1.bool 类型
定义bool类型之前需要导入#include <stdbool.h>
#include <stdio.h> #include <stdbool.h> int main() { bool b=6>5; bool t=true; printf("%d ",b); //仍然是整数形式输出 得到1 return 0; }
2.逻辑运算
非! 或|| 和&& x>4 && x<6 !age<20 永远成立,!age=0或1 优先级顺序 ! && ||
赋值运算等级最低
// 短路 逻辑运算时从左向右的,左边已经可以觉得结果了,右边就不做了
//条件运算符 m<n? x:a+5 表示m<n 则 取x, 否则为a+5 ,这种表达式少用,会搞错 !!
//逗号 等级最低的
#include <stdio.h> #include <stdbool.h> int main() { int i=3+4, 5+6; //出错了 为什么 printf("%d ",i); //7 int j=(3+4,5+6); // 正确 printf("%d ",j); //11 return 0; }
逗号什么用? 主要在for 中使用,可以放多个计算. for(i=0,j=10;i<j:i++,j--)...
3.分段函数
#include <stdio.h> int main() { int x=10; int f=0; if (x<0){ f=-1; } else if(x==0){ f=0; } else{ f=2*x; }
printf("%d ",f); //20 return 0; }
if else 后面只有一个执行语句的话,可以不加{}
#include <stdio.h> int main() { int x=10; int f=0; if (x<0) f=-1; else if(x==0) f=0; else f=2*x; printf("%d ",f); //20 return 0; }
4.switch
为什么已经有了if 还需要用switch?
#include <stdio.h> int main() { int type; scanf("%d",&type); if (type==1) printf("nihao"); else if(type==2) printf("zaoshanghao"); else if(type==3) printf("wanshanghao") ; else printf("no") ; // 上述当type=4 需要一个一个判别过来,不太好 ,因此引入switch return 0; }
用switch() {case 1:...; break; case 2:... ;break;...default:...;break;}
#include <stdio.h> int main() { int type; scanf("%d",&type); switch(type){ case 10: //tpye=10 就直接做这个, printf("nihao"); break; //一定要有break, 阻止语句往下执行 case 20: printf("zaoshanghao"); break; case 30: //tpye=30 就直接做这个,不用判别前面两种了 printf("wanshanghao"); break; default: printf("no"); return 0; }
注意: switch 只能用整数型, type不能是double!
#include <stdio.h> int main() { //成绩转化 int grade; scanf("%d",&grade) ; grade/=10; switch(grade){ case 10: case 9: printf("A "); break; case 8: printf("B "); break; case 7: printf("C "); break; case 6: printf("D "); break; default: printf("F "); break; } return 0; }
5.简单小例子
#include <stdio.h> int main() { // 计算log2的整数部分 int x; int ret=0; scanf("%d",&x); int t=x; while(x>1){ x/=2; ret++; } printf("log2 of %d is %d ",t,ret); return 0; }
12
log2 of 12 is 3
求平均数,输入数字, 以-1 结束,求出-1之前的平均数
#include <stdio.h> int main() { int num; int sum=0; int count=0; scanf("%d",&num); while(num!=-1){ sum+=num; count++; scanf("%d",&num); } printf("%f ",1.0*sum/count); return 0; }
猜数字游戏 (1-100) 过程中需要提示:大了 小了,记录猜数字次数.
#include <stdio.h> #include <stdlib.h> //rand 可以用了 #include <time.h> int main() { srand(time(0)); //让随机数能够像随机数一样 int num=rand()%100+1; //产生一个1-100之间的随机数 int a=0; int count=0; //猜数次数 printf("我已经想好了一个1到100内的数 "); do{ printf("please guess a number: "); scanf("%d",&a); count++; //无论对错都算一次 if (a>num) printf("大了"); else if (a<num) printf ("小了"); }while(a!=num); printf("bingo!,你用了%d次就成功了 ",count); return 0; }
数字逆序输出 ,整数x逆序 作用x%10 得到个位数 x/10 去掉个位数,
#include <stdio.h> int main() { int x=500; int t=x; int num; int ret=0; while(x>0){ num=x%10; ret=ret*10+num; x/=10; } printf("the reverse of %d is %d ",t,ret); return 0; }
the reverse of 500 is 5 , 没有得到005 有缺陷!
注意:容易出错的地方, if后面没有加{} 如果执行语句只有一句,可以不加,有多句一定要{} .
if() 后面不用加; 否则if 直接结束了,执行后面语句
#include <stdio.h> int main() { int age=50; if (age>60); //加了; { printf("can be treat carefully"); } return 0; }
得到:
can be treat carefully 这个结果就是 if 在不执行设么就直接结束了,进入printf 语句
好的风格的代码.
#include <stdio.h> int main() { int x=10; int f=0; if (x<0) { f=-1; } else if (x==0) { f=0; } else { f=2*x; } return 0; }
上述优点在于如要注释几行不会影响其他行. 特别是{ }最会受注释行的影响.
//判断素数
#include <stdio.h> int main() { int x; scanf("%d",&x); int i; int isprime=1; for(i=2;i<x;i++) { if(x%i==0) { isprime=0; // break; break也可以放在外面 } break; } if(isprime==0) printf("不是素数"); else printf("是素数"); return 0; }
13
是素数
//输出30以内的素数 双重循环
#include <stdio.h> int main() { int x; for(x=2;x<30;x++) { int i; int isprime=1; for(i=2;i<x;i++) { if(x%i==0) { isprime=0; } break; } if(isprime==1) printf("%d ",x); } return 0; }
2 3 5 7 9 11 13 15 17 19 21 23 25 27 29
// 输出前20个素数
#include <stdio.h> int main() { int x=2; int cnt=0; while(cnt<20) { int i; int isprime=1; for(i=2;i<x;i++) //x还是会输出2的 { if(x%i==0) { isprime=0; } break; } if(isprime==1) { printf("%d ",x); cnt++; } x++; } return 0; }
2 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
//另一种方法, 不用while, 用for
#include <stdio.h> int main() { int x; int cnt=0; for(x=2;cnt<20;x++) { int i; int isprime=1; for(i=2;i<x;i++) //x还是会输出2的, 但是只有一次循环 { if(x%i==0) { isprime=0; } break; } if(isprime==1) { printf("%d ",x); cnt++; } } return 0; }
//凑硬币 1 2 5元 凑成100元以下的金额 (输出第一个符合条件的即可) 三重循环
#include <stdio.h> int main() { int x; int one ,two,five; int exit=0; scanf("%d",&x); for (one=1;one<x;one++){ for (two=1;two<x/2;two++){ for(five=1;five<x/5;five++){ if(one+2*two+five*5==x){ printf("用%d个一元 %d个两元 %d个五元得到%d元 ", one,two,five,x); exit=1; break; //只能结束当前循环,如何跳出三个循环 ?增加exit变量 接力break } } if (exit==1)break; } if (exit==1)break; } }
23
用1个一元 6个两元 2个五元得到23元
//上述称为接力break, 还有一种方法 用goto, 可以免去写很多个break
#include <stdio.h> int main() { int x; int one,two,five; scanf("%d",&x); for (one=1;one<x;one++) { for (two=1;two<x/2;two++) { for(five=1;five<x/5;five++){ if(one+2*two+five*5==x){ goto out; //后面定out的位置 } } } } out: printf("用%d个一元%d个两元 %d个五元得到%d元 ",one,two,five,x); }
12
用1个一元3个两元 1个五元得到12元
//求和 1+1/2+1/3+1/4...+1/n
#include <stdio.h> int main() { int n; int i; double sum=0.0; scanf("%d",&n); for(i=1;i<=n;i++){ sum+=1.0/i; } printf("f(%d)=%f ",n,sum) ; }
10
f(10)=2.928968
//求和 1-1/2+1/3-1/4...+(-1)^(n-1)*1/n, 增加sign符号
#include <stdio.h> int main() { int n; int i; int sign=1; double sum=0.0; scanf("%d",&n); for(i=1;i<=n;i++){ sum+=sign*1.0/i; sign=-sign; } printf("f(%d)=%f ",n,sum) ; }
4
f(4)=0.583333
//求两个数的最大公约数
方法1: 先找到两数的较小者min , 循环 i=1:min找公因子, 循环结束得到的就是最后一个(最大公因数)
#include <stdio.h> int main() { int a,b; int min ; scanf("%d %d",&a,&b); if (a<b){ min=a; } else{ min=b; } int ret=0; int i; for(i=1;i<min;i++){ if (a%i==0 && b%i==0){ ret=i; } } printf("%d and %d 的最大公约数是%d",a,b,ret); }
10 25
10 and 25 的最大公约数是5
//方法2: 辗转相除法 a=12, b=18 ,t记录a%b 然后a=b, b=t, 继续做下去
思路:
// a b t
//12 18 12
//18 12 6
//12 6 0
//6 0 b是0的时候结束, 此时a是最小公约数
#include <stdio.h> int main() { int a,b; int t; scanf("%d %d",&a,&b) ; while(b!=0){ t=a%b; a=b; b=t; } printf("gcd=%d ",a); }
//正序分解整数 12345 输出 1 2 3 4 5
//先回顾逆序输出... x%10 得到最后一个数字. x/10去掉最后一个数
#include <stdio.h> int main() { int x; scanf("%d",&x); //x=12345; do{ int d=x%10; //得到个数数字 printf("%d ",d); x/=10; } while(x>0); }
1200
0 0 2 1
// 正序可以通过逆序两次得到
#include <stdio.h> int main() { int x; int t=0; scanf("%d",&x); //x=12345; do{ int d=x%10; //得到个数数字 t=t*10+d; x/=10; } while(x>0); printf("t=%d ",t); x=t; do{ int d=x%10; //得到个数数字 printf("%d ",d); x/=10; } while(x>0); }
1329
t=9231
1 3 2 9
但是输入600 得到的 t=6 最后结果也是6 不是 006,修改思路如下
// 思路 : x=1234
//1234/1000 1 ..
//1234%1000 234
//1000/10 100
//234/100 2. ..
//234%100 34
//100/10 10
//34/10 3. ..
//34%10 4
//10/10 1
//4/1 4 ...
//4%1 0
//1/10 0
#include <stdio.h> #include<math.h> int main() { int x; scanf("%d",&x); int t=x; int cnt=0; //计算位数 do{ x/=10; cnt++; } while(x>0); printf("%d ",cnt); int m=pow(10,cnt-1);// pow没有定义?? 增加#include<math.h> printf("%d ",m); x=t; do{ int d=x/m; printf("%d ",d); x%=m; m/=10; }while(m>0); }
123
3
100
1 2 3
上述没必要用pow求
#include <stdio.h> #include<math.h> int main() { int x; scanf("%d",&x); int m=1; int t=x; while(x>9){ x/=10; m*=10; } x=t; do{ int d=x/m; printf("%d ",d); x%=m; m/=10; }while(m>0); }