写出程序并给每一步注释,越详细越好,最好能举个具体的例子,不要用指针
某班期末考试科目为数学,英语,和物理,有最多不超过30人参加考试。考试后要求:(1)计算每个学生的总分和平均分;(2)按总分成绩由高到低排出成绩的名次;(3)打印出名次表,表格内包括学生编号、各科分数、总分和平均分;(4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数
#include <stdio.h>
#include <stdlib.h>
#define MAX_LEN 9 /* 字符串最大长度 */
#define STU_NUM 30 /* 最多的学生人数 */
/*
定义一个录入成绩的方法,参数为学号数组、三门成绩数组、录入学生人数
*/
void ReadScore(long num[],int score[][3],int n)
{
int i,k;
for(i=0;i<n;i++)
{printf("输入第%d个学生学号以及数学、英语、物理成绩:\n",i+1);
scanf("%ld",&num[i]);
getchar();//清除缓存
for(k=0;k<3;k++)
{
scanf("%d",&score[i][k]);//输入当前第i名学生的第k门成绩
getchar();
}
}
}
/*
定义一个计算学生总成绩、平均成绩的方法,参数为 总成绩数组、平均成绩数组、各科成绩二维数组、录入学生人数
*/
void Student(int Studentsum[STU_NUM],float Studentaver[STU_NUM],int score[][3],int n)
{
int i,k,s;
for(i=0;i<n;i++) //遍历每一个学生
{
s=0;
for(k=0;k<3;k++) //遍历每门成绩(一共三门)
{
s+=score[i][k];//统计求当前学生i的总成绩
}
Studentsum[i]=s;
Studentaver[i]=(float)s/3;// 统计求当前学生i的平均成绩
}
}
int main()
{
//定义学生人数变量、成绩二维数组、学生总成绩数组
int n,score[STU_NUM][3],Studentsum[STU_NUM];
//定义学号、学号数组
long no,num[STU_NUM];
//定义平均分数组
float Studentaver[STU_NUM];
printf("请输入学生人数:");
scanf("%d",&n);
//调用方法录入成绩
ReadScore(num,score,n);
//调用方法计算总成绩、平均成绩
Student(Studentsum,Studentaver,score,n);
printf("学号\t总分\t平均分\n");
for(int t=0;t<n;t++)
{
printf("%ld\t%4d\t%4.1f\n",num[t],Studentsum[t],Studentaver[t]);
}
//按照总成绩进行排名
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(Studentsum[j]<Studentsum[j+1]){
//交换学号
long temp=num[j];
num[j]=num[j+1];
num[j+1]=temp;
//交换总成绩
int temp1=Studentsum[j];
Studentsum[j]=Studentsum[j+1];
Studentsum[j+1]=temp1;
//交换平均成绩
int temp2=Studentaver[j];
Studentaver[j]=Studentaver[j+1];
Studentaver[j+1]=temp2;
//交换各科成绩
int temp3[]={0};
temp3[0]=score[j][0];
temp3[1]=score[j][1];
temp3[2]=score[j][2];
score[j][0]=score[j+1][0];
score[j][1]=score[j+1][1];
score[j][2]=score[j+1][2];
score[j+1][0]=score[j][0];
score[j+1][1]=score[j][1];
score[j+1][2]=score[j][2];
}
}
}
printf("\n名次 学号 数学成绩 英语成绩 物理成绩 总分 平均分\n");
for(int i=0;i<n;i++)
{
printf("%d\t%ld\t",i+1,num[i]);
for(int k=0;k<3;k++)
{
printf("%6d\t",score[i][k]);
}
printf("%6d\t%5.1f\n",Studentsum[i],Studentaver[i]);
}
printf("请输入待查询学号:");
scanf("%ld",&no);
bool flag=true;
for(int i=0;i<n;i++){
if(no==num[i]){
flag=false;
printf("名次:%d,学号:%ld,数学成绩:%d,英语成绩:%d,物理成绩:%d\n",i+1,no,score[i][0],score[i][1],score[i][2]);
break;
}
}
if(flag)
printf("当前学号不存在!");
return 0;
}
矩阵转换,只需要行序号和列序号交换就行
#include <stdio.h>
int main()
{
int a[3][4],b[4][3];
int i,j,maxi,maxj,t,mini,minj;
maxi=maxj = mini=minj0;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
for(i=0;i<3;i++)
for(j=0;j<4;j++)
{
b[j][i] = a[i][j];
if(a[i][j] > a[maxi][maxj])
{
maxi = i;
maxj = j;
}
if(a[i][j] < a[mini][minj])
{
mini = i;
minj = j;
}
}
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
printf("%d ",b[i][j]);
printf("\n"):
}
printf("最大值为: a[%d][%d]=%d\n",maxi,maxj,a[maxi][maxj]);
printf("最小值为: a[%d][%d]=%d\n",mini,minj,a[mini][minj]);
}