IT&코딩/C

C언어 2주차 복습-3

솔론 2022. 8. 29. 13:51
728x90
반응형

// while 문
// while else도 있다.
// for가 있는데 while이 있는 이유?

// T 필기
// for 와 while의 차이점
// - c언어에서는 for와 while의 차이점을 찾기 쉽지 않습니다. 
// 하지만 파이썬은 for와 while의 용도가 분명합니다.
// 굳이 용도를 구분하자면 for는 반복의 범위가 정해져 있거나 반복의 간격이 일정한 경우 알맞은 문법 .
// while은 반복의 범위가 정해져있지 않거나 반복의 간격이 일정하지 않은 경우 알맞은 문법.

// 무슨 말인가?
// 1. 반복의 범위
// for는 인형뽑기를 생각해보자 1000원에 한 판 , 5000원으로 다섯판 할 수 있다. 
// while은 pc게임을 생각해보자. 언제까지 할 수 있나? 

// 공통점은 언제간 끝난다는 것.
// for는 다만 반복의 끝이 명시되어 있다.
// while은 끝이 불분명한 경우가 대부분이다. 혹은 간격이 일정하지 않은 경우가 많다.

 

#include<stdio.h>
int main(void)
{
int num;
for (num = 0; num < 3; num++)
{
printf("Hello world %d\n", num);
}
return 0;
}
// while 문으로 바꿔주자

#include<stdio.h>
int main(void)
{
int num=0 ;
while (num < 3)
{
printf("Hello world %d\n", num);
num++;
}
return 0;
}

-----------------------------------------------------------------------------------------------------------------

#include<stdio.h>
#include<conio.h>
#define ESC    0x1b // 우리가 ESC라 쓰면 컴퓨터는 0x1b로 알아듣는다.

int main(void)
{
char ch;
while ((ch = getch()) != ESC ) // ESC와 같지 않으면 참
{
if (ch >= 'a' && ch < 'z')
ch = ch - 32;
putch(ch); // 서식 지원문 안 써도 바로 출력됨. getch의 반대, 즉시 출력
printf("\n");
}
}

 

#include<stdio.h>
#include<conio.h>
#define ESC 0x1b
int main(void) {
char ch;
while (1) {
ch = getch();
if (ch == ESC)
break;
if (ch >= 'a' && ch <= 'z')
ch = ch - 32;
putch(ch);
printf("\n");
}
}

-----------------------------------------------------------------------------------------------------------------

#include<stdio.h>
#define TRUE 1
int main(void)
{
int i, j, sum = 0;
while (TRUE)
{
printf("수입력(1~100)");
scanf("%d", &i);
if (i >= 1 && i <= 100)
break;
printf("잘못 입력, 다시");
}
for (j = 1; j <= i; j++)
sum += j;
printf("%d", sum);
}

 

#include<stdio.h>
int main(void)
{
int i, j, sum = 0;
int flag = 1; // 왜 변수로 flag를 사용했을까. 스위칭을 하는 용도로 많이 사용된다. 절대규칙은 아니고 암묵적이고 관습적인 규칙.
while (flag)
{
printf("수입력(1~100)");
scanf("%d", &i);
if (i >= 1 && i <= 100)
flag = 0;
else
printf("잘못 입력, 다시");
}
for (j = 1; j <= i; j++)
sum += j;
printf("%d", sum);
}

-----------------------------------------------------------------------------------------------------------------

// 숫자 뒤집기

#include<stdio.h>
#define TRUE 1
int main(void) {
int i, temp;
printf("수입력");
scanf("%d", &i);
while (TRUE) {
temp = i % 10;
i = i / 10;
printf("%d", temp);
if (i == 0)
break;
}
printf("\n");
}

-----------------------------------------------------------------------------------------------------------------

// 제어문(do while문)
// 블록 내부의 종속 문장을 먼저 실행한 후에 조건식을 평가
// 선실행 후판단

#include<stdio.h>
int main(void) {
int su = 0, sum = 0;
do {
su++;
sum += su;
} while (su < 10);
printf("sum=%d\n", sum);
}
// do while을 쓰기 때문에 10까지 다 더해지고, 11로 넘어가지도 않는다.
// 우리가 원하는 숫자까지 반복이 진행된다.

-----------------------------------------------------------------------------------------------------------------

// 입력된 수의 거꾸로 수를 구하라 (예 123->321)

#include<stdio.h>
#define TRUE 1
int main(void) {
int i,j, temp, cnt=1, rev=0;
printf("수입력");
scanf("%d", &i);
j = i;
while (TRUE) {
temp = i % 10;
i = i / 10;
cnt *= 10;
if (i == 0)
{
cnt = cnt/10;
break;
}
}
while (TRUE) {
temp = j % 10;
j = j / 10;
rev += temp * cnt;
cnt = cnt / 10;

if (j == 0)
break;
}
printf("%d", rev);
printf("\n");
}

 

// T 풀이
#include<stdio.h>
#define TRUE 1
int main(void) {
int i, temp, rev=0;
printf("수입력");
scanf("%d", &i);
printf("결과 : %d ->", i);
while (TRUE) {
temp = i % 10;
rev *= 10;
rev += temp;
i = i / 10;

if (i == 0)
break;
}
printf("%d\n",rev);
}

-----------------------------------------------------------------------------------------------------------------

// 입력된 수의 각 자리수의 합을 구하는 프로그램을 작성하라.

#include<stdio.h>
#define TRUE 1
int main(void) {
int i, temp, sum=0;
printf("수입력");
scanf("%d", &i);
while (TRUE) {
temp = i % 10;
i = i / 10;
sum += temp;
if (i == 0)
break;
}
printf("각 자릿수의 합 : %d\n", sum);
}

-----------------------------------------------------------------------------------------------------------------

// 예제 실행해보고, 중첩 while문으로 바꿔봐라
// while문으로 바꾸고 규칙대로 분석해야 한다.

 

// 예제

 

#include<stdio.h>
int main(void)
{
int su1, su2;
for (su1 = 1; su1 <= 2; su1++) {
for (su2 = 1; su2 <= 5; su2++) {
printf("su1=%d su2=%d\n", su1, su2);
if (su2 == 2)
break;
}
printf("%d * %d = %d\n", su1, su2, su1 * su2);
}
}

 

// 내 풀이 1 (억지)
#include<stdio.h>
int main(void)
{
int su1=0, su2;
while (su1<=2) {
su1++;
su2 = 0;
while (su2 <= 5) {
su2++;
printf("su1=%d su2=%d\n", su1, su2);
if (su2 == 2){
printf("%d * %d = %d\n", su1, su2, su1 * su2);
break;}
}
if (su1 == 2)
break;
}
}

// 내 풀이 2
#include<stdio.h>
int main(void)
{
int su1=1, su2;
while (su1 <= 2) {
su2 = 1;
while (su2 <= 5) {
printf("su1=%d su2=%d\n", su1, su2);
su2++;
if (su2 == 2)
{
printf("su1=%d su2=%d\n", su1, su2);
printf("%d * %d = %d\n", su1, su2, su1 * su2);
break;
}
}
su1++;
}
}

 


// T풀이

#include<stdio.h>
int main(void)
{
int su1=1, su2=1;
while (su1 <= 2) {
su2 = 1;
while (su2 <= 5) {
printf("su1=%d su2=%d\n", su1, su2);
if (su2 == 2)
break;
su2++;
}
printf("%d * %d = %d\n", su1, su2, su1 * su2);
su1++;
}
}

-----------------------------------------------------------------------------------------------------------------

#include<stdio.h>
int main(void) {
int su;
for (su = 1; su < 5; su++) {
if (su == 3)
{
continue; // 바로 반복구문으로 이동한다.
printf("su=3"); // 이 줄은 실행되지 않는다.
}
else
printf("su= %d\n", su);
}
}

// 실무에서
// 출력될 의도가 다분하다면 위치를 continue 이전에 배치해야 한다.
// 단순히 참고하기 위해서라면, 놔두면 된다.

 

#include<stdio.h>
#include<conio.h>
int main(void) {
char ch;
while (1) {
ch = getch() - 32;
putch(ch);
if (ch != 'q' && ch != 'Q')
continue;
else
exit(1);
}
}
// 결과를 보여주는 과정
// Capslock를 해제하면 대문자가 잘 나온다.
// 무조건 -32를 하기 때문에 소문자인 경우는 대문자가 잘 되지만. 대문자인 경우는 특수문자들가 된다.

-----------------------------------------------------------------------------------------------------------------

// 문제

// 1. 어떤 수의 약수를 구하는 프로그램을 작성하여라.

#include<stdio.h>
int main(void)
{
int num, yak;
printf("약수를 구하고 싶은 수를 입력하시오:\n");
scanf("%d", &num);
for (yak = 1; yak <= num; yak++)
{if (num % yak == 0)
printf("%d, ", yak);
}
printf("\b\b \n");
}

// T 풀이
#include<stdio.h>
int main(void)
{
int num, yak=1;
printf("약수를 구하고 싶은 수를 입력하시오:\n");
scanf("%d", &num);
while(1)
{
if (num % yak == 0)
printf("%d, ", yak);
if (num == yak)
break;
yak++;
}
printf("\b\b \n");
}

-----------------------------------------------------------------------------------------------------------------

// 2. 1에서부터 입력된 어떤 수까지 내에 있는 소수를 찾는 프로그램을 작성하라

#include<stdio.h>
int main(void)
{
int su, num, yak, cnt;
printf("소수를 찾고싶은 수를 입력");
scanf("%d", &num);
for (su = 2; su <= num; su++)
{
cnt = 0;
for (yak = 1; yak <= su; yak++) // 1부터 증가시키며 약수 유무 확인
{
if (su % yak == 0) // 약수일 때마다 카운트 1회 해줌
cnt += 1;
}
if (cnt == 2) // for문이 끝나고 약수가 2개(1과 자기자신)인 경우 조건문 실행
printf("%d, ",su);
}
printf("\b\b \n");
}

 

// T 풀이
#include<stdio.h>
int main(void)
{
int i, j, num, cnt=0;
printf("소수를 찾고싶은 수를 입력");
scanf("%d", &num);
printf("%d까지의 소수 :", num);
for (i = 2; i <= num; i++)
{
for (j = 2; j <= num; j++) 
{
if (i % j == 0) 
cnt ++;
}
if (cnt == 1) 
printf("%3d",i);
cnt = 0; // 다음 수의 약수 개수 파악을 위해 0으로 리셋
}
printf("\n");
}

 

// 3. 1에서 1000까지의 자연중에서 4로 나누어도 6으로 나누어도 나머지가 1인 수의 합을 출력하라.

#include<stdio.h>
int main(void)
{
int num, sum=0;
for (num = 1; num <= 1000; num++)
if (num % 4 == 1 && num % 6 == 1)
sum += num;
printf("합은 %d\n", sum);
}

// T 풀이
#include<stdio.h>
int main(void)
{
int num=1, sum=0;
while (1)
{
if (num > 1000)
break;
if (num % 4 == 1 && num % 6 == 1) // (num%12==1) 결과는 같을지라도 이렇게 코드 작성하지 마라.
sum += num;
num++;
}
printf("합은 %d\n", sum);
}

 

// T 풀이

#include<stdio.h>
int main(void)
{
int num1, num2, max, min, i=1;
printf("두 수를 차례대로 입력 : \n");
scanf("%d%d", &num1, &num2);
while(i<=num1) // num2를 지정해도 상관없다.
{
if (num1 % i == 0 && num2 % i == 0)
max = i; // 공약수를 저장하는 마지막에 저장되는 약수가 최대공약수가 되는 것.
i++;
}
printf("최대공약수는 %d입니다\n", max);
min = (num1 * num2) / max; // 최고 공배수 구하는 공식
printf("최소공배수는 %d입니다\n", min);
}

728x90
반응형