Операторы ветвления и цикла (2)

3.2 для цикла

3.2.1 Синтаксис оператора for

для структуры синтаксиса оператора

Используйте цикл for для вывода на экран чисел от 1 до 10.

#include <stdio.h>

int main()
{
    
    
	int i = 0;
	
	for (i = 1; i <= 10; i++)
	{
    
    
		printf("%d ", i);
	}
	
	return 0;
}


Поток выполнения оператора for выглядит следующим образом:
для потока выполнения инструкции


Теперь давайте сравним цикл for и цикл while:

#include <stdio.h>

int main()
{
    
    
	int i = 1;//1.初始化

	while (i <= 10)//2.判断
	{
    
    
		printf("%d ", i);
		i++;//3.调整
	}

	return 0;
}

Можно обнаружить, что три необходимых условия цикла все еще существуют в цикле while, но из-за проблемы со стилем три части, скорее всего, отклонятся далеко друг от друга, поэтому поиск и модификация недостаточно сосредоточены и удобны. Следовательно, стиль цикла for лучше, а частота цикла for также самая высокая.

3.2.2 прерывание и продолжение цикла for

перерыв:

#include <stdio.h>

int main()
{
    
    
	int i = 0;
	
	for (i = 1; i <= 10; i++)
	{
    
    		
		if (5 == i)
		{
    
    
			break;
		}

		printf("%d ", i);
	}
	
	return 0;
}

//1 2 3 4

продолжать:

#include <stdio.h>

int main()
{
    
    
	int i = 0;

	for (i = 1; i <= 10; i++)
	{
    
    
		if (5 == i)
		{
    
    
			continue;
		}

		printf("%d ", i);
	}

	return 0;
}

//1 2 3 4 6 7 8 9 10

3.2.3 Переменная управления циклом оператора for

предположение:

  1. Не изменяйте переменную цикла в теле цикла for, чтобы цикл for не вышел из-под контроля.
  2. Рекомендуется, чтобы значение управляющей переменной цикла оператора for было записано в виде «интервала открытия после закрытия».
#include <stdio.h>

int main()
{
    
    
	int arr[10] = {
    
     1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	//              0  1  2  3  4  5  6  7  8  9
	int i = 0;//[0,10)

	for (i = 0; i < 10; i++)
	{
    
    
		printf("%d ", arr[i]);
	}

	return 0;
}

3.2.4 Некоторые варианты цикла for

#include <stdio.h>

int main()
{
    
    
	//初始化和调整部分的省略就是啥都不做
	//判断部分省略了,意味着判断是恒为真的
	//建议不要随便省略
	for (;;)
	{
    
    
		printf("hehe\n");
	}

	return 0;
}

#include <stdio.h>

int main()
{
    
    
	int i = 0;
	int j = 0;

	for (i = 0; i < 4; i++)
	{
    
    
		for (j = 0; j < 4; j++)
		{
    
    
			printf("hehe\n");
		}
	}

	return 0;
}

//打印16个hehe

#include <stdio.h>

int main()
{
    
    
	int i = 0;
	int j = 0;

	for (; i < 4; i++)
	{
    
    

		for (; j < 4; j++)
		{
    
    
			printf("hehe\n");
		}

	}

	return 0;
}

//打印4个hehe

//使用多余一个变量控制循环

#include <stdio.h>

int main()
{
    
    
    int x = 0;
    int y = 0;
    
    for (x=0, y=0; (x<2) && (y<5); ++x, y++)
    {
    
    
        printf("hehe\n");
    }
   
    return 0;
}

//打印2个hehe

3.2.5 Письменный тестовый вопрос

//请问循环要循环多少次?

#include <stdio.h>

int main()
{
    
    
	int i = 0;
	int k = 0;
	
	for (i = 0, k = 0; k = 0; i++, k++)
		k++;
	
	return 0;
}

//循环0次

3.3 сделать цикл while

3.3.1 Синтаксис оператора do

синтаксическая структура оператора do
Итак, каков поток выполнения оператора do?
сделать поток выполнения оператора

3.3.2 Особенности оператора do

Цикл выполняется хотя бы один раз, а сценарии использования ограничены, поэтому он используется не часто.

//使用do while语句打印1~10

#include <stdio.h>

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

	return 0;
}

3.3.3 прервать и продолжить в цикле do while

перерыв:

#include <stdio.h>

int main()
{
    
    
	int i = 1;
	
	do
	{
    
    
		if (5 == i)
		{
    
    
			break;
		}

		printf("%d ", i);
		i++;
	} while (i <= 10);

	return 0;
}

//1 2 3 4

продолжать:

#include <stdio.h>

int main()
{
    
    
	int i = 1;
	
	do
	{
    
    		
		if (5 == i)
		{
    
    
			continue;
		}

		printf("%d ", i);
		i++;
	} while (i <= 10);

	return 0;
}

//1 2 3 4 死循环

3.4 Упражнения

3.4.1 Вычисление факториала n

//5! = 1*2*3*4*5
//n! = 1~n 累积相乘

//不考虑溢出
#include <stdio.h>

int main()
{
    
    
	int n = 0;
	scanf("%d", &n);
	int i = 0;
	int ret = 1;

	for (i = 1; i <= n; i++)
	{
    
    
		ret = ret * i;
	}

	printf("%d\n", ret);

	return 0;
}

3.4.2 Вычислить 1!+2!+3!+...+10!

#include <stdio.h>

int main()
{
    
    
	int i = 0;
	int n = 0;
	int sum = 0;

	for (n = 1; n <= 10; n++)
	{
    
    
		int ret = 1;

		for (i = 1; i <= n; i++)
		{
    
    
			ret = ret * i;
		}

		sum = sum + ret;
	}

	printf("%d\n", sum);

	return 0;
}

//以下方法更好

#include <stdio.h>

int main()
{
    
    
	int n = 0;
	int ret = 1;
	int sum = 0;
	//1!
	//2! = 1*2
	//3! = 1*2*3
	//4! = 1*2*3*4
    //每次在前面一次的基础上多乘了一个数,所以不需要每次都把ret改成1重来一遍
	for (n = 1; n <= 10; n++)
	{
    
    
		ret *= n;
		sum += ret;
	}

	printf("%d\n", sum);

	return 0;
}

3.4.3 Найдите конкретное число n в упорядоченном массиве

#include <stdio.h>

int main()
{
    
    
	int arr[] = {
    
     1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//升序
	int k = 7;
	int i = 0;
	
	for (i = 0; i < 10; i++)
	{
    
    
		if (k == arr[i])
		{
    
    
			printf("找到了,下标是%d\n", i);
			break;
		}
	}

	if (10 == i)
	{
    
    
		printf("找不到了\n");
	}

	return 0;
}

//以下方法更好

#include <stdio.h>

int main()
{
    
    
	int arr[] = {
    
     1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//升序
	//printf("%d\n", sizeof(arr));//计算数组的总大小,单位是字节
	//printf("%d\n", sizeof(arr[0]));//4
	//printf("%d\n", sizeof(arr) / sizeof(arr[0]));
	int k = 7;
	int sz = sizeof(arr) / sizeof(arr[0]);
	
	//1
	int left = 0;
	int right = sz - 1;
	int flag = 0;//flag的作用是标志是否找到了
	//2
	while (left <= right)
	{
    
    
		int mid = (left + right) / 2;

		if (k == arr[mid])
		{
    
    
			printf("找到了,下标是:%d\n", mid);
			flag = 1;
			break;
		}
		else if (arr[mid] < k)
		{
    
    
			left = mid + 1;
		}
		else
		{
    
    
			right = mid - 1;
		}
	}

	if (0 == flag)
	{
    
    
		printf("没找到\n");
	}

	return 0;
}

бинарный поиск

3.4.4 Несколько символов движутся с обоих концов и сходятся к середине

//welcome to bit!!!!!
//###################
//w#################!
//we###############!!
//wel#############!!!
//...
//welcome to bit!!!!!


//welcome to bit!!!!!
//###################

#include <stdio.h>
#include <string.h>
#include <windows.h>//Sleep需要一个windows.h的头文件
#include <stdlib.h>//system需要一个stdlib.h的头文件

int main()
{
    
    
	char arr1[] = "welcome to bit!!!!!";
	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(1000);//单位是毫秒
		system("cls");//system函数可以执行系统命令,cls是清理屏幕
		left++;
		right--;
	}
	
	printf("%s\n", arr2);
	
	return 0;
}

3.4.5 Имитация сценария входа пользователя

Напишите код для имитации сценариев входа пользователя в систему, и вы сможете войти в систему только три раза. (Разрешается ввести пароль только три раза. Если пароль правильный, будет выведено сообщение об успешном входе в систему, если он будет введен неправильно три раза, программа завершит работу.)

//假设密码是:"123456"

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

int main()
{
    
    
	int i = 0;
	char password[20] = {
    
     0 };

	for (i = 0; i < 3; i++)
	{
    
    
		printf("请输入密码:>");
		scanf("%s", password);
		//判断密码是否正确
		//两个字符串比较相等是不能使用==的,应该使用strcmp库函数	
		//strcmp返回0表示2个字符串相等
		//strcmp返回>0的数字,表示第一个字符串大于第二个字符串
		//strcmp返回<0的数字,表示第一个字符串小于第二个字符串
		//字符串比较大小是比较对应位置上的ASCII码值
		//
		//abcd\0
		//abq\0
		//
		//abq大于abcd

		if (0 == strcmp(password, "123456"))
		{
    
    
			printf("登录成功\n");
			break;
		}
		else
		{
    
    
			printf("密码错误\n");
		}

	}

	if (3 == i)
	{
    
    
		printf("退出程序\n");
	}

	return 0;
}

//也可以这样写

#include <stdio.h>
 
int main()
{
    
    
	int i = 0;
	char password[20] = {
    
     0 };
	int flag = 0;

	for (i = 0; i < 3; i++)
	{
    
    
		printf("请输入密码:>");
		scanf("%s", password);
		
		if (0 == strcmp(password, "123456"))
		{
    
    
			printf("登录成功\n");
			flag = 1;
			break;
		}
		else
		{
    
    
			printf("密码错误\n");
		}

	}

	if (0 == flag)
	{
    
    
		printf("退出程序\n");
	}

	return 0;
}

Прикрепил:

Операторы ветвления и цикла (1)
Операторы ветвления и цикла (3)

рекомендация

отblog.csdn.net/weixin_73077334/article/details/130359028