Каталог статей
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
предположение:
- Не изменяйте переменную цикла в теле цикла for, чтобы цикл for не вышел из-под контроля.
- Рекомендуется, чтобы значение управляющей переменной цикла оператора 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?
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)