扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
include cstdlib 或 #include stdlib.h
成都创新互联是专业的袁州网站建设公司,袁州接单;提供网站建设、网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行袁州网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
qsort(void* base, size_t num, size_t width, int(*)compare(const void* elem1, const void* elem2))
参数表
*base: 待排序的元素(数组,下标0起)。
num: 元素的数量。
width: 每个元素的内存空间大小(以字节为单位)。可用sizeof()测得。
int(*)compare: 指向一个比较函数。*elem1 *elem2: 指向待比较的数据。
比较函数的返回值
返回值是int类型,确定elem1与elem2的相对位置。
elem1在elem2右侧返回正数,elem1在elem2左侧返回负数。
控制返回值可以确定升序/降序。
产生随机数的函数也是rand(),不是rank().
#include stdio.h
#include stdlib.h
#include string.h
#define status int
#define NAME 30 /*各类名称字数上限*/
#define STU 100 /*学生人数上限*/
#define SUB 10 /*课程数上限*/
typedef struct record {
float score; /*成绩分数*/
} record;
typedef struct student {
int id; /*索引性质的id*/
int no; /*学号*/
char name[NAME]; /*姓名*/
record scores[SUB]; /*各门课成绩分数*/
float totalScore; /*总分*/
float averageScore; /*平均分*/
int ranking; /*名次*/
} student;
int subNum = 3; /*课程数*/
char subject[SUB][NAME] = {"数学","英语","计算机"}; /*课程名称*/
/**********************以下为函数声明**********************/
int stuInfoEmpty (student stu[], int stuNum); /*学生信息判空*/
status inputStuInfo (student stu[], int stuIndex, int subNum); /*录入单个学生信息*/
status inputAllStuInfo (student stu[], int *stuNum, int subNum); /*录入全部学生信息*/
status calcStuInfo (student stu[], int stuIndex, int subNum); /*计算处理单个学生信息*/
status calcAllStuInfo (student stu[], int stuNum, int subNum); /*计算处理全部学生信息*/
status printStuInfo (student stu[], int stuIndex, int subNum, int inclRanking); /*输出单个学生信息*/
status printAllStuInfo (student stu[], int stuNum, int subNum, int inclRanking); /*输出全部学生信息*/
status descSort (student stu[], int stuNum, int subNum); /*按总分降序排列并录入名次*/
int getCommand (void); /*输入命令编号*/
status printMeunText (void); /*打印菜单文本*/
status runMeun (student stu[], int stuNum, int subNum); /*调出菜单*/
/**********************以上为函数声明**********************/
int main (void) {
student stu[STU] = {-1}; /*学生结构体数组*/
int stuNum;
int i;
runMeun (stu, stuNum, subNum);
return 0;
}
/*学生信息判空*/
/*为空返回1;不空返回0*/
int stuInfoEmpty (student stu[], int stuNum) {
int i;
if (stuNum == 0)
return 1;
for (i=0; istuNum; i++)
if (stu[i].id == -1)
return 1;
return 0;
}
/*录入单个学生信息*/
status inputStuInfo (student stu[], int stuIndex, int subNum) {
int i;
scanf ("%d",stu[stuIndex].no); /*学号*/
if (stu[stuIndex].no == -1) { /*学号录入-1以结束*/
stu[stuIndex].id = -1;
return -1; /*本次未录入*/
}
scanf ("%s",stu[stuIndex].name); /*姓名*/
for (i=0; isubNum; i++) {
scanf ("%f",stu[stuIndex].scores[i].score);
} /*各门课成绩分数*/
for (i=0; isubNum; i++)
if (stu[stuIndex].scores[i].score100 || stu[stuIndex].scores[i].score0)
return 0; /*本次录入错误*/
return 1; /*本次录入成功*/
}
/*录入全部学生信息*/
status inputAllStuInfo (student stu[], int *stuNum, int subNum) {
int i,inputStatus,count;
puts ("======================================================");
puts ("录入学生信息");
puts ("======================================================");
putchar ('\n');
if (*stuNum!=0) {
printf ("已有%d名学生信息!\n",*stuNum);
putchar ('\n');
puts ("继续录入以新增(学号录入-1以结束)↓↓");
putchar ('\n');
}
else {
puts ("请录入学生信息(学号录入-1以结束)↓↓");
putchar ('\n');
}
/*录入信息之表头*/
puts ("------------------------------------------------------");
printf ("\t\t学号\t姓名\t");
for (i=0; isubNum; i++)
printf ("%s\t",subject[i]);
putchar ('\n');
puts ("------------------------------------------------------");
/*录入信息*/
count=0;
i=*stuNum;
while (1) {
printf ("第%d名学生\t",i+1);
stu[i].id = i+1;
inputStatus = inputStuInfo (stu, i, subNum);
if (inputStatus==1) {
i++;
count++;
}
else if (inputStatus==0) {
putchar ('\n');
puts ("成绩输入错误!请重新输入↓");
continue;
}
else if (inputStatus==-1)
break;
}
*stuNum += count;
puts ("------------------------------------------------------");
putchar ('\n');
putchar ('\n');
if (count!=0)
printf ("本次%d名学生信息录入完毕!即将返回主菜单。\n",count);
else
printf ("您本次未输入学生信息!即将返回主菜单。\n");
putchar ('\n');
puts ("按任意键继续...");
putchar ('\n');
fflush (stdin);
getch ();
return 1;
}
/*计算处理单个学生信息*/
status calcStuInfo (student stu[], int stuIndex, int subNum) {
int i;
stu[stuIndex].totalScore = stu[stuIndex].averageScore = 0;
/*计算总分*/
for (i=0; isubNum; i++) {
stu[stuIndex].totalScore += stu[stuIndex].scores[i].score;
}
stu[stuIndex].averageScore = stu[stuIndex].totalScore/subNum; /*计算平均分*/
return 1;
}
/*计算处理全部学生信息*/
status calcAllStuInfo (student stu[], int stuNum, int subNum) {
int i;
/*计算总分、平均分等*/
for (i=0; istuNum; i++)
calcStuInfo (stu, i, subNum);
return 1;
}
/*输出单个学生信息*/
status printStuInfo (student stu[], int stuIndex, int subNum, int inclRanking) {
int i;
if (inclRanking)
printf ("%d\t",stu[stuIndex].ranking); /*名次*/
printf ("%d\t",stu[stuIndex].no); /*学号*/
printf ("%s\t",stu[stuIndex].name); /*姓名*/
for (i=0; isubNum; i++) /*各门课成绩分数*/
printf ("%.2f\t",stu[stuIndex].scores[i].score);
printf ("%.2f\t",stu[stuIndex].totalScore); /*总分*/
printf ("%.2f\t",stu[stuIndex].averageScore); /*平均分*/
putchar ('\n');
return 1;
}
/*输出全部学生信息*/
status printAllStuInfo (student stu[], int stuNum, int subNum, int inclRanking) {
int i;
if (stuInfoEmpty (stu,stuNum)) {
puts ("尚未录入学生信息!即将返回主菜单。");
putchar ('\n');
puts ("按任意键继续...");
putchar ('\n');
fflush (stdin);
getch ();
return 0;
}
puts ("======================================================");
puts ("全部学生信息");
puts ("======================================================");
putchar ('\n');
if (inclRanking)
printf ("%d名学生信息如下,按总分由高到低排列名次 ↓↓\n",stuNum);
else
printf ("%d名学生信息如下 ↓↓\n",stuNum);
putchar ('\n');
/*输出信息之表头*/
puts ("------------------------------------------------------");
if (inclRanking)
printf ("名次\t");
printf ("学号\t");
printf ("姓名\t");
for (i=0; isubNum; i++)
printf ("%s\t",subject[i]);
printf ("总分\t");
printf ("平均分\t");
putchar ('\n');
puts ("------------------------------------------------------");
/*输出信息*/
for (i=0; istuNum; i++)
printStuInfo (stu, i, subNum, inclRanking);
puts ("------------------------------------------------------");
putchar ('\n');
putchar ('\n');
puts ("学生信息输出完毕!即将返回主菜单。");
putchar ('\n');
puts ("按任意键继续...");
putchar ('\n');
fflush (stdin);
getch ();
return 1;
}
/*按总分降序排序、录入名次并输出*/
status descSort (student stu[], int stuNum, int subNum) {
int i,j;
student temp;
if (stuInfoEmpty (stu,stuNum))
return 0;
/*按总分降序*/
for (i=0; istuNum-1; i++)
for (j=0; jstuNum-1-i; j++)
if (stu[j].totalScore stu[j+1].totalScore) {
temp = stu[j];
stu[j] = stu[j+1];
stu[j+1] = temp;
}
/*录入名次*/
for (i=0; istuNum; i++)
stu[i].ranking = i+1;
return 1;
}
/*输入命令编号*/
int getCommand (void) {
int key; /*命令编号*/
printf("请输入命令编号以开启操作:");
scanf ("%d",key);
return key;
}
/*打印菜单文本*/
status printMeunText (void) {
puts ("======================================================");
puts ("学生信息管理");
puts ("------------------------------------------------------");
printf ("%4c\t功能详情\n",'#');
puts ("------------------------------------------------------");
printf ("%4d\t输入学生信息\n",1);
printf ("%4d\t按成绩由高到低排序\n",2);
printf ("%4d\t退出\n",7);
puts ("======================================================");
putchar ('\n');
return 1;
}
status runMeun (student stu[], int stuNum, int subNum) {
int key;
do {
system("cls"); /*清屏*/
printMeunText (); /*打印菜单文本*/
key = getCommand (); /*输入命令编号*/
putchar('\n');
switch (key) {
case 1: system("cls"); inputAllStuInfo (stu, stuNum, subNum); calcAllStuInfo (stu, stuNum, subNum); break;
case 2: system("cls"); descSort (stu, stuNum, subNum); printAllStuInfo (stu, stuNum, subNum, 1); break;
case 7: puts("程序结束!\n"); break;
default:puts("输入错误,请重新输入!\n\n\n按任意键继续..."); getch (); break;
}
} while (key!=7);
getch ();
return 1;
}
运行结果
主菜单
录入学生信息
排名次并输出
这写错了吧?
应该是
int rank(int key,int a[])
用户自定义的函数,光看函数名和参数表,是不能确定其功能的,这是由编程者自己定义的。
照字面意思,是求key在a数组中的排名。
c语言中rank函数是自定义的函数吧?如果是的话,怎么用,还必须看这个函数是怎么定义的了。
int main(){
srand(time(0));
int i = 0;
scanf("%d",i);
i += rand()%7-3;//让i加上一个-3到3的数……
printf("%d",i);
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流