c语言中的问题?

为什么会有这样的结果?... 为什么会有这样的结果? 展开
 我来答
碧海风云

2017-08-02 · 碧海风的秘密小据点!
碧海风云
采纳数:909 获赞数:10281

向TA提问 私信TA
展开全部
#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; i<stuNum; 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; i<subNum; i++) {
scanf ("%f",&stu[stuIndex].scores[i].score);
} /*各门课成绩分数*/

for (i=0; i<subNum; i++)
if (stu[stuIndex].scores[i].score>100 || stu[stuIndex].scores[i].score<0)
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; i<subNum; 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; i<subNum; 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; i<stuNum; 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; i<subNum; 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; i<subNum; i++)
printf ("%s\t",subject[i]);
printf ("总分\t");
printf ("平均分\t"); 
putchar ('\n');
puts ("------------------------------------------------------");

/*输出信息*/
for (i=0; i<stuNum; 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; i<stuNum-1; i++)
for (j=0; j<stuNum-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; i<stuNum; 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;
}

运行结果

主菜单

录入学生信息

排名次并输出

a40304
2012-05-18 · 超过42用户采纳过TA的回答
知道小有建树答主
回答量:80
采纳率:60%
帮助的人:63.7万
展开全部
/*关于这个程序,我觉得应该是考你对结构体的掌握
结构体在我个人的理解,就是把一些有联系的东西集合起来,方便调用
打个比方有二十个人,要记录他们的身高和体重,如果用一般数组记录身高和体重,那么就得定义两个数组,而且用起来还麻烦
但用结构体的话,只用一个结构体的数组就行了,方便,简洁
*/
#include<stdio.h>
#define N 2 //定义学生的个数,为了方便调试,我只写了2,你可以把2改为你想要的任意学生数
struct STUDENT //定义一个结构体
{
char name[8];
int num;
float score[3];
float average;
};

void output(struct STUDENT *stu,int n) //输出
{
int i,j,max=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(stu[j].average>stu[i].average)
max=j; //先输出平均分最高的
}
printf("%-8s %-8d %-6.1f\n",stu[max].name,stu[max].num,stu[max].average);
stu[max].average=-1;//输出后标记为-1
}
}

void input(struct STUDENT *stu,int n) //输入
{
int i;
for(i=0;i<n;i++)
{
scanf("%s %d %f %f %f",&stu[i].name,&stu[i].num,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
}
}

void calculate(struct STUDENT *stu,int n) //计算平均分
{
int i;
for(i=0;i<n;i++)
{
stu[i].average=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3; //三门课总和除以3
}
}

void main(void)
{
struct STUDENT stu[N];
int i;
printf("请输入:姓名、学号、数学成绩、英语成绩、计算机成绩(每个数据以空格格开)\n");

input(stu,N); //输入
calculate(stu,N); //计算

printf("排序后:\n");
printf("姓名 学号 平均分\n");

output(stu,N); //输出

}

/*
输入:
王五 1111 60 50 40
张三 2222 70 80 90
输出:
姓名 学号 平均分
张三 2222 80.0
王五 1111 50.0
*/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
White_MouseYBZ
2019-11-08 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6489万
展开全部
  1. 把long unsigned int a,b,c,s;改成long unsigned int a,b,c;。

  2. 把long double area;改成long double area,s;。

  3. 把if(a-b<c && b-a<c && a-c<b && c-a<b && b-c<a && c-b<a)改成if((a-b<c || b-a<c) && (a-c<b || c-a<b) && (b-c<a || c-b<a))或直接改成if(a+b>c && a+c>b && b+c>a)。

  4. 把s=(a+b+c)/2;改成s=(a+b+c)/2.0;。

  5. 把printf("这个三角形面积为%d\n",area);改成把printf("这个三角形面积为%f\n",area);。

或者——

  1. 把long unsigned int a,b,c,s删除。

  2. 把long double area;改成long double area,a,b,c,s;。

  3. 把if(a-b<c && b-a<c && a-c<b && c-a<b && b-c<a && c-b<a)改成if(a+b>c && a+c>b && b+c>a)。

  4. 把begin: scanf("%d%d%d",&a,&b,&c);改成begin: scanf("%lf%lf%lf",&a,&b,&c);。

  5. 把printf("这个三角形面积为%d\n",area);改成把printf("这个三角形面积为%f\n",area);。

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
msh1028
2017-08-02 · TA获得超过2.6万个赞
知道大有可为答主
回答量:1.9万
采纳率:62%
帮助的人:1084万
展开全部
可以参考排序,每次循环总能得到一个最大值,将此最大值所在结构体的排名rank赋值:
大概如下:
for(i=0;i<5;i++)
{
for(j=0;j<4-i;j++)
{
if(student[j].total>student[j+1].total)
{
//temp也是结构体,交换
temp = student[j];
student[j] = student[j+1];
student[j+1] = temp;
}
}
student[j].rank = i+1;
}

也可以用结构体指针,不需要每次交换,只需要标记下最大值,然后赋予名次~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zsyzLJZ
2017-08-02 · TA获得超过264个赞
知道小有建树答主
回答量:118
采纳率:83%
帮助的人:35.9万
展开全部

用结构体+排序就可以

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
using namespace std; 

struct node{char name[50]; int id,math,en,com,avg;};
node q[100];
int n; //班级人数 

int cmp(const node &a,const node &b)
{
if (a.avg>b.avg) return 1;
if (a.avg<b.avg) return 0;
if (a.id<b.id) return 1;
return 0;
}

int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i=i+1)
{
scanf("%s %d %d %d %d",q[i].name,&q[i].id,&q[i].math,&q[i].en,&q[i].com);
q[i].avg=(q[i].math+q[i].en+q[i].com)/3;

sort(q+1,q+1+n,cmp);
for(int i=1;i<=n;i=i+1)
{
printf("%s %d %d %d\n",q[i].name,q[i].id,q[i].avg);
}
}

自打程序不易,如有帮助,望采纳

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(10)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式