带你学C带你飞(3)

小甲鱼C语言系列课程笔记,共61个视频,每6个视频总结一次笔记,预计10篇。

https://www.bilibili.com/video/BV17s411N78s

while语句和dowhile语句

while语句

计算1+2+3+…+100

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

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

while (i <= 100)
{
sum = sum + i;
i = i + 1;
}

printf("1+2+3+...+100 = %d\n", sum);
return 0;
}

统计从键盘输入的一行英文句子的字符个数

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int main()
{
int count = 0;
printf("Please enter:");
while (getchar() != '\n')
{
count = count + 1;
}
printf("结果是%d\n", count);
return 0;
}

dowhile语句

注意格式,while后面有分号

1
2
3
do
循环体
while (表达式);

for语句和循环嵌套

1
2
for (表达式1; 表达式2; 表达式3)
循环体
  • 表达式1:循环初始化表达式
  • 表达式2:循环条件表达式
  • 表达式3:循环调整表达式

打印10次 I love fishc.com

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

// 打印10次I love fishc.com
int main()
{
int i;
for (i = 0; i < 10; i++)
{
printf("I love fishc.com\n");
}
return 0;
}

判断一个数是否为素数

(小甲鱼)测试从 2num / 2 所有整数是否能被整除,如果没有出现能被整除的整数,则 num 为素数。

(百度)测试从 2sqrt(n) 所有整数是否能被整除,如果没有出现能被整除的整数,则 num 为素数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <math.h>

int main()
{
int num;
_Bool isPrime = 1; //布尔值,1是质数,0不是质数
printf("Please enter a number(>=2): ");
scanf("%d", &num);
for (int i = 2; i < (int)sqrt(num) + 1; i++) //从2到sqrt(n)之间是否有整数能被整除,如果有则不是质数
{
if (num % i == 0)
{
isPrime = 0;
}
}

if (isPrime)
{
printf("%d is a prime number.\n", num);
}
else
{
printf("%d is not a prime number.\n", num);
}
return 0;
}

灵活修改

for语句的表达式可以根据需要省略,但是 ; 必须留下。

C99新标准

允许在for语句表达式1中,定义变量(如上述程序)。

1
2
3
4
for (int i = 0; i <= 10; i++)
等价于
int i;
for (i = 0; i <= 10; i++)

循环嵌套

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main()
{
int i, j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("i = %d, j = %d\n", i, j);
}
}

return 0;
}

运行结果

打印99乘法表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main()
{
int i, j;
for (j = 1; j <= 9; j++)
{
for (i = 1; i <= j; i++)
{
printf("%dx%d=%d\t", i, j, i * j);
}
printf("\n");
}
return 0;
}

运行结果:

break语句和continue语句

break语句

使用break语句可以跳出循环,减少运算次数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>

int main()
{
long long int i, num;
_Bool flag = 1;

printf("请输入一个整数:");
scanf("%lld", &num);

for (i = 2; i < num / 2; i++)
{
if (num % i == 0)
{
flag = 0;
break;
}
}
if (flag)
{
printf("%lld是一个素数\n", num);
}
else
{
printf("%lld不是一个素数\n", num);
}
printf("i = %lld\n", i);
return 0;
}

break语句只能跳出它所在的那一层循环,不能跳出外层循环。

continue语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

// 凡是大写字母C都当做看不见
int main()
{
int ch;
while ((ch = getchar()) != '\n')
{
if (ch == 'C')
{
continue;
}
putchar(ch);
}
putchar('\n');

return 0;
}

运行结果

continue语句只能跳过一次它所在的那一层循环,不能跳过外层循环。

将如下程序改成等价的while语句形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

int main()
{
int i;
for (i = 0; i < 100; i++)
{
if (i % 2)
{
continue;
}
}
return 0;
}

修改后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main()
{
int i = 0;
while (i < 100)
{
if (i % 2)
{
continue;
}
i++;
}
return 0;
}

问题出在:while循环执行完continue后,不会再执行i++,而是直接再次循环,因此形成死循环。

拾遗

赋值运算符

赋值运算符的左边必须是lvalue,变量名就是lvalue

复合赋值运算符

赋值 简写
a = a + 1 a += 1
a = a - 2 a -= 2
a = a * 3 a *= 3
a = a / 4 a /= 4
a = a % 5 a %= 5

自增自减运算符

i = i + 1 => i++ ++i
i = i - 1 => i-- --i

i++++i的区别:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int main()
{
int i = 5, j;
j = ++i;
printf("i = %d, j = %d\n", i, j);

i = 5;
j = i++;
printf("i = %d, j = %d\n", i, j);
return 0;
}

运行结果: