《C语言程序设计》实验教学内容
作者: 时间:2019-06-11 点击数:
[实验目的]
(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”,编译并运行程序。
#include<iostream> 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码、字符。
#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; } |
(5)程序的运行结果如图4所示。
图4 程序(5)运行结果
实验(6)的参考源程序代码:输入三个无符号整数,判断其是否可以作为三角形的三条边来构成三角形
#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; } |
编辑、调试课本相关章节的例子程序。
总结一种用Dev-C++进行程序开发的操作方法,熟练使用。
[实验目的]
(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; } |
实验(1)的参考源程序代码二:输入一个实数,编程输出其绝对值。
#include<iostream> using namespace std; int main(void) { double d; cout<<"input a data : "; // 提示输入 cin>>d; d=d>0?d:-d; cout<<d; return 0; } |
实验(2)的参考源程序代码:输入三个数,然后降序输出这三个数。
#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的配对关系 |
实验(3)的参考源程序代码:运用switch语句将分数转换为等级输出。
#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; } |
实验(4)的参考源程序代码:用if-else if语句将分数转换为等级输出。
#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; } |
总结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为输入的非负整数。
#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; } |
实验(2)的参考源程序代码:求阶乘n!=1*2*3*…*n,n为输入的非负整数。
#include<iostream> using namespace std; int main(void) { unsigned i,n; double fac=1.; // fac也可以是unsigned类型,但易溢出。都必须赋初值1 cout<<"输入一个非负的整数 :"; cin>>n; for(i=1;i<=n;i++) fac*=i; cout<<fac; return 0; } |
实验(3)的参考源程序代码:输出特殊格式的九九乘法表。
#include<iostream> using namespace std; int main(void) { int i,j; for(i=1;i<=9;i++) { for(j=1;j<=i;j++) cout<<i<<'*'<<j<<'='<<i*j<<"\t"; cout<<endl; } return 0; } |
实验(3)的参考源程序代码二:输出特殊格式的九九乘法表。
#include<iostream> using namespace std; int main(void) { int i,j; for(i=9;i>=1;i--) { for(j=1;j<i;j++) cout<<"\t"; for(j=i;j<=9;j++) cout<<i<<'*'<<j<<'='<<i*j<<"\t"; cout<<endl; } return 0; } |
实验(4)的参考源程序代码:利用迭代算法求平方根。
#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; } |
总结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为非负整数参数。
#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; } |
实验(2)的参考源程序代码:编写函数判断一个数是否质数,然后在主程序中输入一个正整数,输出它的最大质因数。
#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的平方根,且先排除了偶数,效率高。 |
实验(3)的参考源程序代码:编写递归函数求阶乘,f(n)=n!=1*2*3*…*n,n为非负整数参数。
#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; // 递归调用 } |
实验(4)的参考源程序代码:编写函数,根据参数year、month和day显示是星期几。
#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)掌握数组的定义和使用方法。
(2)掌握字符数组处理字符串的方法。
(3)掌握交换排序法、选择排序法和冒泡排序法及折半查找法。
[实验内容及要求]
(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; } |
实验(2)的参考源程序代码:编写函数,返回一个二维数组中元素的最大值。
#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; } |
实验(3)的参考源程序代码:统计一个字符串中的英文单词个数。
#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; } |
实验(4)的参考源程序代码:输入5个同学的分数,降序输出这5人分数。
#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; } } |
实验(5)的参考源程序代码:编写对分搜索函数,在一个已降序排序的整型数组中,查找是否存在某个整数?是第几个?
#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; } |
总结数组的特点及应用(提取码c4bd)。
[实验目的]
(1)掌握指针的概念,会定义和使用指针变量。
(2)掌握数组与指针、指针与函数之间的关系。
(3)能正确使用指针处理相关问题。
[实验内容及要求]
(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; } |
实验(2)的参考源程序代码:编写函数,判断一个字符串是不是“回文”字符串。
#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; // 一直相等 } |
实验(3)的参考源程序代码:用指针数组存储月份英文名称,根据输入月份数字显示英文月份名。
#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; } |
实验(4)的参考源程序代码:定义结构体,存储学生姓名、分数、出生年月日,输入5个学生的信息,按分数降序输出信息。
#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; } |
运行程序,输入5人信息如图7上半部所示,排序后输出如图下半部。
图7 程序(4)的运行结果
分析指针与变量、数组的联系与区别。
[实验目的]
(1)了解文件和文件指针的概念。
(2)能正确使用基本的文件处理函数实现文件的基本操作。
(3)了解随机数的产生、日期的读取。
[实验内容及要求]
(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; } |
实验(2)的参考源程序代码:依次产生3个随机整数,将该3个整数、当前日期、时间按整数降序保存到记录文件。
#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)) { cout<<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; } |
运行程序,结果如图8所示。
图8 程序(3)的运行结果
[实验目的]
(1)了解模块化程序设计的基本方法。
(2)掌握复杂程序设计的方法和程序调试方法。
(3)掌握程序流程图的使用。
[实验内容及要求]
(1)设计游戏程序,计算机随机产生一个数字不重复的4位有序整数,例如“0351”,但先不显示。然后由用户用尽可能少的次数来猜这个数字,用户每次输入猜的结果后,计算机提示“mAnB”,表示猜对了m个数字且位置也对、猜对了n个数字但位置不对。用户不断根据前面的猜测和计算机的提示,用尽可能少的次数猜对这个数字。
程序的一次运行结果如图9所示。
图9 实验八程序的一次运行结果
(2)进行总体设计:将任务实现划分为多个模块。为每个模块设计流程图。
(3)编程,调试。
(4)由学生结合课外时间自主完成。
[提示]
将实验八的任务需求按功能划分为多个模块,总体流程图如图10所示。
图10 实验八的总体程序流程图
下载实验教学指导(提取码:c4bd)
下一篇: C语言程序设计