美文网首页C语言C语言&嵌入式
学习日记 | C语言经典例题④(实例61-80)

学习日记 | C语言经典例题④(实例61-80)

作者: 三金姐姐 | 来源:发表于2020-03-01 22:45 被阅读0次

    ©一颗斯特拉
    【注】
    1.标有❤️的是参考资料后做出的题目
    2.标有✨的是值得多做的题目

    1. 题目来源于C语言经典例题(菜鸟教程100例)
      4.《学习日记 | C语言经典例题③(实例41-60)》中题目比较偏,暂不更。

    ——3.1更新——

    实例61:【二维数组】

    题目:打印出杨辉三角形(要求打印出10行)。

    01程序分析:

    杨辉三角形
    02Bad Solution:
    暂无
    03Correct Solution:
    #include <stdio.h>
    int main()
    {
       int i,j,a[100][100];
        for(i=0;i<10;i++)
        {
            a[i][0]=1;
            a[i][i]=1;
        }
        for(i=2;i<10;i++)
            for(j=1;j<i;j++)//这里是从第3行第2列的元素起,某个元素是前一行前一列的元素+前一行这一列的元素
                a[i][j]=a[i-1][j-1]+a[i-1][j];
        for(i=0;i<10;i++){
            for(j=0;j<=i;j++)
                printf("%5d", a[i][j]);
            printf("\n");
            }
                return 0;
    }
    

    【运行结果】

    1
    1 1
    1 2 1
    1 3 3 1
    1 4 6 4 1
    1 5 10 10 5 1
    1 6 15 20 15 6 1
    1 7 21 35 35 21 7 1
    1 8 28 56 70 56 28 8 1
    1 9 36 84 126 126 84 36 9 1

    04题目总结:
    给大家推荐一个李永乐老师在b站上讲解「杨辉三角形」的视频。

    实例66:【指针+函数】

    题目:输入3个数a,b,c,按大小顺序输出。

    01程序分析:
    1.假设a、b、c依次变大,如果a>b,则交换a、b。
    2.编写一个交换两个变量的函数,传递指针变量(实则为整形变量的存储地址),则在函数中可以改变变量的值。
    02Bad Solution:
    暂无
    03Correct Solution:

    #include <stdio.h>
    void swap(int *s1,int *s2);
    int main() {
        int a, b, c;
        int *p1,*p2,*p3;
        printf("请输入a、b、c的值:");
        scanf("%d%d%d", &a, &b, &c);
        p1=&a;
        p2=&b;
        p3=&c;
        if(a>b)
            swap(p1,p2);
        if(a>c)
            swap(p1,p3);
        if(b>c)
            swap(p2,p3);
        printf("从小到大依次为:%d %d %d", a, b, c);
        return 0;
    }
    void swap(int *s1,int *s2){
        int t;
        t=*s1;
        *s1=*s2;
        *s2=t;
    }
    

    【运行结果】

    请输入a、b、c的值:3 2 1
    从小到大依次为:1 2 3

    04题目总结:
    1.指针的使用
    通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C 程序员,学习指针是很有必要的。
    每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。
    指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。
    所有实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,对应指针的值的类型都是一样的,都是一个代表内存地址的长的十六进制数。
    不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
    使用指针时会频繁进行以下几个操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。
    2.传递指针给函数

    实例67:【输入数组+函数】

    题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

    01程序分析:
    02Bad Solution:

    #include <stdio.h>
    int main(){
        int i,a[10]={3,2,7,8,9,33,2,92,39,1},min,max,temp;
        max=0;
        min=9;
        for(i=0;i<10;i++)
            if(a[i]>a[max]) max=i;
        if(max!=0)
        {
            temp=a[max];
            a[max]=a[0];
            a[0]=temp;
        }
        for(i=0;i<10;i++)
            if(a[i]<a[min]) min=i;
        if(min!=9)
        {
            temp=a[min];
            a[min]=a[9];
            a[9]=temp;
        }
        printf("交换后为:");
        for(i=0;i<10;i++)
            printf("%d ",a[i]);
    }
    

    【运行结果】

    交换后为:92 2 7 8 9 33 2 3 39 1

    【缺陷】没有解决数组自由输入的问题。
    03Correct Solution:

    #include <stdio.h>
    void fun(int *s,int n);
    
    int main(){
        int a[100],n,i;
        printf("要输入整数的个数:");
        scanf("%d",&n);
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        fun(a,n);
        for(i=0;i<n;i++)
            printf(" %d ",a[i]);
        return 0;
    }
    
    void fun(int *s,int n) {
        int max, min, t, i, a;
        max = s[0];
        for (i = 0; i < n; i++)
            if (s[i] > max) {
                max = s[i];
                a = i;
            }
        s[a] = s[0];
        s[0] = max;
        min = s[n - 1];
        for (i = 0; i < n; i++)
            if (s[i] < min) {
                min = s[i];
                a = i;
            }
        s[a] = s[n-1];
        s[n-1] = min;
    }
    

    【运行结果】

    要输入整数的个数:3
    1 5 3
    5 3 1

    04题目总结:
    1.一般设最大最小为值,不是此值对应的数组的标号。

    实例68:【数组】(O_O)?

    题目:有 n个整数,使其前面各数顺序向后移 m 个位置,最后m个数变成最前面的 m 个数。

    01程序分析:
    02Bad Solution:
    暂无
    03Correct Solution:

    #include <stdio.h>
    void change_back(int *s,int n,int m);
    int main(){
        int a[100],n,m,i;
        printf("请输入数的个数:");
        scanf("%d",&n);
        printf("请输入该数组:");
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        printf("替换前的数组:");
        for(i=0;i<n;i++)
            printf("%d ",a[i]);
        printf("\n");
        printf("请输入要替换的个数:");
        scanf("%d",&m);
        change_back(a,n,m);
        printf("替换后的数组:");
        for(i=0;i<n;i++)
            printf("%d ",a[i]);
        return 0;
    }
    void change_back(int *s,int n,int m){
        int i;
        for(i=0;i<m;i++)
            s[n-m+i]=s[i];
    }
    

    【运行结果】

    请输入数的个数:5
    请输入该数组:1 2 3 4 5
    替换前的数组:1 2 3 4 5
    请输入要替换的个数:2
    替换后的数组:1 2 3 1 2

    04题目总结:
    暂无

    实例69:【指针、循环、条件语句的综合运用】✨

    题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

    01程序分析:
    02Bad Solution:
    暂无
    03Correct Solution:

    #include <stdio.h>
    int main()
    {
        int num[50],n,*p,j,loop,i,m,k;
        printf("请输入这一圈人的数量:\n");
        scanf("%d",&n);
        p=num;
        //开始给这些人编号
        for (j=0;j<n;j++)
        {
            *(p+j)=j+1;
        }
        i=0;//i用于计数,即让指针后移
        m=0;//m记录退出圈子的人数
        k=0;//k报数1,2,3
        while(m<n-1)//当退出的人数不大于总人数时,即留下的人数至少是一个人
            //这句不能写成m<n,因为假设有8人,当退出了6人时,此时还是进行人数退出,即m++,
            //这时是7<8,剩下的一个人自己喊1,2,3那么他也就退出了,将不会有输出
        {
            if (*(p+i)!=0)//如果这个人的头上编号不是0就开始报数加1,这里采用的方法是报数为3的人头上编号重置为0
            {
                k++;
            }
            if (k==3)
            {    k=0;    //报数清零,即下一个人从1开始报数
                *(p+i)=0;//将报数为3的人编号重置为0
                m++;    //退出人数加1
            }
            i++;      //指针后移
            if (i==n)//这句很关键,如果到了队尾,就要使指针重新指向对头
                //并且它只能放在i++后面,因为只有i++了才有可能i==n
            {
                i=0;
            }
    
    
        }
        printf("现在剩下的人是:");
        for (loop=0;loop<n;loop++)
        {
            if (num[loop]!=0)
            {
                printf("%2d号\n",num[loop]);
            }
        }
        return 0;
    }
    

    【运行结果】

    请输入这一圈人的数量:
    8
    现在剩下的人是: 7号

    04题目总结:

    实例70:【指针数组】

    题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

    01程序分析:
    暂无
    02Bad Solution:
    暂无
    03Correct Solution:

    #include <stdio.h>
    int length(char *s);
    int main()
    {
        char ch[20];
        int i,len;
        printf("请输入字符串:");
        scanf("%s",ch);
        len=length(ch);
        printf("字符串的长度为: %d ",len);
        return 0;
    }
    int length(char *s){
        int n=0;
        while(*s!='\0'){
            s++;//指针递增
            n++;
        }
        return n;
    }
    

    【运行结果】

    请输入字符串:www,fdfvd
    字符串的长度为: 9

    04题目总结:
    1.指针的运算

    • 指针的每一次递增,它其实会指向下一个元素的存储单元。
    • 指针的每一次递减,它都会指向前一个元素的存储单元。
    • 指针在递增和递减时跳跃的字节数取决于指针所指向变量数据类型长度,比如 int 就是 4 个字节。

    实例71:【结构体】

    题目:编写input()和output()函数输入,输出5个学生的数据记录。

    01程序分析:
    02Bad Solution:
    暂无
    03Correct Solution:

    【运行结果】

    04题目总结:

    实例75:【while】

    题目:输入一个整数,并将其反转后输出。

    01程序分析:
    最小位数依次升高,最高位数依次降低,用取余和整除运算实现。
    02Bad Solution:
    暂无
    03Correct Solution:

    #include <stdio.h>
    int main()
    {
        int num,renum=0;
        printf("请输入一个整数:");
        scanf("%d",&num);
        while(num!=0){
            renum=num%10+renum*10;
            num=num/10;
        }
        printf("反转后的整数: %d",renum);
    }
    

    【运行结果】

    请输入一个整数:1234
    反转后的整数: 4321
    【更清楚的答案】

    #include <stdio.h>
    int main()
    {
        int num,renum=0,remain;
        printf("请输入一个整数:");
        scanf("%d",&num);
        while(num!=0){
            remain=num%10;//取下最后一位数
            renum=remain+renum*10;//升高最后一位数
            num=num/10;
        }
        printf("反转后的整数: %d",renum);
    }
    

    04题目总结:

    实例76:【指针函数】

    题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)。

    01程序分析:
    02Bad Solution:

    #include <stdio.h>
    double fun1(int n);
    double fun2(int n);
    int main()
    {
        int num;
        printf("请输入一个整数:");
        scanf("%d",&num);
        if(num%2==0){
            printf("%lf",fun1(num));
        }
        else
        {
            printf("%lf",fun2(num));
        }
    }
    double fun1(int n)
    {
        int i;
        double sum=0;
        for(i=1;i<=n/2;i++)
            sum=(double)(sum+1/(2*i));
        return sum;
    }
    double fun2(int n)
    {
        int i;
        double sum=0;
        for(i=0;i<=(n-1)/2;i++)
            sum=(double)(sum+1/(2*i+1));
        return sum;
    }
    

    03Correct Solution:

    【运行结果】

    04题目总结:

    实例80:【猴子吃桃问题】✨

    题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了 一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的, 问海滩上原来最少有多少个桃子?

    01程序分析:

    02Bad Solution:
    暂无
    03Correct Solution:

    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
        int x,i=0,j=1;
        while(i<5){
            x=4*j;//最少都是4个
            for(i=0;i<5;i++)
            {
                if(x%4!=0){break;}
                x=(x/4)*5+1;
            }//5个猴子的条件都满足了
            j++;
        }
        printf("%d\n",x);
    
        return 0;
    }
    

    【运行结果】

    3121

    04题目总结:
    1.【变形】

    题目:一只小猴子一天摘了许多桃子,第一天吃了一半,然后忍不住又吃了一个;第二天又吃了一半,再加上一个;后面每天都是这样吃。到第10天的时候,小猴子发现只有一个桃子了。问小猴子第一天共摘了多少个桃子。

    #include<stdio.h>
    int main()
    {
        int i = 1;//表示每天多吃的那一个
        int j = 1;//用来控制循环
        for (j = 10;j > 1;j--)
        {
            i++;
            i = 2 * i;//吃了一半加一个
        }
        printf("第一天摘了 %d 个桃子。", i);
    }
    

    【运行结果】

    第一天摘了 1534 个桃子。

    相关文章

      网友评论

        本文标题:学习日记 | C语言经典例题④(实例61-80)

        本文链接:https://www.haomeiwen.com/subject/rbyxhhtx.html