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;
}
'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 |