《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<<"abc能否构成三角形:";

   cout<<yes_no<<endl;

   return   0;

}

编辑、调试课本相关章节的例子程序。

总结一种用Dev-C++进行程序开发的操作方法,熟练使用。

(返回目录)

 

 实验二 选择结构程序设计

 

[实验目的]

1)掌握结构化算法的三种基本控制结构之一:选择结构。

2)掌握选择结构在C语言中的实现方法,并针对不同的问题正确选择恰当的选择结构语句(if语句、switch语句和break语句)进行编程。

 

[实验内容及要求]

(1)编程:输入一个实数,不使用绝对值库函数,自己编程输出其绝对值。

(2)运用if语句编写程序:输入三个数,然后降序输出这三个数。

(3)运用switch语句编写程序:根据下面的规则将输入的百分制分数score(0? score ?100)转换为相应的等级rank输出:

                        105C

(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;

}                               //   注意程序中的elseif的配对关系

实验(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+…+mm为输入的非负整数。

分别输入0100,验证程序。

思考:如果输入3.1会如何?输入3.9呢?输入-2呢?为什么?

2)编程求阶乘:n!=1*2*3*…*nn为输入的非负整数。

分别输入035,验证程序。

思考:如果输入200会如何?为什么?

3)编写程序:分别输出如图5和图6形式的九九表。

 

5 程序(3)的运行效果图

 

6 程序(3)的运行效果图二

4)编写程序:输入一个非负实数x,根据下面的迭代公式求其平方根,要求误差小于10-6

    分别输入12459121验证。

输入0时得到的平方根结果是0吗?为什么不是?

[部分实验程序代码]

实验(1)的参考源程序代码:求累加和0+1+2+3+…+mm为输入的非负整数。

#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*…*nn为输入的非负整数。

#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*…*nn为非负整数参数。

2)编写函数判断一个数是否质数,然后在主程序中输入一个正整数,输出它的最大质因数。

3)编写递归函数求阶乘:f(n)=n!=1*2*3*…*nn为非负整数参数。

4)编写函数:根据参数yearmonthday显示是星期几。

输入今天的日期验证。

[部分实验程序代码]

实验(1)的参考源程序代码:编写函数求阶乘f(n)=n!=1*2*3*…*nn为非负整数参数。

#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*…*nn为非负整数参数。

#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)的参考源程序代码:编写函数,根据参数yearmonthday显示是星期几。

#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;                             // -11231日是星期五

  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)    // 对数组an个元素进行降序排序

{

   int i,j,m;

   for(i=0;i<n-1;i++)               // 依次找出n-1个最大数、次大数……

     for(j=i+1;j<n;j++)             // ja[i]后面的所有元素的下标

       if(a[i]<a[j])   // 若后面大则交换,以使a[i]始终比其后面的元素大

       { m=a[i]; a[i]=a[j]; a[j]=m; }

}

void sortSelect(int a[],int n)      // 对数组an个元素进行降序排序

{ int i,j,k,m;                      // 变量k表示最大数的下标

  for(i=0;i<n-1;i++)                // 依次找出n-1个最大数、次大数……

  {  k=i;                           // 先设第一个最大

     for(j=i+1;j<n;j++)             // ja[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)      // 对数组an个元素进行降序排序

{ 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 *);       // 函数声明,参数是2double型指针

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);    // 对数组an个元素进行降序排序

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)     // 对数组an个元素进行降序排序

{  int i,j,k,m;                    // 变量k表示最大数的下标

   for(i=0;i<n-1;i++)              // 依次找出n-1个最大数、次大数……

   {  k=i;                         // 先假设第一个最大

      for(j=i+1;j<n;j++)           // ja[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)

联系我们
  • 通讯地址:广东省江门市蓬江区迎宾大道中99号香港台山商会大楼508、512室

  • 联系电话:0750-3299662、3299701

  • 电子邮箱:wyuznzzxb@163.com

版权所有2020?五邑大学 粤ICP备15096031号