工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1866|回复: 1

[求助][讨论]版主来帮帮忙~~高手也来指点一下,5555555~~

[复制链接]
发表于 2004-1-14 00:06 | 显示全部楼层 |阅读模式
题目
排序的问题 (统计成绩)
一、问题描述
给出 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) 输出的形式;

说明用到的数据结构的定义,主程序的流程
及各程序模块之间的调用关系

算法的时间、空间复杂度的分析;

在下跪求编程高手指点~~我不太懂
发表于 2004-3-14 10:52 | 显示全部楼层
能写出这么工整的程序,难道楼主自己就不会写需求吗??

对于“数据输入的形式和输出值的范围;输出的形式;”楼主运行一下就一目了然,根本无需多说。

该程序应该是用了单向链表的数据结构。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-5-15 12:18

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表