C语言(复习)

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",&dividend,&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;
  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值