C语言练习题集——《C语言程序设计 谭浩强第三版》

课本习题+知识回顾

    • 1. 分支语句练习:(第五章)
    • 2. 循环语句练习(第六章)
    • 3. 数组使用练习(第七章)
    • 4. 函数使用练习(第八章)
    • 5. 简单递归练习

作者:国家一级假勤奋大学生

ps:建议结合书本食用哟!

1. 分支语句练习:(第五章)

5.7 输出一个不大于五位数的数的每个位的数字,并倒序输出,并指出它是几位数

思路:由于规定了不大于五位数,所以利用除法得到每个位置的数字,然后判断输入的数字范围,进行对应的输出

#include 
#include 
//输出一个不大于五位数的数的每个位的数字,并倒序输出,并指出它是几位数
int main()
{
    int x,y,z,a,b,c;
    printf("输入一个不大于五位数的数字\n");
    scanf("%d",&x);
    y = x/10000;
    z=(x-(y*10000))/1000;
    a=(x-y*10000-z*1000)/100;
    b=(x-y*10000-z*1000-a*100)/10;
    c=(x-y*10000-z*1000-a*100-b*10);
    if(x>=10000)
    {
        printf("五位数\n");
        printf("输出每个位置的数字,并按逆序排序:\n");
        printf("%d %d %d %d %d\n",y,z,a,b,c);
        printf("%d %d %d %d %d\n",c,b,a,z,y);
    }
    else
    {
        if(x>=1000)
        {
            printf("四位数\n");
            printf("%d %d %d %d\n",c,b,a,z);
        }
        else
        {
            if(x>=100)
            {
                printf("三位数\n");
                printf("%d %d %d\n",c,b,a);
            }
            else
            {
                if(x>=10)
                {
                    printf("两位数\n");
                    printf("%d %d\n",c,b);
                }
                else
                {
                    printf("一位数\n");
                    printf("%d\n",c);
                }
            }
        }
    }
}

5.8 (switch实现)利润计算

思路:输入I后,利用switch进行分段处理

#include 
#include 

int main()
{
    printf("输入本月利润:\n");
    float I,S;
    int x;
    scanf("%f",&I);
    x = I/100000;
    if(x>10)
        S=(I-x*100000)*0.01+10000+7500+10000+6000+6000;
    else
    {
        switch(x)
        {
            case 0:S=I*0.1;break;
            case 1:S=(I-x*100000)*0.075+10000;break;
            case 2:
            case 3:S=(I-x*100000)*0.05+10000+7500;break;
            case 4:
            case 5:S=(I-x*100000)*0.03+10000+7500+10000;break;
            case 6:
            case 7:
            case 8:
            case 9:S=(I-x*100000)*0.015+10000+7500+10000+6000;break;
            default:printf("error!\n");
        }
    }//一定要记得加break 使switch能够出来而不是继续执行下面语句
    printf("该发的奖金为:%f",S);
    return 0;
}

5.9 输入四个整数,从小到大顺序输出

思路:if 慢慢比大小就行

这里用了指针进行两数交换的方法(maxs函数中,注意写法)

#include 
#include 
#include

int maxs(int*x,int*y);
int main()
{
    float a,b,c,d,e;
    printf("输入四个整数,按从小到大顺序排列\n");
    scanf("%d%d%d%d",&a,&b,&c,&d);
    if(a>b)
        maxs(&a,&b);
    if(a>c)
        maxs(&a,&c);
    if(a>d)
        maxs(&a,&d);
    if(b>c)
        maxs(&b,&c);
    if(b>d)
        maxs(&b,&d);
    if(c>d)
        maxs(&c,&d);
    printf("将排好的顺序输出:\n");
    printf("%d,%d,%d,%d\n",a,b,c,d);
    return 0;
}

int maxs(int*x,int*y)
{
    float e;
    e=*x;
    *x=*y;
    *y=e;
}

5.10 判断坐标是否在四个圆形建筑上

int main()
{
    float x,y;
    printf("输入横纵坐标:\n");
    scanf("%f%f",&x,&y);
    if((x-2)*(x-2)+(y-2)*(y-2)<=1)
        printf("该地建筑高10m");
    else
    {
        if((x-2)*(x-2)+(y+2)*(y+2)<=1)
            printf("该地建筑高10m");
        else
        {
            if((x+2)*(x+2)+(y-2)*(y-2)<=1)
                printf("该地建筑高10m");
            else
            {
                if((x+2)*(x+2)+(y+2)*(y+2)<=1)
                    printf("该地建筑高10m");
                else
                    printf("该地没有建筑,为0m");
            }
        }
    }

}

2. 循环语句练习(第六章)

练习1:斐波那契数列输出

1 1 2 3…

#include 
#include 
//斐波那契数列输出
int main()
{
   int a=1,b=1,c=0,i;
   printf("1\n1\n");
   //注意循环中的迭代 
   for(i=1;i<=38;i=i+1)
   {
       c=a+b;
       printf("%d\n",c);
       a=b;
       b=c;
   }
   return 0;
}

练习2:输出100-200之间的所有的素数

//该程序来实现在100-200之间输出所有的素数
int main()
{
    int a,b,c;
    scanf("%d%d%D", &a, &b, &c);
    for(a=100;a<200;a=a+1)//a在100-200之间变化
    {
        for(c=2;c<a;c=c+1)//c在2-a之间变化
        {
            b=1;
            if(a%c==0)//如果a能整除c
                break;//退出循环
            else
                b=0;//当a无法整除2-a之间的任意数,它应该是素数

        }
        if(b==0)
            printf("%d\n",a);//输出a
    }
    return 0;
}

6.1 求两个正整数的最大公约数和最小公倍数

方法一:纯枚举法。。。大一写的(变量也很混乱。。。大家写程序千万别这样写。。。)
int main()
{
    int x,y,i,k,a,b,c,d;//c为最大公因数,d为最小公倍数
    printf("enter two number:\n");
    scanf("%d %d",&x,&y);
    for(i=1;;i=i+1)
    {
        for(k=1;;k=k+1)
        {
           if(x%k==0)
                a=k;
           if(y%k==0)
                b=k;
           if(a==b)
                c=a;
            if(x>y)
            {
                if(k==y)
                    break;
            }
            else
            {
                if(k==x)
                    break;
            }
        }
        if(i%x==0)
            {
                if(i%y==0)
                {
                    d=i;
                    break;
                }
            }

    }
    printf("最大公因数为:%d\n",c);
    printf("最小公倍数为:%d\n",d);
    return 0;
}

方法二:辗转相除+递归
//得到最大公因数
int gcd(int a, int b)
{
    return !b?a:gcd(b, a%b);
}
int main()
{
    int a, b;
    scanf("%d%d", &a, &b);
    int c = gcd(a, b);
    int d = a*b/c;//由最大公因数得到最小公倍数
    printf("最大公因数为:%d\n",c);
    printf("最小公倍数为:%d\n",d);
    return 0;
}

6.3 求a+aa+aaa+aaa…的值

思路:找到每个值构成的规律即可使用循环完成

int main()
{
    int n,i,s=0,a;
    printf("请输入n的值和a的值:\n");
    scanf("%d%d",&n,&a);
    for(i=1;i<=n;i=i+1)
    {
        s=s+a;
        a=s+a*10;
    }
    printf("输出值为:%d",s);
}

6.4 求阶乘

int main()
{
    long long int n,i,s1,s2=0;
    for(n=1;n<=20;n=n+1)
    {
        for(i=1,s1=1;i<=n;i=i+1)//内循环求1-20每个数的阶乘
        {
            s1=s1*i;
        }
        s2=s2+s1;//阶乘求和
    }
    printf("%lld",s2);
    return 0;
}
//上述存在重复计算,我们可以知道3!=3*2*1 4!=4*3*2*1, 
//所以我们每次保存前一个阶乘的结果,乘以当前n值即可
int main()
{
    long long int s1, s2;
    s1 = 1;
    s2 = 0;
    for(int n=1;n<=20;n++)
    {
        s1 = s1*n;
        printf("%lld\n", s1);
        s2 = s2 + s1;
    }
    printf("%lld", s2);
    return 0;
}

6.6 水仙花数

思路:取位然后判断

int main()
{
    printf("输出所有的水仙花数:\n");
    int a,b,c,i;
    for(i=101;i<=999;i=i+1)
    {
        a=i/100;
        b=(i-a*100)/10;
        c=(i-a*100-b*10);
        if(i==a*a*a+b*b*b+c*c*c)
            printf("%d\n",i);
    }
    return 0;
}

6.8 找规律求和——分子和分母分别是前两个之和

int main()
{
    int a=2,b=3,d=1,e=2,k;
    float s,t,c,f;
    for(k=1;k<=18;k=k+1)
    {
        c=a+b;
        a=b;
        b=c;
        f=d+e;
        d=e;
        e=f;
        t=c/f;
        s=s+t;
    }
    s=2+1.5+s;
    printf("%f",s);
}

6.9 小球反弹高度

int main()
{
    printf("小球从100M落下反弹十次的高度:\n");
    float h=100,i=1,s=0;
    for(i=1;i<=10;i=i+1)
    {
        h=h/2;
        s=s+h;
    }
    s=s+100;
    printf("共经过%fM,第十次反弹%fM高",s,h);
    return 0;
}

6.15 比赛顺序

思路:这个比较有意思,简单来说就是要满足所述的条件,利用一个三重循环来确定a,b,c各自的对手,两个条件

条件一:三个人的对手不同(if判断)

条件二:A不和X打、C不和X, Z打

满足条件输出即可

int main()
{
    char a,b,c;
    for(a='x';a<='z';a=a+1)
        for(b='x';b<='z';b=b+1)
            if(a!=b)
                for(c='x';c<='z';c=c+1)
                    if(a!=c&&b!=c)
                        if(a!='x'&&c!='x'&&c!='z')
                            printf("正确的比赛顺序为:\na-%c\nb-%c\nc-%c",a,b,c);
    return 0;
}

3. 数组使用练习(第七章)

7.2 选择排序

#include 
#include 
int main()
{
    int a[10];
    printf("please input 10 numbers:\n");
    int i,j,pos,temp;
    for(i=0;i<=9;i++)
        scanf("%d",&a[i]);
    for(i=0;i<9;i++)
    {
        pos=i;
        for(j=i+1;j<=9;j++)
            if(a[j]<a[pos])
                pos=j;//记录当前最小数的位置
        temp=a[i];
        a[i]=a[pos];
        a[pos]=temp;
    }
    for(i=0;i<=9;i++)
        printf(" %d",a[i]);
    return 0;
}

7.3 求3x3矩阵对角线之和

int main()
{
    int a[3][3];
    printf("please input some number:\n");
    int i,j,k=0;
    for(i=0;i<=2;i++)
        for(j=0;j<=2;j++)
            scanf("%d",&a[i][j]);
    for(i=0;i<=2;i++)
    {
        k=k+a[i][i];
    }
    k=k+a[0][2]+a[2][0];
    printf("对角线的总和为%d",k);
    return 0;
}
  1. 4插入排序——插入
int main()
{
    int a[20]={1,4,5,6,7,8,9,15,18,19};
    int i,k,l;
    printf("please input a number:\n");
    scanf("%d",&i);
    for(k=9;k>=0;k--)
    {
        if(i<a[k])//输入的数小,则原来位置的数后移
        {
            a[k+1]=a[k];
            l=k;
        }
        else//否则当前位置就是需要插入的位置
            break;
    }
    a[l]=i;
    for(i=0;i<=10;i++)
        printf(" %d",a[i]);
    return 0;
}
//上述程序有点问题:已经假设了原来的排序是升序,但其实题目并没有给是升序还是降序,需要额外判断一下

7.6 打印杨辉三角

思路:第一行补0,第一列补1

按a[ i ] [ j ] = a [i-1] [j-1] + a[i-1] [j]计算即可

//杨辉三角7.6
int main()
{
    int n;
    printf("请输入n的值:\n");
    scanf("%d",&n);
    int a[n][n];
    int row,col,i,j;
    for(j=0;j<=n-1;j++)
        a[0][j]=0;
    for(i=0;i<=n-1;i++)
        a[i][0]=1;
    for(row=1;row<=n-1;row++)
        for(col=1;col<=n-1;col++)
            a[row][col]=a[row-1][col-1]+a[row-1][col];
    for(row=0;row<=n-1;row++)
    {
        printf("\n");
        for(col=0;col<=row;col++)
            printf("%d   ",a[row][col]);
    }
    return 0;
}

7.7 魔方三角

思路:根据填方阵的规律进行填数

//方案一:自己也看不懂了。。。
int main()
{
    int n,i;
    printf("please input the line of the magic mat:\n");
    scanf("%d",&n);
    int a[n][n];
    int row=0,col=n/2;
    a[row][col]=1;
    for(i=2;i<=n*n;i++)
    {
        if((i-1)%n==0)
            row++;
        else
        {
            if(row==0)
                row=n-1;
            else
                row--;
            if(col==n-1)
                col=0;
            else
                col++;
        }
        a[row][col]=i;
    }
    for(row=0;row<=n-1;row++)
    {
        printf("\n");
        for(col=0;col<=n-1;col++)
            printf("%d",a[row][col]);
    }
    return 0;
}

//方案二:
/*
四种填数的规则,复现即可:
1. 右上角没填且在可填的矩阵范围内,直接填,则行-1,列+1
2. 右上角不在范围内,但行在范围内,则行-1,列=0
3. 右上角不再范围内,但列在范围内,则行=n-1, 列+1
4. 其余情况则往正下方填数即可,则行+1, 列不变
*/
int main()
{
    int n,i;
    printf("please input the line of the magic mat:\n");
    scanf("%d",&n);
    int a[n][n];
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            a[i][j] = 0;
    int row=0,col=n/2;
    a[row][col]=1;
    for(i=2;i<=n*n;i++)
    {
        int num = i*i;
        if(row-1>=0&&col+1<n&&a[row-1][col+1]==0)
        {
            row--;
            col++;
        }
        else if(row-1<0&&col+1<n&&a[n-1][col+1]==0)
        {

            row = n-1;
            col ++ ;
        }
        else if(row-1>=0&&col+1>=n&&a[row-1][0]==0)
        {

            row--;
            col = 0;
        }
        else
        {
            row = row+1;
            col = col;
        }
        a[row][col]=num;
    }
    for(row=0;row<=n-1;row++)
    {
        printf("\n");
        for(col=0;col<=n-1;col++)
            printf("%d ",a[row][col]);
    }
    return 0;
}

7.11 输出指定图形

思路:前缀空格+星星和空格交替

int main()
{
    char a[5][20];
    int i,j;
    char x='*',y=' ',z;
    int k=8;
    for(i=0;i<=4;i++)
        for(j=0;j<=20;j++)
        {
            if(i>j)//前缀‘ ’
                a[i][j]=' ';
            else//交替‘*’和‘ ’
            {
                a[i][j]=x;
                z=x;
                x=y;
                y=z;
            }
        }
    for(i=0;i<=4;i++)
    {
        k=k+1;
        printf("\n");
        for(j=0;j<=k;j++)
            printf(" %c",a[i][j]);
    }
}

7.13 实现strcat

//这个写的有点不负责任了。。。
int main()
{
    char a[30]={"qwertyuiop"};
    char b[10]={"asdfghjkl"};
    int j=0,i,k;
    for(i=10;i<=19;i++)
        for(;j<=9;)
        {
            a[i]=b[j];
            j++;
            break;
        }
    for(k=0;k<=29;k++)
        printf(" %c",a[k]);
    return 0;
}

//正确写法(需要用到第八章的函数知识)
//c = a + b
//简陋版,没返回strcat后得到的字符串,需要利用指针
void strcat(char a[], char b[])
{
  	int a_len = strlen(a);
    int b_len = strlen(b);
    int c_len = a_len + b_len;
    char c[c_len];
    for(int i=0;i<a_len;i++)
        c[i] = a[i];
    int index = a_len-1;
    for(int j=0;j<b_len;j++)
        c[index++] = b[j];
    for(int i=0;i<c_len;i++)
        printf("%c", c[i]);
}

7.15 实现strcpy

int main()
{
    char s2[8]={"zxcvbnm"};
    char s1[20];
    int i,j;
    for(i=0;i<=7;i++)
        s1[i]=s2[i];
    for(j=0;j<=7;j++)
        printf(" %c",s1[j]);
    return 0;
}

void strcpy(char a[])
{
    char b_len = strlen(a);
    char b[b_len+1];
    for(int i=0;;i++)
    {
        if(a[i]=='\0')
        {
            break;
        }
        b[i] = a[i];
    }
    b[b_len] = '\0';
}

4. 函数使用练习(第八章)

8.3 判断素数

int prime(int number);//函数声明
int main()
{
   int number;
   printf("请输入一个正整数:\n");
   scanf("%d",&number);
   if(prime(number))
        printf("\n%d是素数",number);
   else
        printf("\n%d不是素数",number);
}

int prime(int number)
{
    if(number==1)
        return 0;
   	if(number==2)
        return 1;
    for(int i=2;i*i<=number;i++)
    {
        if(number%i==0)//可以整除除了1和本身的其他数则不是素数
            return 0;
    }
    return 1;
}

8.4 3x3矩阵转置,行列交换

swap(int a[][3],int b[][3]);//注意二维数组传入时,列参数无法省略
int main()
{
    int i,j;
    int a[3][3];
    int b[3][3];
    printf("please input 9 numbers:\n");
    for(i=0;i<=2;i++)
        for(j=0;j<=2;j++)
            scanf("%d",&a[i][j]);
    swap(a,b);
    for(i=0;i<=2;i++)
    {
        printf("\n");
            for(j=0;j<=2;j++)
                printf(" %d",b[i][j]);
    }
    return 0;
}
int swap(int a[][3],int b[][3])
{
    int i,j;
    for(i=0;i<=2;i++)
        for(j=0;j<=2;j++)
            b[i][j]=a[j][i];//行列转置
}

8.6 字符串连接函数

没什么好说的,跟第七章的题目类似

void pinjie(char a[],char b[],char c[],int n,int m);
int main()
{
    char a[100];
    char b[100];
    char c[300];
    int n,m,l;
    printf("please input a string:\n");
    scanf("%s",a);
    printf("please input another string:\n");
    gets(b);
    scanf("%s",b);
    n=strlen(a);
    m=strlen(b);
    pinjie(a,b,c,n,m);
    for(l=0;l<=n+m-1;l++)
        printf("%c",c[l]);
    return 0;
}
void pinjie(char a[],char b[],char c[],int n,int m)
{
    int i,j;
    for(i=0;i<=n-1;i++)
        c[i]=a[i];
    for(j=0;j<=m-1;j++)
        c[i+j]=b[j];
}

8.7 复制元音字母并输出

int copyyuanyin(char a[],char b[],int i);
int main()
{
    char a[100];
    char b[50];
    int i,m;
    printf("please input a string:\n");
    gets(a);
    i=strlen(a);
    copyyuanyin(a,b,i);
    m=strlen(b);
    for(i=0;i<m;i++)
        printf(" %c",b[i]);
    return 0;
}
int copyyuanyin(char a[],char b[],int i)
{
    int j,k=0;
    for(j=0;j<=i-1;j++)
    {
        switch(a[j])
        {
            case'a':
            case'e':
            case'i':
            case'o':
            case'u':b[k]=a[j];k++;
        }
    }
}

8.8 间隔输出

int shuchu(char a[],char b[],int i);
int main()
{
    char a[4];
    char b[9];
    int i,l;
    gets(a);
    i=strlen(a);
    shuchu(a,b,i);
    for(l=0;l<=6;l++)
        printf("%c",b[l]);
    return 0;
}
int shuchu(char a[],char b[],int i)
{
    int j;
    for(j=i;j>=1;j--)
    {
        b[j*2-2]=a[j-1];//判断位置即可
        b[j*2-3]=' ';
    }
}

8.10 求字符串中最长单词

思路:首先是读入含空格的字符串,可以用gets(不推荐,有的编译器不给通过),所以还是老老实实用getchar一个字符一个字符读吧,千万要记得在结尾加上\0(不然strlen无法正确识别长度噢)。然后就是函数getMaxStr,利用变量来存储最长单词所在的位置,输出即可(以空格为间隔)

//简化:字符串仅由单词和空格构成
void getMaxStr(char str[])
{
    int len = strlen(str);
    int start, end;
    int max_len = 0;
    int pos1, pos2;
    start=end=0;
    for(int i=0;i<len;i++)
    {
        if(str[i]!=' ')
        {
            end++;
        }
        else
        {
            if(end-start>max_len)
            {
                pos1 = start;
                pos2 = end;
                max_len = end-start;
            }
            start=end=i+1;//每次读完需要重置位置的始末
        }
    }
    //最后一个单词,防止结尾为最长单词的情况被漏算
    if(end-start>max_len)
    {
        pos1 = start;
        pos2 = end;
    }
    for(int i=pos1;i<=pos2;i++)
        printf("%c", str[i]);
}
int main()
{
    printf("input the string:\n");
    char str[100];
    int index = 0;
    char c;
    c = getchar();
    while(c!='\n')
    {
        str[index++] = c;
        c = getchar();
    }
    //不要忘记补上终止符\0
    str[index] = '\0';
    getMaxStr(str);
    return 0;
}

8.11 冒泡排序

思路:交换法,相邻交换

int paixu(int a[]);
int main()
{
    int a[10];
    int i;
    printf("please input 10 numbers:\n");
    for(i=0;i<=9;i++)
        scanf("%d",&a[i]);
    //int a[10]={1,5,6,7,8,9,12,11,15,14};
    paixu(a);
    for(i=0;i<=9;i++)
        printf(" %d",a[i]);
    return 0;
}
int paixu(int a[])
{
    int n,m,t;
    //每轮交换后可以使得末尾的一个位置有序
    for(n=0;n<=9;n++)
        for(m=0;m<=9-n;m++)//注意这里内循环的写法
        {
            if(a[m]>a[m+1])//大则交换
            {
                t=a[m];
                a[m]=a[m+1];
                a[m+1]=t;
            }
        }
}

8.12 牛顿迭代法求根

//每次用切线与X轴的交点来近似根

float xpoint(float x,float a,float b,float c,float d);
float root(float x,float a,float b,float c,float d);
float f(float x,float a,float b,float c,float d);
int main()
{
    float a,b,c,d;
    float gen=0,x=1;
    printf("请输入abcd的值:\n");
    scanf("%f%f%f%f",&a,&b,&c,&d);
    gen=root(x,a,b,c,d);
    printf("该方程的根为%f",gen);

}
float f(float x,float a,float b,float c,float d)//求函数值
{
    float y;
    y=a*x*x*x+b*x*x+c*x+d;
    return y;
}
float xpoint(float x,float a,float b,float c,float d)
{
    float k1,y1,x1;
    k1=3*a*x*x+2*b*x+c;
    y1=f(x,a,b,c,d);
    x1=-(y1/k1)+x;
    return x1;
}
float root(float x,float a,float b,float c,float d)
{
    float xx,yy;
    do
    {
        xx=xpoint(x,a,b,c,d);//切线与x轴的交点
        yy=f(xx,a,b,c,d);
        if(fabs(yy)<=1e-6)
            break;
        else
            x=xx;
    }
    while(fabs(yy)>1e-6);
    return xx;
}

8.14 十个学生五门课程,完成计算

思路:体力活。。。在学完结构体后,代码会间接美观一些。。。

int average_student(int a[]);
int average_socre(int a[],int b[],int c[],int d[],int e[],int f[],int g[],int h[],int i[],int j[]);
int max_student_class(int a[],int b[],int c[],int d[],int e[],int f[],int g[],int h[],int i[],int j[]);
int pinfangcha(int a[],int b[],int c[],int d[],int e[],int f[],int g[],int h[],int i[],int j[]);
int main()
{
    int a[5],b[5],c[5],d[5],e[5],f[5],g[5],h[5],i[5],j[5];
    int w,x,y,z;
    printf("请输入第一位学生的语数英理综体育成绩:\n");
    for(x=0;x<=4;x++)
        scanf("%d",&a[x]);
    printf("请输入第二位学生的语数英理综体育成绩:\n");
    for(x=0;x<=4;x++)
        scanf("%d",&b[x]);
    printf("请输入第三位学生的语数英理综体育成绩:\n");
    for(x=0;x<=4;x++)
        scanf("%d",&c[x]);
    printf("请输入第四位学生的语数英理综体育成绩:\n");
    for(x=0;x<=4;x++)
        scanf("%d",&d[x]);
    printf("请输入第五位学生的语数英理综体育成绩:\n");
    for(x=0;x<=4;x++)
        scanf("%d",&e[x]);
    printf("请输入第六位学生的语数英理综体育成绩:\n");
    for(x=0;x<=4;x++)
        scanf("%d",&f[x]);
    printf("请输入第七位学生的语数英理综体育成绩:\n");
    for(x=0;x<=4;x++)
        scanf("%d",&g[x]);
    printf("请输入第八位学生的语数英理综体育成绩:\n");
    for(x=0;x<=4;x++)
        scanf("%d",&h[x]);
    printf("请输入第九位学生的语数英理综体育成绩:\n");
    for(x=0;x<=4;x++)
        scanf("%d",&i[x]);
    printf("请输入第十位学生的语数英理综体育成绩:\n");
    for(x=0;x<=4;x++)
        scanf("%d",&j[x]);
}
int average_student(int a[])
{
    int score=0,y;
    for(y=0;y<=4;y++)
        score=score+a[y];
    printf("该学生的平均成绩为:%d",score/5);
}
int average_socre(int a[],int b[],int c[],int d[],int e[],int f[],int g[],int h[],int i[],int j[])
{
    int chinese,math,english,maxture;
    chinese=(a[0]+b[0]+c[0]+d[0]+e[0]+)
}

5. 简单递归练习

  1. 输出是什么捏?怎么来的?
int age(int n)
{
    int c;
    if(n==1)
        c=10;
    else
        c=age(n-1)+2;
    return c;
}
int main()
{
    printf("%d\n",age(5));
}
  1. 斐波那契数列的递归计算
int main()
{
    float fac(int n);
    int n;
    float y;
    printf("please input a number:\n");
    scanf("%d",&n);
    y=fac(n);
    printf("%d!=%10.0f\n",n,y);
    return 0;
}

float fac(int n)
{
    float f;
    if(n<0)
         printf("n<0,dataerror!");
    else
    {
        if(n==0||n==1)
            f=1;
        else
            f=fac(n-1)*n;
    }
    return f;
}
  1. 汉诺塔问题
int move(char x,char y);
void hanoi(int n, char A, char B, char C);
int main()
{
    int m;
    printf("input the number of disks:\n");
    scanf("%d",&m);
    printf("The step to moving %d disks:\n",m);
    hanoi(m,'A','B','C');

}
void hanoi(int n,char A, char B,char C)
{
    if(n==1)
        move(A,C);
    else
    {
        hanoi(n-1,A,C,B);
        move(A,C);
        hanoi(n-1,B,A,C);
    }
}
int move(char x,char y)
{
    printf("%c-->%c\n",x,y);
}

你可能感兴趣的:(C/C++,c语言,算法,数据结构)