C语言:下列程序哪里有错误,包括语法和算法,请高手纠正。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言:下列程序哪里有错误,包括语法和算法,请高手纠正。相关的知识,希望对你有一定的参考价值。

这是原题:一个班有N名学生,每个学生学习了M门课程,请按平均成绩由小到大的顺序显示M门课程的成绩,按平均成绩由大到小的顺序显示N名学生的成绩
#include<stdio.h>
#define N 5
#define M 3
/*函数声明*/
void input(int);
void output(float,int);
void avgsub(int,float);
void avgstd(int,float);
int mindex(float,int,int,int);
void swap(float,int,int);
void sort(float,int,int);
/*主函数*/
int main()

int s[N][M];
float sub[M],std[N];
input(s[N][M]);
avgsub(s[N][M],sub[M]);
avgstd(s[N][M],std[N]);
sort(sub[],M,1);
sort(std[],N,0);
output(sub[],M);
output(std[],N);
return 0;

/*接收函数*/
void input(int score[ ][M])

int i,j;
for(i=0;i<N;i++)
for(j=0;i<M;j++)
scanf("%d",&score[i][j]);

/*显示函数*/
void output(float array[ ], int n)

int i;
for(i=0;i<n;i++)
printf("%f",array[i]);

/*计算课程平均成绩函数*/
void avgsub(int score[ ][M], float subscore[ ])

int i,j,sum;
float m;
for(j=0;j<M;j++)
for(i=0;i<N;i++)
sum+=score[i][j];
m=(float)sum/N;
subscore[j]=m;
sum=0;


/*计算学生平均成绩函数*/
void avgstd(int score[ ][M], float stdscore[ ])

int i,j,sum;
float m;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
sum+=score[i][j];
m=(float)sum/M;
stdscore[i]=m;
sum=0;


/*查找函数*/
int mindex(float array[ ], int n, int i, int mode)

int t,a;
float m,max,min;
min=max=array[i-1];
for(t=i-1;t<n;t++)
if(array[t]>=array[t+1])

min=array[t+1];
max=array[t];

for(t=i-1;t<n;t++)
if(mode&&max==array[t])
a=t;
else if(!mode&&min==array[t])
a=t;

return a;

/*交换函数*/
void swap(float array[ ], int i, int j)

float m;
m=array[i];
array[i]=array[j];
array[j]=m;

/*排序函数*/
void sort(float array[ ], int n, int mode)

int i,t;
for(i=0;i<n;i++)
t=mindex(array[ ],n,i,mode);
swap(array[ ],i,t);


int mindex(float array[ ], int n, int i, int mode):通过形参数组array接收n个实数,从该数组第i个元素起查找并返回最小元素(mode==0时)或最大元素(mode==1时)的下标
void sort(float array[ ], int n, int mode),通过形参数组array接收n个实数,并调用mindex和swap函数,对数组array进行排序(当mode==0时升序排序,mode==1时降序排序)

语法方面主要是引用数组的格式不对,还有下标有粗心的地方。算法方面 函数mindex的问题比较大。我把你的程序修正过了。在vc6下调试ok。现在贴给你。

// test1112_2.cpp : Defines the entry point for the console application.//
#include "stdafx.h"
//#include<stdio.h>
#define N 5 //学生人数
#define M 3 //课程数
/*函数声明*/
void input(int score[][M]);
void output(float array[],int);
void avgsub(int score[][M],float[]);//按照课程排序
void avgstd(int score[][M],float[]);//按照学生排序
int mindex(float array[],int,int,int);
void swap(float array[],int,int);
void sort(float array[],int,int);
/*主函数*/
int main()

int i,j;
int s[N][M];
float sub[M],std[N];

input(s);
printf("输入的内容为:\n");
printf("%d个学生,每个学生%d门课。分配如下: \n",N,M);
for(i=0;i<N;i++)

printf("第%d个学生的课程成绩:\n",i+1);
for(j=0;j<M;j++)printf("%d ",s[i][j]);
printf("\n");


avgsub(s,sub); avgstd(s,std);
sort(sub,M,1);//按照课程排序 sort(std,N,0);//按照学生排序
printf("按照课程的成绩,降序:\n");
output(sub,M);//按照课程排序
printf("\n");
printf("按照学生的成绩,升序:\n");
output(std,N);//按照学生排序
printf("\n");

return 0;

/*接收函数*/
void input(int score[ ][M])

int i,j;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
scanf("%d",&score[i][j]);


/*显示函数*/
void output(float array[ ], int n)

int i;
for(i=0;i<n;i++)
printf("%f ",array[i]);
printf("\n",array[i]);

/*计算课程平均成绩函数*/
void avgsub(int score[ ][M], float subscore[ ])

int i,j,sum;
float m;

m=0.0;
for(j=0;j<M;j++)

sum=0;
i=0;
for(i=0;i<N;i++)
sum+=score[i][j];
m=(float)sum/N;
subscore[j]=m;



/*计算学生平均成绩函数*/
void avgstd(int score[ ][M], float stdscore[ ])

int i,j,sum;
float m;

for(i=0;i<N;i++)
sum=0;
for(j=0;j<M;j++)sum+=score[i][j];
m=(float)sum/M;
stdscore[i]=m;



/*查找函数*/
int mindex(float array[ ], int n, int i, int mode)

int t,a;
float m,max,min;
min=max=array[i];

a=i;
if(mode==1)

for(t=i;t<n;t++)
if(array[t]>max)

max=array[t];
a=t;


else if(mode==0)

for(t=i;t<n;t++)
if(array[t]<min)

min=array[t];
a=t;



return a;

/*交换函数*/
void swap(float array[ ], int i, int j)

float m;
m=array[i];
array[i]=array[j];
array[j]=m;

/*排序函数*/
void sort(float array[ ], int n, int mode)

int i,t;
for(i=0;i<n;i++)
t=mindex(array,n,i,mode);
if (t!=-1)
swap(array,i,t);
else
printf("排序不成功!\n");



我的qq:55946363 ,。祝你好好学,呵呵
参考技术A 我很难相信这程序是原题,错误多于牛毛,我简单看了一下,发现这几处错误,太多太多
函数声明中的参数与函数定义的参数不一致,例如函数定义的参数要求有整型指针,声明中的参数却是整型数
函数调用参数与函数定义参数不一致,函数定义参数要求为指针,但实际参数却是数组一个元素,而且该元素不存在,例如input(s[N][M])
input函数j误写为i
数组和avgsub及avgstd中的参数sum未初始化,数值不确定
调用mindex会出现数组下标越界从而引发错误,等号的优先级比逻辑与高追问

所有的语法错误我都改了,就是算法不知道哪里错误,你看看呗

追答

算法只有一处错误,就是mindex函数的第一个循环,仅有if语句部分是不够的。如果数组里的数据已经是升序,而要求降序时发挥不了作用,你还应该补充else部分
我说错了一个地方,因为上次没细看,mindex函数的等号和逻辑与的优先级没有错,是那样的

本回答被提问者和网友采纳
参考技术B 你首先要弄明白形参数组传递的是什么;还有函数声明怎样是正确的。我按你的程序改了一下,错误没有了,但好像没用,我写了一个,你参照看。
#include<stdio.h>
#define N 1
#define M 3
/*函数声明*/
void input(int score[ ][M]);
void output(float array[ ], int n);
void avgsub(int score[ ][M], float subscore[ ]);
void avgstd(int score[ ][M], float stdscore[ ]);
int mindex(float array[ ], int n, int i, int mode);
void swap(float array[ ], int i, int j);
void sort(float array[ ], int n, int mode);
/*主函数*/
int main()

int s[N][M];
float sub[M],std[N];
input(s);
avgsub(s,sub);
avgstd(s,std);
sort(sub,M,1);
sort(std,N,0);
output(sub,M);
output(std,N);
return 0;

/*接收函数*/
void input(int score[ ][M])

int i,j;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
scanf("%d",&score[i][j]);

/*显示函数*/
void output(float array[ ], int n)

int i;
for(i=0;i<n;i++)
printf("%f",array[i]);

/*计算课程平均成绩函数*/
void avgsub(int score[ ][M], float subscore[ ])

int i,j,sum;
float m;
for(j=0;j<M;j++)

for(i=0;i<N;i++)
sum+=score[i][j];
m=(float)sum/N;
subscore[j]=m;
sum=0;


/*计算学生平均成绩函数*/
void avgstd(int score[ ][M], float stdscore[ ])

int i,j,sum;
float m;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
sum+=score[i][j];
m=(float)sum/M;
stdscore[i]=m;
sum=0;


/*查找函数*/
int mindex(float array[ ], int n, int i, int mode)

int t,a;
float m,max,min;
min=max=array[i-1];
for(t=i-1;t<n;t++)
if(array[t]>=array[t+1])

min=array[t+1];
max=array[t];

for(t=i-1;t<n;t++)
if(mode&&max==array[t])
a=t;
else if(!mode&&min==array[t])
a=t;

return a;

/*交换函数*/
void swap(float array[ ], int i, int j)

float m;
m=array[i];
array[i]=array[j];
array[j]=m;

/*排序函数*/
void sort(float array[ ], int n, int mode)

int i,t;
for(i=0;i<n;i++)

t=mindex(array,n,i,mode);
swap(array,i,t);



我自己写的:
#include<stdio.h>
#define N 5
#define M 3

int main()

int i,j,temp,sum=0;
float m=0;
int score[N][M];
float stdscore[N],average[N];
printf("一个班有N名学生,每个学生学习了M门课程,请按平均成绩由小到大的顺序显示M门课程的成绩,按平均成绩由大到小的顺序显示N名学生的成绩\n",N,M);
for(i=0;i<N;i++)
for(j=0;j<M;j++)
scanf("%d",&score[i][j]);
for(i=0;i<N;i++)

for(j=0;j<M;j++)
sum+=score[i][j];
m=(float)sum/M;
stdscore[i]=m;
average[i]=stdscore[i];
sum=0;

for(i=1;i<N;i++)
for(j=0;j<i;j++)
if(stdscore[i]<stdscore[j])

temp=stdscore[i];
stdscore[i]=stdscore[j];
stdscore[j]=temp;

for(j=0;j<N;j++)

printf("第%d个同学的成绩为:",j+1);
for(i=0;i<M;i++)

printf("%-5d",score[j][i]);

printf(" 平均成绩为:");
printf("%-6f",average[j]);
printf("\n");

printf("经过排序后平均成绩排序如下\n:");
for(i=0;i<N;i++)

printf("%-10f",stdscore[i]);

printf("\n");
return 0;

以上是关于C语言:下列程序哪里有错误,包括语法和算法,请高手纠正。的主要内容,如果未能解决你的问题,请参考以下文章

C++语法高手进

C语言试题六十之请编写函数fun,计算并输出下列级数和:s=1/1*2+1/2*3+…+1/n(n+1)

C语言试题六十之请编写函数fun,计算并输出下列级数和:s=1/1*2+1/2*3+…+1/n(n+1)

请C语言高手告诉我我错在哪里?

C语言程序调试,编译的结果总是说我的变量S没有初始化,但是我怎么改都是这个错误,请高手指点一二。

一道c语言题,编译无错误,调试时出现“0x00403c2c 指令引用的 0x00000001 内存”,该内存不能为read。