( 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 ”。
自己设计修改该程序,使程序运行显示你自己的姓名。
然后编译程序,观察编译情况。如果有错误,修改程序:
重新编译程序,并连接和运行程序。程序的运行结果是:
再将程序代码中的三条 cout 输出语句合并为一条 cout 输出语句,重新编译、连接、运行,对比结果。
( 4 )尝试分别通过“文件”菜单、快捷工具栏、标签栏右键菜单来关闭编辑的源程序。
( 5 )编程输出多个字符的 ASCII 码、字符。
( 6 )编程:输入三个无符号整数,判断其是否可以作为三角形的三条边来构成三角形。
[部分实验程序代码]
实验( 5 )的参考源程序代码:输出多个字符的 ASCII 码、字符。
#include<iostream>
using namespace std;
int main(void)
{
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;
}
#include<iostream>
using namespace std;
int main(void)
{
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;
return 0;
}
[实验目的]
( 1 )掌握结构化算法的三种基本控制结构之一:选择结构。
( 2 )掌握选择结构在 C 语言中的实现方法,并针对不同的问题正确选择恰当的选择结构语句( if 语句、 switch 语句和 break 语句)进行编程。
[实验内容及要求]
(1)编程:输入一个实数,不使用绝对值库函数,自己编程输出其绝对值。
(2)运用if语句编写程序:输入三个数,然后降序输出这三个数。
(3)运用switch语句编写程序:根据下面的规则将输入的百分制分数score(0 £ score £ 100 )转换为相应的等级rank输出:
(4)用if-else if语句编程解决上面(3)的问题。
[部分实验程序代码]
实验(1)的参考源程序代码:输入一个实数,编程输出其绝对值。
#include<iostream>
using namespace std;
int main(void)
{
double d;
cout<<"input a data : "; // 提示输入
cin>>d;
if(d<0)
d=-d;
cout<<d;
return 0;
}
#include<iostream>
using namespace std;
int main(void)
{
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;
return 0;
} // 注意程序中的 else 与 if 的配对关系
#include<iostream>
using namespace std;
int main(void)
{
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;
}
}
return 0;
}
#include<iostream>
using namespace std;
int main(void)
{
int score;
cout<<" 输入百分制成绩: ";
cin>>score;
if(score<0||score>100)
cout<<" 输入的成绩超出范围! ";
else if(score>=90) cout<<" 优 ";
else if(score>=80) cout<<" 良 ";
else if(score>=70) cout<<" 中 ";
else if(score>=60) cout<<" 及格 ";
else cout<<" 不及格 ";
return 0;
}
( 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 为输入的非负整数。
#include<iostream>
using namespace std;
int main(void)
{
unsigned i,m;
double sum=0.; // sum 也可以是 unsigned 类型,但易溢出。都必须赋初值 0
cout<<" 输入一个非负的整数 : ";
cin>>m;
for(i=1;i<=m;i++)
sum+=i;
cout<<sum;
return 0;
}
#include<iostream>
#include<math.h> // 因为要使用绝对值函数
using namespace std;
int main(void)
{
double x,y1=1.,y2,e;
cout<<" 输入一个非负的实数 : ";
cin>>x;
if(x<0)
y1=-1.;
else
do
{
y2=(y1+x/y1)/2; // 迭代
e=fabs(y1-y2); // 迭代误差,注意绝对值函数不能掉
y1=y2;
}while(e>=1e-6);
cout<<y1;
}
[实验内容及要求]
( 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 为非负整数参数。
#include<iostream>
using namespace std;
double f(unsigned); // 函数声明
int main(void)
{
unsigned n;
double fac;
cout<<" 输入一个非负的整数 : ";
cin>>n;
fac=f(n);
cout<<fac;
return 0;
}
double f(unsigned n) // 函数定义
{
unsigned i;
double fac=1.; // fac 必须赋初值 1
for(i=2;i<=n;i++)
fac*=i;
return fac;
}
#include<iostream>
#include<math.h> // 因为要使用平方根函数
using namespace std;
int judge(unsigned); // 函数声明
int main(void)
{
unsigned i,n;
cout<<" 输入一个正整数 : ";
cin>>n;
for(i=n/2;i>0;i--) // 从该数的一半开始向下尝试
if(n%i==0&&judge(i)==1)
{
cout<<i;
break;
}
return 0;
}
int judge(unsigned m)
{
int i,r=1,t=sqrt(m)+0.01;
if(m>=4)
if(m%2==0) r=0;
else
for(i=3;i<=t;i+=2)
if(m%i==0)
{ r=0;
break;
}
return r;
} // 本方法只试除到 m 的平方根,且先排除了偶数,效率高。
#include<iostream>
using namespace std;
double f(unsigned); // 函数声明
int main(void)
{
unsigned n;
cout<<" 输入一个非负的整数 : ";
cin>>n;
cout<<f(n);
return 0;
}
double f(unsigned n) // 函数定义
{
unsigned i;
double r;
if(n==0)
r=1.; // 递归结束条件
else
r=n*f(n-1);
return r; // 递归调用
}
#include<iostream>
#include<math.h>
using namespace std;
void weekday(int,int,int); // 函数声明
int main(void)
{
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 !";
else
weekday(y,m,d);
return 0;
}
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 10:
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 )编写程序:输入 5 个同学的分数,求平均分,并输出 5 人分数。
( 2 )编写函数:返回一个二维数组中元素的最大值。
( 3 )编写程序:统计一个字符串中的英文单词个数。
( 4 )编写程序:输入 5 个同学的分数,降序输出这 5 人分数。
( 5 )编写对分搜索函数:在一个已降序排序的整型数组中,查找是否存在某个整数?是第几个?
[部分实验程序代码]
实验( 1 )的参考源程序代码:输入 5 个同学的分数,求平均分,并输出 5 人分数。
#include<iostream>
using namespace std;
int main(void)
{
unsigned i,score[5],sum=0;
cout<<" 输入 5 个非负的整数 : ";
for(i=0;i<5;i++)
{
cin>>score[i];
sum+=score[i];
}
cout<<sum/5.<<endl;
for(i=0;i<5;i++)
cout<<score[i]<<", ";
return 0;
}
#include<iostream>
#define N 5
using namespace std;
double f(double d[][N],int); // 函数声明
int main(void)
{
double d[][N]={{1,12,3,4,5},{-1,-2,-3,0,-6}};
cout<<f(d,2);
return 0;
}
double f(double d[][N],int n) // 函数定义
{
int i,j;
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;
}
#include<iostream>
using namespace std;
int main(void)
{
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;
return 0;
}
#include<iostream>
#define N 5
using namespace std;
void sortExchange(int a[],int n); // 交换排序法,函数声明
void sortSelect(int a[],int n); // 选择排序法,函数声明
void sortBubble(int a[],int n); // 冒泡排序法,函数声明
int main(void)
{
int i;
int score[N];
cout<<"input 5 scores : ";
for(i=0;i<N;i++)
cin>>score[i];
sortExchange(score,N); // 函数调用
// sortSelect(score,N); // 调用其它排序法
// sortBubble(score,N);
for(i=0;i<N;i++)
cout<<score[i]<<", ";
return 0;
}
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 表示最大数的下标
for(i=0;i<n-1;i++) // 依次找出 n-1 个最大数、次大数 ……
{ k=i; // 先设第一个最大
for(j=i+1;j<n;j++) // j 是 a[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) // 没有交换则提前结束
break;
}
}
#include<iostream>
#define N 10
using namespace std;
int biSearch(int a[],int n,int x); // 对分搜索,函数声明
int main(void)
{
int x,result;
int d[N]={-7,0,2,5,8,54,111,120,300,500};
cout<<"input searched data : ";
cin>>x;
result=biSearch(d,N,x); // 函数调用
cout<<result;
return 0;
}
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;
else
{ find=mid; break; }
}
return find;
}
( 1 )编写函数:使用指针做参数,实现两个参数值的交换并返回结果。
( 2 )编写函数:判断一个字符串是不是“回文”字符串(串前后对称)。
( 3 )编程用指针数组存储月份英文名称,根据输入月份数字显示英文月份名。
( 4 )编程:定义结构体,存储学生姓名、分数、出生年月日,输入 5 个学生的信息,按分数降序输出信息。
[ 部分实验程序代码]
实验( 1 )的参考源程序代码:编写函数,使用指针做参数,实现两个参数值的交换并返回结果。
#include<iostream>
using namespace std;
void swap(double *,double *); // 函数声明,参数是 2 个 double 型指针
int main(void)
{
double a,b;
cout<<"Input 2 data : ";
cin>>a>>b;
swap(&a,&b);
cout<<a<<", "<<b;
return 0;
}
void swap(double *p1,double *p2) // 函数定义
{ double m;
m=*p1;
*p1=*p2;
*p2=m;
}
#include<iostream>
using namespace std;
int judge(char *); // 函数声明,参数是 1 个字符指针,返回值是结果
int main(void)
{
char c[100];
int result;
cout<<"Input a string : ";
gets(c);
result=judge(c);
if(result)
cout<<"Yes";
else
cout<<"No";
return 0;
}
int judge(char *p) // 函数定义
{ char *p2=p; // 定义另一个字符指针,移到字符串尾
int r=1;
while(*p2!='\0')
p2++;
p2--;
while(p<p2) // 比较字符串的头和尾
if(*p==*p2)
{ p++;
p2--;
}
else
{ r=0; // 一旦不等,就不是“回文”字符串
break;
}
return r; // 一直相等
}
#include<iostream>
using namespace std;
int main(void)
{
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 !";
else
cout<<p[month-1];
return 0;
}
#include<iostream>
#define N 5
using namespace std;
typedef struct date
{
int year;
int month;
int day;
}DATE;
typedef struct student // 声明结构体类型
{
char name[20];
DATE birthdate;
unsigned score;
}STUDENT;
void swapStruct(STUDENT *,STUDENT *); // 声明函数
int main(void)
{
int i,j;
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;
return 0;
}
void swapStruct(STUDENT *p1,STUDENT *p2) // 函数定义
{ STUDENT m;
m=*p1; // 相同类型的结构体变量间可以直接赋值
*p1=*p2;
*p2=m;
}
[ 实验内容及要求]
( 1 )编写函数:复制一个文本文件,参数是 2 个字符指针,表示源文件名和目标文件名,源文件名、目标文件名均为输入。
( 2 )编程:依次产生 3 个随机整数,将该 3 个整数、当前日期、时间按整数降序保存到记录文件。
( 3 )编程:读取( 2 )的记录文件,显示记录。新产生一个随机整数,将当前日期、时间、新随机整数更新保存到文件,使文件始终降序记录最大的三个整数及产生日期、时间。
[ 部分实验程序代码]
实验( 1 )的参考源程序代码:编写函数,复制一个文本文件,参数是 2 个字符指针,表示源文件名和目标文件名,源文件名、目标文件名均为输入。
#include<iostream>
using namespace std;
int MyCopy(char *,char *); // 函数声明
int main(void)
{
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";
else
cout<<"Fail";
return 0;
}
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;
exit(1);
}
m=fgetc(fp1); // 思考为什么?
while(!feof(fp1))
{ fputc(m,fp2);
m=fgetc(fp1);
}
fclose(fp1); // 关闭文件
fclose(fp2);
return 1;
}
#include<iostream>
#include<time.h>
#include<stdlib.h>
#define N 3
using namespace std;
void sortSelect(int a[],int n); // 对数组 a 的 n 个元素进行降序排序
int main(void)
{ // 先产生随机数
int i,a[N];
srand((unsigned)time(NULL)); // 必须先调用设定随机种子函数
cout<<"\n\t 随机数: \t";
for(i=0;i<N;i++)
{ 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.";
exit(1);
}
for(i=0;i<N;i++)
{ fwrite(a+i,sizeof(int),1,fp); // 写 1 个整型:随机数
fwrite(sysTime,sizeof(tm),1,fp); // 写结构体:日期时间
}
fclose(fp);
// --------------------------------- 验证:读文件,显示
if((fp=fopen("record.dat","rb"))==NULL) // 以只读模式打开
{ cout<<"Failure to open file.";
exit(1);
}
cout<<endl;
fread(&i,sizeof(int),1,fp);
fread(sysTime,sizeof(tm),1,fp);
while(!feof(fp))
{ c out<<endl<<i<<", \t"<<1900+sysTime->tm_year
<<'-'<<sysTime->tm_mon+1<<'-'<<sysTime->tm_mday<<' '
<<sysTime->tm_hour<<':'<<sysTime->tm_min
<<':'<<sysTime->tm_sec; // 显示
fread(&i,sizeof(int),1,fp);
fread(sysTime,sizeof(tm),1,fp);
}
fclose(fp);
return 0;
}
void sortSelect(int a[],int n) // 对数组 a 的 n 个元素进行降序排序
{ int i,j,k,m; // 变量 k 表示最大数的下标
for(i=0;i<n-1;i++) // 依次找出 n-1 个最大数、次大数……
{ k=i; // 先假设第一个最大
for(j=i+1;j<n;j++) // j 是 a[i] 后面的所有元素的下标
if(a[k]<a[j]) // 若后面大则修改 k ,使 k 始终是其后最大数的下标
k=j; // 记下新的下标到 k
if(i!=k)
{ m=a[i];
a[i]=a[k];
a[k]=m; // 将第一个与选择的最大数的元素交换
}
}
}
实验( 3 )的参考源程序代码:读取( 2 )的记录文件,显示记录。新产生一个随机整数,将当前日期、时间、新随机整数更新保存到文件,使文件始终降序记录最大的三个整数及产生日期、时间。
#include<iostream>
#include<time.h>
#include<stdlib.h>
#define N 3
using namespace std;
int main(void)
{
int i,a[N],d;
srand((unsigned)time(NULL)); // 必须先调用设定随机种子函数
d=rand(); // 产生 0~32767 的随机整数
cout<<d<<endl;
time_t nowTime;
struct tm *sysTime;
struct tm t[N]; // 用于保存读文件的数据
time(&nowTime); // 获取当前系统日期长整型
sysTime=localtime(&nowTime); // 转换为结构体日期时间
// ------------------------------- 读文件
FILE *fp;
if((fp=fopen("record.dat","rb+"))==NULL) // 以读写模式打开文件
{ cout<<"Failure to open file.";
exit(1);
}
for(i=0;i<N;i++)
{ 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;
break;
}
a[i+1]=a[i];
t[i+1]=t[i];
}
a[i+1]=d;
t[i+1]=*sysTime;
sign=1;
}
if(sign)
{ rewind(fp);
for(i=0;i<N;i++)
{ fwrite(a+i,sizeof(int),1,fp); // 写 1 个整型数据
fwrite(t+i,sizeof(tm),1,fp); // 写结构体日期时间
}
}
fclose(fp);
// --------------------------------- 验证性读文件显示
if((fp=fopen("record.dat","rb"))==NULL) // 以只读模式打开文件
{ cout<<"Failure to open file.";
exit(1);
}
cout<<endl<<endl;
for(i=0;i<N;i++)
{ 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; // 显示
}
fclose(fp);
return 0;
}
[ 实验内容及要求]
( 1 )设计游戏程序,计算机随机产生一个数字不重复的 4 位有序整数,例如“ 0351 ”,但先不显示。然后由用户用尽可能少的次数来猜这个数字,用户每次输入猜的结果后,计算机提示“ mAnB ”,表示猜对了 m 个数字且位置也对、猜对了 n 个数字但位置不对。用户不断根据前面的猜测和计算机的提示,用尽可能少的次数猜对这个数字。
程序的一次运行结果如图 9 所示。
图 9 实验八程序的一次运行结果
( 2 )进行总体设计:将任务实现划分为多个模块。为每个模块设计流程图。
( 3 )编程,调试。
( 4 )由学生结合课外时间自主完成。
[ 提示]
将实验八的任务需求按功能划分为多个模块,总体流程图如图 10 所示。