首页 > 代码库 > 第十次作业。

第十次作业。

 1.有5名学生,每名学生有语文、数学和外语3门课的考试成绩。编程统计各学生的总分和平均分以及所有学生各科的平均分。要求成绩在程序中初始化,结果以表格的形式输出。

#include<stdio.h>
#define N 5
#define M 3
int Sum(double a[][5],int m,int n);
double Average(double a[][5],int m,int n);
int main()
{
    double score[N][M+2]={{90,69,78},{70,80,90},{90,90,90},{88,80,70},{66,77,88}};
    int i,j;
    double average[M]={0};
    for(i=0;i<N;i++)
    {
        score[i][3]=Sum(score,i,-1);
        score[i][4]=Average(score,i,-1); 
    }
    for(i=0;i<M;i++)
    average[i]=Average(score,-1,i);
    printf("\t语文\t数学\t英语\t总分\t平均分\n");
    for(i=0;i<N;i++)
    {
        for(j=0;j<M+2;j++)
        {
            printf("\t%.2lf",score[i][j]);
        }
        printf("\n");
    }
    printf("平均分");
    for(i=0;i<M;i++)
    {
        printf("\t%.2lf",average[i]);
    } 
    return 0;
}
int Sum(double a[][5],int m,int n)
{
    int i,sum=0;
    if(m==-1)
    for(i=0;i<N;i++)
    sum=sum+a[i][n];
    else if(n==-1)
    for(i=0;i<M;i++)
    sum=sum+a[m][i];
    return sum;
}
double Average(double a[][5],int m,int n)
{
    double q;
    if(m==-1)
    q=(double)Sum(a,m,n)/N;
    else if(n==-1)
    q=(double)Sum(a,m,n)/M;
    return q;
}

技术分享

 2.求任意方阵每行、每列、两对角线上元素之和。

#include<stdio.h>
#define N 100
int main()
{
    int i,j,n,nums[N][N]={0},a,sum[N][N]={0};
    printf("请输入方阵宽度:\n");
    scanf("%d",&n);
    a=1;
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    nums[i][j]=a++;
    printf("方阵为:\n");
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("%4d",nums[i][j]); 
        }
        printf("\n");
    }
    a=0;
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    sum[0][i]+=nums[i][j];
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    sum[1][i]+=nums[j][i];
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    {
        if(i==j)
        sum[2][0]+=nums[j][i];
        if(i+j==n-1)
        sum[2][1]+=nums[j][i];
    }
    for(i=0;i<n;i++)
    {
        printf("第%d行的元素和为%d\n",i+1,sum[0][i]);
    }
    for(i=0;i<n;i++)
    {
        printf("第%d列的元素和为%d\n",i+1,sum[1][i]);
    }
    printf("两条对角线上的元素和分别为%d,%d",sum[2][0],sum[2][1]);
    return 0;
}

技术分享

附加题

1.按照以下形式打印杨辉三角(要求输出10行)

杨辉三角形具有如下特点:(1)第一列和对角线上的元素都为1 (2)除第一列和对角线上的元素之外,其他元素的值均为前一行上的同列元素和前一列元素之和。

#include<stdio.h>
#define N 10
int main()
{
    int i,j,a[N][N]={0},q;
    for(i=0;i<N;i++)
    {
        for(j=0;j<=i;j++)
        {
            if(j==0||j==i)
            {
                a[i][j]=1;
            }
            else
            {
                a[i][j]=a[i-1][j-1]+a[i-1][j];
                a[i][i-j]=a[i][j];
            }
        }
    }
    for(i=0;i<N;i++)
    {
        for(q=9-i;q>0;q--)
        {
            printf("  "); 
        }
        for(j=0;j<=i;j++)
        {
            printf("%4d",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}        

技术分享

2.猴子选大王

 一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:输入在一行中给一个正整数N(≤1000)。

输出格式:在一行中输出当选猴王的编号。

输入样例:11

输出样例:7

此题可在pta网站注册提交测试。https://pta.patest.cn/pta/test/14/exam/4/question/808   

#include<stdio.h>
#define N 1001
int main()
{
    int a[N]={0},i,n,j,m,index;
    printf("请输入一个正整数,范围不大于1000。\n");
    scanf("%d",&n);
    while(n>1000||n<0)
    {
        printf("超出范围,请重新输入\n");
        scanf("%d",&n);
    }
    i=1,j=1,m=n;
    while(1)
    {    
        if(a[i]==-1)   
        {
        
            i++;
            if(i>n)
            {
                i=1;
            }
            continue;
        } 
        a[i]=j++;
        if(a[i]==3)
        {
            a[i]=-1;
            m--;
            if(m==1)
            break;
            j=1;
        }
        i++; 
        if(i>n)
        {
            i=1;
        }
    }
    for(i=1;i<=n;i++)
    {
        if(a[i]!=-1)
        {
            index=i;
            break;
        }
    }
    printf("猴王是第%d号",index);
    return 0;
}

技术分享

实验总结:1.自定义函数里二维数组的形参,一定要定义列长度。

     2.if判断里用x++,计算不满足条件,x++也会执行。

     3.数组定义是最好初始化,不要越界。

     4.并列判断是 if 和if ,不是if 、else if。

     5.给二维数组赋值,需要循环嵌套,外循环控制行或列,内循环控制列或行。

     6.将平均分放在存放成绩的数组里,需要将成绩的数组定义为double型,输出时不要忘记是%lf。

第十次作业。