[C 초급] 루프 및 분기문

목차

if...else 문

편집하다

 오류가 있는

최대 100까지 홀수 출력 

switch...case 문

출력 주

 루프 문

비교 판단 

1.break는 루프를 종료합니다.

2.계속

문자 읽기

버퍼 읽기

숫자만 출력 

 for 루프

do...while 루프

n의 계승의 합

 동적인 인쇄를 달성하기 위한 루프

숫자 맞히기 게임 【요약】

 이동

종료 프로그램 편집

 이동

while 루프


if...else 문

먼저 중요한 개념을 소개합니다. 0은 참이고 0이 아닌 것은 거짓입니다.

분기판단문 if...else는 기본적으로 하나의 문만 , 여러 문을 실행하려면 중괄호를 추가하면 됩니다. {}는 코드 세그먼트를 나타냅니다.

if 문은 기본적으로 가장 가까운 else와 일치합니다.

그렇다면 원하는 대로 if...else의 일치 관계를 어떻게 결정할 수 있을까요? 답은 중괄호를 추가하는 것입니다.

//形式1
if (condition)
	{
		return x;
	}
	return y;
//形式2
if (condition)
	{
		return x;
	}
else
		return y;

가독성을 높이기 위해 일반적으로 첫 번째 형식 대신 두 번째 형식이 권장됩니다.

 오류가 있는
int num = 1;
if (num = 5)
{
	printf("hehe\n");
}

이 코드는 무한 루프에 빠질 것입니다. 할당과 같음의 구분에 주의하세요.

//正确
if (num == 5)
//容易检查错误
if(5 == num)

최대 100까지 홀수 출력 

판단문을 사용하여 100 이내의 모든 홀수를 출력할 수 있습니다.

	int i = 1;
	while (i <= 100)
	{
		if(i%2 == 1)
			printf("%d\n", i);
		i++;
	}
	

그러나 판단하지 않고 시도하여 2개의 숫자를 건너뛰는 루프 문을 직접 사용하여 이 기능을 수행 할 수도 있습니다.

while (i <= 100)
	{
		printf("%d\n", i);
		i+=2;
	}

switch...case 문

switch...case 문은 스위치를 의미하는 분기문으로 사용됩니다. 경우에 따라 if...else 문보다 더 편리하고 읽기 쉽습니다.

출력 주

일반 모드:

int day = 0;
scanf("%d", &day);
if (1 == day)
	printf("星期1\n");
	else if (2 == day)
		printf("星期2\n");
	else if (3 == day)
		printf("星期3\n");
	else if (4 == day)
		printf("星期4\n");
	else if (5 == day)
		printf("星期5\n");
	else if (6 == day)
		printf("星期6\n");
	else if (7 == day)
		printf("星期天\n");

스위치 재작성: 

우리가 4를 입력하면 프로그램은 4번째 문에 들어가고 성공적으로 4주를 출력하지만 다음 분기를 출력합니다. 전류 흐름으로 생각할 수 있으며 이를 닫으려면 게이트 제어가 필요 합니다 . 닫기 키는 만나면 중지됩니다.

int day = 0;
	scanf("%d", &day);
	int n = 1;
	switch (day)//整型表达式
	{
	case 1:  //case 后必须是整型常量表达式
		printf("星期1\n");
		break;
	case 2:
		printf("星期2\n");
		break;
	case 3:
		printf("星期3\n");
		break;
	case 4:
		printf("星期4\n");
		break;
	case 5:
		printf("星期5\n");
		break;
	case 6:
		printf("星期6\n");
		break;
	case 7:
		printf("星期天\n");
		break;
	}

이제 공휴일과 평일을 인쇄하고 다음과 같이 코드를 수정할 수 있습니다.

switch (day)//整型表达式
	{
	case 1:  //case 后必须是整型常量表达式
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
	default:
		printf("输入错误\n");
		break;
	}

이는 switch 문의 자유도를 반영한 ​​것으로, 1-7 이외의 숫자를 출력할 때 default 키워드(default)를 사용하여 처리할 수 있습니다. default는 문의 끝에 쓸 필요가 없으며 어디에나 있을 수 있으므로 그 뒤에 break를 추가하는 것이 좋습니다.

 루프 문

루프는 이름에서 알 수 있듯이 판정 조건이 충족된 후에도 계속해서 반복 실행되는 작업입니다.

비교 판단 

  

조건이 만족되면 계속 루프를 돌고 참 조건을 입력하면 무한 루프에 들어가게 되는데, 루프를 유연하게 제어하기 위해 break와 계속해서 루프를 제어하는 ​​기능도 추가했습니다.

1.break는 루프를 종료합니다.

중단 루프를 만나 현재 루프 에서 뛰어내림

2.계속

계속을 만나면 루프 본문 뒤에 있는 내용을 무시하고 루프를 다시 시작합니다( 루프 건너뛰기).

루프가 5에 도달하면 프로그램은 무한 루프에 들어가게 되는데 올바른 방법은 루프의 첫 번째 문장에 i++를 넣어 5가 인쇄되지 않도록 하는 것입니다.

문자 읽기

키보드에서 여러 문자를 읽으려면 어떻게 해야 합니까?

읽기에 성공하면 정수 값(ascii 코드 값에 해당)을 반환합니다 . 읽기에 실패하면 EOF(-1)를 반환하도록 조정합니다. 수동으로 읽기를 종료할 수도 있습니다. 키보드 입력 ctrl+z

putchar는 출력 문자이며 성공하면 문자를 반환하여 화면에 출력하고 실패하면 EOF를 반환합니다.

ch는 getchar의 반환 값을 받아 각 문자를 판단합니다. Enter 키를 누르면 getchar도 읽고 판단한 다음 화면에 출력하므로 한 문자가 한 줄을 차지하는 효과가 있습니다.

버퍼 읽기

 캐시가 존재하는지 확인하기 위해 간단한 암호 확인 프로그램을 구현합니다.

패스워드를 입력하면 ch 가 캐리지 리턴을 직접 읽어 직접 인쇄 확인에 실패하는데 이는 \n 또는 공백을 만나면 scanf가 입력을 중단하고 나머지 내용은 버퍼에 남아 있기 때문입니다. 이 상황을 피하기 위해 getchar를 사용하여 공백을 읽을 수 있습니다.

getchar를 추가한 후 코드를 성공적으로 실행할 수 있습니다.

 고려해야 할 또 다른 상황이 있습니다

 왜 이런 일이 일어났습니까?

즉, 아직까지 깔끔하게 처리되지 않은 상태이며, 이때 루프를 이용하여 버퍼의 내용을 지우고 있습니다.

숫자만 출력 

int ch = 0;
while ((ch = getchar()) != EOF)//多组输入,注意优先级加括号
{
	
	if (ch < '0' || ch > '9')
		continue;
/*if(ch <= '9' && ch >= '0')*/
	putchar(ch);
}

char 유형이 getchar의 반환 값을 받을 수도 있지만 int를 사용하는 것이 좋습니다(잘릴 수 있음).

 for 루프

for 루프는 while 루프의 통합으로 루프를 정확하게 조정할 수 있습니다.

for(코드 1; 코드 2; 코드 3)

초기 조건, 판단 및 업데이트를 각각 나타냅니다.

이 코드는 5를 제외한 1부터 10까지의 모든 숫자를 출력합니다. while 루프와 달리 continue 에 업데이트 조건을 넣으면 실행되지 않지만 for 루프에서 continue를 사용하면 업데이트 조건을 계속 실행할 수 있습니다

for 의 초기화, 판정, 조정은 생략 가능하지만 판정 부분을 생략한다는 것은 판정이 항상 참이라는 뜻입니다.

 초기 부분을 생략하면 다음과 같이 표시될 수 있습니다.

 생략하지 않기 전에 100번 인쇄 생략 후 j의 값은 10번 인쇄 후에도 재초기화를 하지 않기 때문에 여전히 10이다.

따라서 무심코 판정 조건을 생략하지 않는 것이 좋다 .

do...while 루프

특징은 다음과 같습니다. 최소 한 번 실행 , 일반적으로 일반적으로 사용되지 않음.

 다음 코드의 결과는 무엇입니까?

int i = 1;
do
{
	if (i == 5)
		continue;
	printf("%d ", i);
	i++;
} 
while (i <= 10);

정답은 출력 1 2 3 4 입니다. 마찬가지로 continue 뒤에 업데이트 조건이 놓이기 때문에 continue 실행 후 while 루프(무한 루프)에 들어갑니다.

n의 계승의 합

구체적인 아이디어는 1에서 n까지의 계승을 차례로 찾아 합산하는 것입니다.

    int i = 1;
	int sum = 0;
	int ret = 1;
	int n = 0;
	for (n = 1; n <= 3; n++)
	{
		ret = 1;
		for (i = 1; i <= n; i++)
		{
			ret = i * ret;
		}
		sum = sum + ret;
	}
	printf("%d", sum);

ret는 각 루프 후에 1로 변경되어야 합니다.

두 번째 방법(낮은 소비)

n!= (n-1)! * N

    int i = 1;
	int sum = 0;
	int ret = 1;
	int n = 0;
	for (n = 1; n <= 3; n++)
	{
		ret = n * ret;
		sum = sum + ret;
	}
	printf("%d", sum);

 동적인 인쇄를 달성하기 위한 루프

동일한 길이의 문자열과 # 기호가 주어지면 매번 루프를 만들고 #이 문자열로 덮일 때까지 왼쪽과 오른쪽을 덮으십시오.

#include<stdio.h>
#include<windows.h>
#include<string.h>
int main(){
char arr1[] = "welcome to here!!!!";
char arr2[] = "###################";
int left = 0;
int right = strlen(arr1)-1;
while (left <= right)
{
	arr2[left] = arr1[left];
	arr2[right] = arr1[right];
	printf("%s\n", arr2);
	Sleep(100);//休眠命令
	system("cls");//清空屏幕命令
		left++;
		right--;
}
printf("%s\n", arr2);
}

이 코드를 복사하여 컴파일러에서 실행하면 간단한 동적 효과를 관찰할 수 있습니다.

숫자 맞히기 게임 【요약】

이 기사에서 배운 지식을 결합하고 숫자 추측 게임을 사용하여 복습을 합니다. 

추천 메뉴 작성:

void menu()
{
	printf("*********************************\n");
	printf("**********  1. play  ************\n");
	printf("**********  0. exit  ************\n");
	printf("*********************************\n");
}
int main()
{
	int n = 0;
	do
	{
		menu();
		scanf("%d", &n);
		switch (n)
		{
		case 1:
			//game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择!\n");
			break;
		}
	}
while (n);
	return 0;
}

 다음으로 게임 기능을 완성합니다. 

숫자를 추측하는 기능을 구현하려면 난수를 생성하는 컴퓨터가 필요하며 rand는 난수를 생성하는 데 특별히 사용되는 함수입니다.

그러나 rand에 의해 생성된 숫자는 의사 난수이며 프로그램을 두 번째로 실행한 횟수는 처음 과 완전히 동일합니다 !

그래서 우리는 srand( random number initialization setter )를 사용하여 난수를 진정으로 난수로 만듭니다.

변경된 것은 시간이므로 time 함수를 사용하여 초기화를 설정합니다. 그 반환값은 타임스탬프(정수) 인데 여기서는 임의의 값을 생성하고 있으므로 NULL을 전달하여 임의의 값을 생성할 수 있습니다.

 srand는 한 번만 설정할 수 있으므로 루프에 참여하지 않고 do...while 루프 에 추가할 수 있습니다.

	srand((unsigned int)time(NULL));

 시간 함수의 리턴 타입은 time_t이고 srand의 매개변수는 무부호 정수이므로 이를 캐스팅해야 합니다.

void game()
{
	int num = rand()%100+1;//1-100之间
	int guess = 0;
	while (1)
	{
		printf("请猜数字:>");
		scanf("%d", &guess);

		if (guess < num)
			printf("猜小了\n");
		else if (guess > num)
			printf("猜大了\n");
		else
		{
			printf("猜对\n");
			break;
		}
	}
}

위의 코드를 통합하면 숫자 추측 게임을 실행할 수 있습니다. 서둘러 C 언어로 첫 번째 작은 게임을 경험하십시오!

 이동

루프의 하나 이상의 레이어에서 점프하는 함수로서 goto 문으로 구현될 수 있는 함수는 다른 문장으로 구현될 수 있으며, 이를 사용하면 프로그램에서 일부 문제가 발생할 수 있습니다(예: 일부 프로그램을 건너뛰면 디버깅할 수 없는 버그 등을 표시하는 프로그램). 출현율은 높지 않고, 여러 루프를 한번에 뛰어야 하는 장면에 주로 등장한다 . (브레이크는 루프의 한 레이어에서만 점프할 수 있습니다)

 종료 프로그램

이름에서 알 수 있듯이 특정 시간에 컴퓨터를 종료할 수 있는 프로그램입니다. 나는 이 프로그램을 두 가지 방법으로 작성할 것이다.

 이동

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    system("shutdown -s -t 60");//60秒内关机
again:
	
	printf("请注意,你的电脑在1分钟内关机,如果输入:我是猪,就取消关机\n");
	char input[20] = { 0 };
	scanf("%s", input);
	if (strcmp(input, "我是猪") == 0)
	{
		system("shutdown -a");
		printf("关机取消\n");
	}
	else
		goto again;
	return 0;
}

작업 결과:

while 루프

int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");

	while (1)
	{
		printf("请注意,你的电脑在1分钟内关机,如果输入:我是猪,就取消关机\n");
		scanf("%s", input);
		if (strcmp(input, "我是猪") == 0)
		{
			system("shutdown -a");
			printf("关机取消\n");
			break;
		}
	}
	return 0;
}

추천

출처blog.csdn.net/dwededewde/article/details/131457661