C语言与软件技术基础
实 验 报 告
课程名称
指导老师
班 级 实验名称 实验时间 姓 名 实验地点 提交时间 座 号
一、实验目的和要求
1、掌握结构体类型变量的定义和使用。
2、掌握结构体类型数组的概念和应用。
3、了解链表的概念和操作方法。
二、实验环境和方法
实验方法:
(一)综合运用课本所学的知识,用不同的算法实现在不同的程序功能。
(二)结合指导老师的指导,解决程序中的问题,正确解决实际中存在的异常情况,逐步改善功能。
(三)根据实验内容,编译程序。
实验环境:Windows xp Visual C++6.0
三、实验内容及过程描述
实验内容:编译以下题目的程序并调试运行。
1、有5个学生,每个学生的数据包括学号、姓名、3门课成绩。从键盘输入5个学生数据,要求输出3门课程平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课的成绩、平均分)。 2、13个人围城一圈,从第1个人开始顺序报号1、2、3.凡报到“3”者退出圈子,找出最后留在圈子中的人原来的号。要求用链表实现。
3、建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。
实验步骤:
① 进入Visual C++ 6.0集成环境。
② 输入自己编好的程序。
③ 检查一遍已输入的程序是否有错(包括输入时输错的和编程中的错误),如发现有错,及时改正。
④ 进行编译和连接。如果在编译和连接过程中发现错误,频幕上会出现“报错信息”,根据提示找到出错位置和原因,加以改正。再进行编译,如此反复直到不出错为止。
⑤ 运行程序并分析运行结果是否合理。在运行是要注意当输入不同的数据时所得结果是否正确,应运行多次,分别检查在不同情况下结果是否正确。
以下是各题源代码:
1、有5个学生,每个学生的数据包括学号、姓名、3门课成绩。从键盘输入5个学生数据,要求
输出3门课程平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课的成绩、平均分)。 #include<stdio.h> struct Student {int num; char name[10]; float score[3]; float total; float ave; }stu[10]; int main() { void input(struct Student stu[]); void max(struct Student stu[]); void print(struct Student stu[]); input(stu); print(stu); max(stu); return 0; } void input(struct Student stu[]) {int i,j; for(i=0;i<10;i++) {printf("请输入第%d位学生信息:\n",i+1); printf("学号:"); scanf("%d",&stu[i].num); printf("姓名:"); scanf("%s",stu[i].name); for(j=0;j<3;j++) {printf("第%d门成绩:",j+1); scanf("%f",&stu[i].score[j]); } printf("\n"); stu[i].total=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2]); stu[i].ave=stu[i].total/3; } } void print(struct Student stu[]) {int i,j; printf("*******************所有学生成绩************************\n"); printf("学号\t姓名\t 第一门 第二门 第三门 总分 平均分\n"); for(i=0;i<10;i++) { printf("\nNO.%d\t%s\t",stu[i].num,stu[i].name); for(j=0;j<3;j++) { printf("%8.2f ",stu[i].score[j]); } printf("%8.2f %8.2f\n",stu[i].total,stu[i].ave); } } void max(struct Student stu[]) {int i,j,M=0; for(i=0;i<10;i++) { if(stu[i].total>stu[M].total) M=i; } printf("****************成绩最高的学生******************\n");
printf("****************成绩最高的学生******************\n");
printf("学号\t姓名\t 第一门 第二门 第三门 总分 平均分\n");
printf("NO.%d\t%s\t",stu[M].num,stu[M].name);
for(j=0;j<3;j++)
{
printf("%8.2f ",stu[M].score[j]);
}
printf("%8.2f %8.2f\t\n",stu[M].total,stu[M].ave);
}
2、13个人围城一圈,从第1个人开始顺序报号1、2、3.凡报到“3”者退出圈子,找出最后留在圈子中的人原来的号。要求用链表实现。
#include<stdio.h> #define N 13 struct person {int number; int nextp; }link[N+1]; int main() {int i,count,h; for(i=1;i<=N;i++) {if(i==N) link[i].nextp=1; else link[i].nextp=i+1; link[i].number=i; } printf("\n"); count=0; h=N; printf("退出圈子的号数为:\n"); while(count<N-1) {i=0; while(i!=3) {h=link[h].nextp; if(link[h].number) i++; } printf("%4d",link[h].number); link[h].number=0; count++; } printf("\n最后留下来的号数为:"); for(i=1;i<=N;i++) if(link[i].number) printf("%3d",link[i].number); printf("\n"); return 0; }
3、建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。
#include <stdio.h> #include <malloc.h> #define LEN sizeof(struct student) struct student //定义结构体 { char num[6]; //学号 char name[8]; //姓名 char sex[2]; //性别 int age; //年龄 struct student *next; //结构体指针 } stu[10]; //结构体变量 int main() { struct student *p,*pt,*head; int i,length,iage,flag=1; int find=0; //找到待删除元素 find=1,否则find=0 while (flag==1) {printf("输入链表长度(<10):"); scanf("%d",&length); if (length<10) flag=0; } //建立链表 for (i=0;i<length;i++) {p=(struct student *) malloc(LEN); if (i==0) head=pt=p; else pt->next=p; pt=p; printf("学号:"); scanf("%s",p->num); printf("姓名:"); scanf("%s",p->name); printf("性别:"); scanf("%s",p->sex); printf("年龄:"); scanf("%d",&p->age); } p->next=NULL; p=head; printf("\n 学号 姓名 性别 年龄\n"); //显示 while(p!=NULL) {printf("%4s %8s %6s%6d\n",p->num,p->name,p->sex,p->age); p=p->next; } // 删除 printf("请输入要删除的年龄:"); //输入待删年龄 scanf("%d",&iage); pt=head; p=pt; if (pt->age==iage) //链头是待删元素 {p=pt->next; head=pt=p; find=1; } else //链头不是待删元素 pt=pt->next; while (pt!=NULL) {if (pt->age==iage) {p->next=pt->next;
{p->next=pt->next; find=1; } else // 中间结点不是待删元素 p=pt; pt=pt->next; } if (!find) printf(" 找不到年龄为 %d的对象.",iage); p=head; printf("\n 学号 姓名 性别 年龄9\n"); //显示结果 while (p!=NULL) {printf(" %4s %8s",p->num,p->name); printf("%6s%6d\n",p->sex,p->age); p=p->next; } return 0; }
四、实验结果:
1、有5个学生,每个学生的数据包括学号、姓名、3门课成绩。从键盘输入5个学生数据,要求输出3门课程平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课的成绩、平均分)。
运行结果:
以上是输入数据,以下是输出结果:
2、13个人围城一圈,从第1个人开始顺序报号1、2、3.凡报到“3”者退出圈子,找出最后留在圈子中的人原来的号。要求用链表实现。
3、建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。
第二篇:数据类型、运算符和表达式(C语言实验报告)
仲恺农业工程学院实验报告纸
信息学院(院、系) 专业 班 C语言程序设计 课 实验目的:
(1) 掌握C语言数据类型,熟悉基本类型变量的定义、赋值和运算。
(2) 熟悉C程序的编辑、编译、链接和运行过程。
实验内容与总结:
1、 运行下面程序,分析实验结果。
#include <stdio.h>
void main()
{
float x=2.5,y=4.7;
int a=7,b;
float result;
result=x+a%3*(int)(x+y)%2/4; /*赋值语句1*/
printf("result1=%f\n",result);
a=2;b=3;x=3.5;y=2.5;
result=(float)(a+b)/2+(int)x%(int)y; /*赋值语句2*/
printf("result2=%f\n",result);
}
分析:
(1)、result=x+a%3*(int)(x+y)%2/4;语句求值过程分析如下:
a%3=1;(int)(x+y)=7;result=x+a%3*(int)(x+y)%2/4=2.5+1*7%2/4=2.5+1/4=2.500000 因为float result,所以输出结果有六位小数。
(2)、result=(float)(a+b)/2+(int)x%(int)y; 语句求值过程分析如下:
(float)(a+b)/2=(2+3)/2=2.500000;(int)x%(int)y=3%2=1,所以result=3.500000.
(3)、该实验中表达式求值所用到的知识点包括:
①单精度浮点型变量float,有效数学为6~7位;
②基本整型int;
③程序内printf函数中的“%f”是输出浮点数时指定的格式符,作用是指定该实数以小数形式输出;
④取商符号“/”, 取余符号“%”;
⑤转义字符\n,作用是换行,将当前位置移到下一行开头。
2、 译码:教材P67-3.7
程序:
#include<stdio.h>
void main()
{
char c1='C',c2='h',c3='i',c4='n',c5='a';
c1+=4;
c2+=4;
c3+=4;
c4+=4;
c5+=4;
printf("Password is %c%c%c%c%c\n",c1,c2,c3,c4,c5);
}
(1)、程序编制要点:
①指定字符变量,初值分别’C’,’h’,’i’,’n’,’a’;
②经过运算,使C变为G,h变为l,i变为m,n变为r,a变为e;
③输出结果:China 译成 Glmre。
(2)该题目涉及的知识点和难点:
①字符变量char的使用;
②复合的赋值运算符“+=”, c+=4是表示c=c+4,
③程序内printf函数中的“%c”是输出字符时指定的格式符,作用是指定该实数以字符形式输出; ④“;”的使用。
3、 输入一个三位整数,然后构成其反向三位数,并将其输出。
程序:
#include<stdio.h>
void main()
{
int a,b,c,x,y;
printf("请输入一个三位整数 x=");
scanf("%d",&x);
a=x/100;
b=(x-a*100)/10;
c=x-a*100-b*10;
y=c*100+b*10+a;
printf(“%d\n",y);
}
(1)、程序编制要点:
①输入一个三位数x,取出它的个位数a,十位数b,百位数c;
②将反向三位数y等于个位数*100+十位数*10+百位数,则y=c*100+b*10+a
③x变成了y。
(2)、该题目涉及的知识点和难点:
①基本整型int,scanf函数的使用;
②一个三位数的个位数、十位数、百位数的取值方法。
程序代码和运行情况描述:
前两个程序我都写的都没问题,但有时忘记了“;”的输入,导致程序出错,根据编程工作区的最下面小窗口的出错提示改正后,程序就可行了。
第三个输入三位数的实验我编写的程序出现了问题。开始的时候,我把个位数、十位数、百位数的取值方法理解错了,编写出来的结果程序没有错,但就是运行不了。经过老师和同学的帮忙,我改正了错误的地方,再调试时,程序就可以运行了。