专业 序号 姓名 日期
12级信息管理1班 7
苏炎江 唐彩铃 王涵 王潼业 2014/3/2
实验1 结构体
【实验目的】
复习C语言结构体和一些函数的用法
【实验内容】
1. 请举例说明malloc函数和realloc函数的用法 (1)、动态分配内存空间函数malloc 例如:
p=(char*)malloc(100) 表示给p分配100个字节的存储空间 (2)、重新分配内存空间函数realloc 定义:
realloc函数将p指向的对象的长度修改为size个字节. 如果新分配的内存比原来的大,则原来的数据保持不变.增加的空间不进行初始化.如果新分配的内存比原来的内存小,则新的内存空间不被初始化.realloc函数返回指向新分配空间的指针.若无法满足要求则返回NULL 指针.在这种情况下.原指针p指向的单元内容保持不变. 例如:
p =(char*)malloc(100); p=(char*)realloc(200);
2. 对下列程序每行进行注释,并修改程序运行结果和分析相应的时间复杂度,并改写该函
数的输入输出函数
要求:请输入10个以上同学的成绩并计算
#include
char name[30]; char sex;
float Chinese; float Math; float English;
}stu[4]={{2007480001,\{2007480002,\{2007480003,\void main() {
printf(\全班最好成绩*********\\n\\n\
if ((stu[1].Chinese+stu[1].Math+stu[1].English)>(stu[2].Chinese+stu[2].Math+stu[2].English)) stu[4]=stu[1]; else
stu[4]=stu[2];
if ((stu[0].Chinese+stu[0].Math+stu[0].English)>(stu[4].Chinese+stu[4].Math+stu[4].English))
printf(\第一名是 %s\ else
printf(\第一名是 %s\\n\\n\
printf(\及格情况*********\\n\\n\
int j,c=0,m=0,e=0;
for(int i=0;i<3;i++) { //补充语句 }
printf(\语文不及格的人数有%d个。\\n数学不及格的有%d个。\\n英语不及格的有%d个.\\n\\n\float k,q,p;
k=c/3.0f*100; q=m/3.0f*100; p=e/3.0f*100;
printf(\语文不及格的人数占%f%%。\\n数学不及格的占%f%%。\\n英语不及格的占%f%%.\\n\\n\
printf(\个人成绩数据*********\\n\\n\
printf(\姓名:%s 总分:%f 平均分:%f\\n\3.0);
printf(\姓名:%s 总分:%f 平均分:%f\\n\3.0);
printf(\姓名:%s 总分:%f 平均分:%f\\n\3.0);
}
【结果如下】:
#include
struct student //创建student类,存储学生信息 {
int num; //学生学号
char name[30]; //存储姓名 char sex; //存储性别
float Chinese; //存储语文成绩 float Math; //存储数学成绩 float English; //存储英语成绩
student (int nu,char *n,char s,float c,float m,float e) //内嵌构造函数 {
num = nu; //将nu的值赋值给num
strcpy(name,n); //复制语句,将字符串n复制给name sex = s; //将s的值赋值给sex Chinese = c; //将c的值赋值给Chinese Math = m; //将m的值赋值给Math English = e; //将e的值赋值给English }
~student() {}; //释放构造函数
void print() //成员函数,输出学生信息 {
cout<<\学号:\
cout<<\姓名:\ cout<<\总
分:\ cout<<\平均
分:\ } };
int main() {
student stu[10]={
student(2007480001,\ student(2007480002,\ student(2007480003,\ student(2007480004,\ student(2007480005,\ student(2007480006,\ student(2007480007,\ student(2007480008,\ student(2007480009,\ student(2007480010,\ }; //输入十个学生的信息,并存储在数组stu中 float max; //定义一个最大值,备用 int i,j=0; //定义j记录最大值的相关信息
max = stu[0].Chinese+stu[0].Math+stu[0].English; //定义一个最大值,备用 cout<<\学生成绩***********\ for (i=0; i<10; i++) {
stu[i].print(); //输出十个学生学号、姓名及各科成绩 if (stu[i].Chinese+stu[i].Math+stu[i].English>max) //判断大小,从而选取最大值 {
max=stu[i].Chinese+stu[i].Math+stu[i].English; //若成立,则把大值赋给max
j = i; //记录条件成立的i,输出需要 } }
cout<<\全班最好成绩*********\
cout<<\第一名是:\输出总分第一名的学生姓名 cout<<\及格情况***********\ int c1=0, m1=0, e1=0;
for (int k=0; k<10; k++) {
if (stu[k].Chinese<60)
c1++; //计算语文不及格人数 if (stu[k].Math<60)
m1++; //计算数学不及格人数 if (stu[k].English<60)
e1++; //计算英语不及格人数
}
cout<<\语文不及格的人数有\个。\ <<\数学不及格的有\个。\
<<\英语不及格的有\个。\ float q,w,r;
q=c1/10.0f*100; //计算语文不及格百分比 w=m1/10.0f*100; //计算数学不及格百分比 r=e1/10.0f*100; //计算英语不及格百分比 cout<<\语文不及格的人数占
\输出各科不及格百分比 <<\。数学不及格的占\ <<\。英语不及格的\。\
return 0; //函数返回值 }
【运行结果如下】:
【结果分析】:
首先说明一点,结构体有以下优点: 一、可以包含不同的数据类型
二、相同结构的结构体变量是可以相互赋值的 三、能够节省内存空间 四、运行结果高效率
基于结构体有以上四个结果,我们分析程序的有穷行、确定性和可行性:
有穷性:在实验的过程中我们多次使用for循环结构,循环的总次数为20次,在一定程度上做到了最少,因此程序在有穷性的原则上还是可以的;
确定性:程序的运行结果中,我们可以得到一个最终值,并且是唯一的,因此该程序同样满足确定性原则;
可行性:程序在满足有穷性和确定性的基础上,本来其在一定的条件下可行性是满足的,但是如果考虑到输入人数的不确定,这时则需要修改输入程序及相关参数,因此本程序存在局
限性,不能很好的推广运用。

