判断与循环
目录
判断与循环
1.If语句
含义:如果if语句判断成立,那么就执行if大括号里面的内容,如果不成立就跳过该括号里面的语句
语法:
if(条件){
}W
注意:
- 如果没有大括号,紧跟着if后面的语句条件成立的时候执行。
- IF语句后面要没有分号,分号放在语句结束后
关系运算:
| 运算符 | 意义 |
|---|---|
| == | 相等 |
| != | 不相等 |
| > | 大于 |
| >= | 大于或等于 |
| < | 小于 |
| <= | 小于等于 |
注意:
- 关系运算符的结果要么是0或者1
- 1代表true,0代表false
- 所有的关系符的优先级比算术运算符的低,但是比赋值运算符的高
- 判断是否相等的==和判断不相等的!=和其他运算符优先级要低,而连续的关系运算的关系是从左到右的
#include <stdio.h>
int main()
{
printf("%d \n",5==3); //0
printf("%d \n",5>3); //1
printf("%d \n",5<=3); //0
printf("%d \n",7<=4+3); //1
return 0;
}
#include <stdio.h>
int main()
{
int a =1;
int b =2;
printf("%d \n",5>3==5>4); //1
printf("%d \n",6>5>4); //0
printf("%d \n",a==b==3);//从左到右 结果为0
printf("%d \n",a==b>0); //结果为:1
return 0;
}
#include <stdio.h>
int main() {
//初始化
double price = 0;
double bill = 0;
printf("请输入金额:");
scanf("%f", &price);
printf("请输入票面:");
scanf("%f", &bill);
/* double change=bill-price;
if(change>0){
printf("用户余额不足\n");
}
else{
printf("应该找您:%f \n",change);
}
*/
//计算找零
if(bill>price) {
printf("用户余额不足\n");
} else {
printf("应该找您:%f\n",bill-price);
}
return 0;
}
1.1嵌套if else
示例:比较大小
#include <stdio.h>
int main()
{
int a,b,c;
printf("请输入三个整数:\n");
scanf("%d %d %d",&a,&b,&c);
int max =0;
if(a>b){
if(a>c){
max =a;
} else{
max =c;
}
}else{
if(b>c){
max =b;
}else{
max =c;
}
}
printf("The max is %d\n",max);
return 0;
}
#include <stdio.h>
int main() {
const int READY = 24 ;
int code =0;
int count = 0;
printf("请输入code和count的值:\n");
scanf("%d %d",&code,&count);
if(code ==READY) {
if (count <20) {
printf("一切正常\n");
} else {
printf("出现故障\n");
}
} else {
printf("继续等待\n");
}
return 0;
}
注意:
- else总是和最近的if匹配
- 在if或else后面总用{},即便只有一条if语句
1.2级联的if-else if
示例:分段函数
#include <stdio.h>
//级联的if-else if
int main() {
int x=0;
int fx=0;
printf("请输入x的值:\n");
scanf("%d",&x);
if(x<0) {
fx=-1;
} else if(x==0) {
fx=0;
} else {
fx=2*x;
}
printf("函数值为:%d",fx);
return 0;
}
注意:
- 在c语言当中,=不是表示等于的意思,==才是不要搞错了
- if只要()里面的值是零或者非零就会做事情
1.3 多路分支
switch语句
switch (控制表达式){
case 常量;
语句..
break;
case 常量;
语句..
break;
default:
语句...
}
#include <stdio.h>
int main()
{
const int MRN =2;
int type;
scanf("%d",&type);
switch(type){
//控制表达式(就是括号内的)只能是整形的表达式
case 1://常量也可以是常数,也可以是常数计算的表达式
printf("你好");
break;
case MRN:
printf("早上好");
break;
case 3:
printf("晚上好");
break;
case 4:
printf("再见");
break;
default:
printf("啊?什么啊?");
}
}
注意:
- 控制表达式(就是括号内的)只能是整形的表达式
- 常量也可以是常数,也可以是常数计算的表达式
- 如果case后面没有break,那么会执行到下个case里面去,直到遇到一个break,或者switch结束为止。
示例:
#include <stdio.h>
int main()
{
int score;
printf("请输入你的成绩:\n");
scanf("%d",&score);
score /=10;
switch( score ) {
case 10:
case 9:
printf("你的成绩为A\n");
break;
case 8:
printf("你的成绩为B\n");
break;
case 7:
printf("你的成绩为C\n");
break;
case 6:
printf("你的成绩为D\n");
break;
default:
printf("你的成绩为F\n");
break;
}
return 0;
}
2. 循环
2.1while循环
作用:如果条件成立,则执行循环体中的语句,直到运行到条件不成立
语法:
while(条件){
循环体
}
示例:
程序要读入一个四位数一下(含四位数)的正整数,然后输出这个整数的位数
#include <stdio.h>
用if来做
//程序要读入一个四位数一下(含四位数)的正整数,然后输出这个整数的位数
int main() {
int num1 = 1;
printf("请输入四位数以下(含四位数的正整数): \n");
scanf("%d",&num1);
if(num1>999) {
printf("您输入的是四位数\n");
} else if(num1>99) {
printf("您输入的是三位数\n");
} else if(num1>9) {
printf("您输入的是二位数\n");
}else{
printf("您输入的是一位数\n");
}
return 0;
}
#include <stdio.h>
int main()
{
int x;
int n=0;
printf("请输入正整数: \n");
scanf("%d",&x);
n++;
x/=10;
while(x>0){
n++;
x/=10;
}
printf("您输入的是%d位数\n",n);
return 0;
}
注意:
- 在循环体内要有改变条件的机会否则就成死循环了
2.1.1do while 循环
定义:在进入循环的时候不做检查,而是在执行完一轮循环体的代码之后,再来检查循环的条件是否满足,如果满足则进行下轮的循环,不满足则结束循环
语法:
do
{
<循环体语句>
}while(<循环条件>);
do-while和while的区别:
- do-while循环出来的时候判断,while先判断是否满足,再执行
- 即do-while无论满足都会执行一次
示例:
#include <stdio.h>
int main() {
int x;
int n=0;
printf("请输入正整数: \n");
scanf("%d",&x);
do {
x/=10;
n++;
printf("x=%d,n=%d\n",x,n);
} while(x>0);//while循环后面要有分号
printf("您输入的是%d位数\n",n);
return 0;
}
注意:
- while循环后面要有分号
2.1.2随机数
语法:rand(),预加载文件要加上#include <time.h>,在前面还要写个srand(time(0));
作用:每次召唤rand()就得到一个随机数的整数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//引入类库
int main()
{
srand(time(0));//暂时不知道什么意思
int a =rand();//生成一个随机数并赋值给a ,四位以内随机数
printf("%d\n",a%100);//a是一百一类的
return 0;
}
示例:
猜数游戏
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
////引入类库
int main() {
srand(time(0));
int num=rand()%100;//生成一个1~100的随机数
int a=0;//初始化变量
int count=0;//计数
do {
printf("请猜一个数(1~100):");
count++;
scanf("%d",&a); //获取a的值
if(a>num) {
printf("你猜的数太大了!\n");
} else if(a<num) {
printf("你猜的数太小了!\n");
}
} while(a!=num);
printf("太好了你猜对了,用了%d次,答案为:%d",count,num);
return 0;
}
算平均数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
////引入类库
int main() {
srand(time(0));
int num=rand()%100;//生成一个1~100的随机数
int a=0;//初始化变量
int count=0;//计数
do {
printf("请猜一个数(1~100):");
count++;
scanf("%d",&a); //获取a的值
if(a>num) {
printf("你猜的数太大了!\n");
} else if(a<num) {
printf("你猜的数太小了!\n");
}
} while(a!=num);
printf("太好了你猜对了,用了%d次,答案为:%d",count,num);
return 0;
}
整数数位的判断
分析:
- 对一个整数做10%的操作,就得到它的个位数;
- 对一个整数做/10的操作,就是去掉它的个位数;
- 然后再对2的结果做%10,就得到原来数的十位数了以此类推
案例:逆序整数
方法1:
#include <stdio.h>
int main() {
int x = 0; //接收输入的整数
printf("请输入一个正整数:\n");
scanf("%d",&x);
int dight =0;
//int ret=0;
//用于接收反转之后的整数
//先知道它的最后一位数
while(x>0) {
dight = x%10;
printf("%d",dight);
x/=10;//去掉最后一位数,目的:进入循环之后再%10得到倒数第二位数
}
return 0;
}
方法2:(700就只能倒序为7,不太推荐)
#include <stdio.h>
int main()
{
int x;
printf("请输入一位正整数:\n");
scanf("%d",&x);
int dight =0;
int ret = 0;
while(x>0){
dight =x%10; //获得最后一位的数
//printf("%d",dight);
ret =ret*10+dight;
//printf("x=%d,dight=%d,ret = %d \n",x,dight,ret);
x /=10; //去掉最后一位的数
}
printf("%d",ret);
return 0;
}
2.2for循环
作用:for循环像一个计数循环:设定一个计数器,初始化它,然后在计数器到达某值之前,重复执行循环体,而每执行一轮循环,计数器值以一定步步调整,不如加1或者减1,可以做其他的运算,不一定是加一或者减一
语法:
for(初始动作;条件;每一轮的动作){
循环体
}
- for中国的每一个表达式都可以省略
- for(;条件;) == while(条件)
示例:
for (count=10;count>0;count--)
- 翻译成中文就是:一开始count=10,当count>0时重复做循环体,没完成一次循环,使得count--
注意:
- 求和时,记录结果的最初变量应该初始化为0
- 求积时,记录结果的最初变量应该初始化为1
- 循环控制变量i之在循环里面被使用了,在循环外面他没有任何作用,因此,外面可以把变量i的定义写到for语句里面去
示例:
阶乘
#include <stdio.h>
int main() {
int n;
scanf("%d",&n);
int fact =1;
int i=1;
if(n==0) {
printf("0!=1\n");
} else {
for (i=2; i<=n; i++) {
fact *=i;
}
printf("%d!=%d\n",n,fact);
}
return 0;
}
反向乘
#include <stdio.h>
int main() {
int n;
scanf("%d",&n);
int fact =1;
// int i =1;
// for(int i=2;i<=n;i++){
// fact *=i;
// }
int i=1;
if(n==0) {
printf("0!=1\n");
} else {
for (i=n; i>1; i--) {
fact *=i;
}
printf("%d!=%d\n",n,fact);
}
return 0;
}
2.1循环控制
- break:跳出循环
- continue:跳过循环这一轮进入下一轮的语句进入下一轮
素数(break)
#include <stdio.h>
int main(){
int x;
scanf("%d",&x);
int i;
int isPrime =1; //x是素数
for(i=2; i<x; i++){
if(x %i==0){
isPrime =0;
break ;//跳出循环
}
}
if (isPrime ==1 ){
printf("是素数\n");
}else{
printf("不是素数\n");
}
return 0;
}
2.2循环的嵌套
含义:循环里面还是循环
- 一般来说:每一层用的控制变量是不一样的
计算前50个素数
#include <stdio.h>
int main() {
int x;
int cnt =0;
// for(x=1; cnt<50; x++) {
// 他的条件不一定要用x
x=1;
while(cnt<50){
int isPrime =1;
int i;
for(i=2; i<x; i++) {
if(x%i==0) {
isPrime =0;
break;
}
}
if(isPrime==1) {
cnt ++;
printf("%d\t",x);
if( cnt %5 ==0){
printf("\n");
}
}
x++;
}
return 0;
}
2.2.1从嵌套循环中跳出
- break和continue只能对它所在的那层循环做
第一种方法:在每个层for循环中加上break
#include <stdio.h>
int main() {
int x;
int one,two,five;
int exit=0;
x=2;
for(one=1; one < x*10; one++) {
for(two=1; two < x*10/2; two++) {
for(five=1; five < x*10/5; five++) {
if(one*1+two*2+five*5==x*10) {
printf("用%d个一角%d个两角和%d五角可以找零%d元 \n",one,two,five,x);
exit=1;
break;
//这个break只会结束内层的循环
}
}
if(exit)break;
}
if(exit) break;
}
return 0;
}
第二种方法:goto
#include <stdio.h>
int main() {
int x;
int one,two,five;
int exit=0;
x=2;
for(one=1; one < x*10; one++) {
for(two=1; two < x*10/2; two++) {
for(five=1; five < x*10/5; five++) {
if(one*1+two*2+five*5==x*10) {
printf("用%d个一角%d个两角和%d五角可以找零%d元 \n",one,two,five,x);
exit=1;
goto out;
//goto out; out为自己所写的标号:意思就是跳到写的out的那个位置上去
}
}
}
}
out;
return 0:
}
本章习题:
1.前n项求和
#include <stdio.h>
//f(x)=1+1/2+1/3...+1/n
int main()
{
int n;
int i;
double sum =0.0;
// scanf("%d",&n);
n=1000;
for(i=1;i<=n;i++){
sum+=1.0/i;
}
printf("f(%d)=%f \n",n,sum);
return 0;
}
#include <stdio.h>
//f(x)=1-1/2+1/3...+1/n
int main()
{
int n;
int i;
double sum =0.0;
// scanf("%d",&n);
double sign=1.0;
n=10000;
for(i=1;i<=n;i++){
sum+=sign*1/i;
sign=-sign;
}
printf("f(%d)=%f \n",n,sum);
return 0;
}
2.正序分解整数
错误案例:
#include <stdio.h>
int main()
{
int x=0;
scanf("%d",&x);
int t=0;
int dight=0;
/* x=123;
123/100=1
123%100=23
23/10=2
23%10=3
3/1=3
3%1=0
123%10=3 最后一位
123/10=12
12%10=2 最后两位
12/10=1
1%10=1
1/10=0
*/
while(x>0){
dight=x%10;//获取最后一位数
t=t*10+dight;
x/=10; //去掉最后一位
printf("x=%d,dight=%d,t=%d \n",x,dight,t);
}
x=t;//得到翻转之后的三位数
int dight2=0;
while(x>0){
dight2=x%10;//得到最后一位数
printf("%d",dight2);
if(x>=10){
printf(" ");
}
x/=10;
}
printf("\n");
return 0;
}
正解:
#include <stdio.h>
/*思路:
x=123;
123/100=1 //得到第一位
123%100=23 //去掉第一位
23/10=2 //得到第二位
23%10=3
3/1=3
3%1=0
*/
int main()
{
int x=10;
scanf("%d",&x);
int cnt=0;
int mask=1;
int t=x;
while(x>9){
x/=10;
//去掉最后一位
mask *=10;
//让mask可以符合循环条件进行后面的操作
cnt++;
}
//printf("mask=%d\n",mask);
//用函数pow,算出
//int mask =pow(10,cnt-1);
x=t;
do{
int d=x/mask; //得到第一位数
printf("%d",d);
if(mask>9){
printf(" ");
}
x%=mask; //去掉第一位
mask /=10;
//printf("x=%d,mask=%d,d=%d\n",x,mask,d);
}while(mask>0);
printf("\n");
return 0;
}
3.最大公约数
方法一:枚举法
#include <stdio.h>
//枚举法
int main() {
int i;
scanf("%d",&i);
int j ;
scanf("%d",&j);
int min;
if(i>j) {
min=j;
} else {
min=i;
}
int t=1;
int ret=0;
for(t=1; t<=min; t++) {
if(i%t==0) {
if(j%t==0) {
ret=t;
}
}
}
printf("最大公约数:%d",ret);
return 0;
}
方法2:辗转法
#include <stdio.h>
//枚举
/*如果b等于0,计算结束,a就是最大公约数;
否则,计算a除以b的余数,让a等于b,而b等于那个余数;
回到第一步. */
int main() {
int a,b;
scanf("%d %d",&a,&b);
int t=0;
while(b!=0){
t=a%b;
a=b;
b=t;
}
printf("最大公约数:%d",a);
}
4.水仙花
#include <stdio.h>
//输出所有的“水仙花数”,所谓的“水仙花数”是指一个N位数其各位数字的N次幂和等于该数本身,
//例如153是“水仙花数”,因为:153 = 13 + 53 + 33。
int main() {
int n;
scanf("%d",&n);
int first=1;
int i=1;
//得到n位最小的整数
while(i<n) {
first *=10;
i++;
}
i=first;
//进行遍历
while(i<first*10) {
int t= i;
int sum = 0;
//分解 t的值
while(t>0) {
int d = t%10;
t/=10;
//拿t的值算出n的幂次方
int p =1;
int j =0;
while(j<n) {
p*=d;
j++;
}
// 把所有 算的p加起来
sum += p;
}
if(sum== i){
printf("%d \n",i);
}
i++;
}
return 0;
}
5.给定条件的整数的整数集
#include <stdio.h>
int main(){
int x;
printf("请输入一个6以内的数(不包含6):\n");
scanf("%d",&x);
int i,j,k;
int max=x+3;
int count=0;
for(i=x;i<=max;i++){
for(j=x;j<=max;j++){
for(k=x;k<=max;k++){
if(i!=j){
if(i!=k){
if(j!=k){
printf("%d%d%d",i,j,k);
count++;
if(count==6){
printf("\n");
count=0;
}else{
printf(" ");
}
}
}
}
}
}
}
return 0;
}
6.九九乘法表
#include <stdio.h>
int main() {
int i,j;
for(i=1;i<=9;i++){
for(j=1;j<=i;j++){
printf("%d*%d=%d",j,i,i*j);
if(i*j<10){
printf(" ");
}else{
printf(" ");
}
}
printf("\n");
}
return 0;
}
7.打印M-N区间内的素数
#include <stdio.h>
int main() {
int m,n;
scanf("%d %d",&m,&n);
int i,k;
int sum=0;
int cnt=0;
if (m==1)m=2;
for(i=m; i<=n; i++) {
int isPrime=1;
for(k=2; k<i; k++) {
if(i%k==0) {
isPrime=0;
break;
}
}
if(isPrime) {
cnt++;
sum+=i;
}
}
printf("%d %d",cnt,sum);
return 0;
}
8.n项求和
#include <stdio.h>
//计算前n项的和,2/1+3/2+5/3+8/5...的前n项和
//注意改序列从第二项起,每一项的分子都是前一项分子和分母的和,分母是前一项的分子
int main()
{
int n;
scanf("%d",&n);
int cnt=1;
double sum=0.0;
double a=2;//a分子
double b=1;//b分母
int i;
double t;
for(i=1;i<=n;i++){
sum +=a/b;
t=a;
a=t+b;
b=t;
}
printf("%.2f\n",sum);
return 0;
}
9.约分最简分式
#include <stdio.h>
int main()
{
int a,b;
scanf("%d %d",&a,&b);
int c=b;
while(b!=0){
int t=0;
t= a%b;
a=b;
b=t;
}
printf("最简形式为:%d/%d",a,b);
return 0;
}
总结
各种循环应用场景
- 如果有固定的次数,就用for
- 如果必须执行一次,用do_while
- 其他情况用while

浙公网安备 33010602011771号