C语言(复习)
用的是Devc++编辑器
指针
#include<stdio.h> //函数声明 void f(int *p); int main(){ //这次必须学会 int a=7; printf("a的地址是:%p\n",&a); printf("a的值是:%d\n",a); int *x=&a; printf("地址%p\n",x); printf("值%d\n",*x); } //int* 就是指针类型 //可以int* p 可以int *p *p是一个参数,用来接受地址值 //建议用 int *p , *p 表示的是地址 //指针总结: //定义指针: int *p; //用 p 来访问地址 用 *p来访问值 //指针地址访问: printf("指针访问,这里是地址:%p",p); //指针值的访问 prinf("指针值的访问,这里是值:%d",*p); void f(int* p){ printf("p的地址是:%p\n",p); //*p 是一个整数 通过*p可以修改值 printf("*p=%d\n",*p); *p=56; } //交换两个变量 void swap(int *pa,int *pb){ int temp= *pa; *pa = *pb; *pb =temp; }
变量
变量定义注意事项
标识符:字母 数字 下划线组成 第一个不能是数字 _change 正确 c99之后可以在任何地方定义变量
赋值
int change=100-price;
读数
scanf()函数 scanf("%d",&price); scanf("%d %d",&a,&b); scanf("%d,%d",&a,&b);
常量
const 变量锁定 const int AMOUNT=100;
整数做除法运算注意点
整数做运算 会丢掉小数部分 int a=10,b; int c=a/3; printf("c的结果:%d",c); 浮点数做运算 int a=10,b; double c=1.0*a/3; printf("c的结果:%f",c);
练习
//计算时间差 int h1,m1; int h2,m2; printf("输入时间h1,m1:\n"); scanf("%d %d",&h1,&m1); printf("输入时间h2,m2:\n"); scanf("%d %d",&h2,&m2); int t1=h1*60+m1; int t2=h2*60+m2; int t=t2-t1; printf("时间差是%d时%d分",t/60,t%60); return 0; //求平均数 int a,b; scanf("%d %d",&a,&b); double c=(a+b)/2.0; printf("%d和%d的平均数是%.2f",a,b,c); return 0; //交换两个变量的值 int a=5; int b=6; printf("交换a,b的值:\n"); int temp=a; a=b; b=temp; printf("a的值:%d\n",a); printf("b的值:%d\n",b); return 0; // ++a和a++的区别: // ++a;和a++;单独放在一行是没有区别的 都是加1 // int c=a++; c是a+1之前的值 // int c=++a; c是a+1之后的值 int a=5; int c=++a; printf("a的值:%d\n",a); printf("c的值:%d\n",c); return 0; //整数四则运算 int a,b; printf("请输入a,b的值:\n"); scanf("%d %d",&a,&b); printf("%d + %d = %d\n",a,b,a+b); printf("%d - %d = %d\n",a,b,a-b); printf("%d * %d = %d\n",a,b,a*b); printf("%d / %d = %d\n",a,b,a/b); return 0; //拿数 int a=1180; printf("前两个数:%d\n",a/100); printf("后两个数:%d\n",a%100); return 0; //计算时间差2 int h1,m1; int h2,m2; printf("输入时间h1,m1:\n"); scanf("%d %d",&h1,&m1); printf("输入时间h2,m2:\n"); scanf("%d %d",&h2,&m2); int h=h2-h1; int m=m2-m1; if(m<0){ m+=60; h--; } printf("时间差是%d时%d分",h,m); return 0; //判断真假 //是c99的注释 //为真 1 为假 0 printf("%d\n",7>=3); printf("%d\n",1==0); return 0; //找零计算机 //初始化 int price = 0;//商品的价格 int bill = 0; //票面的价格 printf("请输入商品的价格:\n"); scanf("%d",&price); printf("请输入票面:\n"); scanf("%d",&bill); if(bill>=price){ printf("找您%d钱\n",bill-price); }else{ printf("你的钱不够\n"); } return 0; //比较两个数的大小 int a=5; int b=6; int max=a>b?a:b; printf("%d和%d中,最大的那个数是:%d\n",a,b,max); return 0; //比较三个数的大小 int a=5; int b=6; int c=7; int max_1=a>b?a:b; int max=max_1>c?max_1:c; printf("%d,%d,%d中,最大的那个数是:%d\n",a,b,c,max); return 0; // switch case default 语法 // switch 只能放int类型 int day=1; switch(day){ case 1: printf("你好,今天是星期一\n"); break; case 2: printf("你好,今天是星期二\n"); break; case 3: printf("你好,今天是星期三\n"); break; case 4: printf("你好,今天是星期四\n"); break; case 5: printf("你好,今天是星期五\n"); break; case 6: printf("你好,今天是星期六\n"); break; case 7: printf("你好,今天是星期天\n"); break; default: printf("输入错误了哦\n"); } return 0; // 数数几位数 int a=123; int count=0; //方法 不断的划掉最右边的数字 count++; a=a/10; while(a>0){ count++; a=a/10; } printf("几位数:%d",count); return 0; //猜数 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ srand(time(0)); int number=rand()%100+1; int count=0; int a=0; printf("我已经想好了一个1-100之间的数.\n"); do{ printf("请你猜一个数:"); scanf("%d",&a); count++; if(a>number){ printf("你猜大了\n"); } else if(a<number){ printf("你猜小了\n"); } }while(a!=number); printf("太好了,你用了%d次就猜到了答案.\n",count); return 0; } //算平均数 int number; int sum=0; int count=0; do{ scanf("%d",&number); if(number!=-1){ sum+=number; count++; } } while(number!=-1); printf("%.2f",1.0*sum/count); return 0; //算平均数(改进版) int number; int sum=0; int count=0; scanf("%d",&number); while(number!=-1){ sum+=number; count++; scanf("%d",&number); } printf("%.2f",1.0*sum/count); return 0; //整数求逆 700-->7 int x=700; int digit; int res=0; while(x>0){ digit=x%10; res=res*10+digit; x=x/10; } printf("%d",res); return 0; //整数求逆 700-->007 int x=700; int digit; int res=0; while(x>0){ digit=x%10; printf("%d",digit); res=res*10+digit; x=x/10; } return 0; //求阶乘 int n=4; int res=1; int i=1; for(i=2;i<=n;i++){ res*=i; } printf("%d",res); return 0; //求阶乘 int n=4; int res=1; int i=1; for(i=n;i>=2;i--){ res*=i; } printf("%d",res); return 0; //求阶乘 int n=4; int res=1; int i=n; for(;n>=2;n--){ res*=n; } printf("%d",res); return 0; //判断素数 int n=6; int isprime=1;//默认是素数 int i; for(i=2;i<n;i++){ if(n%i==0){ isprime=0;//不是素数 break; } } if(isprime==1){ printf("是素数"); }else{ printf("不是素数"); } return 0; //输出1-100之间的素数 (1不是素数) int x; for(x=2;x<=100;x++){ int isprime=1;//默认是素数 int i; for(i=2;i<x;i++){ if(x%i==0){ isprime=0;//不是素数 break; } } if(isprime==1){ printf("%d ",x); } } printf("\n"); return 0; //输出前50个素数 int x=2;//从2开始计算 int count=0;//计数器 while(count<50){ int isprime=1;//默认是素数 //判断素数 int i; for(i=2;i<x;i++){ if(x%i==0){ isprime=0;//不是素数 break; } } if(isprime==1){ printf("%d ",x); //如果是素数就加1 count++; } x++; } printf("\n"); return 0; //接力break //用 1角,2角,5角来换10元以内的钱 int x; int one, twe, five; //这里是用来计数的,one 表示的是1角的个数 int exit =0;//用来跳出循环 scanf("%d",&x); for(one=1;one<x*10;one++) { for(twe=1;twe<x*10/2;twe++){ for(five=1;five<x*10/5;five++){ if(one+twe*2+five*5==x*10){ printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",one,twe,five,x); exit=1; break; } } if(exit==1){ break; } } if(exit==1){ break; } } return 0; //goto //用 1角,2角,5角来换10元以内的钱 int x; int one, twe, five; //这里是用来计数的,one 表示的是1角的个数 scanf("%d",&x); for(one=1;one<x*10;one++) { for(twe=1;twe<x*10/2;twe++){ for(five=1;five<x*10/5;five++){ if(one+twe*2+five*5==x*10){ printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",one,twe,five,x); goto out; } } } } out: return 0; //求f(n)=1+1/2+1/3+...+1/n int n=4; int i; double res=0.0; for(i=1;i<=n;i++){ res+=1.0/i; } printf("f(%d)=%f\n",n,res); return 0; //求f(n)=1-1/2+1/3-1/4+...+1/n int n=4; int i; double sign=1.0; double res=0.0; for(i=1;i<=n;i++){ res+=sign/i; sign=-sign; } printf("f(%d)=%f\n",n,res); return 0; //逆序分解数 int n=12345; do{ int t=n%10; printf("%d",t); if(n>=10){ printf(" ");//最后一个不是空格 } n/=10; } while(n>0); return 0; //正序分解数 int n=70000; int mask=10000;//用来记录操作 do{ int t=n/mask; printf("%d",t); if(mask>=10){ printf(" ");//最后一个不是空格 } n%=mask; mask/=10; } while(mask>0); printf("\n") return 0; // n 70000 mask 10000 五位数 /* t 70000/10000-->7 输出7 mask 10000>0 输出空格 n 70000%10000-->0 mask 10000/10-->1000 mask>0 t 0/1000-->0 输出0 mask 1000>0 输出空格 n 0%1000-->0 mask 1000/10 -->100 mask>0 */ //正序分解数 (改进版) int n=70000; int temp=n; int mask=1; //第一个循环我们用temp来做 while(temp>=10){ temp/=10; mask*=10; } printf("mask:%d\n",mask); // 1位数 mask=1 // 2位数 mask=10 do{ int t=n/mask; printf("%d",t); if(mask>=10){ printf(" ");//最后一个不是空格 } n%=mask; mask/=10; } while(mask>0); printf("\n"); return 0; // n 70000 mask 10000 五位数 /* t 70000/10000-->7 输出7 mask 10000>0 输出空格 n 70000%10000-->0 mask 10000/10-->1000 mask>0 t 0/1000-->0 输出0 mask 1000>0 输出空格 n 0%1000-->0 mask 1000/10 -->100 mask>0 */ //算最大公约数(第一种) int a=10; int b=20; int min=a<b?a:b; int res=0;//记录结果 int i; for(i=1;i<min;i++){ if(a%i==0 && b%i==0){ res=i; } } printf("%d和%d的最大公约数是%d\n",a,b,res); return 0; //算最大公约数(第二种)辗转相除法 /*如果b等于0,计算就结束,a就是最大公约数 否则,计算a除以b的余数,让a=b,而b等于那个余数; 回到第一步 a b t 12 18 12 18 12 6 12 6 0 6 0 */ int a=20; int b=10; int t; do{ t=a%b; a=b; b=t; }while(b!=0); printf("最大公约数是%d\n",a); return 0; //给定条件的整数集 //题目:给定不超过6的正整数a,考虑从a开始的连续4个数字,请输出所有由他们组成的无重复数字的三位数 //要求:每六个换一行 int a=2; int i,j,k; int cnt=0; i=a; while(i<=a+3){ j=a; while(j<=a+3){ k=a; while(k<=a+3){ if(i!=j){ if(i!=k){ if(j!=k){ cnt++; printf("%d%d%d",i,j,k); if(cnt==6){ printf("\n"); cnt=0; }else{ printf(" "); } } } } k++; } j++; } i++; } return 0; //水仙花数 //题目:水仙花数是指一个N位正整数(N>=3),他的每个位上的数字的N次幂之和等于他本身. //例如:153=1^3+5^3+3^3;,本题要求编写程序,计算所有N位水仙花数. int n; scanf("%d",&n); //三位数 100-999 //算出第一位数 int first=1; int i=1; while(i<n){ first*=10; i++; } // printf("%d\n",first); //遍历100-999 i=first; while(i<=first*10-1){ //t 的定义因为会破坏i int t=i; int sum=0; //对i做拆解,用do while做拆解会考虑到0的情况 do{ int d=t%10; t/=10; int p=d; //因为p=d,所以做n-1次 //如果p=1,就做n次 //做a*a*a (d的n次幂)操作 int j=1; while(j<n){ p*=d; j++; } sum+=p; } while(t>0); if(sum==i){ printf("%d\n",i); } i++; } return 0; //打印99乘法表 int i,j; int n=9; i=1; while(i<=9){ j=1; while(j<=i){ printf("%d*%d=%d",j,i,i*j); if(i*j<10){ printf(" ");//三个空格 }else{ printf(" ");//两个空格 } j++; } printf("\n");//一个回车 i++; } return 0; //统计素数并求和 //输入:在一行中给出两个数,M,N //输出:输出M-N之间素数的个数,素数的和,之间用空格分开 //输入 10 31 int m,n; int i; int count=0; int sum=0; scanf("%d %d",&m,&n); //判断isprime //排除1 if(m=1){ m=2; } for(i=m;i<=n;i++){ //遍历m-n //判断isprime int isprime=1; int k; for(k=2;k<i;k++){ if(i%k==0){ isprime=0;//不是素数 break; } } if(isprime==1){ count++; sum+=i; } } printf("%d %d\n",count,sum); return 0; //猜数字游戏 //题目:猜一个100以内的数a,用户输入一个数进行猜测,猜测数b, //如果b>a,提示 too big;如果b<a,提示 too small,相等表示猜到. //如果1次就猜到就提示 Bingo;如果3次以内猜到就提示 Luck you,如果超过3次但在n次猜到,就提示 Good Guess //如果超过n次都没有猜到,就提示 Game Over,如果在到达n次之前,用户输入了一个负数,也输出 Game Over //输入: 输入要猜的数字 输入可以猜的次数 //输入 58 4 int number,n; scanf("%d %d",&number,&n); int inp;//用户每次输入的数 int finish=0;//finish标记猜是否结束,0表示没有结束,1表示结束; int cnt=0;//记录猜的次数 do{ scanf("%d",&inp); cnt++; if(inp<0){ //通常情况下我们就考虑三种情况,> < =,这里多了一种自己想结束的情况 //自己想结束 printf("Game Over!\n"); finish=1; } else if(inp>number){ printf("Too big!\n"); } else if(inp<number){ printf("Too small!\n"); }else{ //这里是猜中的情况 //猜中的情况再分,几次猜中 if(cnt==1){ printf("Bingo!\n"); }else if(cnt<=3){ printf("Lucky You!\n"); }else{ //超过3次在n次猜到 printf("Good Guess!\n"); } finish=1; } //如果猜了n次就要退出了 if(cnt==n){ if(finish==0){ //finish=0表示没有猜到 printf("Game Over!\n"); finish=1; //没有猜到,但是已经猜了n次就要退出了 } } } while(finish!=1);//条件是!=1,=1表示猜到了!=1循环是继续的 //表示猜到就退出或者没有猜到但是已经猜了n次还是没有猜到也退出 return 0; //题目: 求序列前n项的和 //计算2/1+3/2+5/3+8/5+...的前n项和 //下一项的分子等于上一项的分子+分母 //下一项的分母等于上一项的分子 //输入 20 int n; scanf("%d",&n); double dividend,divisor;//分子分母 double sum=0.0; double t; int i; dividend=2; divisor=1; for(i=1;i<=n;i++){ sum+=dividend/divisor; t=dividend;//拿到分子 dividend=dividend+divisor;//表示下一项的分子 divisor=t;//表示下一项的分母 } printf("%.2f\n",sum); return 0; //约分最简分式 //60/120-->1/2 //输入60/120 int dividend,divisor;//分子分母 scanf("%d/%d",÷nd,&divisor); int a=dividend; int b=divisor; int t; //辗转相除法求最大公约数 while(b>0){ t=a%b; a=b; b=t; } //算出来a就是最大公约数 printf("%d/%d\n",dividend/a,divisor/a); return 0; //念数字 int x; scanf("%d",&x); if(x<0){ printf("fu "); x=-x; } //算几位数 用t,mask来处理 //mask作用用来分解数字 int mask=1; int t=x; while(t>9){ t/=10; mask*=10; } do{ int d=x/mask;//相除得第一位(从最高位分解到最低位) switch(d){ case 0:printf("ling");break; case 1:printf("yi");break; case 2:printf("er");break; case 3:printf("san");break; case 4:printf("si");break; case 5:printf("wu");break; case 6:printf("liu");break; case 7:printf("qi");break; case 8:printf("ba");break; case 9:printf("jiu");break; } if(mask>9){ printf(" "); } x%=mask;//1234%1000 去数处理去掉第一个数 mask/=10; }while(mask>0); printf("\n"); return 0;