문제 푸는 과정
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
char i = 0;
int value = 0;
while (1)
{
printf("Enter next integer\n");
scanf("%d", &i);
if (i == 'q')
{
printf("%d", value);
break;
}
value = value + i;
}
printf("%d", value);
}
- 궁금한 점 - 첫 번째에 보면 Enter next integer가 아니라 Enter an integer로 출력되어있었는데. 이러면, 반복문 위에 구현해놨다는 건데, 첫 번째 변수를 어디서, 왜 받는 건지?
- 오직 while문으로만 구현하기에는 어려워서
그래서 일단은 ‘합’에 대해서 초점을 맞추어서 q를 넣어서 종료되는 것은 없애기로 했다.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 0;
int value = 0;
while (1)
{
printf("Enter next integer\n");
scanf("%d", &i);
value = value + i;
printf("The sum is %d\n", value);
}
}
이렇게 구현하면 종료됐을 때 모든 합을 깔끔하게 보여주지는 않지만, 일단은 입력한 모든 수의 합이 더하게 끔 구현은 되었다.
이제 리터럴 q를 넣었을 때 함수가 종료되면서, 모든 합의 결과값을 넣어 주면된다.
그런데 내가 봤을 때, 종료되었을 때 모든 합의 결과값을 보여주는 것은 그냥 저 printf를 while문으로 밖으로 빼주면 될 것 같고.
문제는 ‘q’를 넣었을 때 어떻게 함수를 정지 시키는 가..?
%d 때문에 무한 루프가 생기는 것 같은데..
scanf에 %c나 %s로 다 교체해주면, 덧셈이 아마 안될 것으로 예상된다.
심지어 %c에서 숫자를 받는 것이 가능하다 해도 char은 255까지의 숫자 밖에 표현이 안되기 때문에 의미가 없다.
그래서 음수를 넣었을 때, 정상적으로 프로그램을 작동하도록 만들었다.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 0;
int value = 0;
while (i > -1)
{
printf("Enter next integer\n");
scanf("%d", &i);
value = value + i;
}
printf("The sum is %d\n", value);
}
- while문에 (i > 0)을 넣으면 그냥 입력도 필요 없이 while문이 종료가 되어서 어쩔 수 없이 -1을 넣었다.
어떻게든 되긴 했는데 하자가 하나가 있다.
음수를 넣으면 그 음수가 value = value + i;에
계산하고 나와서 결과 값이 그 음수 만큼 뺀 값이 나온다..
음.. 그렇게 생각을 하다가 번뜩! 생각났다.
마지막 부분에 그 음수 만큼 더해주면 되는거 아니야??
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i2 = 0;
int value = 0;
while (i > -1)
{
printf("Enter next integer\n");
scanf("%d", &i);
value = value + i;
}
value = value -(i);
printf("The sum is %d\n", value);
}
결과는 잘 나오긴 한다..
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num = 0;
int sum = 0;
int status;
printf("Enter an integer (q to quit) : ");
status = scanf("%d", &sum);
while (status == 1)
{
sum = sum + num;
printf("Enter next integer (q to quit) : ");
status = scanf("%d", &num);
}
printf("sum = %d\n", sum);
return 0;
}
이 코드는 홍정모 선생님이 짠 코드다.
일단 처음에 enter an integer을 왜 번거롭게 또 다른 변수에 넣을려고 했는지 이해가 안되었는데,
scnaf 반환 값을 응용해서 만든 것이다.
즉, scanf에 글자가 들어가면 숫자밖에 인식이 안되서 0으로 인식되고(%s나 %c면 1로 인식할 것 같다), scanf에 하나의 숫자가 들어오면 1로 인식하는 점을 이용한 것이다.
나는 이거를 보고 진짜 감명을 받았다.
동등 연산자 Equality Operator
while(status == 1) 부분의 ‘==’은 왼쪽 좌변과 우변이 같은지 비교를 하는 것이다.
status == 1에서 status의 변수가 1이라면 이 표현식 그 자체가 1이 된다.
출처: 홍정모의 따라배우는 C언어
강의 외의 추가된 것들은 책 그리고 인터넷 조사해서 얻었음
'배운 것들 메모 > 따라 배우는 C언어' 카테고리의 다른 글
[홍정모의 따라하며 배우는 C언어] 6.4 관계 연산자(Relational Operators) (0) | 2024.09.26 |
---|---|
[홍정모의 따라하며 배우는 C언어] 6.3 진입조건 루프(Entry-Condition Loop) while (0) | 2024.09.26 |
[홍정모의 따라하며 배우는 C언어] 5.11 자료형 변환(Type conversions) (0) | 2024.09.11 |
[홍정모의 따라하며 배우는 C언어] 5.9 표현식(Expressions)과 문장(Statements) (0) | 2024.09.10 |
[홍정모의 따라하며 배우는 C언어] 5.8 증가(++), 감소(—) 연산자 (0) | 2024.09.09 |