鱼C论坛

 找回密码
 立即注册
查看: 4302|回复: 7

求助一个关于动态储存分配的程序

[复制链接]
发表于 2013-7-2 10:59:15 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 天使已然堕落 于 2013-7-6 22:50 编辑

写一个统计学生成绩的程序,分别用子函数求出:(1):出入n个学生的m门功课的成绩
(2):每个学生的平均分。
(3):没门功课的平均分。
(4):找出最高分对应的学生和功课
要求:
1:有四个单独的子函数完成上述功能。
2:用动态存储分配思想完成数组的定义。

哪位大神能帮忙写一下这个程序,用C实现,在下先行谢过了。

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-2 14:27:56 | 显示全部楼层
int book_id_test( int id )
{
        struct book * p = head;
        for ( p = head; p; p = p->next )
        {
                if ( p->book_id == id )
                        return 1;
        }
        return 0;
}

void add_book()                        
{

    struct book *asd;
    asd = (struct book*)malloc(sizeof(struct book));
        printf("请输入编号:\n");
        scanf("%d",&(asd->book_id));
        printf("请输入名称:");
        scanf("%s",asd->book_name);
        printf("请输入名字");
        scanf("%s",asd->book_writer);
        while ( book_id_test( asd->book_id ) )
        {
                printf( "输入id以存在请重新输入" );
                fflush( stdin );
                printf("请输入编号:\n");
                scanf("%d",&(asd->book_id));
                printf("请输入名称:");
                scanf("%s",asd->book_name);
                printf("请输入名字");
                scanf("%s",asd->book_writer);
        }

    asd->next = NULL;

    if(head == NULL)
    {
        head = asd;
    }
    else
    {
        asd->next=head;
        head=asd;
    }
    return;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-4 00:21:50 | 显示全部楼层
学习学习........
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-4 12:34:24 | 显示全部楼层

嗯。。感谢你的帮助。。不过。。貌似不合题意。。不过。。花了五个多小时,我自己写出来了。。无论如何,谢谢你的帮助
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-4 12:55:45 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct Grade   //定义用于储存成绩的动态表及其别名
  4. {
  5.     float grade;
  6.     struct Grade *next;
  7. }Grade;
  8. typedef struct Grade *GradeList;    //定义指向成绩节点指针的别名

  9. typedef struct Student     //定义用于储存学生信息的动态表及其别名
  10. {
  11.     char name[20];
  12.     GradeList G;
  13.     float average;
  14.     struct Student *next;
  15. }Student;
  16. typedef struct Student *StudentList;    //定义指向学生信息指针的别名

  17. void setup(StudentList *L,int n,int m) //用于创建整张表的函数
  18. {
  19.     StudentList p1,r1;
  20.     GradeList p2,r2;
  21.     int i,j;
  22.     *L = (StudentList)malloc(sizeof(Student));//指向整个学生信息链表
  23.     r1 = *L;//r1指向学生信息链表的尾部
  24. /***********头结点作为每科平均分的存放位置*/
  25.     r2=r1->G=(Grade *)malloc(sizeof(Grade));
  26.     for(j=0;j<m;j++)
  27.     {
  28.         p2 = (Grade *)malloc(sizeof(Grade));
  29.         r2->next=p2;
  30.         r2=p2;
  31.     }
  32.     r2->next=NULL;
  33. /*******************************************/
  34.     for(i=0;i<n;i++)
  35.     {
  36.         p1 = (Student *)malloc(sizeof(Student));//生成新的学生信息节点
  37.         printf("\nPlease enter the name of student %d:",i+1);//输入第i个学生的姓名
  38.         scanf("%s",p1->name);
  39.         p1->G=(GradeList)malloc(sizeof(Grade));//指向整个学生成绩链表
  40.         r2=p1->G;//r2指向学生成绩链表的尾部
  41.         for(j=0;j<m;j++)
  42.         {
  43.             p2 = (Grade *)malloc(sizeof(Grade));//生成一个新的学生成绩节点
  44.             printf("    Please enter the grade of subject %d:",j+1);
  45.             scanf("%f",&(p2->grade));//输入第J科成绩
  46.             r2->next=p2;//将学生成绩终结点的指针指向新结点
  47.             r2=p2;//将当前的新节点定义为学生成绩链表的表位终端结点
  48.         }
  49.         r2->next=NULL;//结束学生成绩链表
  50.         r1->next=p1;//将学生信息链表表尾终端结点的指针指向新节点
  51.         r1=p1;//将当前的新节点定义为学生信息链表的表尾终端结点
  52.     }
  53.     r1->next=NULL;//结束学生信息链表
  54. }

  55. void saverage(StudentList L,int n,int m)//计算每位学生的平均分
  56. {
  57.     int i,j;
  58.     StudentList r1;//定义指向学生信息链表尾结点的指针
  59.     GradeList r2;//定义指向学生成绩链表尾结点的指针
  60.     r1=L->next;//将指针指向学生信息链表首节点
  61.     for(i=0;i<n;i++)
  62.     {
  63.         r2=r1->G->next;//将指针指向学生成绩链表首届点
  64.         for(j=0;j<m;j++)
  65.         {
  66.             r1->average+=r2->grade/m;//计算平均成绩
  67.             r2=r2->next;//指针向后移动一个节点
  68.         }
  69.         printf("\nThe average grade of sutdent %d is %.2f",i+1,r1->average);
  70.         r1=r1->next;//向后移动一个节点
  71.     }
  72. }
  73. float esgrade(StudentList L,int n,int m)//读取第N个学生的第M科的成绩
  74. {
  75.     int i,j;//定义计数变量
  76.     StudentList p1;
  77.     GradeList p2;
  78.     p1=L->next;
  79.     i=1;
  80.     while(p1&&i<n)//等待学生信息指针传递
  81.     {
  82.         p1=p1->next;
  83.         i++;
  84.     }
  85.     p2=p1->G->next;
  86.     j=1;
  87.     while(p2&&j<m)//等待学生成绩指针传递
  88.     {
  89.         p2=p2->next;
  90.         j++;
  91.     }
  92.     return p2->grade;//返回所需学生的成绩
  93. }
  94. void gaverage(StudentList L,int n,int m)//计算每科的平均分
  95. {
  96.     GradeList p;
  97.     int i,j;
  98.     p=L->G->next;
  99.     for(j=1;j<=m;j++)
  100.     {
  101.         for(i=1;i<=n;i++)
  102.         {
  103.             p->grade+=esgrade(L,i,j)/n;
  104.         }
  105.         printf("\nThe average grade of subject %d is %.2f",j,p->grade);
  106.         p=p->next;
  107.     }
  108. }
  109. void gmax(StudentList L,int n,int m)//
  110. {
  111.     float max;
  112.     int i,j,num;
  113.     for(j=1;j<=m;j++)
  114.     {
  115.         max=esgrade(L,1,j);
  116.         num=1;
  117.         for(i=1;i<=n;i++)
  118.         {
  119.             if (esgrade(L,i,j)>max)
  120.             {
  121.                 max=esgrade(L,i,j);
  122.                 num=i;
  123.             }
  124.         }
  125.         printf("\nThe highest grade of subject %d is %.2f and it's the grade of student %d",j,max,num);
  126.     }
  127. }

  128. void main(void)
  129. {
  130.     int n=2,m=2;
  131.     printf("\nIn this progrom after enter a data,please press the enter bottom to end.\n");
  132.     StudentList L;
  133.     setup(&L,n,m);
  134.     printf("\n");
  135.     saverage(L,n,m);
  136.     printf("\n");
  137.     gaverage(L,n,m);
  138.     printf("\n");
  139.     gmax(L,n,m);
  140. }
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-4 17:27:10 | 显示全部楼层
Mark!!!!!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-4 19:32:08 | 显示全部楼层
我觉得我们鱼c也应该搞一个“求作业就封贴”
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-6 20:01:04 | 显示全部楼层
我也来帮忙顶一下吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-21 08:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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