首页 > 代码库 > 学习阶段总结2

学习阶段总结2

最近刚好把C语言的基础部分学完,作为一个初学者,而且是一个自学者,就准备写个简单的东西看看自己学的再怎么样,于是就准备写一个最简的成绩管理的程序,正好下午没课,就背了包去了图书馆泡着,准备什么时候写完,什么时候回宿舍。

最开始部分很简单,就写的很顺利,但写到将成绩排序时就开始遇到了问题。由于为了方便以后学到东西增加后修改这个程序让其功能更加丰满时方便一些,最开始储存学生数据时就没有使用结构体数组,而是直接使用链表的。然而正是因为这样,然排序部分的困难增加了许多。最开始我对排序的想法是通过冒泡排序,一步步的将储存的数据最大的那个节点移到链表的最前面,由于现在学到的只是链表的创建部分,对于链表的操作并没有学到,于是我就开始想怎么用代码实现这个交换过程,最开始只是按照心里的想法将代码敲出来,然后点了编译,没有意外,直接宣告失败,于是我就开始想是哪个部分除了问题,这时我就将自己想像计算机模拟它实现这些代码的过程,将数字写在纸上一步一步的试数,果然,是中间节点的处理出了问题,为了找到节点处理的正确代码,我就写了一组数据,把自己当成计算机,如果我想完成排序,我需要哪些步骤,一点一点的将处理过程推出来。按照这个思路,一段时间之后,我终于把中间的实现过程找了出来,当我再次编译时也并没有报错,但是在运行时却整个崩溃了,这时我就开始反思,我是哪里的处理除了问题。我想到,一般在初学这个阶段,运行崩溃的主要原因一般是指针问题,或者输入时没有取地址符,我将整个代码检查了一遍,但并没有找到出错的地方,这个时候的感觉是特别崩溃的,但是我想越是着急越不可能将错误找出来,于是我就开始静下来想代码在那个地方容易出现这种错误,最终我想到在处理节点时是不是将最后一个节点的指向改变了,使它部位NULL,于是我再次修改了排序时节点处理部分的代码,果然,再次运行时程序并没有崩溃,但是结果还是出错了。这让我十分崩溃,因为实在找不出到底是哪里出错了。于是我就准备等下次再找错在哪里,于是就回到了宿舍,在宿舍休息的时候突然脑海里闪现了一个想法,我为什么就非要执着于将节点的位置交换,交换节点的数据不是也有一样的效果吗。而且省去了节点处理的部分,会使代码简单很多。于是我就马上将这个想法尝试了一下,最终终于实现了我想要的效果。

最后终结:

这个虽然只是一个简单的程序,但现这个程序的过程和以后需要学习的更多更加困难的程序是一样的,都需要通过各种步骤设计,错误查找,心态变化这些过程,我认为比起这程序的代码,让我收获更多的是实现程序功能的过程,我认为试数,将各个函数分开查错,想办法从另一个思路实现同一个功能等这些想法会在我以后学习过程中带给我更多帮助。

 

/*
    学生管理系统
        程序要求:不能使用结构体数组储存学生总体信息
  功能要求:能够统计能源专业四个班期末考试(数学 英语 C语言)
            的各班均分,并将各班成绩按照总分从高到低分别打印。     
      能源专业共有 4 个班 每个班 30 人
*/
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
# include <string.h>
# define N 4

 

// 定义储存学生个人信息的数组
typedef struct student
{
 char name[20];
 int math;
 int English;
 int C;
 int amount;
 struct student * pNext;
}None, * pNone;

 

// 系统菜单
void Menu(void);
// 链表的创建
pNone Create_List();
// 交换两个节点的内容
void Exchange(pNone, pNone);
// 按总分从高到低排序
void Seq_List(pNone);
// 学生成绩的输入。
void Input(pNone);
// 成绩统计输出
void Output(pNone);
// 均分
void Average(pNone);

 

int main(void)
{
 // 定义链表的头地址
 pNone pHead1, pHead2, pHead3, pHead4;
 // 分别储存每个班级的学生成绩信息
 pHead1 = Create_List();
 pHead2 = Create_List();
 pHead3 = Create_List();
 pHead4 = Create_List();
 while (1)
 {
  // 菜单
  Menu();
  int i, j;
  // 输入所需服务序号
  scanf("%d", &i);
  switch (i)
  {
   case 1:
   {
       printf("请输入您的班级:");
    scanf("%d", &j);
    printf("\n");
    switch (j)
    {
     case 1:
      Input(pHead1);
      break;
     case 2:
      Input(pHead2);
      break;
     case 3:
      Input(pHead3);
      break;
     case 4:
      Input(pHead4);
      break;
     default:
      printf("输入错误!\n");
      break;
    }
    break;
   }
   case 2:
   {
    printf("请输入您的班级:");
    scanf("%d", &j);
    printf("\n");
    switch (j)
    {
     case 1:
      Output(pHead1);
      break;
     case 2:
      Output(pHead2);
      break;
     case 3:
      Output(pHead3);
      break;
     case 4:
      Output(pHead4);
      break;
     default:
      printf("输入错误!\n");
      break;
    }
    break;
   }
   case 3:
   {
    printf("请输入您的班级:");
    scanf("%d", &j);
    printf("\n");
    switch (j)
    {
     case 1:
      Average(pHead1);
      break;
     case 2:
      Average(pHead2);
      break;
     case 3:
      Average(pHead3);
      break;
     case 4:
      Average(pHead4);
      break;
     default:
      printf("输入错误!\n");
      break;
    }
    break;
   }
   case 4:
   {
    printf("欢迎下次下来!\n");
    break;
   }
   default:
       printf("输入错误!\n"); 
  }
  if (4 == i)
      break;
 }
 
 return 0;
}

 

pNone Create_List(void)
{
 pNone pHead, pTemp, pNew;
 pHead = (pNone)malloc(sizeof(None));
 if (NULL == pHead)
 {
  puts("内存分配失败!");
  exit(1);
 }
 pTemp = pHead;
 pHead->pNext = NULL;
 int j;
 for (j = 0; j < N; ++j)
 {
  pNew = (pNone)malloc(sizeof(None));
  if (NULL == pNew)
     {
      puts("内存分配失败!");
      exit(1);
     }
  pTemp->pNext = pNew;
  pNew->pNext = NULL;
  pTemp = pNew;
 }
 
 return pHead;
}

 

void Menu(void)
{
 printf("******************************************************\n");
 printf("              欢迎登陆学生管理系统                    \n");
 printf("(1)学生成绩录入:\n");
 printf("(2)班级总体考试得分情况:\n");
 printf("(3)班级均分:\n");
 printf("(4)退出系统!\n");
 printf("请输入您想要执行的项目编号:\n");
 printf("*******************************************************\n");
 
 return;
}

 

void Exchange(pNone p, pNone q)
{
 pNone pTemp;
 pTemp = (pNone)malloc(sizeof(None));
 if (NULL == pTemp)
 {
  puts("内存分配失败!");
  exit(1);
 }
 strcpy(pTemp->name, p->name);
 strcpy(p->name, q->name);
 strcpy(q->name, pTemp->name);
 pTemp->math = p->math;
 p->math = q->math;
 q->math = pTemp->math;
 pTemp->English = p->English;
 p->English = q->English;
 q->English = pTemp->English;
 pTemp->C = p->C;
 p->C = q->C;
 q->C = pTemp->C;
 pTemp->amount = p->amount;
 p->amount = q->amount;
 q->amount = pTemp->amount;
 
 
 return;
}

 

void Seq_List(pNone pHead)
{
 pNone pTemp1, pTemp2, pTemp;;
 while (NULL != pHead->pNext)
 {
     pTemp1 = pHead->pNext;
     pTemp = pTemp1;
  while (NULL != pTemp->pNext)
  {
   pTemp2 = pTemp->pNext;
   if (pTemp1->amount < pTemp2->amount)
       Exchange(pTemp1, pTemp2);
   pTemp = pTemp->pNext;
  }
  pHead = pHead->pNext;
 }
 
 return;
}

 

void Input(pNone pHead)
{
 int i = 1;
 pNone pTemp;
 while (pHead->pNext != NULL)
 {
  pTemp = pHead->pNext;
  printf("请输入第%d个学生的姓名:", i);
  scanf("%s", pTemp->name);
  printf("\n");
  printf("请输入第%d个学生的数学成绩:", i);
  scanf("%d", &pTemp->math);
  printf("\n");
  printf("请输入第%d个学生的英语成绩:", i);
  scanf("%d", &pTemp->English);
  printf("\n");
  printf("请输入第%d个学生的C语言成绩:", i);
  scanf("%d", &pTemp->C);
  pTemp->amount = pTemp->math + pTemp->English + pTemp->C;
  printf("\n");
  ++i;
  pHead = pHead->pNext;
 }
 
 return;
}

 

void Output(pNone pHead)
{
 Seq_List(pHead);
 int i = 1;
 pNone pTemp;
 while (NULL != pHead->pNext)
 {
  pTemp = pHead->pNext;
  printf("No.%d 姓名: %s 数学:%-5d 英语:%-5d C语言:%-5d 总分:%-5d\n", i++, pTemp->name, pTemp->math, pTemp->English, pTemp->C, pTemp->amount);
  pHead = pHead->pNext;
 }
 
 return;
}

 

void Average(pNone pHead)
{
 int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;
 int ave1, ave2, ave3, ave4;
 pNone pTemp;
 while (pHead->pNext != NULL)
 {
  pTemp = pHead->pNext;
  sum1 += pTemp->math;
  sum2 += pTemp->English;
  sum3 += pTemp->C;
  sum4 += pTemp->amount;
  pHead = pHead->pNext;
 }
 ave1 = sum1/N;
 ave2 = sum2/N;
 ave3 = sum3/N;
 ave4 = sum4/N;
 printf("班级各科均分分别为:\n");
 printf("数学:%d\n", ave1);
 printf("英语:%d\n", ave2);
 printf("C语言:%d\n", ave3);
 printf("总均分为:%d\n", ave3);
 
 return;
}

 

 错误及修改尝试过程

// 此过程修改思路为将链表节点位置互换

void Seq_List(pNone pHead)
{
 pNone pTemp, pMax, pTemp1, pTemp2, pBefore, pAfter;
 pTemp = pHead;
 int i, j;
 for (i = 0; i < N-1; ++i)
 {
  pTemp1 = pTemp->pNext;
     pTemp2 = pTemp1->pNext;
        pMax = pTemp1;
        pBefore = pTemp;
        // 记录此时正在用于判定的节点的地址
  pAfter = pTemp->pNext;
  for (j = 0; j < N-1-i; ++j)
  {
   if (pMax->amount < pTemp2->amount)
   {
    pMax = pTemp2;
    // 记录最大值的前一个节点的地址。
    pBefore = pTemp1;
   }
   pTemp1 = pTemp2;
   pTemp2 = pTemp2->pNext;
  }
  // 链表中将节点交换位置
  pBefore->pNext = pMax->pNext;
  pTemp->pNext = pMax;
  pMax->pNext = pAfter;
  pTemp = pMax;
 }
 
 return;
}


void Seq_List(pNone pHead)
{
 pNone pTemp, pMax, pTemp1, pTemp2, pBefore, pAfter, pB1, pA1;
 pTemp = pHead;
 int i, j;
 for (i = 0; i < 4; ++i)
 {
  pB1 = pTemp;
  pTemp1 = pB1->pNext;
     pTemp2 = pTemp1->pNext;
     pA1 = pTemp1->pNext;
        pMax = pTemp1;
        pBefore = pTemp;
        // 记录此时正在用于判定的节点的地址
  pAfter = pMax->pNext;
  for (j = 0; j < 4-i; ++j)
  {
   if (pMax->amount < pTemp2->amount)
   {
    pMax = pTemp2;
    // 记录最大值的前一个节点的地址。
    pBefore = pTemp1;
    pAfter = pMax->pNext;
   }
   pTemp2 = pTemp2->pNext;
  }
  // 链表中将节点交换位置
  pB1->pNext = pMax;
  pMax->pNext = pTemp1;
  pBefore->pNext = pAfter;
  pTemp = pMax;
 }
 
 return;
}

void Seq_List(pNone pHead)
{
 // pTemp 为中间值 pMax 为最大值的地址  pBefore, pAfter 为最大值前一个和后一个节点的地址
 pNone pTemp, pMax, pTemp1, pTemp2, pBefore, pAfter, pB1, pA1;
 pTemp = pHead;
 int i, j;
 for (i = 0; i < 4; ++i)
 {
  pB1 = pTemp;
  pTemp1 = pB1->pNext;
     pTemp2 = pTemp1->pNext;
     pA1 = pTemp1->pNext;
        pMax = pTemp1;
        pBefore = pTemp;
        // 记录此时正在用于判定的节点的地址
  pAfter = pMax->pNext;
  for (j = 0; j < 4-i; ++j)
  {
   if (pMax->amount < pTemp2->amount)
   {
    pMax = pTemp2;
    // 记录最大值的前一个节点的地址。
    pBefore = pTemp1;
    pAfter = pMax->pNext;
   }
   pTemp2 = pTemp2->pNext;
   if (j = 4-i-1)
        pTemp2 = NULL;
  }
  // 链表中将节点交换位置
  pB1->pNext = pMax;
  pMax->pNext = pTemp1;
  pBefore->pNext = pAfter;
  pTemp = pMax;
 }
 
 return;
}

 

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

typedef struct student
{
 int amount;
 struct student * pNext;
}None, * pNone;

pNone Create_List(void)
{
 pNone pHead, pTemp, pNew;
 pHead = (pNone)malloc(sizeof(None));
 if (NULL == pHead)
 {
  puts("内存分配失败!");
  exit(1);
 }
 pTemp = pHead;
 pHead->pNext = NULL;
 int j;
 for (j = 0; j < 5; ++j)
 {
  pNew = (pNone)malloc(sizeof(None));
  if (NULL == pNew)
     {
      puts("内存分配失败!");
      exit(1);
     }
  pTemp->pNext = pNew;
  pNew->pNext = NULL;
  pTemp = pNew;
 }
 
 return pHead;
}

void Seq_List(pNone pHead)
{
 // pTemp 为中间值 pMax 为最大值的地址  pBefore, pAfter 为最大值前一个和后一个节点的地址
 pNone pTemp, pMax, pTemp1, pTemp2, pBefore, pAfter, pB1, pA1;
 pTemp = pHead;
 int i, j;
 for (i = 0; i < 4; ++i)
 {
  pB1 = pTemp;
  pTemp1 = pB1->pNext;
     pTemp2 = pTemp1->pNext;
     pA1 = pTemp1->pNext;
        pMax = pTemp1;
        pBefore = pTemp;
        // 记录此时正在用于判定的节点的地址
  pAfter = pMax->pNext;
  for (j = 0; j < 4-i; ++j)
  {
   if (pMax->amount < pTemp2->amount)
   {
    pMax = pTemp2;
    // 记录最大值的前一个节点的地址。
    pBefore = pTemp1;
    pAfter = pMax->pNext;
   }
   pTemp2 = pTemp2->pNext;
   if (j = 4-i-1)
        pTemp2 = NULL;
  }
  // 链表中将节点交换位置
  if (pMax != pTemp1)
  {
   pB1->pNext = pMax;
   pMax->pNext = pTemp1;
      pBefore->pNext = pAfter;
  }
  pTemp = pMax;
 }
 
 return;
}

void Input(pNone pHead)
{
 int i = 1;
 pNone pTemp;
 while (pHead->pNext != NULL)
 {
  pTemp = pHead->pNext;
  printf("请输入第%d个学生的成绩:", i);
  scanf("%d", &pTemp->amount);
  ++i;
  pHead = pHead->pNext;
 }
 
 return;
}

void Output(pNone pHead)
{
 int i = 1;
 pNone pTemp;
 while (pHead->pNext != NULL)
 {
  pTemp = pHead->pNext;
  printf("第%d个学生的成绩位:%d\n", i, pTemp->amount);
  ++i;
  pHead = pHead->pNext;
 }
 
 return;
}

int main(void)
{
 pNone pHead1;
 pHead1 = Create_List();
 Input(pHead1);
 Seq_List(pHead1);
 Output(pHead1);
 
 return 0;
}

/*
请输入第1个学生的成绩:12
请输入第2个学生的成绩:32
请输入第3个学生的成绩:11
请输入第4个学生的成绩:6
请输入第5个学生的成绩:3
第1个学生的成绩位:32
第2个学生的成绩位:11
第3个学生的成绩位:6
第4个学生的成绩位:3

--------------------------------
Process exited after 5.753 seconds with return value 0
请按任意键继续. . .

请输入第1个学生的成绩:16
请输入第2个学生的成绩:15
请输入第3个学生的成绩:14
请输入第4个学生的成绩:13
请输入第5个学生的成绩:12
第1个学生的成绩位:15
第2个学生的成绩位:14
第3个学生的成绩位:13
第4个学生的成绩位:12

--------------------------------
Process exited after 6.714 seconds with return value 0
请按任意键继续. . .

请输入第1个学生的成绩:11
请输入第2个学生的成绩:12
请输入第3个学生的成绩:13
请输入第4个学生的成绩:14
请输入第5个学生的成绩:15
第1个学生的成绩位:12
第2个学生的成绩位:13
第3个学生的成绩位:14
第4个学生的成绩位:15
第5个学生的成绩位:11

--------------------------------
Process exited after 6.978 seconds with return value 0
请按任意键继续. . .

请输入第1个学生的成绩:12
请输入第2个学生的成绩:32
请输入第3个学生的成绩:14
请输入第4个学生的成绩:52
请输入第5个学生的成绩:11
第1个学生的成绩位:32
第2个学生的成绩位:14
第3个学生的成绩位:52
第4个学生的成绩位:12
第5个学生的成绩位:11

--------------------------------
Process exited after 7.34 seconds with return value 0
请按任意键继续. . .
*/

 

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

typedef struct student
{
 int amount;
 struct student * pNext;
}None, * pNone;

pNone Create_List(void)
{
 pNone pHead, pTemp, pNew;
 pHead = (pNone)malloc(sizeof(None));
 if (NULL == pHead)
 {
  puts("内存分配失败!");
  exit(1);
 }
 pTemp = pHead;
 pHead->pNext = NULL;
 int j;
 for (j = 0; j < 5; ++j)
 {
  pNew = (pNone)malloc(sizeof(None));
  if (NULL == pNew)
     {
      puts("内存分配失败!");
      exit(1);
     }
  pTemp->pNext = pNew;
  pNew->pNext = NULL;
  pTemp = pNew;
 }
 
 return pHead;
}

void Exchange(pNone p, pNone q)
{
 pNone pTemp;
 pTemp = (pNone)malloc(sizeof(None));
 if (NULL == pTemp)
 {
  puts("内存分配失败!");
  exit(1);
 }
 pTemp->amount = p->amount;
 p->amount = q->amount;
 q->amount = pTemp->amount;
 
 
 return;
}

void Seq_List(pNone pHead)
{
 pNone pTemp1, pTemp2, pTemp;;
 while (NULL != pHead->pNext)
 {
     pTemp1 = pHead->pNext;
     pTemp = pTemp1;
  while (NULL != pTemp->pNext)
  {
   pTemp2 = pTemp->pNext;
   if (pTemp1->amount < pTemp2->amount)
       Exchange(pTemp1, pTemp2);
   pTemp = pTemp->pNext;
  }
  pHead = pHead->pNext;
 }
 
 return;
}

void Input(pNone pHead)
{
 int i = 1;
 pNone pTemp;
 while (pHead->pNext != NULL)
 {
  pTemp = pHead->pNext;
  printf("请输入第%d个学生的成绩:", i);
  scanf("%d", &pTemp->amount);
  ++i;
  pHead = pHead->pNext;
 }
 
 return;
}

void Output(pNone pHead)
{
 int i = 1;
 pNone pTemp;
 while (pHead->pNext != NULL)
 {
  pTemp = pHead->pNext;
  printf("第%d个学生的成绩位:%d\n", i, pTemp->amount);
  ++i;
  pHead = pHead->pNext;
 }
 
 return;
}

int main(void)
{
 pNone pHead;
 pHead = Create_List();
 Input(pHead);
 Seq_List(pHead);
 Output(pHead);
 
 return 0;
}

 

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

typedef struct student
{
 int amount;
 // struct student * pNext;
}None, * pNone;

void Exchange(pNone p, pNone q)
{
 pNone pTemp;
 pTemp = (pNone)malloc(sizeof(None));
 if (NULL == pTemp)
 {
  puts("内存分配失败!");
  exit(1);
 }
 pTemp->amount = p->amount;
 p->amount = q->amount;
 q->amount = pTemp->amount;
 
 
 return;
}

int main(void)
{
 pNone s1, s2;
 s1 = (pNone)malloc(sizeof(None));
 s2 = (pNone)malloc(sizeof(None));
 s1->amount = 13;
 s2->amount = 15;
 Exchange(s1, s2);
 printf("%d, %d\n", s1->amount, s2->amount);
 
 return 0;
}

 

学习阶段总结2