实训报告
科目: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语言基础实训报告
班 级:
设 计 人:
指导教师对课程设计的评语
课程设计成绩
教师评语:
指导教师签字 :
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.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.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)尝试用三种方法排序:冒泡法、选择法,插入法排序。
#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.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)结构体数组的操作。
(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
#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.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中读取第2,4,6,8,10个学生的数据
{
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中读取第2,4,6,8,10个学生的数据
}
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.1.实训目的:
(1)掌握结构化程序设计的方法,自下而上,编码实现各模块功能;
(2)掌握各个模块之间的调用顺序和关系。
7.2.实训内容:
(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");}
首先,实训的两周时间里,对于之前C语言的知识又进行了一遍系统性的复习,我认为这次复习是更加完善的,因为此次复习是在一次理论和实践相结合的复习。因此此次实训在学到知识的同时,更锻炼了自己的动手能力。其次,之前对于C语言的学习是基于Turbo C++的环境,而此次实训又熟悉了VC++6.0的编译环境,在实训的过程中能够利用所学的基本知识,解决简单的程序设计问题,通过每天的编写相关程序代码、反复调试、与同学不断地讨论及查阅相关资料。自己的编程能力有了一定程度的提高。此外,在实训的过程中克服了自己性子急的毛病,锻炼了自己的耐性。同时培养了自己独立思考的团结合作的意识使自身有了很大程度的提高。最后,在编写实训的报告中自己也发现了些许的小问题,不过通过耐心的再调试过程,最终自己成功完成了本次实训报告的编写。
实训周过后,接下来还会面对学习生活中更多新的挑战,通过两周的实训的锻炼,我增强了信心,锻炼了自己,相信自己有足够的勇气迎接未来更多的挑战。
Pcb武汉软件工程职业学院课程设计报告课程名称设计题目数字电子时钟系别软件学院专业嵌入式系统工程班级1102班学生姓名孙欣学号12…
合肥学院课程设计报告题目光耦输入板的PCB板图设计系别电子系专业电子信息工程班级3学号0805070243姓名郁成才导师史俊成绩2…
清华大学电子线路CAD期末报告说明书系部信息与控制工程专业电气自动化班级10级2班学生姓名学号年月日电子线路CAD期末报告说明书目…
广东交通职业技术学院ProtelDXP2004电子CAD实训报告姓名:学号:***指导老师:**日期:20XX.1.2-20XX.…