目录
3 模拟用户登录,密码只能输入三次,密码正确后退出,错误三次后退出
4 查找有序数组char arr[] = {1, 2, 3, 4....20}中的15所对应的下标
11 打印1-100中出现数字9的数,打印1-100中9出现的个数
程序的三种基本结构
顺序结构
分支结构
循环结构
语句
-
含义
是计算机指令,由 ; 结尾
-
类型
控制语句 | 条件判断语句 | if else; switch |
循环语句 | while; do while; for | |
转向语句 | break; continue; goto; return | |
函数调用语句 | 函数调用 + ; 例如: printf("hello, world!"); | |
表达式语句 | 表达式 + ; | |
空语句 | ; | |
复合语句/语块 | { 由大括号括起来的语句和声明等 } |
表达式
-
含义
是计算机指令,由运算符和运算对象(常量、变量)组成,单独的一个运算对象也是表达式
An expression is a sequence of operators and operands that specifies computation of a value.
表达式是指定计算值的操作符和操作数的序列。
-
类型
常量表达式 | 1, 3.14, a, 0 |
算数表达式 | a + b, 1%b |
赋值表达式 | a = 1, i++, a += 7 |
关系表达式 | a > 4, a != 8 |
逻辑表达式 | a && b, a | b, ^b |
逗号表达式 | (a, s, 1, 2, a, q + 1)---值为逗号表达式内最右侧表达式的值 |
复合表达式 | a * 7 /(a % v + 1) |
函数表达式 | a = Max(x, y) |
分支语句
-
if 语句
语法结构
if else 只对后面一条语句产生效果,之间只能有一条语句
如果if else之间有多条语句,需要用{}
if (表达式)
语句1;
if else (表达式)
语句2;
else
语句3;
// if else 的匹配适用就近原则,所以多语句时需要使用代码块 {}
//条件表达式
测试条件 ?exp1:exp2;
-
switch语句
多重选择语句
1 语法结构
switch (整型表达式)
{
语句项:
}
switch (expression) // 类型必须为整型或枚举类型
{
case /* constant-expression */:
/* code */
break; // 跳出整个switch continue不对switch产生影响
default:
break;
}
break 跳出整个switch
continue不对switch产生影响
2 语句项
case 整型常量表达式://不能重复
语句;
char c;
scanf("%c", &c);
switch (c)
{
case 'a':
printf("Alpha\n");
// break;
case 'b':
printf("Bravo\n");
break;
case 'c':
printf("Charlie\n");
break;
default:
printf("don't know\n");
}
char c;
while (1)
{
scanf("%c", &c);
switch (c)
{
case 'a':
printf("Alpha\n");
break;
case 'b':
printf("Bravo\n");
break;
case 'c':
printf("Charlie\n");
break;
default:
printf("don't know\n");
}
getchar(); // 清除未被吸收的输入
}
循环语句
正确设置有限次数循环的三个条件
1 计数器设置初始值
2 循环条件
3 计数器更新
-
while语句
1 语法结构
while 只对后面一条语句产生效果
如果while后有多条语句,需要用{},构成复合语句
while (/* condition */)
{
/* code */
}
2 执行流程
3 死循环
//结果是什么呢
#include <stdio.h>
int main()
{
int i = 0;
while (i < 10)
{
if (i == 5)
{
continue;
}
printf("%d\n", i);
i++;
}
return 0;
}
正确写法
#include <stdio.h>
int main()
{
int i = 0;
while (i < 10)
{
i++;
if (i == 5)
{
continue;
}
printf("%d\n", i);
}
return 0;
}
-
for语句
1 语法结构
for 只对后面一条语句产生效果
如果for后有多条语句,需要用{},构成复合语句
for (int i = 1; i < 9; i++); //相当于 for (int i = 1; i < 9; i++) ;
for (size_t i = 0; i < count; i++)
{
/* code */
}
for (expr1 : expr2 : expr3)
{
statement;
}
expr1 : 循环变量初始化
expr2 : 条件判断
expr3 : 循环判断条件的调整
2 执行流程
3 会不会死循环呢?结果是什么
#include <stdio.h>
int main()
{
for (int i = 0; i < 10; i++)
{
if (i == 5)
continue;
printf("%d\n", i);
}
return 0;
}
// 注意 = 号;
//尽量不要在for循环体内改变循环变量
#include <stdio.h>
int main()
{
for (int i = 0; i < 10; i++)
{
if (i = 5)
printf("%d\n", i);
}
return 0;
}
4 建议
-
不可以在for循环体内改变循环变量,防止for循环失去控制
-
for语句循环变量的取值采取“前闭后开”写法
for (int i = 0; i < 10; i++) //推荐----更直观 :10次循环;10次打印;10个元素
for (int i = 0; i <= 9; i++) //不推荐
5 变种1
#include <stdio.h>
int main()
{
int i = 0;
int g = 0;
for (;;)
{
printf("a");
}
return 0;
}
// for循环的初始化,判断,调整表达式都可以被省略
//判断条件省略代表判断结果恒为真
5.1 不要随意省略
#include <stdio.h>
int main()
{
int i = 1;
int g = 1;
for (; i < 11; i++)
{
for(; g < 11; g++)
{
printf("%d\n", g);
}
}
return 0;
}
结果为
1
2
3
4
5
6
7
8
9
10
因为在外层第二遍时, g == 10,没有初始化
6 变种二
// 有两个循环变量
#include <stdio.h>
int main()
{
int i;
int g;
for (i = 1, g = 1; i < 11 && g <3; i++, ++g)
{
printf("a\n");
}
return 0;
}
7 循环了多少次,i最后的值是多少
#include <stdio.h>
int main()
{
int i;
for (i = 0; i = 0; i++)
{
i++;
}
printf("%d",i);
return 0;
}
结果: 循环0次,i 的值为0;因为判断表达式的结果为0,0为假,程序不再往下运行
-
do..while()语句
1 语法结构
do
{
/* code */
} while (/* condition */);
do
{
循环语句;
}
while(表达式);
2 执行流程
-
循环嵌套
#include <stdio.h>
int main()
{
for (char a = 'A'; a <= 'E'; a++)
{
for (int n = 1; n <= 9; n++)
{
printf("%c%d", a, n);
}
printf("\n");
}
}
//
A1A2A3A4A5A6A7A8A9
B1B2B3B4B5B6B7B8B9
C1C2C3C4C5C6C7C8C9
D1D2D3D4D5D6D7D8D9
E1E2E3E4E5E6E7E8E9
-
break continue
break:跳出本级循环
continue:跳过本次循环,不运行continue后代码,直接开始下一次循环
continue << for 会立即更新计数器, 进入新循环
break << for 直接跳出循环,不会更新计数器
嵌套多个continue break: 作用于上一层循环
-
go to语句
作用
终止深层嵌套
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 处理错误情况
-
练习
1 计算 n 的阶乘
// n!
#include <stdio.h>
int main()
{
int re = 1;
int n;
scanf("%d", &n);
for (int j = 1; j < (n+1); j++)
{
re = re * j;
}
printf("%d\n",re);
return 0;
}
2 计算 1!+ 2!+3!+4!+5!
// 1! + 2!+..+ 10!
#include <stdio.h>
int main()
{
int re = 1;
int n;
int sum = 0;
scanf("%d", &n);
for (int j = 1; j < (n + 1); j++)
{
re = re * j;
sum = sum + re;
}
printf("%d\n%d\n", re, sum);
return 0;
}
3 模拟用户登录,密码只能输入三次,密码正确后退出,错误三次后退出
方法一
//密码登录
#include <stdio.h>
int main()
{
int password = 12345;
int user_loadin;
int count = 0;
for (; count < 3; count++)
{
printf("请输入密码>>");
scanf("%d", &user_loadin);
if (user_loadin == password)
{
printf("登录成功!\n");
break;
}
else
{
printf("请重新登录\n");
if (count == 2)
{
printf("密码多次错误,请五分钟后再尝试\n");
}
}
}
return 0;
}
方法二
用strcmp来比较两个字符串是否相等,相等返回1;第一个大于第二个返回大于0的数;小于返回小于0的数;
数组名是数组的首地址
//密码登录
#include <stdio.h>
#include <string.h>
int main()
{
char password[20];
int count = 0;
for (; count < 3; count++)
{
printf("请输入密码>>");
scanf("%s", password);
if (strcmp("12345", password) == 0)
{
printf("登录成功!\n");
break;
}
else
{
printf("请重新登录\n");
if (count == 2)
{
printf("密码多次错误,请五分钟后再尝试\n");
}
}
}
return 0;
}
4 查找有序数组char arr[] = {1, 2, 3, 4....20}中的15所对应的下标
方法一
//查找
#include <stdio.h>
int main()
{
char arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
int se = sizeof(arr) / sizeof(arr[0]);
int aim_num = 15;
for (int n = 0; n < se; n++)
{
if (arr[n] == aim_num)
{
printf("%d\n", n);
break;
}
}
return 0;
}
方法二:用二分法来优化代码
//查找
//l_index 左下标
//r_index 右下标
//m_index 中间值的下标
#include <stdio.h>
int main()
{
char arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
int se = sizeof(arr) / sizeof(arr[0]);
int aim_num = 10;
int l_index = 0;
int r_index = se - 1;
for (; l_index <= r_index;)
{
int m_index = (l_index + r_index) / 2;
if (aim_num < arr[m_index])
r_index = m_index - 1;
else if (aim_num > arr[m_index])
l_index = m_index + 1;
else
{
printf("下标为 : %d\n", m_index);
break;
}
}
if (l_index > r_index)
{
printf("找不到目标数字\n");
}
return 0;
}
5 编写代码,演示多个字符从两端向中间汇聚
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "Hello, world!!!!!!";
char arr2[] = "******************";
int l = 0;
int r = strlen(arr1) - 1;
for (; l <= r;)
{
arr2[l] = arr1[l];
arr2[r] = arr1[r];
printf("%s\n", arr2);
l++;
r--;
}
return 0;
}
6 输入三个数,将三个数从大到小输出
// 三个数从大到小输出
#include <stdio.h>
int main()
{
int a;
int b;
int c;
int n;
int j;
int k;
scanf("%d%d%d", &a, &b, &c);
if (a < b)
{
n = b;
b = a;
a = n;
}
if (b < c)
{
j = c;
c = b;
b = j;
}
if (a < b)
{
k = a;
a = b;
b = k;
}
printf("%d %d %d\n", a, b, c);
return 0;
}
7 打印1-100之间3的倍数
// 1-100之间3的倍数
#include <stdio.h>
int main()
{
for (int i = 1; i < 101; i++)
{
if (i % 3 == 0)
printf("%d\n", i);
}
return 0;
}
8 输入两个数,求最大公约数
// 求两个数的最大公约数----辗转相除法
#include <stdio.h>
int main()
{
int a;
int b;
int re;
scanf("%d%d", &a, &b);
for (; a % b != 0;) //while(re = a % b)
{
re = a % b;
a = b;
b = re;
}
printf("%d\n", re);
return 0;
}
9 打印1000-2000年之间的闰年
// 1000-2000之间的闰年---能被4整除不能被100整除/能被400整除
#include <stdio.h>
int main()
{
int count = 0;
for (int year = 1000; year < 2001; year++)
{
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
{
printf("%d\n", year);
count++;
}
}
printf("%d\n", count);
return 0;
}
10 打印1-100之间的素数
方法一
// 1-100之间的素数----只能被1或本身整除
// 试除法
#include <stdio.h>
int main()
{
int g;
int count = 0;
for (int i = 0; i < 101; i++)
{
for (g = 2; g < i; g++)
{
if (i % g == 0)
break;
}
if (i == g || i < g)
{
printf("%d\n", i);
count++;
}
}
printf("素数:%d\n", count);
return 0;
}
方法二
// 1-100之间的素数----只能被1或本身整除
// 试除法
// a * b = i --------- a || b <= sqrt(i)
#include <stdio.h>
#include <math.h>
int main()
{
int g;
int count = 0;
for (int i = 1; i < 101; i += 2)
{
for (g = 2; g <= sqrt(i); g++)
{
if (i % g == 0)
break;
}
if (g > sqrt(i))
{
printf("%d\n", i);
count++;
}
}
printf("素数:%d\n", count);
return 0;
}
11 打印1-100中出现数字9的数,打印1-100中9出现的个数
// 1-100中出现多少个数字9
// 不是个位为9就是十位为9
// 所以判断条件为--------除以10,商为9或者余数为9的数
// 注意99里有两个9
#include <stdio.h>
int main()
{
int count = 0;
for (int i = 1; i < 101; i++)
{
if (i % 10 == 9)
{
printf("%d\n", i);
count++;
}
if(i / 10 == 9)
{
printf("%d\n", i);
count++;
}
}
printf("count : %d\n", count);
return 0;
}
12 分数求和
// 分数求和
// 1/1 - 1/2 + 1/3 - 1/4 + 1/5...+1/99 - 1/100
// 要得到浮点数, 必须保证除号两端有一个数是浮点数!!!!!!!!!
#include <stdio.h>
int main()
{
double sum = 0.0;
for (int i = 1, flag = 1; i < 101; i++, flag *= -1)
{
sum += flag * 1.0 / i;
}
// for (int i = 2; i < 101; i += 2)
// {
// sum -= 1.0/i;
// }
printf("%lf\n", sum);
return 0;
}
13 打印10个数的最大值
// 求十个整数中的最大值
// 注意⚠️设置max = arr[0], 避免max初始值恒大于所有元素
#include <stdio.h>
int main()
{
int arr[] = { -1,
-200,
-3,
-4,
-5,
-6,
-7,
-8,
-9,
-10 };
int max = arr[0];
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
if (max < arr[i])
{
max = arr[i];
}
}
printf("max = %d\n", max);
return 0;
}
14 打印乘法口诀表
// 打印乘法口诀表
// %-2d-----------2--打印两位,空格补满
// - 左对齐
// + 右对齐
#include <stdio.h>
int main()
{
int re;
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= i; j++)
{
re = i * j;
printf("%dX%d = %-2d ", i, j, re);
}
printf("\n");
}
return 0;
}