重复执行的语句(循环语句)可以多次执行其他语句,它检查一个逻辑条件是否满足,只在满足的时候执行它的循环体。
while语句:
while语句是一个循环语句,它会首先判断一个条件是否满足,如果条件满足,则执行后面紧跟着的语句或语句括号,然后再次判断条件是否满足,如果条件满足则再次执行,直到条件不满足为止。后面紧跟的语句或语句括号,就是循环体。
int count;
int sum = 1;
printf("请输入一个整数:");
scanf("%d",&count);
while (count / 10 >=1)
{
sum++;
count /=10;
}
printf("这个数是%d位数。\n", sum);
do-while语句:
do-while循环和while循环很像,唯一的区别是我们在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少一遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。
int count;
int sum = 0;
printf("请输入一个整数:");
scanf("%d",&count);
do
{
sum++;
count /= 10;
} while (count >= 1);
printf("这个数是%d位数。\n", sum);
for循环语句
for循环像一个计数循环:设定一个计数器,初始化它,然后在计数器到达某值之前,重复执行循环体,而每一轮循环体,计数器以一定步骤进行调整,比如+1或者-1。
注:中间用分号隔开。
int n, i;
printf("请输入你要求的数:");
scanf("%d", &n);
int sum = 1;
for (i = 1; i <= n;i++)
{
sum *= i;
}
printf("这个数的阶乘为%d。\n", sum);
for(初始动作;循环条件;每轮的动作)
{
……
}
- for中的每个表达式都是可以省略的
for(;条件;)==while(条件)
循环语句的选择
- 如果有固定次数,用for;
- 如果必须执行一次,用do_while;
- 其余情况用while.
逻辑类型和运算
bool类型需要首先定义头文件#include<stdbool.h>,之后就能使用bool类型和ture和false.
1、逻辑运算
对逻辑量进行的运算,结果只有0或1.
ex:1、如何表达区间x∈(5,9)?
x>5&&x<9
2、如何判断一个字符c是否是大写字母?
c>='A'&&c<='Z'
短路:逻辑运算是按照从左往右的顺序进行的,如果左侧的结果已经可以决定结果了,就不会做右侧的计算。(不把赋值组合进逻辑表达式)
2、条件运算符
ex:count=(count>20)?count-10:count+10;
条件?条件满足时的值:条件不满足时的值;就等价于
注:优先级高于赋值运算符,低于其他运算符。
3、逗号运算符
逗号是用来连接两个表达式的,并且以右边的值作为逗号运算的结果。
主要用涂:在for语句中使用:
for(i=0,j=10;i<j;i++,j--)
int i; i=3+4,5+6; //i=7 i=(3+4,5+6); //i=11
级联和嵌套的判断
1、嵌套的判断:当if语句的结果满足或者不满足时,要执行的语句也可以是一条if或else语句
int a, b, c, max; printf("请输入要比较的三个数:"); scanf("%d %d %d", &a, &b, &c); if (a > b) { if (a > c) { max = a; } else { max = c; } } else { if (b > c) { max = b; } else { max = c; } } printf("最大的数为:%d\n", max);
注:编译器不主动识别缩进,因此没有大括号,else总是和最近的if匹配
2、级联的判断:if-else if
switch-case语句(多路分支)
1、控制表达式只能是整数型的结果;
2、常量可以是常数,也可以是常数计算的表达式;
3、break:跳出循环,如果没有就会顺序执行下一条语句。
实例练习:
1、用户输入一系列正整数,最后输入-1表示输入结束,然后计算这些数据的平均数,输出输入数字的个数和平均数。
int i;
int sum = 0;
int n = 0;
double average;
scanf("%d\n", &i);
while (i != -1) {
sum += i;
n++;
scanf("%d\n", &i);
}
average = sum / n;
printf("平均数=%f\n", average);
return 0;
2、猜数游戏
计算机想一个数,然后让用户来猜,用户每输入一个数就告诉用户猜大了还是小了,直到猜对为止,并且告诉用户猜了多少次。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int Guess, Num; //Guess猜数,Num随机数
int n=1;
int Next; //下一次执行
do
{
system("cls"); //清屏
printf("-------------------------------------\n");
srand(time(NULL));
Num = rand() % 100 + 1; //随机生成1-100数字
printf("请猜猜1-100内的数字:\n");
scanf("%d", &Guess);
while (Guess != Num)
{
//scanf用于继续猜数判断
if (Guess > Num)
{
printf("猜大啦.\n");
scanf("%d", &Guess);
n++;
}
if (Guess < Num)
{
printf("猜小啦.\n");
scanf("%d", &Guess);
n++;
}
}
printf("恭喜你猜对啦!您一共猜了%d次。\n",n);
printf("想不想再猜一猜?Y/y或N/n\n");
getchar(); //输入是否继续执行字符y/n
printf("-------------------------------------\n");
Next = getchar(); //赋值
} while (Next == 'Y' || Next == 'y'); //判断下次是否执行
printf("程序已退出...\n");
return 0;
}
3、整数逆序
输入一个整数,逆序输出该数并且统计这是一个几位数:
#include<stdio.h>
int main()
{
int number, ret;
int n = 0;
scanf("%d", &number);
while (number > 0) {
ret = number % 10; //对10取余得到个位数
printf("%d", ret);
number /= 10; //除以10取整去除个位数
n++;
}
printf("\n");
printf("这个数是%d位数", n);
return 0;
}
4、求和:f(n)=1-1/2+1/3-1/4……+1/n;
#include<stdio.h>
int main()
{
int n;
double sum = 0;
double sign = 1.0;
scanf("%d",&n);
for (int i = 1;i <= n;i++) {
sum += sign/ i;
sign = -sign;
}
printf("f(%d)=%f\n",n, sum);
}
5、求最大公约数
输入两个数a和b,输出他们的最大公约数;
法一:枚举法
#include<stdio.h>
int main()
{
int a, b;
int ret = 0;
scanf("%d %d",&a, &b);
for (int i = 1;i <= a && i <= b;i++) {
if (a % i == 0 && b % i == 0)
ret = i;
}
printf("%d和%d的最大公约是是%d\n", a, b, ret);
}
法二:辗转相除法
如果b=0,计算结束,a就是最大公约数;
否则,计算a/b的余数,令a=b,b=余数;
回到第一步。
#include<stdio.h>
int main()
{
int a, b;
int ret = 0;
scanf("%d %d",&a,&b);
int t;
while(b!=0){
t=a% b;
a = b;
b = t;
}
printf("最大公约是是%d\n", a);
}
6、正序分解整数
输入一个正整数,正序输出每一位。
#include<stdio.h>
int main()
{
int x;
scanf("%d", &x);
//最高位数计量单位判断
int t = x;
int mask = 1;
while (t>9) {
t /= 10;
mask*= 10;
}
//正序分解输出
do {
int d = x / mask;
printf("%d", d);
if (mask > 9) { //通过判断,除最后一位数之外,其余中间留空格
printf(" ");
}
x %= mask;
mask /= 10;
} while (mask > 0);
}
循环控制break&continue语句
break:跳出循环
continue:跳后续循环体,继续循环
ex:判断素数:给出一个数,判断这个数是否是素数。
#include<stdio.h> int main() { int x; int isprime = 1; scanf("%d", &x); for (int i = 2;i < x;i++) { if (x % i == 0) { isprime = 0; break; } } if (isprime == 0) { printf("不是素数"); } else { printf("是素数"); } }
#include<stdio.h> int main() { int x; int isprime = 1; scanf("%d", &x); for (int i = 2;i < x;i++) { if (x % i == 0) { isprime = 0; continue; } printf("%d\n", i); } if (isprime == 0) { printf("不是素数"); } else { printf("是素数"); } }
for循环是高级语言出现的第一种循环,它和现代的程序设计理念是否存在差距?为什么Python语言就没有C语言这种形式的for循环了?
for循环不符合人类的语言逻辑,并不易于理解,因此就造成了第一次接触语言的人难以理解for循环所表达的意思。而现代程序设计理念更强调与人类语言的逻辑统一性而非编译逻辑故此在新兴的python语言中祛除掉了C中的for循环逻辑。但由于for循环抽象程度高,所以在掌握语言基础后,其表现逻辑更为简洁易于回溯反而更方便使用。为什么Python语言就没有C语言这种形式的for循环了,查到一个原因是Python里没有累加器。