DXP20xx实训报告

实训报告

科目:PCB设计与布板技术

实训项目:

班别:

姓名:

学号:

系别:

专业:

指导老师:

一、绘制电路图

   

二、元器件参数对应封装选择及说明

本次设计元器件的参数及封装如下:

 上表列出的是电路图所需要元器件的所有封装,其中C1和C3都选择了CAPPR2-5x6.8型号的封装,其他的电容封装都选择了RAD-0.1型号的封装,DS1到DS56都选择了CAPPR2-5x6.8型号的封装,这可以看出不同的元器件可以用相同的封装,对于各种元器件的封装,我们要选择恰当,才能更好的布局,元器件的封装的选择不仅影响布局而且还影响布线,从而影响整个PCB板的设计,所以在选择封装时要慎重考虑好影响整个PCB板的主要因素,为制作良好的PCB板做铺垫。

三、ERC与网络表

ERC电路规则检查没有错误,所以整个电路图是没有错;网络表是检查电路图有没有封装和漏接线的工具,生成网络表如下图所示:


[

U2

DIP-8

NE555N

]

[

U1

DIP-14

SN74LS164N

]

[

RP1

RP1

RPot

]

[

R12

AXIAL-0.4

Res2

]

[

R11

AXIAL-0.4

Res2

]

[

R10

AXIAL-0.4

Res2

]

[

R9

AXIAL-0.4

Res2

]

[

R8

AXIAL-0.4

Res2

]

[

R7

AXIAL-0.4

Res2

]

[

R6

AXIAL-0.4

Res2

]

[

R5

AXIAL-0.4

Res2

]

[

R4

AXIAL-0.4

Res2

]

[

R3

AXIAL-0.4

Res2

]

[

R2

AXIAL-0.4

Res2

]

[

R1

AXIAL-0.4

Res2

]

[

Q8

SFM-T3/A4.7V

NPN

]

[

Q7

SFM-T3/A4.7V

NPN

]

[

Q5

SFM-T3/A4.7V

NPN

]

[

Q4

SFM-T3/A4.7V

NPN

]

[

Q3

SFM-T3/A4.7V

NPN

]

[

Q2

SFM-T3/A4.7V

NPN

]

[

Q1

SFM-T3/A4.7V

NPN

]

[

DS56

CAPPR2-5x6.8

LED0

]

[

DS55

CAPPR2-5x6.8

LED0

]

[

DS54

CAPPR2-5x6.8

LED0

]

[

DS53

CAPPR2-5x6.8

LED0

]

[

DS52

CAPPR2-5x6.8

LED0

]

[

DS51

CAPPR2-5x6.8

LED0

]

[

DS50

CAPPR2-5x6.8

LED0

]

[

DS49

CAPPR2-5x6.8

LED0

]

[

DS48

CAPPR2-5x6.8

LED0

]

[

DS47

CAPPR2-5x6.8

LED0

]

[

DS46

CAPPR2-5x6.8

LED0

]

[

DS45

CAPPR2-5x6.8

LED0

]

[

DS44

CAPPR2-5x6.8

LED0

]

[

DS43

CAPPR2-5x6.8

LED0

]

[

DS42

CAPPR2-5x6.8

LED0

]

[

DS41

CAPPR2-5x6.8

LED0

]

[

DS40

CAPPR2-5x6.8

LED0

]

[

DS39

CAPPR2-5x6.8

LED0

]

[

DS38

CAPPR2-5x6.8

LED0

]

[

DS37

CAPPR2-5x6.8

LED0

]

[

DS36

CAPPR2-5x6.8

LED0

]

[

DS35

CAPPR2-5x6.8

LED0

]

[

DS34

CAPPR2-5x6.8

LED0

]

[

DS33

CAPPR2-5x6.8

LED0

]

[

DS32

CAPPR2-5x6.8

LED0

]

[

DS31

CAPPR2-5x6.8

LED0

]

[

DS30

CAPPR2-5x6.8

LED0

]

[

DS29

CAPPR2-5x6.8

LED0

]

[

DS28

CAPPR2-5x6.8

LED0

]

[

DS27

CAPPR2-5x6.8

LED0

]

[

DS26

CAPPR2-5x6.8

LED0

]

[

DS25

CAPPR2-5x6.8

LED0

]

[

DS24

CAPPR2-5x6.8

LED0

]

[

DS23

CAPPR2-5x6.8

LED0

]

[

DS22

CAPPR2-5x6.8

LED0

]

[

DS21

CAPPR2-5x6.8

LED0

]

[

DS20

CAPPR2-5x6.8

LED0

]

[

DS19

CAPPR2-5x6.8

LED0

]

[

DS18

CAPPR2-5x6.8

LED0

]

[

DS17

CAPPR2-5x6.8

LED0

]

[

DS16

CAPPR2-5x6.8

LED0

]

[

DS15

CAPPR2-5x6.8

LED0

]

[

DS14

CAPPR2-5x6.8

LED0

]

[

DS13

CAPPR2-5x6.8

LED0

]

[

DS12

CAPPR2-5x6.8

LED0

]

[

DS11

CAPPR2-5x6.8

LED0

]

[

DS10

CAPPR2-5x6.8

LED0

]

[

DS9

CAPPR2-5x6.8

LED0

]

[

DS8

CAPPR2-5x6.8

LED0

]

[

DS7

CAPPR2-5x6.8

LED0

]

[

DS6

CAPPR2-5x6.8

LED0

]

[

DS5

CAPPR2-5x6.8

LED0

]

[

DS4

CAPPR2-5x6.8

LED0

]

[

DS3

CAPPR2-5x6.8

LED0

]

[

DS2

CAPPR2-5x6.8

LED0

]

[

DS1

CAPPR2-5x6.8

LED0

]

[

C1

CAPPR2-5x6.8

Cap Pol2

]

[

Q6

SFM-T3/A4.7V

NPN

]

(

+5V

R10-2

R11-2

U1-1

U1-2

U1-14

U2-4

U2-8

)

(

NetR12_2

R12-2

U1-8

)

(

NetR12_1

R12-1

U2-3

)

(

NetR11_1

U2-7

R11-1

RP1-1

)

(

NetR8_2

R9-1

R8-2

)

(

NetR8_1

R8-1

U1-13

)

(

NetR7_1

R7-1

U1-12

)

(

NetR6_1

R6-1

U1-11

)

(

NetR5_1

R5-1

U1-10

)

(

NetR4_2

R4-2

U1-6

)

(

NetR3_2

R3-2

U1-5

)

(

NetR2_2

R2-2

U1-4

)

(

NetR1_2

R1-2

U1-3

)

(

NetQ8_2

Q8-2

R9-2

)

(

NetQ8_1

Q8-1

R10-1

U1-9

)

(

NetQ7_2

R7-2

Q7-2

)

(

NetQ6_2

Q6-2

R6-2

)

(

NetQ5_2

R5-2

Q5-2

)

(

NetQ4_2

R4-1

Q4-2

)

(

NetQ3_2

R3-1

Q3-2

)

(

NetQ2_2

R2-1

Q2-2

)

(

NetQ1_2

R1-1

Q1-2

)

(

NetDS55_1

DS55-1

DS56-2

)

(

NetDS54_1

DS54-1

DS55-2

)

(

NetDS53_1

DS53-1

DS54-2

)

(

NetDS50_1

DS51-2

DS50-1

)

(

NetDS49_2

DS49-2

DS53-2

Q7-1

)

(

NetDS49_1

DS49-1

DS50-2

)

(

NetDS47_1

DS47-1

DS48-2

)

(

NetDS46_1

DS46-1

DS47-2

)

(

NetDS45_1

DS45-1

DS46-2

)

(

NetDS43_1

DS43-1

DS44-2

)

(

NetDS42_1

DS42-1

DS43-2

)

(

NetDS41_2

Q6-1

DS41-2

DS45-2

)

(

NetDS41_1

DS41-1

DS42-2

)

(

NetDS39_1

DS39-1

DS40-2

)

(

NetDS38_1

DS38-1

DS39-2

)

(

NetDS37_1

DS37-1

DS38-2

)

(

NetDS35_1

DS35-1

DS36-2

)

(

NetDS34_1

DS34-1

DS35-2

)

(

NetDS33_2

Q5-1

DS33-2

DS37-2

)

(

NetDS33_1

DS33-1

DS34-2

)

(

NetDS31_1

DS31-1

DS32-2

)

(

NetDS30_1

DS30-1

DS31-2

)

(

NetDS29_1

DS29-1

DS30-2

)

(

NetDS27_1

DS27-1

DS28-2

)

(

NetDS26_1

DS26-1

DS27-2

)

(

NetDS25_2

Q4-1

DS25-2

DS29-2

)

(

NetDS25_1

DS25-1

DS26-2

)

(

NetDS23_1

DS23-1

DS24-2

)

(

NetDS22_1

DS22-1

DS23-2

)

(

NetDS21_1

DS21-1

DS22-2

)

(

NetDS19_1

DS19-1

DS20-2

)

(

NetDS18_1

DS18-1

DS19-2

)

(

NetDS17_2

Q3-1

DS17-2

DS21-2

)

(

NetDS17_1

DS17-1

DS18-2

)

(

NetDS15_1

DS15-1

DS16-2

)

(

NetDS14_1

DS14-1

DS15-2

)

(

NetDS13_1

DS13-1

DS14-2

)

(

NetDS11_1

DS11-1

DS12-2

)

(

NetDS10_1

DS10-1

DS11-2

)

(

NetDS9_2

Q2-1

DS9-2

DS13-2

)

(

NetDS9_1

DS9-1

DS10-2

)

(

NetDS7_1

DS7-1

DS8-2

)

(

NetDS6_1

DS6-1

DS7-2

)

(

NetDS5_1

DS5-1

DS6-2

)

(

NetDS3_1

DS3-1

DS4-2

)

(

NetDS2_1

DS2-1

DS3-2

)

(

NetDS1_2

Q1-1

DS1-2

DS5-2

)

(

NetDS1_1

DS1-1

DS2-2

)

(

NetC1_1

C1-1

U2-6

U2-2

RP1-2

RP1-3

)

(

GND

Q6-3

C1-2

Q8-3

U2-1

U1-7

Q5-3

Q1-3

Q2-3

Q3-3

Q4-3

Q7-3

)

(

+12V

DS52-1

DS4-1

DS8-1

DS12-1

DS16-1

DS20-1

DS24-1

DS28-1

DS32-1

DS36-1

DS40-1

DS44-1

DS48-1

DS56-1

)

(

NetDS51_1

DS52-2

DS51-1

)


四、PCB板制作与工艺设计

  1、画电路图

  2、生成网络表

  3、布局

  4、布线

  5、覆铜

  6、画PCB板尺寸

  7、设计规则检查

五、各种报表的生成

 1、DRC规则表

   Protel Design System Design Rule Check

PCB File : \PCB\J\²ÊµÆ¿ØÖƵç·\PCB1.PcbDoc

Date     : 2013/5/27

Time     : 19:37:19

Processing Rule : WidthConstraint (Min=60mil) (Max=100mil) (Preferred=60mil) (InNet('+12V'))

Rule Violations :0

Processing Rule : WidthConstraint (Min=60mil) (Max=100mil) (Preferred=60mil) (InNet('GND'))

Rule Violations :0

Processing Rule : WidthConstraint (Min=60mil) (Max=100mil) (Preferred=60mil) (InNet('+5V'))

Rule Violations :0

Processing Rule : Hole Size Constraint (Min=1mil) (Max=500mil) (All)

Rule Violations :0

Processing Rule : Height Constraint (Min=0mil) (Max=1000mil) (Prefered=500mil) (All)

Rule Violations :0

Processing Rule : WidthConstraint (Min=30mil) (Max=50mil) (Preferred=40mil) (All)

Rule Violations :0

Processing Rule : ClearanceConstraint (Gap=15mil) (All),(All)

Rule Violations :0

Processing Rule : Broken-NetConstraint ( (All) )

Rule Violations :0

Processing Rule : Short-Circuit Constraint (Allowed=No) (All),(All)

Rule Violations :0

Violations Detected : 0

Time Elapsed        : 00:00:00

六、PCB各层面输出与打印

顶层:

底层:

各层叠印效果:

丝印层:

3D效果图

七、总结

    实训就是实践,一周的PCB实训使我们更加对Protel2004软件能更加熟悉。实训期间,对平时课上所学的进行了一个系统的学习,将其联系在了一起。对于彩灯控制电路的设计过程中,进行了元件的编辑,元件的设计与封装,以及最后的PCB图的制作,布线等等。在这些操作中,我们更加了解到了细心的含义,一时的大意都可能导致很大的错误。在整个对彩灯控制电路的设计过程中,我认为最难操作的应该是最后的PCB图,在对其元件进行放置中,既要注意元件在整个主电路图中的位置,又要在乎在布线时期的简洁和清晰程度,整块设计版成型时是否美观。同样手工布线清晰明了,布线完成时要仔细检查。虽然经过一段很复杂的过程,但当最后看见自己一周的成果,真的存在一种喜悦。我建议学校多提供一些实训,提高大学生自己动手的能力,加强对社会中的适应能力。

 

第二篇:C实训报告

语言基础实训

报告书

    设计题目:       C语言基础实训报告          

    班    级:                                     

    设 计 人:                           

 

指导教师对课程设计的评语

课程设计成绩              

教师评语:

                                               指导教师签字 :       

                                                       20##年  月   日

目录

1.项目一名称:学生成绩排名. 4

1.1实训目的. 4

1.2实训内容. 4

1.3程序流程:. 4

1.4程序代码: 5

2.项目二名称:按条件实现学生成绩排名. 7

2.1实训目的. 7

2.2实训内容. 7

2.3程序流程:. 7

2.4程序代码: 8

3.项目三名称:数组优化学生成绩排名. 9

3.1实训目的. 9

3.2 实训内容. 9

3.3程序流程. 9

3.4程序代码:. 10

4.项目四名称:学生成绩单制作. 11

4.1实训目的:. 11

4.2实训内容. 11

4.4程序代码: 11

5.项目五名称:学生成绩排序文件管理. 15

5.1实训目的. 15

5.2实训内容. 15

5.4程序流程:. 16

6.项目六名称:设计和编写学生成绩管理系统的系统主菜单. 20

6.1实训目的. 20

6.2实训内容. 20

6.3程序代码. 20

7.项目七:学生成绩管理项目实现. 22

7.1.实训目的. 22

7.2实训内容:. 22

7.3程序代码. 22

8.实训心得: 29

1.项目一名称:学生成绩排名

1.1实训目的:

(1)熟悉变量、数组定义、使用、输入、输出等基本操作;

(2)进行选择、循环结构程序设计练习;

(3)掌握冒泡法排序的算法。

1.2实训内容:

    (1)定义一个数组a[11],用以存放学生的成绩。

    (2)从键盘输入10个学生及成绩;

(3)采用冒泡法,将学生成绩按照从高到低进行排序;

(4)再输入一个学生的成绩,将此成绩按照排序规律插入原学生成绩数组;

(5)将排好序的成绩单进行反序存放,即原来是从高到低,现在改为从低到高排列。

 

1.3程序流程:

 

 

                              

                              

1.4程序代码:

     #include<stdio.h>   //头文件

     void main()      //主函数

     {int a[11];      //定义一维数组

      int i,j,t,b;

      printf("input 10 numbers :\n");

      for(i=1;i<=10;i++)   //输入十个学生成绩

      scanf("%d",&a[i]);    *scanf中不能用‘\n’

      printf("\n");

      for(j=1;j<10;j++)    //冒泡法对十个学生的成绩由高到低排序

      for(i=1;i<=10-j;i++)

        if(a[i]<a[i+1])

         {t=a[i];

          a[i]=a[i+1];

          a[i+1]=t;

          }

     printf("the sorterd number :\n");//输出排序后的结果

     for(i=1;i<11;i++)

     printf("%d ",a[i]);

     printf("\n");

     scanf("%d",&b);//再插入一个学生的成绩

     if (a[1]>b)  //插入法排序

         a[0]=b;

else

        {for(i=1;i<=11;i++)

         if(a[i]<b)

          { for(j=10;j>=i;j--)

               a[j-1]=a[j];

              a[i]=b;

               break;

          }

        }

     for(j=0;j<10;j++)

     for(i=0;i<10-j;i++)      //再次用冒泡法使成绩由低到高排序排序

       if (a[i]>a[i+1])

           {t=a[i];

            a[i]=a[i+1];

            a[i+1]=t;

            }

      printf("the scorted numbers :\n");

      for(i=0;i<11;i++)

      printf("%d ",a[i]);

      printf("\n");

     }

 

 

 

 

 

2.项目二名称:按条件实现学生成绩排名

2.1实训目的:

(1)复习数组,选择、循环结构程序设计;

(2)掌握函数的定义、调用、声明,以及参数的两种传递方式。

2.2实训内容:

(1)在函数中进行10个学生成绩从高到低排名 sort(int a[10]);

(2)改进第一步的函数为sort(int a[],int n),进行n个学生成绩从高到低排名;

(3)改进第二步的函数为sort(int a[],int n, char style), 将n个学生成绩从高到低排名,排名方式;

(4)根据sort()函数的style参数进行,如style为‘a’按升序排,style为‘d’按降序排。(a:ascending  升,d:descending 降);

(5)尝试用三种方法排序:冒泡法、选择法,插入法排序。

2.3程序流程:

   

 2.4程序代码:

              #include<stdio.h>  //头文件

#define N  10   *学会使用宏定义

void main()

{void sort(int array[],int n );//sort函数的声明

int a[N];

int i;

printf("input 10 scores:\n");//输入十个学生的成绩

for(i=0;i<N;i++)

               scanf("%d",&a[i]);

sort(a,N);   //在主函数中调用sort函数

 printf("the sorted array:\n");

for(i=0;i<N;i++)

printf("%d ",a[i]);

printf("\n");

}

void sort(int array[],int n)   //sort函数的定义

{int i,j,k,t;

                for(i=0;i<N-1;j++)          //选择法排序

                {k=i;

                 for(j=i+1;j<N;j++)

                 if(array[j]<array[k])

                 k=j;

                 t=array[k];array[k]=array[i];array[i]=t;

   }

3.项目三名称:数组优化学生成绩排名

 3.1实训目的:

(1)熟悉变量的指针和指向变量的的指针变量的概念和使用;

(2)熟悉数组的指针和指向数组的的指针变量的概念和使用。

 3.2 实训内容:

(1)定义一个数组stu[10]存放10个学生的成绩,从键盘输入数据,要求用指针实现;

(2)将数组stu[10]的内容输出到屏幕上,要求用指针实现;

(3)将成绩数组按照从高到低进行排序,要求用指针实现;

(4)将第三步内容放在函数中实现,在主函数中调用实现排序,用指针实现,输出排序后的成绩单;

(5)采用指针方法,输入字符串“student score ”,复制该字符串并输出(复制字符串采用库函数或用户自定义函数)。

3.3程序流程:

                  

   3.4程序代码:

#include <stdio.h>     //头文件

void main()

{void  sort(int *x,int n);//用指针实现

int i,*p,a[10];

printf("input 10 scores:\n");

                            p=a;

                            for(i=0;i<10;i++)

                            scanf("%d",p++);

                            p=a;

                  sort(p,10);  //在主函数中调用sort函数

printf("排序后的结果:\n");

                            for(p=a,i=0;i<10;i++)

                             { printf("%d ",*p);p++;}

                          }

                           void sort(int *x,int n)  //排序函数的定义

{

                             int i,j,t,k;

                             for(i=0;i<n-1;i++)

                               {k=i;

                                for(j=i+1;j<n;j++)

                                  if ( *(x+j)>*(x+k) )

                                   k=j;

                                  if(k!=i)

                                  {t=*(x+i);

                                   *(x+i)=*(x+k);

                                   *(x+k)=t;}

 }

                             }

4.项目四名称:学生成绩单制作

 4.1实训目的:

(1)掌握结构体变量及数组的定义、赋值、初始化、输入、输出;

(2)结构体数组的操作。

 4.2实训内容:

(1)定义一个结构体数组,存放10个学生的学号,姓名,math、Chinese、English三门课的成绩;

(2)从键盘输入10个学生的以上内容;

(3)输出单门课成绩最高的学生的学号、姓名、以及该门课程的成绩;

(4)输出三门课程的平均分数最高的学生的学号、姓名及其平均分;

(5)将10个学生按照平均分数从高到低进行排序,输出结果,格式如下所示:

number     name   math   Chinese   English    average

103        tom    90      90       100         95

101        alice    90      80       70         80

4.4程序代码:

#include <stdio.h>

# define N 3  //宏定义

struct student  //定义结构体数组

{

                  char num[7];

                  char name[8];

                  float Chinese;

                  float English;

                  float Math;

                  float aver;

                } stu[N],stud;

void main() //主函数

{int i,j,n;float max;                       

               printf("请输入3个学生的各项成绩:\n");  //输入学生的相关信息

for(i=0;i<N;i++)

               {printf("请输入学生的学号:\n");

                   scanf("%s",stu[i].num);

                   printf("请输入学生的姓名:\n");

                   scanf("%s",stu[i].name);

                   printf("请输入语文成绩:\n");

                   scanf("%f",&stu[i].Chinese);

                   printf("请输入英语成绩:\n");

                   scanf("%f",&stu[i].English);

                   printf("请输入数学成绩:\n");

                   scanf("%f",&stu[i].Math);

stu[i].aver=(stu[i].Chinese+stu[i].English+stu[i].Math)/3;             

                   printf("平均分为:%f\n",stu[i].aver);

                    }

printf("数学成绩最高的为:\n");    //计算数学成绩最高分

                max=stu[0].Math;

                for(i=1;i<N;i++)

               {if(stu[i].Math >=max)

                      {max=stu[i].Math;

                           n=i;

                    }           

               }

             printf("学号:%s姓名:%s  数学成绩:%f",stu[n].num,stu[n].name,max);

             printf("\n");

           printf("语文成绩最高的为:\n");//计算数学成绩最高分

             max=stu[0].Chinese;

             for(i=1;i<10;i++)

             {if(stu[i].Chinese>= max)

                    {max=stu[i].Chinese;

                           n=i;

                    }           

            }

             printf("学号:%s姓名:%s  语文成绩:%f",stu[n].num,stu[n].name,max);

           printf("\n");

           printf("英语成绩最高的为:\n");//计算英语成绩最高分

             max=stu[0].English;

             for(i=1;i<N;i++)

            {

                if(stu[i].English>=max)

                    {

                           max=stu[i].English;

                           n=i;

                    }           

             }

           printf("学号:%s姓名:%s  英语成绩:%f",stu[n].num,stu[n].name,max);

           printf("\n");

         printf("平均成绩最高的为:\n");  //计算平均成绩最高分

           max=stu[0].aver;

           for(i=1;i<N;i++)

           {

               if(stu[i].aver>=max)

                    {

                           max=stu[i].aver;

                           n=i;

                     }         

            }

               printf("学号:%s姓名:%s  平均成绩:%f",stu[n].num,stu[n].name,max);

            printf("\n");

            printf("按平均成绩由高到低排列:\n");            for(i=0;i<N-1;i++)

               for(j=0;j<N-1-i;j++)

               {

                    if(stu[j].aver>=stu[j+1].aver)  //用冒泡法实现平均成绩由高到低排序

                    {   stud=stu[j];

                           stu[j]=stu[j+1];

                           stu[j+1]=stud;                         

                     }

               }

            printf("     学号    姓名     语文    英语    数学    平均分\n");

            for(j=0;j<N;j++)

             printf("%s %s %f %f %f %f\n",stu[i].num,stu[j].name,

             stu[j].Chinese,stu[j].English,stu[j].Math,stu[j].aver);

        }

 

 

 

 

 

 

 

5.项目五名称:学生成绩排序文件管理

 5.1实训目的:

(1)掌握文件指针的概念和运用;

(2)掌握文件的相关操作:打开、读、写、关闭;

(3)掌握文件的定位操作。

 5.2实训内容:

(1)定义一个结构体数组,存放10个学生的学号,姓名,三门课的成绩;

(2)从键盘输入10个学生的以上内容,存入文件stud.dat,关闭文件;

(3)打开stud.dat文件,将数据读出,查看是否正确写入,关闭文件;

(4)打开文件stud.dat文件,读出数据,将10个学生按照平均分数从高到低进行排序,分别将结果输出到屏幕上和另一文件studsort.dat中;

(5)从studsort.dat 文件中读取第2,4,6,8,10个学生的数据。

5.3程序流程:

            

          

5.4程序流程:

#include <stdio.h>

#define  N  3   //宏定义

char p1[20]={"stud.dat"};

char p2[20]={"studsort.dat"};

FILE *fp;

struct student_type  //定义结构体数组

{    char name[10];

                char num[20];

                  int math; Eng; Chin; ave;

}stud[N],h;

void  input()//给结构体赋初值

{

                printf("请输入学生信息:\n\n");

                for(int i=0;i<N;i++)

               {

                   printf("\n请输入第%d个学生信息:\n",i+1);

                   printf("姓名:");

                   scanf("%s",stud[i].name);

                   printf("学号:");

                   scanf("%s",stud[i].num);

                   getchar();

                   printf("数学:");

                   scanf("%d",&stud[i].math);

                   printf("英语:");

                   scanf("%d",&stud[i].Eng);

                   printf("语文:");

                   scanf("%d",&stud[i].Chin);

             }

}

void output()//输出学生信息

{

          for(int i=0;i<N;i++)

       {printf("name:%s\nnumber:%s\nmath:%d\nEnglish:%d\nChinese:%d\n\n",stud[i].name,stud[i].num,stud[i].math,stud[i].Eng,stud[i].Chin);

          }

}

void save(char s[])//将数据写进文件

{

          int i;

          if((fp=fopen(s,"wb"))==NULL)

              {printf("cannot open file\n");

                    return;

             }

        for(i=0;i<N;i++)

        if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)

        printf("file write error\n");

}

void display(char s[])//打开文件stud.dat

{

               int i;

               if((fp=fopen(s,"rb"))==NULL)

             {

                 printf("cannot open file\n");

                    return;   

              }

             for(i=0;i<N;i++)

             {

                 if((fread(&stud[i],sizeof(struct student_type),1,fp))!=1)

                  {

                      printf("file read error\n");

                  }

             }

}

    void sort()//根据学生成绩排序

{

            int i,j;

            display(p1);

           for (i=0;i<N;i++)

               {

                    stud[i].ave=(stud[i].math+stud[i].Eng+stud[i].Chin)/3.0; //计算平均分

              }

           for (i=0;i<N;i++)

              for (j=0;j<N-i-1;j++)

                    if(stud[j].ave<stud[j+1].ave)      //对平均分排序

                    {

                           h=stud[j];

                           stud[j]=stud[j+1];

                           stud[j+1]=h;

                    }

      printf("来自文件stud.dat,排序结果!\n");

       printf("number        name        math           English       Chinese     average\n");

      for (i=0;i<N;i++)

             for (j=0;j<N-i-1;j++)

                    if(stud[j].ave<stud[j+1].ave)

                           {

                                  h=stud[j];

                                  stud[j]=stud[j+1];

                                  stud[j+1]=h;

                           }

      for (i=0;i<N;i++)

             {

printf("%s%14s%14d%14d%14d%18f\n",stud[i].num,stud[i].name,stud[i].math,stud[i].Eng,stud[i].Ch      in,stud[i].ave);

             }

      printf("\n");

      save(p2);

      fclose(fp);

      fclose(fp);

}

void read()//输出文件studsort.dat中读取第246810个学生的数据

{

      printf("来自文件studsort.dat,排序结果!\n");

      display(p2);

      printf("number        name        math           English       Chinese        average\n");

      for (int i=1;i<N;i=i+2)

             {

      printf("%s%14s%14d%14d%14d%18f\n",stud[i].num,stud[i].name,stud[i].math,stud[i].Eng,stud[i].Chin,stud[i].ave);

             }

      fclose(fp);

}

//主函数

void main()

{   input();//给结构体赋初值

save(p1);//将数据写进文件

fclose(fp);//关闭文件

display(p1);//打开文件stud.dat

fclose(fp);//关闭文件

output();//输出学生信息

sort();//根据学生成绩排序

read();//输出文件studsort.dat中读取第246810个学生的数据

}

6.项目六名称:设计和编写学生成绩管理系统的系统主菜单

6.1实训目的:

(1)掌握结构化程序设计的方法,自顶向下,逐步细化;

(2)设计系统框架结构,理顺主模块和各个模块之间的调用顺序和关系。

 6.2实训内容:

(1)编写主菜单,包括1输入、2插入、3排序、4查找、5删除、6输出、7退出等7个功能的菜单项,程序执行则首先显示这7个菜单项目,当用户按下功能序号时可以执行相应的功能。

(2)每一个功能编写一个相应的空函数,名称为input、insert、sort、find、delete、output、quit,由主函数来调用。

(3)为了测试调用成功与否,每个空函数里加上语句显示当前被调用的函数的名称

(4)每执行完一次某个菜单功能后,还要返回主菜单,等待用户再选择菜单项。

 6.3程序代码:

int menu_select()  //主菜单函数

{ int x;

printf("***********************************\n");

printf("*1、学生信息输入  2、学生信息插入 *\n");

      printf("*3、学生成绩,学号排序  4、学生成绩查询 *\n");

printf("*5、学生信息删除  6、学生信息输出 *\n");

printf("*7、退出程序                      *\n");

printf("***********************************\n");

do

{

printf("\n请输入1-7之间的任意数字进入功能选项:\n");

scanf("%d",&x);

}

while(x>7||x<0);

return(x);

}

void input()                                 //输入函

{

}

  int insert()                            //插入学生信息函数定义

{

}

void  savesort()                                  //排序函数

{

}

void findstu()                          //查找函数

{

}

void deletestu()                  //删除函数

{

}

7.项目七:学生成绩管理项目实现

7.1.实训目的:

(1)掌握结构化程序设计的方法,自下而上,编码实现各模块功能;

(2)掌握各个模块之间的调用顺序和关系。

7.2.实训内容:

(1)输入:函数input把20学生的学名号、姓、性别、年龄、四科成绩以及平均成绩和总成绩放在一个结构体数组中,学生的学号、姓名、四科成绩由键盘输入,然后计算出平均成绩和总成绩放在结构体对应的域中,并把原始数据放入student.dat。

(2)输出:函数output 输出全部学生的记录,从文件中读出学生的信息,并从屏幕上输出。

(3)插入:insert 函数输入一个学生的记录,按学号的先后顺序插入该学生的全部内容。

(4)删除:delete函数输入一个学生的学号或姓名,找到该学生并删除该学生的全部内容。

(5)排序:sort函数对所有学生按要求排序(1.学号  2.总成绩  ),并输出。

(6)查找:find函数输入一个学生的学号或姓名,找到该学生并输出该学生的全部内容。要求能查询多次

(7)综合调试,完成项目

7.3 程序代码

#include<stdio.h>                             //头文件的开始

#include<stdlib.h>

struct Student1                                //学生结构体

{

      long int number;

      char name[15],sex[5];

      int age;

      float score[4];

      double total;

      double averge;

};

struct Student                                  //结点结构体

{

    struct Student1 stu;

      struct Student *next;

};

void Caidan(struct Student *p);                     //菜单函数

int print();                                      //主菜单输出函数

void Input(struct Student *p);                      //数据输入函数

void Insert(struct Student *p);                      //插入函数

void Sort(struct Student *p);                       //排序总函数

void Sort1(struct Student *p);                      //学号排序函数

void Sort2(struct Student *p);                      //成绩排序函数

void Find(struct Student *p);                       //查找函数

void Delet(struct Student *p);                      //删除函数

void Display(struct Student *p);                    //从函数中读取输出函数

void Display1(struct Student *p);                   //输出函数

void out();                                     //退出函数

void Write(struct Student *,char s[]);                //写函数

void Read(struct Student *,char s[]);                //读函授

/*主函数开始*/

int main()

{   struct Student *p=NULL;                     //定义结点指针             

      for(;;)                                     //死循环控制菜单

             Caidan(p);

      return 0;

}                                            //主函数结束

void Caidan(struct Student *p)           //菜单函数

{  int n;

      n=print();                                  //调用菜单输出函数

      switch(n)                                  //用switch做菜单选择

      {

      case 1: Input(p);break;                       //输入1调用Input函数

      case 2:Insert(p);break;                       //输入2调用Insert函数

      case 3: Sort(p);break;                        //输入3调用Sort函数

      case 4:Find(p);break;                        //输入4调用Find函数

      case 5:Delet(p);break;                       //输入5调用Delet函数

      case 6:Display(p);break;                     //输入6调用Display函数

      case 7:out();break;                          //输入7调用Out函数

      }

}                                           //菜单函数结束                                                                           

int print()                                    //菜单输出函数

{

      int n;

      printf("********************目录**********************\n");

      printf("**                 1.输入                   **\n");

      printf("**                 2.插入                   **\n");

      printf("**                 3.排序                   **\n");

      printf("**                 4.查找                   **\n");

      printf("**                 5.删除                   **\n");

      printf("**                 6.输出                   **\n");

      printf("**                 7.退出                   **\n");

      printf("**********************************************\n");

      printf("请从1--7选择:");

      scanf("%d",&n);

      return n;

}

void Input(struct Student *p)       //数据输入函数

{   int count=0,N;              //定义计数器count和要输入的学生个数变量N                                           

      struct Student *a;

      printf("请输入要录入的学生个数");

      scanf("%d",&N);

      printf("请输入学号、姓名、性别、年龄和四科成绩\n");

      for(count=0;count<N;count++)  //用循环来控制内存空间的分配,并录入数据         

      {   if(count==0)

                    a=p=calloc(1,sizeof(struct Student));   

             if(count!=0)

             {  p->next=calloc(1,sizeof(struct Student));

                    p=p->next;

             }

             if(count==N-1)

                    p->next=NULL;

             scanf("%ld %s %s %d %f%f%f%f",&p->stu.number,p->stu.name,p->stu.sex,

&p->stu.age,&p->stu.score[0],&p->stu.score[1],&p->stu.score[2],&p->stu.score[3]);

      p->stu.total=p->stu.score[0]+p->stu.score[1]+p->stu.score[2]+p->stu.score[3];

             p->stu.averge=p->stu.total/4.0;

      }

      Sort1(a);                                    //调用排序函数

      Write(a,"stu.dat");                            //调用写入函数

}                                             //数据输入函数结束

void Write(struct Student *p,char s[])                //文件写入函数

{   FILE *fp;

      struct Student *a;

      if((fp=fopen(s,"wb"))==NULL)               //以二进制写的方式打开文件

      {   printf("error!!");

             exit(0);

      }

      do

      {   if(fwrite(p,sizeof(struct Student),1,fp)!=1)

                    printf("write error!!");

             a=p;

             p=p->next;

             free(a);                               //内存释放

      }while(p!=NULL);

      fclose(fp);                                //关闭文件

}                                           //文件的写函数结束

void Read(struct Student *p,char s[])              //文件的读函数

{  FILE *fp;

      struct Student *a,*b;

      if((fp=fopen(s,"rb"))==NULL)               //以二进制读的方式打开文件

      {   printf("read open error!");

             exit(0);

      }

      a=p=calloc(1,sizeof(struct Student));          //分配内存空间

      do

      {   if(fread(p,sizeof(struct Student),1,fp)!=1)   //读到内存

                  printf("read error!!");

             b=p->next;

             if(b!=NULL)

             {   p->next=calloc(1,sizeof(struct Student));

                 p=p->next;

             }

      }while(b!=NULL);

}                                            //结束

void Display(struct Student *p)                    //从文件中读并输出到文件

{   struct Student *a;

      p=Read(p,"stu.dat");

      printf("学号   姓名   性别  年龄   高数   语文    英语    体育     总成绩    平均成绩\n");

      do

      {printf("%-5ld  %-5s  %-5s  %-4d %-4.2f  %-4.2f   %-4.2f    %-4.2f    %-4.2lf    %-4.2lf\n",p->stu.number,p->stu.name,

p->stu.sex,p->stu.age,p->stu.score[0],p->stu.score[1],p->stu.score[2],p->stu.score[3],p->stu.total,p->stu.averge);

             a=p;

             p=p->next;

             free(a);

      }while(p!=NULL);

}                                            //文件结束

void Display1(struct Student *p)                   //输出函数

{   struct Student *a;

      printf("学号   姓名   性别  年龄   高数   语文    英语    体育     总成绩    平均成绩\n");

      do

      {     printf("%-5ld  %-5s  %-5s  %-4d %-4.2f  %-4.2f   %-4.2f    %-4.2f    %-4.2lf    %-4.2lf\n",p->stu.number,p->stu.name,

p->stu.sex,p->stu.age,p->stu.score[0],p->stu.score[1],p->stu.score[2],p->stu.score[3],p->stu.total,p->stu.averge);

             a=p;

             p=p->next;

      }while(p!=NULL);

}                                              //函数结束

void Insert(struct Student *p)                       //插入函数

{   int n,i,count;

      struct Student *a,*c,*t,*head;

      printf("请输入要插入学生的个数:");

      scanf("%d",&n);

      head=Read(p,"stu.dat");

      for(i=0;i<n;i++)

      { a=calloc(1,sizeof(struct Student));

        scanf("%ld %s %s %d %f %f %f %f",&a->stu.number,a->stu.name,a->stu.sex,

      &a->stu.age,&a->stu.score[0],&a->stu.score[1],&a->stu.score[2],&a->stu.score[3]);

      a->stu.total=a->stu.score[0]+a->stu.score[1]+a->stu.score[2]+a->stu.score[3];

             a->stu.averge=a->stu.total/4.0;

             a->next=NULL;

             count=0;

             p=head;

             do

             {  if(a->stu.number<p->stu.number)

                    {  if(count==0)

                           {  a->next=p;

                                  head=a;

                           }

                           else

                           {   t=c->next;

                                  c->next=a;

                                  a->next=t;

                           }

                           break;

}

                    c=p;

                    p=p->next;

                    count++;

             }while(p!=NULL);

             if(p==NULL)

             {   c->next=a;

                    a->next=NULL;

             }

      }

      Display1(head);

      Write(head,"stu.dat");

}                                   //函数结束             

void Sort1(struct Student *p)             //学号排序     

{

      int n=0,i,j;

      struct Student1 t;

      struct Student *p1,*a;

      a=p;

      do

      {  p=p->next;

             n++;

      }while(p!=NULL);

      p=a;

      for(i=0;i<n-1;i++)

      {   p=a;

             for(j=0;j<n-1-i;j++)

             {   p1=p->next;

                    if(p->stu.number>p1->stu.number)

                    {   t=p->stu;

                           p->stu=p1->stu;

                           p1->stu=t;

                    }

                    p=p1;

             }

      }

}

void Sort2(struct Student *p)             //按成绩排序函数

{   int n=0,i,j;

      struct Student1 t;

      struct Student *p1,*a;

      a=Read(p,"stu.dat");

      p=a;

      do

{   p=p->next;

             n++;

      }while(p!=NULL);

      p=a;

      for(i=0;i<n-1;i++)

      {   p=a;

             for(j=0;j<n-1-i;j++)

             {   p1=p->next;

                    if(p->stu.total>p1->stu.total)

                    {   t=p->stu;

                           p->stu=p1->stu;

                           p1->stu=t;

                    }

                    p=p1;

             }

      }

      Display1(a);

}                                               //函数结束

void Sort(struct Student *p)                         //总排序函数

{   printf("按学号排序:\n");

      Display(p);

      printf("按总成绩排名:\n");

      Sort2(p);

}

void out()                                       //退出函数

{exit(0);}                                       //函数结束

void Find(struct Student *p)                        //查找函数

{  long int num;

      int n=0;

      struct Student *a;

      p=Read(p,"stu.dat");

      printf("请输入要查询的学号:");

      scanf("%ld",&num);

      do

      {if(num==p->stu.number)

      {printf("学号 姓名 性别 年龄 高数 语文 英语 体育 总成绩 平均成绩\n");

       printf("%-5ld%-5s %-5s %-4d %-4.2f %-4.2f %-4.2f %-4.2f %-4.2lf    %-4.2lf\n",p->stu.number,p->stu.name,

p->stu.sex,p->stu.age,p->stu.score[0],p->stu.score[1],p->stu.score[2],p->stu.score[3],p->stu.total,p->stu.averge);

                    n=1;}

             a=p;

             p=p->next;

          free(a);

      }while(p!=NULL);

      if(n==0)

             printf("没有你要查找的学生信息。\n");

}

void Delet(struct Student *p)

{  long int num;

      int n=0;

      struct Student *a,*head;

      head=p=Read(p,"stu.dat");

      printf("请输入要删除学生的学号:");

      scanf("%ld",&num);

      do

      {  if(num==p->stu.number)

             {  if(n==0)

                    {   head=p->next;

                           free(p);

                           break;

                    }

                    else

                    {   a->next=p->next;

                           free(p);

                           break;

                    }

             }

             a=p;

             p=p->next;

      }while(p!=NULL);

      Display1(head);

      Write(head,"stu.dat");}

8.实训心得:

认识与接触C语言已经有差不多一年了,从上第一堂课老师就强调C语言的重要性,在上第一堂课之前我不了解什么是C我也不知道我是否能够学好他,在慢慢的接触后,我认识C语言是一门比较复杂与困难的学科。刚刚接触到C语言,完全弄不了解,不清楚为什么要这样写、有什么规则、格式、更别说什么函数的字符。在通过为期两周的C语言程序设计实训,我又增长了知识,实训期间及编写实训报告的过程中,自己学到了许多知识,为更好的从实训中吸取经验,以促进今后的学习,自己对实训作了总结,总结如下:

首先,实训的两周时间里,对于之前C语言的知识又进行了一遍系统性的复习,我认为这次复习是更加完善的,因为此次复习是在一次理论和实践相结合的复习。因此此次实训在学到知识的同时,更锻炼了自己的动手能力。其次,之前对于C语言的学习是基于Turbo C++的环境,而此次实训又熟悉了VC++6.0的编译环境,在实训的过程中能够利用所学的基本知识,解决简单的程序设计问题,通过每天的编写相关程序代码、反复调试、与同学不断地讨论及查阅相关资料。自己的编程能力有了一定程度的提高。此外,在实训的过程中克服了自己性子急的毛病,锻炼了自己的耐性。同时培养了自己独立思考的团结合作的意识使自身有了很大程度的提高。最后,在编写实训的报告中自己也发现了些许的小问题,不过通过耐心的再调试过程,最终自己成功完成了本次实训报告的编写。

实训周过后,接下来还会面对学习生活中更多新的挑战,通过两周的实训的锻炼,我增强了信心,锻炼了自己,相信自己有足够的勇气迎接未来更多的挑战。