▶ 实验一 熟悉开发环境及简单编程
▶ 实验二 选择结构程序设计
▶ 实验三 循环结构程序设计
▶ 实验四 函数的编程及应用
▶ 实验五 数组的应用
▶ 实验六 指针及结构体的应用
▶ 实验七 文件的操作
▶ 实验八 综合实验:开发猜数游戏程序
实验一 熟悉开发环境及简单编程
[实验目的]
(1)熟悉C语言的集成开发环境,掌握程序的编辑、编译、连接及运行的全过程。
(2)了解C语言源程序的基本格式,掌握基本的输入/输出操作。
(3)熟悉C语言的基本运算符与表达式,了解计算机语言与数学语言之间的联系和区别,能够将一个基本数学命题转换为C语言的表达式,并编写出简单的验证程序。
[实验内容及要求]
(1)启动Dev-C++开发平台,并以新建方式,建立文件名为E0201.cpp的源程序文件。
在Dev-C++的菜单中选择“文件”—>“新建”—“源代码”,将在编辑区产生一个“未命名1”的文件。
图1 新建文件保存对话框
在文件中按以下内容输入程序代码,在程序编辑中,建议大家只使用键盘,这样效率反而更高,特别是数学键盘上的“Home”键、“End”键、“PgUp”键、“PgDn”键、“Tab”键、“Delete”键和“Backspace”键等,以及切换插入、改写状态、Dev-C++的快捷控制键。
#include<iostream>
using namespace std; // 以上2行以后将是C++程序的固定形式
int main(void) // 程序入口,也是固定格式
{
cout<<“Hello World!”; // 输出字符串
return 0; // 程序结束,也是固定格式
}
按快捷工具栏“保存”按钮,将弹出如图1所示“保存为”对话框,可输入保存文件路径、文件名、文件类型。这里只修改文件名为“E0201”即可。注意其中4行及花括号是以后所有的程序设计所需要的,这将在(3)中用此程序做基础(模板)来开发其它程序。
按快捷工具栏的“编译且运行按钮”,将编译该源程序,并运行如图2所示。
图2 程序(1)编译运行界面
如不能正常进行编译、运行,需要检查右上角编译软件选择是否与你的计算机操作系统相匹配,如图3所示。
(2)修改“E0201.cpp”文件,另存为“E0202.cpp”。
自己设计修改该程序,使程序运行显示你自己的姓名。
图30Dev-C++集成开发环境中编译软件的选择
(3)在操作系统的文件夹中直接双击“E0201.cpp”文件,将打开Dev-c++,在此程序基础上进行修改,开发其它的程序。
修改为以下代码,另存为“E0203.cpp”,编译并运行程序。
using namespace std; // 此行前可能加上其它的包括文件
int main(void)
{ // 此以上4行,以后将一直保留
int a,b;
a=10,b=23;
c=a+b;
cout<<"a+b=";
cout<<c;
cout<<"\n";
return 0; // 此行以下2行也是固定使用的
然后编译程序,观察编译情况。如果有错误,修改程序:
重新编译程序,并连接和运行程序。程序的运行结果是:
再将程序代码中的三条cout输出语句合并为一条cout输出语句,重新编译、连接、运行,对比结果。
(4)尝试分别通过“文件”菜单、快捷工具栏、标签栏右键菜单来关闭编辑的源程序。
(5)编程输出多个字符的ASCII码、字符。
(6)编程:输入三个无符号整数,判断其是否可以作为三角形的三条边来构成三角形。
[部分实验程序代码]
实验(5)的参考源程序代码:输出多个字符的ASCII码、字符。
using namespace std;
char c1='a',c2='b',c3='c',c4='\101',c5='\106',c6;
c6=c5+1;
cout<<c1<<", "<<c2<<", "<<c3<<endl;
cout<<"12345678901234567890\n";
cout<<c3<<", "<<c4<<", "<<c6<<endl;
cout<<(int)c3<<", "<<(int)c4<<", "<<(int)c6<<endl;
return 0;
(5)程序的运行结果如图4所示。
图4 程序(5)运行结果
实验(6)的参考源程序代码:输入三个无符号整数,判断其是否可以作为三角形的三条边来构成三角形
unsigned a,b,c;
char yes_no;
cout<<"Please input 3 unsigned integers : ";
cin>>a>>b>>c; // 以空格、Tab键或Enter键分隔各输入项,
// 最后以Enter键结束输入
yes_no=((a+b)>c&&(a+c)>b&&(b+c)>a)?'Y':'N';
cout<<"a、b、c能否构成三角形:";
cout<<yes_no<<endl;
编辑、调试课本相关章节的例子程序。
总结一种用Dev-C++进行程序开发的操作方法,熟练使用。
(返回目录)
实验二 选择结构程序设计
(1)掌握结构化算法的三种基本控制结构之一:选择结构。
(2)掌握选择结构在C语言中的实现方法,并针对不同的问题正确选择恰当的选择结构语句(if语句、switch语句和break语句)进行编程。
(1)编程:输入一个实数,不使用绝对值库函数,自己编程输出其绝对值。
(2)运用if语句编写程序:输入三个数,然后降序输出这三个数。
(3)运用switch语句编写程序:根据下面的规则将输入的百分制分数score(0£ score £100)转换为相应的等级rank输出:
(4)用if-else if语句编程解决上面(3)的问题。
实验(1)的参考源程序代码:输入一个实数,编程输出其绝对值。
double d;
cout<<"input a data : "; // 提示输入
cin>>d;
if(d<0)
d=-d;
cout<<d;
实验(1)的参考源程序代码二:输入一个实数,编程输出其绝对值。
d=d>0?d:-d;
实验(2)的参考源程序代码:输入三个数,然后降序输出这三个数。
double a,b,c,m; // m是用于两个变量交换值的中间变量
cout<<"input 3 data : "; // 提示输入
cin>>a>>b>>c;
if(a<b)
{ m=a; a=b; b=m; }
if(a<c) // c最大,降序顺序为:c,a,b
cout<<endl<<c<<", "<<a<<", "<<b;
else if(b>c) // a最大,c最小,降序顺序为:a,b,c
cout<<endl<<a<<", "<<b<<", "<<c;
else // a最大,b最小,降序顺序为:a,c,b
cout<<endl<<a<<", "<<c<<", "<<b;
} // 注意程序中的else与if的配对关系
实验(3)的参考源程序代码:运用switch语句将分数转换为等级输出。
int score;
cout<<"输入百分制成绩:";
cin>>score;
if(score<0||score>100)
cout<<"输入的成绩超出范围!";
else
switch(score/10)
case 10:
case 9: cout<<"优"<<endl; break;
case 8: cout<<"良"<<endl; break;
case 7: cout<<"中"<<endl; break;
case 6: cout<<"及格"<<endl; break;
default: cout<<"不及格"<<endl;
实验(4)的参考源程序代码:用if-else if语句将分数转换为等级输出。
else if(score>=90) cout<<"优";
else if(score>=80) cout<<"良";
else if(score>=70) cout<<"中";
else if(score>=60) cout<<"及格";
else cout<<"不及格";
总结C语言编程中选择结构的语法及应用。
实验三 循环结构程序设计
(1)掌握结构化算法的三种基本控制结构(顺序结构、选择结构、循环结构)。
(2)掌握循环结构在C语言中的实现方法。
(3)掌握控制循环进程的两种方法:计数法和标志法。
(4)掌握穷举算法和迭代与递推算法。
(1)编程求累加和:0+1+2+3+…+m,m为输入的非负整数。
分别输入0、100,验证程序。
思考:如果输入3.1会如何?输入3.9呢?输入-2呢?为什么?
(2)编程求阶乘:n!=1*2*3*…*n,n为输入的非负整数。
分别输入0、3、5,验证程序。
思考:如果输入200会如何?为什么?
(3)编写程序:分别输出如图5和图6形式的九九表。
图5 程序(3)的运行效果图
图6 程序(3)的运行效果图二
(4)编写程序:输入一个非负实数x,根据下面的迭代公式求其平方根,要求误差小于10-6。
分别输入1、2、4、5、9、121验证。
输入0时得到的平方根结果是0吗?为什么不是?
实验(1)的参考源程序代码:求累加和0+1+2+3+…+m,m为输入的非负整数。
unsigned i,m;
double sum=0.; // sum也可以是unsigned类型,但易溢出。都必须赋初值0
cout<<"输入一个非负的整数 :";
cin>>m;
for(i=1;i<=m;i++)
sum+=i;
cout<<sum;
实验(2)的参考源程序代码:求阶乘n!=1*2*3*…*n,n为输入的非负整数。
unsigned i,n;
double fac=1.; // fac也可以是unsigned类型,但易溢出。都必须赋初值1
cin>>n;
for(i=1;i<=n;i++)
fac*=i;
cout<<fac;
实验(3)的参考源程序代码:输出特殊格式的九九乘法表。
int i,j;
for(i=1;i<=9;i++)
for(j=1;j<=i;j++)
cout<<i<<'*'<<j<<'='<<i*j<<"\t";
cout<<endl;
实验(3)的参考源程序代码二:输出特殊格式的九九乘法表。
for(i=9;i>=1;i--)
for(j=1;j<i;j++)
cout<<"\t";
for(j=i;j<=9;j++)
实验(4)的参考源程序代码:利用迭代算法求平方根。
#include<math.h> // 因为要使用绝对值函数
double x,y1=1.,y2,e;
cout<<"输入一个非负的实数 :";
cin>>x;
if(x<0)
y1=-1.;
do
y2=(y1+x/y1)/2; // 迭代
e=fabs(y1-y2); // 迭代误差,注意绝对值函数不能掉
y1=y2;
}while(e>=1e-6);
cout<<y1;
总结C语言编程中循环结构的语法及应用。
实验四 函数的编程及应用
(1)掌握C语言的函数定义、函数声明与函数调用。
(2)掌握递归函数,并比较递归算法与迭代(递推)算法。
(1)编写函数求阶乘:f(n)=n!=1*2*3*…*n,n为非负整数参数。
(2)编写函数判断一个数是否质数,然后在主程序中输入一个正整数,输出它的最大质因数。
(3)编写递归函数求阶乘:f(n)=n!=1*2*3*…*n,n为非负整数参数。
(4)编写函数:根据参数year、month和day显示是星期几。
输入今天的日期验证。
实验(1)的参考源程序代码:编写函数求阶乘f(n)=n!=1*2*3*…*n,n为非负整数参数。
double f(unsigned); // 函数声明
unsigned n;
double fac;
fac=f(n);
double f(unsigned n) // 函数定义
unsigned i;
double fac=1.; // fac必须赋初值1
for(i=2;i<=n;i++)
return fac;
实验(2)的参考源程序代码:编写函数判断一个数是否质数,然后在主程序中输入一个正整数,输出它的最大质因数。
#include<math.h> // 因为要使用平方根函数
int judge(unsigned); // 函数声明
cout<<"输入一个正整数 :";
for(i=n/2;i>0;i--) // 从该数的一半开始向下尝试
if(n%i==0&&judge(i)==1)
cout<<i;
break;
int judge(unsigned m)
int i,r=1,t=sqrt(m)+0.01;
if(m>=4)
if(m%2==0) r=0;
for(i=3;i<=t;i+=2)
if(m%i==0)
{ r=0;
return r;
} // 本方法只试除到m的平方根,且先排除了偶数,效率高。
实验(3)的参考源程序代码:编写递归函数求阶乘,f(n)=n!=1*2*3*…*n,n为非负整数参数。
cout<<f(n);
double r;
if(n==0)
r=1.; // 递归结束条件
r=n*f(n-1);
return r; // 递归调用
实验(4)的参考源程序代码:编写函数,根据参数year、month和day显示是星期几。
#include<math.h>
void weekday(int,int,int); // 函数声明
unsigned y,m,d;
cout<<"\nInput year, month, day : ";
cin>>y>>m>>d;
if(m<0||m>12||d<0||d>31||(m==4||m==6||m==9||m==11)&&d==31||
m==2&&d>29||m==2&&d==29&&!(y%4==0&&y%100!=0||y%400==0))
cout<<"\n\n\tInput Data Error !";
weekday(y,m,d);
void weekday(int y,int m,int d)
char wd[]="日一二三四五六";
int yr,dd,i,wkday;
yr=(int)((ceil)(y/4.)-(ceil)(y/100.)+(ceil)(y/400.));
// -1.12.31.~y.1.1.闰年数
dd=y*365+yr;
for(i=1;i<m;i++)
switch(i)
case 1:
case 3:
case 5:
case 7:
case 8:
case 12:dd+=31;break; // 大月
case 4:
case 6:
case 9:
case 11:dd+=30;break; // 小月
default:
if(y%4==0&&y%100!=0||y%400==0) dd+=29;
else dd+=28;
dd+=d+5; // -1年12月31日是星期五
wkday=(dd%7+7)%7*2;
printf("\n\n\t公元 %d 年 %d 月 %d 日是星期%c%c。",
y,m,d,wd[wkday],wd[wkday+1]);
总结函数的特点。
实验五 数组的应用
(1)掌握数组的定义和使用方法。
(2)掌握字符数组处理字符串的方法。
(3)掌握交换排序法、选择排序法和冒泡排序法及折半查找法。
(1)编写程序:输入5个同学的分数,求平均分,并输出5人分数。
(2)编写函数:返回一个二维数组中元素的最大值。
(3)编写程序:统计一个字符串中的英文单词个数。
(4)编写程序:输入5个同学的分数,降序输出这5人分数。
(5)编写对分搜索函数:在一个已降序排序的整型数组中,查找是否存在某个整数?是第几个?
实验(1)的参考源程序代码:输入5个同学的分数,求平均分,并输出5人分数。
unsigned i,score[5],sum=0;
cout<<"输入5个非负的整数 :";
for(i=0;i<5;i++)
cin>>score[i];
sum+=score[i];
cout<<sum/5.<<endl;
cout<<score[i]<<", ";
实验(2)的参考源程序代码:编写函数,返回一个二维数组中元素的最大值。
#define N 5
double f(double d[][N],int); // 函数声明
double d[][N]={{1,12,3,4,5},{-1,-2,-3,0,-6}};
cout<<f(d,2);
double f(double d[][N],int n) // 函数定义
double max=d[0][0];
for(i=0;i<n;i++)
for(j=0;j<N;j++)
if(d[i][j]>max)
max=d[i][j];
return max;
实验(3)的参考源程序代码:统计一个字符串中的英文单词个数。
char ch[100],*p;
int sign=0,count=0; // sign标记是否单词状态
cout<<"input a string : ";
gets(ch);
p=ch;
while(*p!='\0')
if(sign==0&&*p!=' ')
sign=1;
count++;
else if(*p==' ')
sign=0;
p++;
cout<<count;
实验(4)的参考源程序代码:输入5个同学的分数,降序输出这5人分数。
void sortExchange(int a[],int n); // 交换排序法,函数声明
void sortSelect(int a[],int n); // 选择排序法,函数声明
void sortBubble(int a[],int n); // 冒泡排序法,函数声明
int i;
int score[N];
cout<<"input 5 scores : ";
for(i=0;i<N;i++)
sortExchange(score,N); // 函数调用
// sortSelect(score,N); // 调用其它排序法
// sortBubble(score,N);
void sortExchange(int a[],int n) // 对数组a的n个元素进行降序排序
int i,j,m;
for(i=0;i<n-1;i++) // 依次找出n-1个最大数、次大数……
for(j=i+1;j<n;j++) // j是a[i]后面的所有元素的下标
if(a[i]<a[j]) // 若后面大则交换,以使a[i]始终比其后面的元素大
{ m=a[i]; a[i]=a[j]; a[j]=m; }
void sortSelect(int a[],int n) // 对数组a的n个元素进行降序排序
{ int i,j,k,m; // 变量k表示最大数的下标
{ k=i; // 先设第一个最大
if(a[k]<a[j]) // 若后面大则修改k,使k始终是其后最大数的下标
k=j; // 记下新的下标到k
if(k!=i)
{ m=a[i]; a[i]=a[k]; a[k]=m; } // 将第一个与选择的最大数的元素交换
void sortBubble(int a[],int n) // 对数组a的n个元素进行降序排序
{ int i,j,sign,m; // sign表示是否有交换
for(i=0;i<n-1;i++) // 通过“冒泡”依次找出n-1个最大数、次大数……
{ sign=0;
for(j=n-1;j>i;j--) // j是从后向前冒泡的元素下标
if(a[j]>a[j-1]) // 若后面大则交换,以使相邻两个始终前面的大
{ m=a[j]; a[j]=a[j-1]; a[j-1]=m; sign=1; }
if(sign==0) // 没有交换则提前结束
实验(5)的参考源程序代码:编写对分搜索函数,在一个已降序排序的整型数组中,查找是否存在某个整数?是第几个?
#define N 10
int biSearch(int a[],int n,int x); // 对分搜索,函数声明
int x,result;
int d[N]={-7,0,2,5,8,54,111,120,300,500};
cout<<"input searched data : ";
result=biSearch(d,N,x); // 函数调用
cout<<result;
int biSearch(int a[], int n, int x)
int low,high,mid,find=-1; // find=-1表示未找到
low=0;high=n-1;
while(low<=high)
mid=(low+high)/2;
if(x<a[mid]) high=mid-1;
else if(x>a[mid]) low=mid+1;
{ find=mid; break; }
return find;
总结数组的特点及应用(提取码c4bd)。
实验六 指针及结构体的应用
(1)掌握指针的概念,会定义和使用指针变量。
(2)掌握数组与指针、指针与函数之间的关系。
(3)能正确使用指针处理相关问题。
(1)编写函数:使用指针做参数,实现两个参数值的交换并返回结果。
(2)编写函数:判断一个字符串是不是“回文”字符串(串前后对称)。
(3)编程用指针数组存储月份英文名称,根据输入月份数字显示英文月份名。
(4)编程:定义结构体,存储学生姓名、分数、出生年月日,输入5个学生的信息,按分数降序输出信息。
实验(1)的参考源程序代码:编写函数,使用指针做参数,实现两个参数值的交换并返回结果。
void swap(double *,double *); // 函数声明,参数是2个double型指针
double a,b;
cout<<"Input 2 data : ";
cin>>a>>b;
swap(&a,&b);
cout<<a<<", "<<b;
void swap(double *p1,double *p2) // 函数定义
{ double m;
m=*p1;
*p1=*p2;
*p2=m;
实验(2)的参考源程序代码:编写函数,判断一个字符串是不是“回文”字符串。
int judge(char *); // 函数声明,参数是1个字符指针,返回值是结果
char c[100];
int result;
cout<<"Input a string : ";
gets(c);
result=judge(c);
if(result)
cout<<"Yes";
cout<<"No";
int judge(char *p) // 函数定义
{ char *p2=p; // 定义另一个字符指针,移到字符串尾
int r=1;
while(*p2!='\0')
p2++;
p2--;
while(p<p2) // 比较字符串的头和尾
if(*p==*p2)
{ p++;
{ r=0; // 一旦不等,就不是“回文”字符串
return r; // 一直相等
实验(3)的参考源程序代码:用指针数组存储月份英文名称,根据输入月份数字显示英文月份名。
int month;
const char *(p[12])= // 定义一个指针数组,12个元素
{ "January","February","March","April",
"May","June","July","August",
"September","October","November","December" };
cout<<"Input month : ";
cin>>month;
if(month<1||month>12)
cout<<"Data Error !";
cout<<p[month-1];
实验(4)的参考源程序代码:定义结构体,存储学生姓名、分数、出生年月日,输入5个学生的信息,按分数降序输出信息。
typedef struct date
int year;
int day;
}DATE;
typedef struct student // 声明结构体类型
char name[20];
DATE birthdate;
unsigned score;
}STUDENT;
void swapStruct(STUDENT *,STUDENT *); // 声明函数
STUDENT stu[N];
cout<<"please input 5 students' information : \n";
for(i=0;i<N;i++) // 通过交互,输入信息
{ fflush(stdin);
cout<<" No. "<<i+1<<endl;
cout<<" Name : ";
gets(stu[i].name);
cout<<" Birthday (year month day) : ";
cin>>stu[i].birthdate.year>>stu[i].birthdate.month
>>stu[i].birthdate.day;
cout<<" Score : ";
cin>>stu[i].score;
for(i=0;i<N-1;i++) // 交换排序
for(j=i+1;j<N;j++)
if(stu[i].score<stu[j].score)
swapStruct(stu+i,stu+j);
for(i=0;i<N;i++) // 输出结果
cout<<"\n No "<<i+1<<", "<<stu[i].name<<",\t"
<<stu[i].birthdate.year<<"."<<stu[i].birthdate.month
<<"."<<stu[i].birthdate.day<<",\t"<<stu[i].score;
void swapStruct(STUDENT *p1,STUDENT *p2) // 函数定义
{ STUDENT m;
m=*p1; // 相同类型的结构体变量间可以直接赋值
运行程序,输入5人信息如图7上半部所示,排序后输出如图下半部。
图7 程序(4)的运行结果
分析指针与变量、数组的联系与区别。
实验七 文件的操作
(1)了解文件和文件指针的概念。
(2)能正确使用基本的文件处理函数实现文件的基本操作。
(3)了解随机数的产生、日期的读取。
(1)编写函数:复制一个文本文件,参数是2个字符指针,表示源文件名和目标文件名,源文件名、目标文件名均为输入。
(2)编程:依次产生3个随机整数,将该3个整数、当前日期、时间按整数降序保存到记录文件。
(3)编程:读取(2)的记录文件,显示记录。新产生一个随机整数,将当前日期、时间、新随机整数更新保存到文件,使文件始终降序记录最大的三个整数及产生日期、时间。
实验(1)的参考源程序代码:编写函数,复制一个文本文件,参数是2个字符指针,表示源文件名和目标文件名,源文件名、目标文件名均为输入。
int MyCopy(char *,char *); // 函数声明
char f1[100],f2[100];
cout<<"Input source file name : ";
gets(f1);
cout<<"Input destination file name : ";
gets(f2);
if(MyCopy(f1,f2))
cout<<"Success";
cout<<"Fail";
int MyCopy(char *f1,char *f2)
{ char m;
FILE *fp1,*fp2;
if((fp1=fopen(f1,"rb"))==NULL) // 以只读模式打开
{ cout<<"Failure to open "<<f1;
exit(1);
if((fp2=fopen(f2,"wb"))==NULL) // 以写文件模式打开
{ cout<<"Failure to open "<<f2;
m=fgetc(fp1); // 思考为什么?
while(!feof(fp1))
{ fputc(m,fp2);
m=fgetc(fp1);
fclose(fp1); // 关闭文件
fclose(fp2);
return 1;
实验(2)的参考源程序代码:依次产生3个随机整数,将该3个整数、当前日期、时间按整数降序保存到记录文件。
#include<time.h>
#include<stdlib.h>
#define N 3
void sortSelect(int a[],int n); // 对数组a的n个元素进行降序排序
{ // 先产生随机数
int i,a[N];
srand((unsigned)time(NULL)); // 必须先调用设定随机种子函数
cout<<"\n\t随机数:\t";
{ a[i]=rand(); // 产生0~32767的随机整数
cout<<a[i]<<", ";
sortSelect(a,N); // 降序排序
// 下面处理日期时间
time_t nowTime;
struct tm *sysTime;
time(&nowTime); // 获取当前系统时间长整型
sysTime=localtime(&nowTime); // 转换为日期时间结构体
cout<<"\n\n\t系统日期:\t"<<1900+sysTime->tm_year
<<'-'<<sysTime->tm_mon+1<<'-'<<sysTime->tm_mday<<' '
<<sysTime->tm_hour<<':'<<sysTime->tm_min<<':'<<sysTime->tm_sec;
// 显示日期、时间
FILE *fp;
if((fp=fopen("record.dat","wb"))==NULL) // 以写文件模式打开
{ cout<<"Failure to open file.";
{ fwrite(a+i,sizeof(int),1,fp); // 写1个整型:随机数
fwrite(sysTime,sizeof(tm),1,fp); // 写结构体:日期时间
fclose(fp);
// ---------------------------------验证:读文件,显示
if((fp=fopen("record.dat","rb"))==NULL) // 以只读模式打开
fread(&i,sizeof(int),1,fp);
fread(sysTime,sizeof(tm),1,fp);
while(!feof(fp))
{ cout<<endl<<i<<", \t"<<1900+sysTime->tm_year
<<sysTime->tm_hour<<':'<<sysTime->tm_min
<<':'<<sysTime->tm_sec; // 显示
{ k=i; // 先假设第一个最大
if(i!=k)
{ m=a[i];
a[i]=a[k];
a[k]=m; // 将第一个与选择的最大数的元素交换
实验(3)的参考源程序代码:读取(2)的记录文件,显示记录。新产生一个随机整数,将当前日期、时间、新随机整数更新保存到文件,使文件始终降序记录最大的三个整数及产生日期、时间。
int i,a[N],d;
d=rand(); // 产生0~32767的随机整数
cout<<d<<endl;
struct tm t[N]; // 用于保存读文件的数据
time(&nowTime); // 获取当前系统日期长整型
sysTime=localtime(&nowTime); // 转换为结构体日期时间
// ------------------------------- 读文件
if((fp=fopen("record.dat","rb+"))==NULL) // 以读写模式打开文件
{ fread(a+i,sizeof(int),1,fp);
fread(t+i,sizeof(tm),1,fp);
cout<<endl<<a[i]<<", \t"<<1900+(t+i)->tm_year<<'-'
<<(t+i)->tm_mon+1 <<'-'<<(t+i)->tm_mday<<' '<<(t+i)->tm_hour
<<':'<<(t+i)->tm_min<<':'<<(t+i)->tm_sec; // 显示
int sign=0; // 判断是否需要插入新的数据
if(d>a[N-1])
{ for(i=N-2;i>=0;i--)
{ if(d<a[i])
{ a[i+1]=d;
t[i+1]=*sysTime;
a[i+1]=a[i];
t[i+1]=t[i];
a[i+1]=d;
if(sign)
{ rewind(fp);
{ fwrite(a+i,sizeof(int),1,fp); // 写1个整型数据
fwrite(t+i,sizeof(tm),1,fp); // 写结构体日期时间
// --------------------------------- 验证性读文件显示
if((fp=fopen("record.dat","rb"))==NULL) // 以只读模式打开文件
cout<<endl<<endl;
<<(t+i)->tm_mon+1<<'-'<<(t+i)->tm_mday<<' '<<(t+i)->tm_hour
运行程序,结果如图8所示。
图8 程序(3)的运行结果
实验八 综合实验:开发猜数游戏程序
(1)了解模块化程序设计的基本方法。
(2)掌握复杂程序设计的方法和程序调试方法。
(3)掌握程序流程图的使用。
(1)设计游戏程序,计算机随机产生一个数字不重复的4位有序整数,例如“0351”,但先不显示。然后由用户用尽可能少的次数来猜这个数字,用户每次输入猜的结果后,计算机提示“mAnB”,表示猜对了m个数字且位置也对、猜对了n个数字但位置不对。用户不断根据前面的猜测和计算机的提示,用尽可能少的次数猜对这个数字。
程序的一次运行结果如图9所示。
图9 实验八程序的一次运行结果
(2)进行总体设计:将任务实现划分为多个模块。为每个模块设计流程图。
(3)编程,调试。
(4)由学生结合课外时间自主完成。
[提示]
将实验八的任务需求按功能划分为多个模块,总体流程图如图10所示。
图10 实验八的总体程序流程图
下载实验教学指导(提取码:c4bd)