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