|
题目
排序的问题 (统计成绩)
一、问题描述
给出 n 个学生的考试成绩表,每条信息由姓名与分数组成,试设计一个算法:
(1)按分数高低次序,打印出每个学生在考试中获得的名次,
分数相同的为同一名次;
(2)按名次列出每个学生的姓名与分数。
二、基本要求
学生的考试成绩表必须通过键盘输入数据而建立,同时要对输出进行格式控制。
源程序:
// Homework1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
//
struct Student
{
char Name[20];
float ChineseMark;
float EnglishMark;
float MathematicsMark;
float TotalMark;
int MarkOrder;
struct Student *next;
Student()
{
MarkOrder =0;
next = NULL;
}
};
Student * ReadStudentData(int number);
void DeleteNode ( Student * pNode);
void ListByInputOrder(Student *pNode);
void ListByMarkOrder(Student *pNode);
void SortMarkOrder(Student *pNode);
int main(int argc, char* argv[])
{
int i=0;
printf("\nPlease input the number of students...\n");
scanf("%d",&i);
if (i<=0)
{
char temp[20];
gets(temp);
printf("\nError input! Press ENTER key to quit the program!\n");
getchar();
return 1;
}
Student * HeadNode = ReadStudentData(i);
if (HeadNode==NULL)
{
char temp[20];
gets(temp);
printf("\nFail to get students' information. Press ENTER key to quit the program!\n");
getchar();
return 1;
}
SortMarkOrder(HeadNode);
int selection =-1;
bool StopWhile = false;
while (!StopWhile)
{
printf("\n\nPlease select a list:");
printf("\n1 - List by input order.\n2 - List by mark oder.\n3 - Quit the program.");
printf("\nPlease input your selection:");
scanf("%d",&selection);
switch (selection)
{
case 1:
ListByInputOrder(HeadNode);
break;
case 2:
ListByMarkOrder(HeadNode);
break;
case 3:
StopWhile= true;
break;
default:
printf("Error input!");
}
}
DeleteNode(HeadNode);
char temp[20];
gets(temp);
printf("\nPress ENTER key to quit the program!\n");
getchar();
return 0;
}
Student * ReadStudentData(int number)
{
if (number<=0)
return NULL;
Student * HeadNode=NULL,*RearNode = NULL,*pNode=NULL;
for (int i=0;i<number;i++)
{
pNode=new Student;
if (pNode==NULL)
{
DeleteNode(HeadNode);
return NULL;
}
printf("\nPlease input a new student's marks...\n");
printf("Name:");
scanf("%s",pNode->Name);
printf("ChineseMark(0-100):");
scanf("%f",&(pNode->ChineseMark));
while ( pNode->ChineseMark<0 || pNode->ChineseMark>100)
{
printf("\nIllegal input! the value must between 0 - 100.\n");
printf("ChineseMark(0-100):");
scanf("%f",&(pNode->ChineseMark));
}
printf("EnglishMark(0-100):");
scanf("%f",&(pNode->EnglishMark));
while ( pNode->EnglishMark<0 || pNode->EnglishMark>100)
{
printf("\nIllegal input! the value must between 0 - 100.\n");
printf("EnglishMark(0-100):");
scanf("%f",&(pNode->EnglishMark));
}
printf("MathematicsMark(0-100):");
scanf("%f",&(pNode->MathematicsMark));
while ( pNode->MathematicsMark<0 || pNode->MathematicsMark>100)
{
printf("\nIllegal input! the value must between 0 - 100.\n");
printf("MathematicsMark(0-100):");
scanf("%f",&(pNode->MathematicsMark));
}
pNode->TotalMark = pNode->ChineseMark+pNode->EnglishMark+pNode->MathematicsMark;
if (RearNode == NULL)
HeadNode = pNode;
else
RearNode->next = pNode;
RearNode=pNode;
//RearNode->next=NULL;
}
return HeadNode;
}
void DeleteNode ( Student * pNode)
{
Student *pTemp=pNode;
while (pTemp!=NULL)
{
pNode = pNode->next;
delete pTemp;
pTemp = pNode;
}
}
void ListByInputOrder(Student *pNode)
{
printf("\nList by input order:\n\n");
printf("Order\tName\tChinese\tEnglish\tMath\tTotal\n");
Student *pTemp = pNode;
while (pTemp!=NULL)
{
printf("%d\t%s\t%0.2f\t%0.2f\t%0.2f\t%0.2f\n",pTemp->MarkOrder,pTemp->Name,
pTemp->ChineseMark,pTemp->EnglishMark,pTemp->MathematicsMark,pTemp->TotalMark);
pTemp = pTemp->next;
}
}
void ListByMarkOrder(Student *pNode)
{
int pOrder=1;
int step =0;
Student * pTemp=pNode;
bool flag = true;
printf("\nList by mark order:\n\n");
printf("Order\tName\tChinese\tEnglish\tMath\tTotal\n");
while (flag)
{
flag = false;
while (pTemp!=NULL)
{
if (pTemp->MarkOrder==pOrder)
{
step++;
printf("%d\t%s\t%0.2f\t%0.2f\t%0.2f\t%0.2f\n",pTemp->MarkOrder,pTemp->Name,
pTemp->ChineseMark,pTemp->EnglishMark,pTemp->MathematicsMark,pTemp->TotalMark);
}
if (!flag && pTemp->MarkOrder > pOrder)
flag = true;
pTemp = pTemp->next;
}
pOrder += step;
step =0;
pTemp= pNode;
}
}
//
//
void SortMarkOrder(Student *pNode)
{
if (!pNode)
return;
Student * pTemp1=pNode,*pTemp2 ;
while (pTemp1!=NULL)
{
pTemp1->MarkOrder++;
pTemp2 = pNode;
while( pTemp2!=NULL)
{
if (pTemp1->TotalMark < pTemp2->TotalMark)
pTemp1->MarkOrder++;
pTemp2 = pTemp2->next;
}
pTemp1 = pTemp1->next;
}
}
要求:
需求分析:
(1) 数据输入的形式和输出值的范围;
(2) 输出的形式;
说明用到的数据结构的定义,主程序的流程
及各程序模块之间的调用关系
算法的时间、空间复杂度的分析;
在下跪求编程高手指点~~我不太懂 |
|