728x90
728x90

3장 본문 예제들 중

문자열 뒤집어서 출력
#include <stdio.h>
#include <string.h>

int main()
{
    int i, n;
    char a[] = "DOG";
    char b[10];
    
    n = strlen(a); //문자열길이
    for(i = n-1; i>=0; i--) {
        b[n-1-i] = a[i];
    }
    b[n]='\0'; //문자열의 끝났음을 알리는 표시 추가
    
    printf("%s를 거꾸로 읽으면 %s\n", a, b);

    return 0;
}

 

* strlen() : 헤더파일 string.h 필요. 공백을 포함한 널문자인 \0 전까지의 문자 개수


 

파일입출력
#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>

main()
{
    FILE* fp;
    char s[256];
    int i = 1;

    fp = fopen("abc.txt", "r");
    if (fp == NULL) {
        return;
    }

    while (feof(fp) == 0) {
        fgets(s, 255, fp);
        printf("%04d: %s", i, s);
        i++;
    }
    fclose(fp);
}

 

* fopen , feof , fgets , fclose : https://coding-restaurant.tistory.com/

* %4d : 필드 폭을 4칸 확보하고 우측 정렬해서 출력
* -%4d : 필드 폭을 4칸 확보하고 좌측 정렬해서 출력 
* %04d : 필드 폭을 4칸 확보하고 우측 정렬해서 출력하고 0으로 채움

 

 

4장 본문 예제들 중 

a부터 b까지의 합
#include <stdio.h> 

int calc(int, int);

main()
{
	int c;
	c = calc(1, 5);
	printf("%d\n", c);
}

int calc(int a, int b) {
	int i, n = 0;
	for (i = a; i <= b; i++) {
		n += i;
	}
	return n;
}
#include <stdio.h>

void swap(int*, int*);
void sum(int, int);

main()
{
	sum(1, 5);
	sum(10, 5);
	sum(1, 10);
	sum(2, 2);
}

void swap(int* a, int* b) {
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

void sum(int min, int max) {
	int i, n;

	if (min > max) {
		swap(&min, &max);
	}
	printf("%d", min);

	n = min;	
	for (i = min + 1; i <= max; i++) {
		printf("+%d", i);
		n += i;
	}
	printf("=%d\n", n);
	printf("%d에서 %d까지의 합은 %d\n", min, max, n);
}

 

 

 

재귀 호출 (팩토리얼)
#include <stdio.h>

int factorial(int);

main()
{
	printf("%d! = %d\n", 5, factorial(5));
}

int factorial(int n) {
	if (n == 0) {
		return 1;
	}
	else {
		return (n * factorial(n - 1));
	}
}

 

 

 

 

3-1. 1부터 n까지의 정수 중 홀수의 값을 구하는 프로그램 작성 (n은 키보드로 입력받기)

#include <stdio.h>

int main()
{
    int num; //입력값 
    int total=0;
    
    printf("홀수의 합을 어디까지 더해볼 지 숫자 입력 : \n");
    scanf("%d", &num);
    
    //홀수 고르기
    for(int i=1; i<=num; i++) {
        if(i%2 == 1) {
            total += i;
        }
    }
    
    printf("홀수의 합은 : %d", total);
    
    return 0;
}

* scanf 오류 체크 

 

3-2. 사용자와 컴퓨터가 가위바위보를 5번 하는 프로그램 작성*

1. 컴퓨터가 낼 것을 난수를 사용해서 임의로 결정
2. 사용자가 낼 것을 번호로 입력
3. 누가 이겼는지 결과 표시
4. 5번 동안에 많이 이긴 사람을 승자로 표시
#include <stdio.h>
#include <stdlib.h> 

int main()
{
    //각각 낸거
    int com; int you;
    //이긴 횟수
    int youWin = 0;
    int comWin = 0;

    for (int i = 0; i < 5; i++)
    {
        //컴
        com = rand() % 3; //0,1,2

        //사람
        printf("가위 1 바위 2 보 0 입력하시오 : \n");
        //fflush(stdin);
        scanf_s("%d", &you);

        // 개행문자가 있으면 다시 입력
        //if(you == '\n') scanf("%d", &you);        

        //printf("컴:%d, 사람:%d\n", com, you);

        //승자 판별
        // 사용자
        if ((com == 0 && you == 1) || (com == 1 && you == 2) || (com == 2 && you == 0)) {
            youWin++;
            printf("사용자 \n");
        }
        // 무승부
        else if (com == you) {
            printf("무승부 \n");
        }
        // 컴
        else {
            comWin++;
            printf("컴 \n");
        }
    }

    //최종 승자
    if (comWin < youWin) {
        printf("사용자가 승자");
    }
    else if (comWin == youWin) {
        printf("무승부");
    }
    else {
        printf("컴이 승자");
    }

    return 0;
}

 

답안지

#include <stdio.h>
#include <stdlib.h> 

int main()
{
    int userson, userwin = 0;
    int comson, comwin = 0;
    int i = 1, result;

    while (1) {
        // 컴퓨터가 낼 손
        comson = rand() % 3;

        // 사용자가 낼 손
        printf("낼 손의 번호 입력 (보=0, 가위=1, 바위=2)\n");
        scanf("%d", &userson);

        //0~2외 수 입력 예외처리
        if (userson < 0 || userson>2) {
            continue;
        }
        else {
            i++;
        }
    
        //판정결과
        printf("사용자: %d, 컴퓨터 :%d", userson, comson);

        if (userson == comson) {
            printf("무승부");
        }
        else if (comson == (userson + 1) % 3) {
            printf("컴퓨터 승");
            comwin += 1;
        }
        else {
        	printf("사용자 승");
            userwin += 1; //사용자 승리 횟수 추가            
        }

        // 5번이 넘었으면 종료
        if (i > 5) {
            break;
        }
    }

    // 최종결과
    printf("사용자 vs 컴 : %d vs %d", userwin, comwin);
    result = userwin - comwin;

    if (result > 0) {
        printf("이겼다");
    }
    else if (result < 0) {
        printf("졌다");
    }
    else {
        printf("비겼다");
    }

    return 0;
}

 

키워드

(a+1) % 3

0, 1 ,2 을 1, 2, 3으로 변경, 3으로 나누면 1,2,0으로 나머지가 떨어진다.
* 반복되는 규칙을 찾아 정리된 식인 듯

rand() : 0부터 RAND_MAX 범위 내에서 int형 난수를 반환한다. 난수를 생성하기 위한 시드를 설정하려면 srand()를 사용한다. % 나머지 연산자를 사용하여 난수의 범위를 한정시킬 수 있다. rand() %10 는 0~9까지의 랜덤한 난수를 만든다.

rand() % n

 

scanf 오류, scanf_s로 수정

비주얼스튜디오 최신버전에서는 함수 취약 에러가 나면서 컴파일이 안된다.
#define _CRT_SECURE_NO_WARNING을 추가해 줄 수도 있지만 되도록 안쓸 수 있으면 안쓸 것을 권장한다.

scanf는 scanf("입력받을 데이터형", &변수이름); 이런 형태로 사용되며
scanf_s는 입력받은 크기를 추가해준다. scanf_s("입력받을 데이터형태", &변수이름, sizeof(a)); 이런 식으로 쓰인다.

 

 

 

 

4-1. 인수를 값으로 전달하는 것과 참조로 전달하는 것의 차이점은 무엇인가요

인수를 값으로 전달하는 방식(call-by-value)은 값을 복사하여 전달하기 때문에 복사 대상을 직접적으로 외부에서 바꿀 수 없다. 인수를 참조로 전달하는 방식은 주소값을 전달하기 때문에 외부에서 접근하여 값을 변경할 수 있다

 

4-2. 다음 프로그램의 출력 결과를 예상해보세요

#swap으로 1번 내용을 비교하는 예제라 생략

 

4-3. 다음 프로그램에서 오류가 발생하니, 잘못된 곳을 수정하세요

#include <stdio.h>

void main()
{
	calculate(2, 3);
}

void calculate(int a, int b)
{
	printf("두 수의 합은 %d입니다\n", a+b);
}

함수를 사용하려면 호출 전 함수를 미리 정의해야한다. main 위에 프로토타입을 선언하던가 위에 정의해야한다.

 

4-4. 세 개의 정수를 전달 인수로 하고, 세 값 중에서 가장 작은 수를 반환하는 함수 작성 *

int printMin(int a, int b, int c) 
{
    int min = a;
    
    if(b<min) {
        min=b;
    }
    if(b<min) {
        min=c;
    }
    return min;
}
728x90
728x90

'C, C++' 카테고리의 다른 글

콜론연산자(:), 더블콜론연산자(::)  (0) 2021.09.25
C 구조체  (0) 2021.09.12
c 난수 생성 함수  (0) 2021.09.08
보안 경고 #define _CRT_SECURE_NO_WARNINGS  (0) 2021.09.08
메인 함수(엔트리포인트)  (0) 2021.09.08
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v