第十次作业。

 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(
" 语文 数学 英语 总分 平均分 "); for(i=0;i<N;i++) { for(j=0;j<M+2;j++) { printf(" %.2lf",score[i][j]); } printf(" "); } printf("平均分"); for(i=0;i<M;i++) { printf(" %.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("请输入方阵宽度:
");
    scanf("%d",&n);
    a=1;
    for(i=0;i<n;i++)
      for(j=0;j<n;j++)
        nums[i][j]=a++;
    printf("方阵为:
");
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("%4d",nums[i][j]); 
        }
        printf("
");
    }
    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
",i+1,sum[0][i]);
    }
    for(i=0;i<n;i++)
    {
        printf("第%d列的元素和为%d
",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];
            
            }
        }
    }
    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("
");
    }
    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;
    scanf("%d",&n);
    i=1,j=1,m=n;
    do
    {   for(i=1;i<=n;i++)
        {
            if(a[i]!=-1)   
            {
                j++;
               if((j-1)%3==0)
               {
                   a[i]=-1;
                   m--;
               }
            }
        } 
    }while(m!=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。

     7.减少判断和赋值,可以节省运行时间。

原文地址:https://www.cnblogs.com/TX980502/p/6139226.html