安徽工业大学
C语言实习报告
专业:软件工程
班级:软141
姓名:
学号:
指导老师:
课题一
1.熟悉变量、数组定义、使用、输入、输出等基本操作
2.进行选择、循环结构程序设计练习
3.掌握冒泡法排序的算法
4.掌握函数的定义、调用、声明,以及参数的两种传递方式
课题二
1.熟悉变量的指针和指向变量的的指针变量的概念和使用.
2.熟悉数组的指针和指向数组的的指针变量的概念和使用.
课题三
1.掌握结构体变量及数组的定义、赋值、初始化、输入、输出
2.结构体数组的操作。
课题四
1.掌握文件指针的概念和运用
2.掌握文件的相关操作:打开、读、写、关闭
3.掌握文件的定位操作
课题五
1. 目标:学会使用链表与指针对结构体进行插入,删除,输出。
代码:
#include<stdio.h>
#include <stdlib.h>
#include <process.h>
#include <string.h>
#include <conio.h>
#define N 10
typedef struct student
{
char name[8];
unsigned No;
float math,Chinese,English;
float ave;
struct student *next;/*保存下一个stu的地址*/
}NODE,*linklist;
void zhu();
void scan(int a[],int n)
{
int i;
printf("\n请输入%d个人成绩\n",n);
for(i=0;i
scanf("%d",&a[i]);
}
/*****************************************************************************/
void sort(int a[],int n, char style)
{
int i,j,t;
if(style=='a')
{
for(i=0;i
for(j=0;j
{if(a[j]>a[j+1])
{t=a[j];a[j]=a[j+1];a[j+1]=t;}
}
printf("按照升序排列的结果:\n");
for(i=0;i
printf("%d\t",a[i]);
printf("\n");
}
if(style=='d')
{
for(i=0;i
for(j=0;j
{
if(a[j+1]>a[j])
{ t=a[j];a[j]=a[j+1];a[j+1]=t;}
}
printf("按照降序排列的结果:\n");
for(i=0;i
printf("%d\t",a[i]);
printf("\n");
}
}
/*****************************************************************************/
void scan_1(int a[],int n)
{
int i;
printf("定义一个数组stu[10]存放10个学生的成绩,从键盘输入数据\n ");
for(i=0;i
scanf("%d",&a[i]);
}
/*****************************************************************************/
void sort_stu (int a[],int n)
{
int i,j,t;
printf("\n将成绩数组按照从高到低进行排序\n");
for(i=0;i
for(j=0;j
if(a[j+1]>a[j])
{t=a[j+1];a[j+1]=a[j];a[j]=t;}
}
/*****************************************************************************/
void print_stu(int a[],int n)
{
int i;
printf("\n将数组stu[10]的内容输出到屏幕上\n");
for(i=0;i
printf("%d\t",a[i]);
printf("\n");
}
/*****************************************************************************/
void scan_str(char str[])
{
int i=0;
printf("输入字符串“student score ”,复制该字符串并输出\n");
fflush(stdin);
gets( str);
printf("输出该字符串\n");
printf("%s",str);
printf("\n");
}
/*****************************************************************************/
void scan_con(struct student *p,int n)
{
int i;
printf("格式:姓名,学号,成绩(数学,语文,英语)\n\n");
for(i=0;i
{
printf("请输入第%d个学生数据\n",i+1);
scanf("%s%d%f%f%f",(*p).name,&(*p).No,&(*p).math,&(*p).Chinese,&(*p).English);
}
}
/*****************************************************************************/
int Max1(struct student *p)
{
int i,a;
float max1=p->math;
for(i=0;i<10;i++){
if((p+i)->math>max1){ max1=(p+i)->math; a=i; }}
return a;
}
int Max2(struct student *p){
int i,b;
float max2=p->Chinese;
for(i=0;i<10;i++){
if((p+i)->Chinese>max2) {max2=(p+i)->Chinese; b=i;}}
return b;
}
int Max3(struct student *p){
int i,c;
float max3=p->English;
for(i=0;i<10;i++){
if((p+i)->English>max3) {max3=(p+i)->English; c=i;}}
return c;
}
/*****************************************************************************/
void print_con(struct student *p)
{
int m=0,c=0,e=0;
m=Max1(p);
c=Max2(p);
e=Max3(p);
printf("\n\n输出单门课成绩最高的学生的学号、姓名、以及该门课程的成绩\n");
printf("max math:");
printf("%s\t%d\t%.2f\n",(p+m)->name,(p+m)->No,(p+m)->math);
printf("max Chinese:");
printf("%s\t%d\t%.2f\n",(p+c)->name,(p+c)->No,(p+c)->Chinese);
printf("max English:");
printf("%s\t%d\t%.2f\n",(p+e)->name,(p+e)->No,(p+e)->English);
}
/******************************************************************************/
void print_aver(struct student *p,int n)
{
int i,e=0;
float max;
for(i=0;i
p[i].ave=(p+i)->math+(p+i)->Chinese+(p+i)->English;
}
for(i=0;i
p[i].ave=(1.0/3.0)*p[i].ave;
}
max=p[0].ave;
for(i=0;i
if(p[i].ave>max) {max=p[i].ave; e=i;}
}
printf("\n输出三门课程的平均分数最高的学生的学号、姓名及其平均分\n");
printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",(p+e)->No,(p+e)->name,(p+e)->math,(p+e)->Chinese,(p+e)->English,(p+e)->ave);
}
/*****************************************************************************/
void sort_aver(struct student *p,int n)
{
int i,j;
struct student t;
for(i=0;i
for(j=0;j
{
if(p[j+1].ave>p[j].ave){
t=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=t;
}
}
printf("\n将10个学生按照平均分数从高到低进行排序\n");
printf("number\t\tname\tmath\tChinese\tEnglish\tave\n") ;
for(i=0;i
printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",(p+i)->No,(p+i)->name,(p+i)->math,(p+i)->Chinese,(p+i)->English,(p+i)->ave);
}
/*****************************************************************************/
void scan_con_1(FILE *fp,struct student *p,int n)
{
int i;
for(i=0;i
{
fprintf(stdout,"请输入第%d个学生数据(姓名,学号,成绩(数学,语文,英语))\n",i+1);
fscanf(stdin,"%s%d%f%f%f",(*p).name,&(*p).No,&(*p).math,&(*p).Chinese,&(*p).English);
}
}
/*****************************************************************************/
void print_con_1(FILE *fp,struct student *p)
{
int m=0,c=0,e=0;
m=Max1(p);
c=Max2(p);
e=Max3(p);
fprintf(stdout,"\n\n输出单门课成绩最高的学生的学号、姓名、以及该门课程的成绩\n");
fprintf(stdout,"max math:");
fprintf(stdout,"%s\t%d\t%.2f\n",(p+m)->name,(p+m)->No,(p+m)->math);
fprintf(stdout,"max Chinese:");
fprintf(stdout,"%s\t%d\t%.2f\n",(p+c)->name,(p+c)->No,(p+c)->Chinese);
fprintf(stdout,"max English:");
fprintf(stdout,"%s\t%d\t%.2f\n",(p+e)->name,(p+e)->No,(p+e)->English);
}
/*****************************************************************************/
void print_aver1(FILE *fp,struct student *p,int n)
{
int i,e=0;
for(i=0;i
p[i].ave=(p+i)->math+(p+i)->Chinese+(p+i)->English;
}
for(i=0;i
p[i].ave=(1.0/3.0)*p[i].ave;
}
for(i=0;i
if(p[i].ave>p[0].ave) e=i;}
fprintf(stdout,"\n输出三门课程的平均分数最高的学生的学号、姓名及其平均分\n");
fprintf(stdout,"%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",(p+e)->No,(p+e)->name,(p+e)->math,(p+e)->Chinese,(p+e)->English,(p+e)->ave);
}
/*****************************************************************************/
void print_aver_con(FILE *fp,struct student *p,int n)
{
int i,j,e=0;
float t=0;
for(i=0;i
p[i].ave=(p+i)->math+(p+i)->Chinese+(p+i)->English;
}
for(i=0;i
p[i].ave=(1.0/3.0)*p[i].ave;
}
for(i=0;i
for(j=0;j
{
if(p[j+1].ave>p[j].ave){
t=p[j].ave;p[j].ave=p[j+1].ave;p[j+1].ave=t;
}
}
fprintf(stdout,"\n将10个学生按照平均分数从高到低进行排序\n");
fprintf(stdout,"number\t\tname\tmath\tChinese\tEnglish\tave\n") ;
for(i=0;i
fprintf(stdout,"%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",(p+i)->No,(p+i)->name,(p+i)->math,(p+i)->Chinese,(p+i)->English,(p+i)->ave);
}
/*****************************************************************************/
void print_aver_con2(FILE *fp,struct student *p )
{
int i;
fprintf(stdout,"\n从studsort.dat 文件中读取第2,4,6,8,10个学生的数据。\n");
for(i=2;i<=10;i=i+2)
{
fprintf(stdout,"%d\t%s\t%.2f\t%.2f\t%.2f",(p+i-1)->No,(p+i-1)->name,(p+i-1)->math,(p+i-1)->Chinese,(p+i-1)->English);
fprintf(stdout,"\n");
}
}
/******************************************************************************/
/*struct stu *h;===>NoDE *h or linklist h;等价;定义一个单链表*/
linklist create(int n)
{
linklist h,f,p;
int i;
h=(linklist) malloc(sizeof(NODE));/*申请空间*/
f=p=h;
printf("请输入姓名,学号以及三门课成绩\n");
scanf("%s%d%f%f%f",(*p).name,&(*p).No,&(*p).math,&(*p).Chinese,&(*p).English);
for(i=1;i
{ f=p;
p=(linklist) malloc(sizeof(NODE));/*申请空间*/
scanf("%s%d%f%f%f",(*p).name,&(*p).No,&(*p).math,&(*p).Chinese,&(*p).English);
f->next=p;
}
p->next=NULL;
return(h);
}
/*****************************************************************************/
void pt(linklist h)
{
linklist p=h;
printf("\n输出的结果是:\n");
while(p!=NULL)
{
printf("%s\t%d\t%.2f\t%.2f\t%.2f\n",p->name,p->No,p->math,p->Chinese,p->English);
p=p->next;
}
}
/*****************************************************************************/
linklist del_xh(linklist h,int num)
{
linklist current_node=h;
linklist previous=0;
while(current_node!=0&&(current_node->No!=num))
{
previous=current_node;
current_node=current_node->next;
}
if(current_node!=0&&previous==0)
{
h=current_node->next;
delete current_node;
printf("学号:%d成功删除 \n",num);
}
else if(current_node!=0&&previous!=0)
{
previous->next=current_node->next;
delete current_node;
printf("学号:%d成功删除 \n",num);
}
else
printf("对不起,链表中没有这个人员的信息 \n");
return (h);
}
/*****************************************************************************/
linklist del_xm(linklist h,char str[])
{
linklist current_node=h;
linklist previous=0;
while(current_node!=0&&strcmp(current_node->name,str)!=0)
{
previous=current_node;
current_node=current_node->next;
}
if(current_node!=0&&previous==0)
{
h=current_node->next;
delete current_node;
printf("姓名:%s成功删除 \n",str);
}
else if(current_node!=0&&previous!=0)
{
previous->next=current_node->next;
delete current_node;
printf("姓名:%s成功删除 \n",str);
}
else
printf("对不起,链表中没有这个人员的信息 \n");
return (h);
}
/*************************链表的插入*****************************************/
linklist insert(linklist head,linklist stud)
{
linklist p1,p2,p3;
p1=head;
p2=stud;
while( (p2->No>p1->No)&&(p1->next!=NULL))
{
p3=p1;
p1=p1->next;}
if(p2->No<=p1->No)
{
if(head==p1) head=p2;
else p3->next=p2;
p2->next=p1; }
else
{ p1->next=p2;p2->next=NULL;}
return(head);
}
/*****************************************************************************/
void case1(){
char style;
int stu[N]={0};
/* n个学生成绩从高到低排名 */
printf("please input a(升序) or d(降序)\t");
scanf(" %c",&style);
scan( stu,N);
sort(stu,N, style);
printf("按任意键返回主菜单:\n");
getch();
system("cls");
zhu();
}
/*****************************************************************************/
void case2(){
char stu_score[20]={0};
int stu[N];
/* 定义一个数组stu[10]存放10个学生的成绩,从键盘输入数据 */
scan_1(stu,N);
/* 将数组stu[10]的内容输出到屏幕上 */
print_stu(stu,N);
/* 将成绩数组按照从高到低进行排序 */
sort_stu(stu,N);
/* 将数组stu[10]的内容输出到屏幕上(排序后) */
print_stu(stu,N);
/* 输入字符串“student score ”,复制该字符串并输出 */
scan_str(stu_score);
printf("\n");
printf("按任意键返回主菜单:\n");
getch();
system("cls");
zhu();
}
/*****************************************************************************/
void case3(){
struct student s[N];
float a[N]={0};
/* 从键盘输入10个学生的以上内容 */
scan_con(s,N) ;
/* 输出单门课成绩最高的学生的学号、姓名、以及该门课程的成绩 */
print_con(s);
/* 输出三门课程的平均分数最高的学生的学号、姓名及其平均分 */
print_aver(s,N);
/* 将10个学生按照平均分数从高到低进行排序 */
sort_aver(s,N);
printf("\n");
printf("按任意键返回主菜单:\n");
getch();
system("cls");
zhu();
}
/*****************************************************************************/
void case4(){
struct student s[N];
FILE *fp;
/* 从键盘输入10个学生的以上内容,存入文件stud.dat,关闭文件 */
if((fp=fopen("stud.dat","w"))==NULL){
printf("FILE OPEN ERROR!\n");
exit(0);
}
scan_con_1(fp,s,N);
/* 打开stud.dat文件,将数据读出,查看是否正确写入,关闭文件。 */
print_con_1(fp,s);
fclose(fp);
/*打开文件stud.dat文件,读出数据,将10个学生按照平均分数从高到低进行排序,
分别将结果输出到屏幕上和另一文件studsort.dat中。 */
if((fp=fopen("stud.dat","r"))==NULL){
printf("FILE OPEN ERROR!\n");
exit(0);
}
print_aver_con(fp,s,N);
fclose(fp);
print_aver_con2(fp,s);
printf("\n");
printf("按任意键返回主菜单:\n");
getch();
system("cls");
zhu();
}
/*****************************************************************************/
void case5(){
int s,m,j,i=0;
char k[8];
linklist l,h,p;
NODE stu;
printf("请输入学生人数\n");
scanf("%d",&m);
l=create(m);
pt(l);
printf("请根据学号或姓名修改数据:\n1.学号\t2.姓名\n");
printf("你的选择:\t");
scanf("%d",&j);
if(j>=1&&j<=2){
switch(j){
case 1:{
printf("\n请输入要删除的学号\t");
scanf("%d",&s);
printf("\n");
h=del_xh(l,s);
pt(h);
printf("\n");
}break;
case 2:{
printf("\n请输入要删除的姓名\t");
scanf("%s",k);
printf("\n");
h=del_xm(l,k);
pt(h);
printf("\n");}break;
}
}
p=h;
while(p!=NULL)
{
i++;
p=p->next;
}
if(i
printf("请输入新的数据:\t\n");
printf("格式:姓名,学号,成绩\n");
scanf("%s%d%f%f%f",&stu.name,&stu.No,&stu.math,&stu.Chinese,&stu.English);
h=insert(h,&stu);
pt(h);
}
printf("按任意键返回主菜单:\n");
getch();
system("cls");
zhu();
}
/*****************************************************************************/
void case6()
{
printf("\n\n\n\t****************************************************************\n");
printf("\t\tcopyright from 苏昶东\n");
printf("\t\t学号:139074091 班级:计133\n");
printf("\t****************************************************************\n");
printf("按任意键返回主菜单:\n");
getch();
system("cls");
zhu();
}
/*****************************************************************************/
int main()
{
int j;
printf("\n\n\n\t=======================================================\n");
printf("\t=======================================================\n");
printf("\t**************欢迎进入学生管理系统*********************\n");
printf("\t=======================================================\n");
printf("\t=======================================================\n\n\n");
char f[]="888888";
printf("请输入密码并以回车键结束:");
scanf("%s",f);
if(strcmp(f,"888888")==0)
{
system("cls");
zhu();//密码正确时进入系统
}
else
j=1;
printf("密码错误!请重新选择按键!\n");
printf("请输入第2次\t");
scanf("%s",f);
while(strcmp(f,"888888")!=0&&j<=4) {
printf("密码错误!请重新选择按键!\n");
printf("请输入第%d次\t",j+2); scanf("%s",f); j++;
}
if(j>4) {printf("输错次数大于6次\n"); getch(); exit(0);}
system("cls");
zhu();//密码正确时进入系统
return 0;
}
/*****************************************************************************/
void zhu(){
int i;
while(1){
printf("\t****************************************************************\n");
printf("\t\t1: 根据条件进行学生成绩排名\n\t\t2:用指针优化学生成绩排名\n\t\t3:学生成绩单制作\n\t\t");
printf("4:学生成绩文件管理\n\t\t5:修改学生信息(链表)\n\t\t6: 查看版本信息\n\t\t7: 离开\n");
printf("\t****************************************************************\n\n");
printf("\t\t请选择:\t");
scanf("%d",&i);
switch(i)
{
case 1: system("cls");case1();break;
case 2: system("cls");case2();break;
case 3: system("cls");case3();break;
case 4: system("cls");case4();break;
case 5: system("cls");case5();break;
case 6: system("cls");case6();break;
case 7: exit(0);break;
default:
{system("cls");
printf("\n输入错误,请重新输入\n");
printf("按任意键返回主菜单:\n");
getch();
system("cls");
zhu();
}
}
}
}
/*****************************************************************************/
截图:
计算机科学与技术 计133 苏昶东 139074091
C语言实习心得体会
在这几个星期里,我们专业的学生在专业老师的带领下进行了c语言程序实习学习。在这之前,我们已经对c语言这门课程学习了一个学期,对其有了一定的了解,但是也仅仅是停留在了解的范围,对里面的好多东西还是很陌生,更多的在运用起来的时候还是感到很棘手,毕竟,万事开头难嘛。
由于时间的关系,我们的这次实习课程老师并没有给我们详细的介绍,只是给我们简单的介绍了几个比较重要的实际操作。上机实验是学习程序设计语言必不可少的实习环节,特别是c语言灵活、简洁,更需要通过编程的实习来真正掌握它。对于程序设计语言的学习目的,可以概括为学习语法规定、掌握程序设计方法、提高程序开发能力,这些都必须通过充分的实际上机操作才能完成。
学习c程序设计语言除了课堂讲授以外,必须保证有不少于课堂讲授学时的上机时间。因为学时所限,课程不能安排过多的统一上机实验,所以希望学生有效地利用课程上机实验的机会,尽快掌握用c语言开发程序的能力,为今后的继续学习打下一个良好的基础。为此,我们结合课堂讲授的内容和进度,安排了12次上机实验。课程上机实验的目的,不仅仅是验证教材和讲课的内容、检查自己所编的程序是否正确,课程安排的上机实验的目的可以概括为如下几个方面:
1.熟悉程序开发环境、学习计算机系统的操作方法
一个c语言程序从编辑、编译、连接到运行,都要在一定的外部操作环境下才能进行。所谓"环境"就是所用的计算机系统硬件、软件条件,只有学会使用这些环境,才能进行程序开发工作。通过上机实验,熟练地掌握c语言开发环境,为以后真正编写计算机程序解决实际问题打下基础。同时,在今后遇到其它开发环境时就会触类旁通,很快掌握新系统的使用。
2.学习上机调试程序
完成程序的编写,决不意味着万事大吉。你认为万无一失的程序,实际上机运行时可能不断出现麻烦。如编译程序检测出一大堆错误。有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的。开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。程序的调试是一个技巧性很强的工作,对于初学者来说,尽快掌握程序调试方法是非常重要的。有时候一个消耗你几个小时时间的小小错误,调试高手一眼就看出错误所在。
通过这次为数不多的几天计算机实习学习,我们了解了一些关于c语言的知识,理解巩固了我们c语言的理论知识,着对我们将来到社会工作将会有莫大的帮助。同时它让我知道,只要你努力,任何东西都不会太难。
3.加深对课堂讲授内容的理解
课堂上要讲授许多关于c语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。然而要使用c语言这个工具解决实际问题,又必须掌握它。通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握c语言的语法规定。对于一些内容自己认为在课堂上听懂了,但上机实习中会发现原来理解的偏差,这是由于大部分学生是初次接触程序设计,缺乏程序设计的实习所致。
学习c语言不能停留在学习它的语法规则,而是利用学到的知识编写c语言程序,解决实际问题。即把c语言作为工具,描述解决实际问题的步骤,由计算机帮助我们解题。只有通过上机才能检验自己是否掌握c语言、自己编写的程序是否能够正确地解题。
通过上机实验来验证自己编制的程序是否正确,恐怕是大多数同学在完成老师作业时的心态。但是在程序设计领域里这是一定要克服的传统的、错误的想法。因为在这种思想支配下,可能你会想办法去"掩盖"程序中的错误,而不是尽可能多地发现程序中存在的问题。自己编好程序上机调试运行时,可能有很多你想不到的情况发生,通过解决这些问题,可以逐步提高自己对c语言的理解和程序开发能力。