(
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
所示。