首页 >> 实验教学 >> 实验项目 >> 详细内容
实验教学
 
实验项目 >> 正文
《高级语言程序设计》
日期:2021-12-09 17:30:49  发布人:nclgjsj  浏览量:160

 

 

一、实验目的与要求:

1、熟悉VC++ 6.0的启动流程,会在VC++ 6.0中新建C语言源程序,并能够编制简单的程序;

2、学会简单的C语言程序的调试,包括编译、连接和运行程序。

 

二、实验内容:

1、VC++ 6.0上机软件的使用;

  • 编制简单的C语言程序。

 

三、实验器材:

微机+windows操作系统+VC++6.0

 

四、实验步骤:

1、启动VC++ 6.0软件

单击“开始”->“所有程序”->Microsoft Visual Studio 6.0->Microsoft Visual C++ 6.0

2、新建程序

   单击“文件”->“新建”,在弹出的对话框中,选择"文件"选项卡,在其中选择“C++ Source File,还要输入文件名(.c结尾),选择保存的目录。

3、输入程序

C语言程序基本框架:

   #include<stdio.h>

   void main()

   {

       自己编写代码的区域

   }

自己编写程序:

第一步:定义变量

int a,b,c;

double x,y;

第二步:对某些变量进行初始化

第三步:编写主体功能语句(具体问题具体分析)

第四步:输出结果

C语言的输出函数:

printf(参数1,参数2);

参数1:代表输出的格式,它必须由一对双引号括起来

        格式符:

         %f: 表示输出一个实数,且自动保留6位小数

         %d: 表示输出一个十进制整数

参数2:代表输出的常量、变量或表达式

例如1printf("%d",123);       输出结果:123

      printf("%d",0123);       输出结果:83

      double x=-2.3;

      printf("%f",x);          输出结果:-2.300000

      printf("%f",x-1);        输出结果:-3.300000

      int a=2,b=3;

      printf("%d,%d",a,b);     输出结果:2,3

 

例:编程求长方形的面积和周长。

第一步:定义变量

         int a,b,s,c;

第二步:对某些变量进行初始化(对某些变量赋初值)(一种:直接赋值 ,另一种:通过输入函数来给变量赋值)

         a=10;

         b=5;

第三步:编写主体功能语句

         s=a*b;

         c=2*(a+b);    

第四步:输出结果(任何程序一定要有输出结果)

         printf("%d,%d",s,c);

       

4、编译(检查语法错误)

    将源程序(.c结尾)编译成了目标程序(.obj结尾)

 

5、连接(生成可执行程序,.exe结尾)

将目标程序(.obj结尾)连接成可执行程序(.exe)

 

6、运行,得到结果

 

五、上机作业

 

1、编程求圆的面积和周长。

     

2、编程求圆体的体积和表面积。

 

六、运行结果

 

 

 

 

 

 

 

 

 

 

 

实验二:顺序结构程序设计

 

一、实验目的与要求:

1、掌握和使用printf和scanf函数实现基本的输入与输出功能;

2、学会编制顺序结构程序,并调试程序。

 

二、实验内容:

  • printf和scanf函数的格式介绍

2、编制顺序结构程序。

 

三、实验器材:

微机+windows操作系统+VC++6.0

 

四、实验步骤:

1、、printf函数的使用

  printf(参数1,参数2);

 

   参数1:代表输出的格式,它必须由一对双引号括起来

          格式符:

              %f:表示输出一个实数,且自动保留6位小数

              %d:表示输出一个十进制整数

   参数2:代表输出的常量、变量或表达式

2scanf——输入函数

格式:

      scanf(参数1,参数2);

参数1:由一对双引号括起来的格式符

       %d:   以十进制整数形式输入

       %f:   以单精度实型输入

       %lf:  以双精度实型输入

参数2:变量的地址  (格式:&变量名)

例如:

int a,b,c;

scanf("%d,%d,%d",&a,&b,&c);   //从键盘上输入三个整数分别赋给a,b,c

double a,b,c;

scanf("%lf,%lf,%lf",&a,&b,&c);   //从键盘上输入三个双精度实数分别赋给a,b,c

 

例:求长方形的面积和周长。

#include<stdio.h>

void main()

{

int a,b,c,s;

printf("请输入长方形的长和宽(以逗号隔开,输入结束请按回车键):");   //输入之前的提示作用

scanf("%d,%d",&a,&b);    

c=2*(a+b);

s=a*b;

printf("长方形的周长为:%d,长方形的面积为:%d\n",c,s);

}

 

五、上机作业

 

1、已知:1公里=2=1000米,请编写一个程序,输入公里数,将其转换成里和米。要求程序的输入输出如下:

      请输入公里数: 3.3

      3.30公里=6.60=3300

#include<stdio.h>

void main()

{

double gli,li,mi;

printf("请输入公里数:");

scanf("%lf",&gli);

li=2*gli;

mi=gli*1000;

printf("%.2f公里=%.2f=%.0f\n",gli,li,mi);

}

 

2、编程题

编写程序实现从键盘上输入两个两位的正整数ab,并将两个两位的正整数a,b合并成一个正整数放在c中,并输出c

合并的方式如下:将a这个数的十位和个位分别放在c的千位和十位上,将b这个数的十位和个位分别放在c的个位和百位上,例如:当 a=34,b=56时,c=3645

 

 

六、运行结果

 

 

 

 

 

 

 

 

 

 

 

 

 

 

实验三:if语句引领的选择结构程序设计

 

一、实验目的与要求:

1、掌握和使用ifelse双分支结构程序设计;

2、掌握和使用ifelse多分支结构程序设计。

 

  • 实验内容:

1、ifelse双分支结构语法及多分支结构语法介绍

2、进行if语句引领的选择结构程序设计。

 

三、实验器材:

微机+windows操作系统+VC++6.0

 

四、实验步骤:

1、双分支结构

格式:

     if(表达式)

        语句1;

     else

        语句2;

注意:

1if之后的表达式可以是任意的表达式,但是,一般来说,是关系表达式或者逻辑表达式。

2)表达式的值:非0的值当作真,0当作假。

3)语句可以是一条语句,也可以包含多条语句。若包含多条语句,则必须用一对花括号{}将这些语句扩起来构成复合语句。

2、多分支结构

格式如下:

    if(表达式1)

        语句1;

    else

        if(表达式2)

            语句2;

        else

            if(表达式3)

                语句3;

            else

            ......     

1:某邮政系统,按照如下要求计费:

邮件重量不超过100克,则按照每克0.2元收取邮费;

邮件重量超过100克,则超过的部分按照每克0.1元收取邮费。

编程实现,从键盘上输入邮件的重量,计算并输出应该收取的邮费。

#include<stdio.h>

void main()

{

    double x,y;

    printf("请输入邮件重量:");

    scanf("%lf",&x);

    if(x<=100)

y=x*0.2;

    else

y=100*0.2+(x-100)*0.1;

    printf("邮费为: %.2f\n",y);

}

 

2 :某超市卖苹果,10斤以上(含)每斤0.80元,8斤以上(含)每斤1.00元,6斤以上(含)每斤1.20元,4斤以上(含)每斤1.50元,4斤以下每斤1.80元。

编程完成下列具体要求:

1)输入顾客购买苹果的重量和所付款数,输出应付款数和应找钱数。

2)输入要有提示信息,输出要有文字说明。

3)输出数据结果要保留两位小数。

#include<stdio.h>

void main()

{

   double apple,ypay,spay,zhao;

   printf("请输入苹果的重量: ");

   scanf("%lf",&apple);

   if(apple>=10)

      ypay=apple*0.8;

   else

      if(apple>=8)

 ypay=apple*1.0;

      else

 if(apple>=6)

    ypay=apple*1.2;

 else

    if(apple>=4)

       ypay=apple*1.5;

    else

       ypay=apple*1.8;

    printf("应付款金额为: %.2f\n",ypay);

    printf("输入顾客实际付款金额: ");

    scanf("%lf",&spay);

    zhao=spay-ypay;

    printf("应找零为: %.2f\n",zhao);

}

 

五、上机作业

 

1、从键盘上输入三个任意的整数,编程输出最小数。

#include<stdio.h>

void main()

{

   

}

 

2、假定征税的办法如下:

(1)收入在800元以下(800)的不征税;

(2)收入在800元以上,1200元以下(1200),超过800元的部分按5%的税率收税;

(3)收入在1200元以上,2000元以下(2000),超过1200元的部分按8%的税率收税;

(4)收入在2000元以上,则超过2000元的部分按20%的税率收税。

试编写按收入计算税费的程序(要求按多分支结构实现)

#include<stdio.h>

void main()

{

   

}

 

六、运行结果

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

实验四:switch语句引领的选择结构程序设计

 

一、实验目的与要求:

掌握和使用switch语句实现多分支结构程序设计。

 

  • 实验内容:

1、switch多分支结构语法介绍

2、进行switch语句引领的选择结构程序设计。

 

三、实验器材:

微机+windows操作系统+VC++6.0

 

四、实验步骤:

switch语句的格式:

    switch(表达式)

    {

      case  常量1: 语句1;

      case  常量2: 语句2;

      ......

      case  常量n: 语句n;

      default: 语句n+1;

    }

注意:

1switch之后的表达式的值只能是整数或者字符型数据,不能是实数;

2case之后的常量的值必须与switch之后的表达式的值类型一致;

3switch结构中可以省略default标号;

4)每个case标号之后的语句可以多条;

5)某些场合,case标号之后的语句可以省略不写;

6)执行了某个case标号之后的语句,若想立即跳出switch结构,则需在该case标号的语句末尾加上一个break语句。

 

例:假定征税的办法如下:

(1)收入在800元以下的不征税;

(2)收入在800(800)以上,1200元以下,超过800元的部分按5%的税率收税;

(3)收入在1200(1200)以上,2000元以下,超过1200元的部分按8%的税率收税;

(4)收入在2000(2000)以上,则超过2000元的部分按20%的税率收税。

试编写按收入计算税费的程序(要求用switch结构实现多分支结构)。请填空:

#include<stdio.h>

void main()

{

   double x;

   printf("请输入您的收入:");

   scanf("%lf",&x);

   switch(__________)

  {

     case 0:

     case 1:printf("税费为: %.2f\n",0);break;

     case 2:printf("税费为: %.2f\n",____________);break;

     case 3:

     case 4:printf("税费为: %.2f\n",____________);break;

     default:printf("税费为: %.2f\n",_________________);

  }

}

 

五、上机作业

 

1、模拟简易计算器程序。从键盘上输入运算数和四则运算符(+-*/),则输出计算结果。

【提示】:若输入:5+4, 则输出:5+4=9

           输入: 5-4, 则输出:5-4=1

           输入: 5*4, 则输出:5*4=20

           输入: 5/4, 则输出:5/4=1.250000

#include <stdio.h>

void  main()

{

    double a,b;

    char c;

    printf("请输入运算数和运算符(格式如:3,+,5):");

    scanf("%lf,%c,%lf",&a,&c,&b);

    switch(c){

        case '+': printf("%f%f=%f\n",a,b,a+b);break;

        case '-': printf("%f?%f=%f\n",a,b,a-b);break;

        case '*': printf("%f×%f=%f\n",a,b,a*b);break;

        case '/': printf("%f÷%f=%f\n",a,b,a/b);break;

        default: printf("输入有误\n");

    }

}

 

2、从键盘上输入一个四位正整数,输出其逆序数,并判断是否是对称数,如果是输出“YES”,否则输出“NO”。

【提示】:如果输入:4253,先求出其每位上的数字,再重新组成其逆序数:3524,则其不是逆序数,输出“NO”。

          如果输入:4224,先求出其每位上的数字,再重新组成其逆序数:4224,则其是逆序数,输出“YES”。

#include <stdio.h>

void main()

{

  int n,g,s,b,q,m;

  scanf("%d",&n);

  q=n/1000;                    //求出千位数

  b=__________;                //求出百位数

  s=n/10%10;                   //求出十位数

  g=n%10;                      //求出个位数

  m=__________;                //组合成逆序数

  if(___________)              //判断是否是对称数

    printf("YES\n");

  else

    printf("NO\n");

}

 

六、运行结果

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

实验五:循环结构程序设计(一)

 

一、实验目的与要求:

1、掌握while语句、do-while语句和for语句三种编程语法结构;

2、学会使用while语句、do-while语句和for语句三种编程语法结构来实现循环结构程序设计。

 

二、实验内容:

1、while语句、do-while语句和for语句三种编程语法结构介绍

2、进行while语句、do-while语句和for语句编制循环结构程序设计

 

三、实验器材:

微机+windows操作系统+VC++6.0

 

四、实验步骤:

三种循环结构的语法结构

1while语句

格式:

    while(表达式)

      循环体语句;

 

2do-while语句

格式:

   do

   {循环体语句; ... }

   while(表达式);

 

3for语句

格式:

   for(表达式1;表达式2;表达式3)

        循环体语句;

 

: 编程求1+2+3+...+nn由键盘自己输入

分析:累加操作(规律:后一项数据总是比前一项数据多1

定义变量:(1n

         2)循环变量:i 代表累加的某一项数据   初始值为1

               要使得能够循环下去,只要使i自增1操作   i++;++i;i=i+1;i+=1;

          3)和变量:s  代表结果   初始值为0

               累加操作:s=s+i;

表达式(循环条件): i<=n  

循环体语句:s=s+i;  i++;

#include<stdio.h>

void main()

{

   int n,i,s;

   printf("请输入一个正整数(赋给n):");

   scanf("%d",&n);

   i=1;

   s=0;

   while(i<=n)

   {

       s=s+i;

       i++;

   }

   printf("1+2+3+...+%d=%d\n",n,s);

}

 

五、上机作业

 

1、编程求1+1/2+1/3+...+1/nn由键盘自己输入

#include<stdio.h>

void main()

{

  int i,n;

  double  s;

  i=1;

  s=0;

  printf("请输入一个正整数(赋给n):");

  scanf("%d",&n);

  while(i<=n)

  {

    ________;

    i++;

  }

  printf("1+1/2+1/3+...+1/%d=%f\n",n,s);

}

 

2n!(n由键盘自己输入),即求1*2*3*...*n

#include<stdio.h>

void main()

{

  int i,n;

  double s;

  i=1;

  s=1;

  printf("请输入一个正整数(赋给n):");

  scanf("%d",&n);

  while(i<=n)

  {

     ________;

     i++;

  }

  printf("%d!=%.0f\n",n,s);

}

 

  • 编程求11000之间的所有奇数之和,并输出。

 

 

 

六、运行结果

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

实验六:循环结构程序设计(二)

 

一、实验目的与要求:

  • 掌握while语句、do-while语句和for语句三种编程语法结构;

2、掌握双重循环结构程序设计。

 

二、实验内容:

1、双重循环结构介绍

2、进行复杂的循环结构程序设计

 

三、实验器材:

微机+windows操作系统+VC++6.0

 

四、实验步骤:

1、循环的跳转语句

(1)break语句

格式:

     break;

作用:用于跳出整个循环体

 

例如:求1+2+3+...+100,直到累加和大于1000为止,输出此时加到第几项?

 

(2)continue语句

格式:  

    continue;

作用:用于结束本次循环,直接进入下一次循环

 

2、循环的嵌套——双重循环——难点

(1) for(......)

      for(......)

            ...;

(2) while(...)

      while(...)

           ...;

(3) for(......)

      while(...)

          ...;

 

分为外层循环和内层循环:

内层循环结束需要回到外层循环,外层循环的结束才算双重循环结束。

 

1:输入一个任意正整数,判断其是否为素数(质数),若是输出“YES”,否则输出“NO”。

提示:

1)一个数若只能被1和它本身整除,则这个数是素数。

2)设一个数x,用循环不断使得x除以2x-1之间的某个数,则能被其间某个数整除,则其不是素数,否则就是素数。

#include<stdio.h>

void main()

{

   

}

 

五、上机作业

 

1、编写程序:输出2100之间的所有素数(质数)之和。

#include<stdio.h>

void main()

{

   

}

 

2、编写程序:输入一行字符(以回车键结束),统计其中大写字母的个数、小写字母的个数、数字字符的个数、空格个数及其他字符的个数。

#include<stdio.h>

void main()

{

  

}

 

3a+aa+aaa+...+aaa..aa,其中an由自己输入。

例如:a=2,n=5,则计算:

      2+22+222+2222+22222

      a=5,n=4 则计算:

      5+55+555+5555

规律:将前一项数据乘以10,再加上第一项的值,刚好等于后一项数据

#include<stdio.h>

void main()

{

  

}

 

六、运行结果

 

 

 

 

 

实验七:函数及调用

 

一、实验目的与要求:

  • 掌握自定义函数的语法格式和注意事项;

2、学会编写自定义函数,并能够进行调用。

 

二、实验内容:

1、自定义函数的语法格式介绍

2编写自定义函数,并能够进行调用

 

三、实验器材:

微机+windows操作系统+VC++6.0

 

四、实验步骤:

自定义函数——重点

 

1、格式:

 

函数返回值的数据类型  函数名(类型 形参1,类型 形参2,...)    

{

     函数体语句;

}

 

注意:

(1)函数名的命名规则与变量是一致的;

(2)形参只能是变量;

(3)一般来说,将问题中的已知量(问题中必须具备的条件)作为形参来处理。

(4)问题经过一系列的处理后,会得到某个具体的值,则称为其有返回值。

   若有返回值,则要确定其数据类型;

   若有返回值,还要在函数体中添加一条return语句,将该值返回。

return语句的格式:

格式一: return  变量或表达式;

格式二: return(变量或表达式);

(5)有些问题经过一系列的处理后,没有得到某个具体值,只是起到相应的输出信息的作用,则该函数没有返回值,此时函数返回值的类型用void表示。

(6)具体来说,某一自定义函数要不要返回值,需跟主函数的调用语句有关的

(7)若自定义函数缺省了函数返回值的类型,则系统默认为int.

 

例如1:写一自定义函数:求两个双精度实数xy之和。

double  sum1(double x,double y)    

{

    double s;

    s=x+y;

    return s;

}

例如2:写一自定义函数: 判断某一整数的奇偶性。

void jiou(int x)    

{

     if(x%2==0)

       printf("偶数");

     else

       printf("奇数");

}

例如3:写一自定义函数:求1+1/(2*2)+1/(3*3)+...+1/(n*n)

double  sum2(int n)    

{

    double s=0.0;

    int i;

    for(i=1;i<=n;i++)

      s=s+1.0/(i*i);

    return s;

}

void  sum2(int n)    

{

    double s=0.0;

    int i;

    for(i=1;i<=n;i++)

      s=s+1.0/(i*i);

    printf("%f",s);

}

 

五、上机作业

 

1、编写自定义函数,求:s=x+x/(1*2)+x/(1*2*3)+...+x/(1*2*3*...*n) 源程序如下:

#include<stdio.h>

double fun(double x,int n)

{

 

 

 

}

 

void main()

{

  printf("%.4f\n",fun(3.0, 10));

}

 

 

实验八:函数及其嵌套、递归调用

 

  • 实验目的与要求:

1、掌握自定义函数的语法格式和注意事项;

2、学会编写自定义函数,并能够进行函数的嵌套和递归调用。

 

二、实验内容:

1、自定义函数的语法格式介绍

2编写自定义函数,并能够进行函数的嵌套和递归调用

 

三、实验器材:

微机+windows操作系统+VC++6.0

 

四、实验步骤:

函数的调用

自定义函数完成后,一定要在主函数main中调用它,检验它是否正确。

 

在主函数调用自定义函数,完成三件事:

1、重新定义已知量(最好不要与形参重名),并且输入问题中已知量;

2、调用自定义函数,调用的格式:

格式一:    函数名(实参);          //适用于没有返回值的调用

格式二:   <变量>=函数名(实参);   //适用于有返回值的调用

注意:实参可以是常量、变量或表达式,且实参的个数与数据类型必须与形参保持一致。

 (1) 在调用时,系统会给形参分配内存空间,且将实参的值传递给形参,单向传递,形参的值改变不会影响实参。在调用结束后,则形参的内存空间释放。

 (2) 任何C程序的执行都是从main函数开始,并在main函数中结束。

 (3) 在程序中,自定义函数一般放在主函数之前。

 (4) 自定义函数不可以嵌套,但是函数调用可以嵌套

 

例:写一自定义函数:求xy次方,其中x为实型变量,y为正整型变量。

#include<stdio.h>

double   fun(double  x, int  y)   //自定义函数

{

    int  i;

    double   s=1;

    for(i=1;i<=y;i++)

        s=s*x;

    return  s;

}

void main()

{  double  a,t;

    int   b;

   scanf("%lf,%d",&a,&b);

   t=fun(a,b);                      //调用自定义函数

  printf("%lf\n",t);  

}

 

五、上机作业

 

1、编写自定义函数,求:1-1/2+1/3-1/4+...+1/(2*n-1)-1/(2*n)  源程序如下:

#include<stdio.h>

double fun(int n)

{

 

}

 

void main()

{

  printf("%.2f\n",fun(50));

}

 

 

验证结果:0.69

 

 

2、编写自定义函数,求:s=x+x/(1+2)+x/(1+2+3)+...+x/(1+2+3+...+n) 源程序如下:

#include<stdio.h>

double fun(double x,int n)

{

 

 

 

}

 

void main()

{

  printf("%.4f\n",fun(3.0, 10));

}

 

验证结果:5.4545

 

 

 

 

 

 

 

实验九:宏的应用上机实践

 

一、实验目的与要求:

1、掌握编译预处理命令语法格式。

2、学会使用不带参数的宏定义和带参数的宏定义解决实际问题。

 

二、实验内容:

结合实例,验证不带参数的宏定义和带参数的宏定义。

 

三、实验器材:

微机+windows操作系统+VC++6.0

 

四、实验步骤:

1、宏定义

(1)不带参数的宏定义:

       #define  宏名  替换文本

例如:

       #define  PI   3.14

       #define  M    5

(2)带参数的宏定义:

       #define   宏名(形参表)    替换文本

例如:

       #define  MU(X,Y)  (X)*(Y)

      ...

      a=MU(5,2);

注意:先替换,最后再一次性计算。

 

1、以下程序输出结果____55____

#include<stdio.h>

#define    M    5

#define    N     M+M

void  main()

{

     int   k;

     k=N*N*5;

     printf("%d\n" , k);

}

 

 

2、以下程序输出结果___________

#include<stdio.h>

#define   N    2

#define   M   N+1

#define   NUM    (M+1)*M/2

void  main()

{

     int  i;

     for(i=1;i<=NUM;i++)

          printf("%d\n" ,  i);

}

 

 

3、以下程序输出结果____28____

#include<stdio.h>

#define   S(a , b)     a*b/2

void  main()

{

    printf("%d\n" , S(7+5, 4+2));

}

 

 

4、以下程序输出结果____9_______

#include<stdio.h>

#define   SQR(x)     x*x

void  main()

{

     int   a, k=3;

     a=++SQR(k+1);

     printf("%d\n" , a);

}

 

5、以下程序输出结果_____12_________

#include<stdio.h>

#define SUB(X,Y) (X)*Y

void main()

{

    int a=3,b=4;

    printf("%d\n",SUB(a++,b++));

}

 

 

 

 

 

 

 

 

 

实验十:一维和二维数组的应用举例分析

 

  • 实验目的与要求:

1、掌握一维数组和二维数组的定义、引用和初始化等;

2、学会使用数组进行程序设计。

 

二、实验内容:

1、一维数组和二维数组的定义、引用和初始化、输入与输出介绍

2使用数组解决实际问题

 

三、实验器材:

微机+windows操作系统+VC++6.0

 

四、实验步骤:

1、从键盘上输入10个任意的整数存放于一维数组a中,编程求出数组a中元素的最大值及对应的下标,最小值及对应的下标。请填空:

#include<stdio.h>

void main()

{

int a[10],i,max,maxi,min,mini;

printf("请输入10个任意的整数:");

for(i=0;i<10;i++)

  scanf("%d",&a[i]);   

max=a[0];maxi=0;min=a[0];mini=0;

for(i=1;________;i++)

{

   if(a[i]>max)   //求最大值及对应的下标

   {

     max=a[i];

     maxi=i;

   }

   if(________)   //求最小值及对应的下标

   {

     min=a[i];

     mini=i;

   }

}

printf("最大值: %d,最大值下标: %d,最小值: %d,最小值下标: %d\n",max,maxi,min,mini);

}

 

2、从键盘上输入10个任意的整数存放于一维数组a中,编程将数组a中的所有元素按从小到大的顺序排好,并输出。

提示:冒泡排序

原始数据: 10  9  8  7  6  5  4  3  2  1   (从小到大排序)

 

3、输入一44列的二维数组,将该二维数组的下三角元素乘以x(x由自己键盘输入),并输出该二维数组。请填空:

例如:原二维输入如下:

     1 1 1 1

     2 2 2 2

     3 3 3 3

     4 4 4 4

    输入x=2,则输出为:

     2 1 1 1

     4 4 2 2

     6 6 6 3

     8 8 8 8

#include<stdio.h>

void main()

{

    int a[4][4],i,j,x;

    for(i=0;i<4;i++)    //输入二维数组的内容

       for(j=0;j<4;j++)

          scanf("%d",&a[i][j]);

    scanf("%d",&x);      //输入x的值

    for(i=0;i<4;i++)  //使得该二维数组的下三角元素乘以x

       for(j=0;__________;j++)

          _____________________;

    for(i=0;i<4;i++)    //输出该二维数组的内容

    {

       for(j=0;j<4;j++)

   printf("%d ",a[i][j]);

       printf("\n");

    }

}

 

 

 

 

 

 

 

 

 

 

 

 

实验十一:字符串及其应用上机实践操作

 

一、实验目的与要求:

1、掌握字符型数组的定义、引用和初始化操作;

2、学会使用字符串处理函数解决实际问题。

 

二、实验内容:

1、字符型数组的定义、引用和初始化介绍

2使用字符串处理函数解决实际问题

 

三、实验器材:

微机+windows操作系统+VC++6.0

 

四、实验步骤:

 

1 :字符串加密操作(填空题)

从键盘上输入一批字符(@结束输入),按下列要求加密并输出。

加密规则:

1)所有字母均转换为小写;

2)若是字母'a''y',则转化为下一个字母;

3)若是'z',则转化为'a'

4)其他字符,保持不变。

#include<stdio.h>

void main()

{    char ch;

    while((ch=getchar())!='@')

    {

       if(ch>='a' && ch<='y')

          ch=___________;

       else if(ch>='A' && ch<='Y')

          ch=___________;

       else if(ch=='Z' || ch=='z')

          ch=___________;

       putchar(ch);

    }

    putchar("\n");

}

 

2 :编写程序,将字符串s中的所有*号删除。

#include<stdio.h>

void main()

{

char s[80];

int i,j;

gets(s);

j=0;

for(i=0;s[i]!='\0';i++)

   if(s[i]!='*')

{

      s[j]=s[i];

      j++;

}

s[j]='\0';

puts(s);

}

 

3:从键盘上输入两个字符串,将两个字符串首尾相连接后,再输出新的字符串。

例如:输入两个字符串为:

                        Hello

                        China  

      则输出新字符串为:HelloChina

#include<stdio.h>

void main()

{

char a[50],b[50],c[100];

int i,j,k;

printf("请输入两个字符串:\n");

gets(a);gets(b);

k=0; //控制c数组的下标

for(i=0;a[i]!='\0';i++)

{  c[k]=a[i];

     k++;  }

for(j=0;b[j]!='\0';j++)

{  c[k]=b[j];

     k++; }

c[k]='\0';  //'\0'作为C字符串的结束标志

puts(c);

}

 

 

 

 

 

 

 

 

 

实验十二:指针操作数组应用上机

 

一、实验目的与要求:

1、掌握指针的定义,指针变量的引用;

2、掌握使用指针操作一维数组的元素;

3、学会使用指针操作一维数组解决实际问题。

 

二、实验内容:

1、指针变量的定义和引用介绍

2使用指针操作一维数组的元素;

3使用指针操作一维数组解决实际问题

 

三、实验器材:

微机+windows操作系统+VC++6.0

 

四、实验步骤:

指针变量:该变量存放的是某个内容变量的地址。

指针变量的定义格式:

类型名  *指针变量名 ,  .......;

例如:

int p;   //p是内容变量,且p中的内容()的数据类型是int型。

int *p;  //p是指针变量,p中存放的是某个内容变量的地址(地址没有数据类型可言),且该内容变量的数据类型是int

注意:不要理解为p中存放的地址是int型。

注意:

1)定义了一个指针变量,则必须让该指针变量有一个指向(必须给它赋初值)

     int i=10,*p=&i;

    等价于:

     int i=10;

     int *p;

     p=&i;

2)将某个内容变量的地址赋给一个指针变量,则相当于这个指针变量指向了该内容变量。

 

用指针操作一维数组——重点

 

1、一维数组的名字(常量)就是地址,是第0个元素的地址(首地址).

int a[10]={1,2,3,4,5,6,7,8,9,0};

int *p;

p=a;   //p指向a[0]元素

p=a+1; //p指向a[1]元素

p=a+9; //p指向a[9]元素

p++;

a++;   或   a--;    //错误,因为a是数组名,是个常量,常量不能++--

问:p++ 或者 ++p  :p指针指向下一个元素   

  *p++ 或者 *(p++)  :p先与++结合,即p指针先指向下一个元素,然后再与*结合,取p指针所指向的空间内容

  (*p)++  :先取p指针所指向的空间内容作为该表达式的值,然后使得p指针所指向的空间的内容自增1

  ++(*p)  :先使得p指针所指向的空间的内容自增1,然后取p指针所指向的空间内容作为该表达式的值。

int a[10];

int *p;

p=a;   //p指向a[0]元素

表示一维数组中第0个元素地址:  a、     p、      &a[0]

表示一维数组中地0个元素内容:  *a、   *p、       a[0]

结论:

表示一维数组中第i个元素地址:  a+i、   p+i、    &a[i]

表示一维数组中第i个元素内容:*(a+i)*(p+i)、    a[i] p[i]

 

例如 :编程求一维数组各元素之和。(请填空)

1)使用数组方法实现

   #include<stdio.h>

   void main()

   { int a[5]={5,6,7,8,9},sum=0,i;

     for(i=0;i<5;i++)

         ____sum = sum +a[i]_______;

     printf("%d\n",sum);

    }

2)使用指针方法实现(指针的指向不变)

   #include<stdio.h>

   void main()

   {int a[5]={5,6,7,8,9},sum=0,i;

     int *p=a;

     for(i=0;i<5;i++)

         ___sum = sum +p[i]___;

     printf("%d\n",sum);

    }

3)使用指针方法实现(指针的指向改变)

   #include<stdio.h>

   void main()

   {

     int a[5]={5,6,7,8,9},sum=0,i;

     int *p=a;

     for(i=0;i<5;i++)

         __sum = sum + *p++___;

     printf("%d\n",sum);

}

实验十三:指针操作字符串应用上机

 

一、实验目的与要求:

1、掌握指针的定义,指针变量的引用;

2、掌握使用指针操作字符串;

3、学会使用指针操作字符串解决实际问题。

 

二、实验内容:

1、指针变量的定义和引用介绍

2使用指针操作字符串;

3使用指针操作字符串解决实际问题

 

三、实验器材:

微机+windows操作系统+VC++6.0

 

四、实验步骤:

字符串与指针

1、用数组存储字符串

char a[]="china";

printf("%s",a);

puts(a);

2、用指针表示字符串

char *a="china";  //a为指针变量,并让a指向该字符串的首地址

printf("%s",a);

puts(a);

 

上机作业:

 

1、编程求一个字符串的长度.(要求:用指针方法实现,且不能使用strlen函数)

#include<stdio.h>

void main()

{

    

}

 

 

2、 编程实现两个字符串的连接.(要求:用指针方法实现,且不能使用strcat函数)

#include<stdio.h>

void main()

{

     

}

 

 

实验十四:结构体操作学生信息上机实践

 

一、实验目的与要求:

1、掌握结构体类型的定义和结构体变量的定义和引用;

2、学会使用结构体解决实际问题。

 

二、实验内容:

1、结构体类型的定义和结构体变量的定义和引用介绍;

2使用结构体解决实际问题

 

三、实验器材:

微机+windows操作系统+VC++6.0

 

四、实验步骤:

1:程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的信息。函数fun的功能是输出这位学生的信息。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 给定源程序:

#include <stdio.h>

typedef struct

{ int num;

char name[9];

char sex;

struct { int year,month,day ;} birthday;

float score[3];

}STU;

/**********found**********/

void show(STU ___1___)

{ int i;

printf("\n%d %s %c %d-%d-%d", tt.num, tt.name, tt.sex, tt.birthday.year, tt.birthday.month, tt.birthday.day);

for(i=0; i<3; i++)

/**********found**********/

printf("%5.1f", ___2___);

printf("\n");

}

main( )

{ STU std={1,"Zhanghua",'M',1961,10,8,76.5,78.0,82.0 };

printf("\nA student data:\n");

/**********found**********/

show(___3___);

}

解题思路:

本题是利用结构体变量存储了一名学生的信息。

第一处:tt变量在函数体fun已经使用,所以应填:tt

第二处:利用循环分别输出学生的成绩数据,所以应填:tt.score[i]

第三处:函数的调用,所以应填:std

 

2:学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s, 请编写函数fun,它的功能是:把分数最低的学生数据放在b所指的数组中,注意:分数最低的学生可能不止一个,函数返回分数最低的学生的人数。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

给定源程序:

#include <stdio.h>

#define N 16

typedef struct

{ char num[10];

int s;

} STREC;

int fun( STREC *a, STREC *b )

{ }

main()

{ STREC s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},{"GA011",91},{"GA017",64}, {"GA018",64}, {"GA016",72}};

STREC h[N];

int i,n;FILE *out ;

n=fun( s,h );

printf("The %d lowest score :\n",n);

for(i=0;i<n; i++)

printf("%s %4d\n",h[i].num,h[i].s);

printf("\n");

out = fopen("c:\\test\\out.dat","w") ;

fprintf(out, "%d\n",n);

for(i=0;i<n; i++)

fprintf(out, "%4d\n",h[i].s);

fclose(out);

}

解题思路:

本题是把符合条件的学生记录存入到另一个结构体,人数通过函数返回,记录由实参b返回。

1. 符合条件的学生人数存在变量j(初始值为0)中,最后返回其值。

2. 利用for循环语句,依次判断是否符合条件,如果成绩相等,则把记录存入b中,人数j 1;如果当前成绩a[i].s小于最低成绩min,那么人数重新初始化为0,把当前成绩存入最低成绩中,人数j1

3. 直至循环结束为止。

参考答案:

int fun( STREC *a, STREC *b )

{ int i, j = 0, min=a[0].s ;

for(i = 0 ; i < N; i++)

{ if(min > a[i].s)

{ j = 0 ; b[j++] = a[i] ; min = a[i].s ; }

else if(min == a[i].s)

b[j++] = a[i] ;

}

return j ;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

实验十五:单链表的基本操作上机实践

 

一、实验目的与要求:

1、掌握单链表的建立、插入元素、删除表中某元素的算法。

2、学会使用单链表解决实际问题。

 

二、实验内容:

建立一个带头结点的单链表,然后对该单链表进行插入删除结点操作,输出各种操作的结果

 

三、实验器材:

微机+windows操作系统+VC++6.0

 

四、实验步骤:

#include <stdio.h>

#include <stdlib.h>

typedef struct node

{char data;

struct node *next;

}LINKLIST;

/*以下程序段的功能为尾插入法建立单链表*/

void creat(LINKLIST *head)

{

LINKLIST *t,*p;

char ch;

p=head;

printf("请从键盘上输入一串字符,以字符$作为输入的结束符号:");

while((ch=getchar())!='$')

 {

 t=(LINKLIST *)malloc(sizeof(LINKLIST));

 t->data=ch;

 t->next=p->next;

 p->next=t;

 p=p->next;

 }

}

/*以下程序段的功能为输出单链表的各结点的值*/

void print(LINKLIST *head)

{

 LINKLIST *p;

 p=head->next;

 printf("head");

 while(p!=NULL)

 {printf("-->%c",p->data);

    p=p->next;

 }

 printf("\n");

}

/*以下程序段的功能为在单链表中插入一个元素*/

void insert(LINKLIST *head,int x)

{

 LINKLIST *p,*t;

 char ch;

 int i=0;

 printf("请输入要输入的结点的值:");

 scanf("%c",&ch);

 p=head;

 while(p->next!=NULL&&i<x)

 {i++;

  p=p->next;

 }

 t=(LINKLIST *)malloc(sizeof(LINKLIST));

 t->data=ch;

 t->next=p->next;

 p->next=t;

}

/*以下程序段的功能为在单链表中删除一个元素*/

void deletenode(LINKLIST *head,int i)

{

LINKLIST *p,*s;

p=head;

int j=0;

while(p->next!=NULL&&j<i-1)

{j++;

p=p->next;

}

s=p->next;

p->next=s->next;

free(s);

}

/*主函数*/

void main()

{

 LINKLIST *head;

 int i;

 head=(LINKLIST *)malloc(sizeof(LINKLIST));

 head->next=NULL;

 creat(head);

 printf("建立的单链表为:");

         print(head);

 printf("请输入要插入结点的位置(0-n):");

 scanf("%d",&i);

 getchar();

 insert(head,i-1);

 printf("插入元素后的单链表为:");

         print(head);

         printf("请输入要删除的结点 (0-n):");

 scanf("%d",&i);

         deletenode(head,i);

 print(head);

}

 

五、实验结果

 

 

 

 

 

 

 

 

 

 

 

 

 

实验十六:文件的操作上机实践

 

一、实验目的与要求:

1、掌握文件指针的定义和引用。

2、掌握文件常用操作函数(fopen函数、fclose函数、fputc函数和fgetc函数、fputs函数和fgets函数、fwrite函数和fread函数、fprintf函数和fscanf函数、判断文件结束函数feof、fseek函数、ftell函数等)的使用;

3、学会使用文件操作函数解决实际问题。

 

二、实验内容:

结合实例,使用文件常用操作函数进行实际问题的解决。

 

三、实验器材:

微机+windows操作系统+VC++6.0

 

四、实验步骤:

文件指针:文件指针实际上指向一个结构体类型的指针

定义文件指针的格式:

  FILE  *指针变量名;

例如:FILE  *fp;    //fp指向一个文件

文件操作函数

1、文件打开与关闭的函数

文件打开格式:

文件指针名=fopen(文件名,打开方式);

例如:

 FILE  *fp;

 fp=fopen("a.dat","rb");

打开方式:

"r":只读方式打开文本文件

"rb":只读方式打开二进制文件

"w":为写方式打开文本文件

"wb":为写方式打开二进制文件

"a":为在文件后面添加数据而打开文本文件

"ab":为在文件后面添加数据而打开二进制文件

"r+":为读和写打开文本文件

"rb+":为读和写打开二进制文件

读:从文件中取数据出来送到程序中来执行

写:把程序中的数据送到文件中保存

关闭文件格式:

   fclose(文件指针);

例如:fclose(fp);

2、文件读写函数

(1)fputc函数和fgetc函数——读写一个字符

格式:

   fputc(ch,fp);

作用:将字符ch写到文件指针fp所指的文件中

   ch=fgetc(fp);

作用:从文件指针fp所指的文件中读入一个字符,赋值给ch

(2)fputs函数和fgets函数——读写一个字符串

格式:

   fputs(str,fp);

作用:将str(可以字符数组名或字符指针名)指定的字符串(不包括'\0')写到文件指针fp所指的文件中

   fgets(str,n,fp);

作用:从fp所指的文件中读入n-1个字符存放到str(可以字符数组名或字符指针名)中。读入结束后,系统自动在字符串末尾加上'\0'

(3)fwrite函数和fread函数——读写二进制文件

fread(buffer,size,count,fp);

作用:从fp所指向的文件读取count个size个字节的数据送到buffer所指地址中去

fwrite(buffer,size,count,fp);

(4)fprintf函数和fscanf函数——读写任意类型 (整型、实型或字符型)的文本文件

fprintf(文件指针,格式控制字符串,输出列表);

作用:将输出列表按照指定的格式写到文件指针所指定的文件中

例如:fprintf(fp,"%x,%o",23,45);

fscanf(文件指针,格式控制字符串,输入列表);

例如:fscanf(fp,"%d%d",&x,&y);

3、判断文件结束函数feof

格式:

feof(fp)

若遇到文件结束,则feof(fp)函数的返回值为1,否则为0

while(!feof(fp))

{

   .....

}

4、文件指针的定位函数

(1)fseek函数——移动文件指针到指定位置上

格式:

fseek(fp,offset,origin);

fp:文件指针,offset:位移量,origin:起始点(SEEK_SET、SEEK_END、SEEK_CUR)

例如:

fseek(fp,-30L,SEEK_END);

 

(2)ftell函数——获取当前文件指针的位置

格式:

   long t;

   t=ftell(fp);

(3)rewind函数——使得文件指针回到文件开头

格式:

   rewind(fp);

 

上机任务:

 

1、给定程序中,函数fun的功能是将形参给定的字符串、整数、浮点数写到文本文件中,再用字符方式从此文本文件中逐个读入并显示在终端屏幕上。

请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

给定源程序:

#include <stdio.h>

void fun(char *s, int a, double f)

{/**********found**********/

__1__ fp;

char ch;

fp = fopen("file1.txt", "w");

fprintf(fp, "%s %d %f\n", s, a, f);

fclose(fp);

fp = fopen("file1.txt", "r");

printf("\nThe result :\n\n");

ch = fgetc(fp);

/**********found**********/

while (!feof(__2__))

{ /**********found**********/

putchar(__3__); ch = fgetc(fp);

}

putchar('\n');

fclose(fp);

}

main()

{ char a[10]="Hello!"; int b=12345;

double c= 98.76;

fun(a,b,c);

}

解题思路:

本题是考察先把给定的数据写入到文本文件中,再从该文件读出并显示在屏幕上。

第一处:定义文本文件类型变量,所以应填:FILE *

第二处:判断文件是否结束,所以应填:fp

第三处:显示读出的字符,所以应填:ch

 

2、给定程序中,函数fun的功能是:将自然数110以及它们的平方根写到名为myfile3.txt的文本文件中,然后再顺序读出显示在屏幕上。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

给定源程序:

#include <math.h>

#include <stdio.h>

int fun(char *fname )

{ FILE *fp; int i,n; float x;

if((fp=fopen(fname, "w"))==NULL) return 0;

for(i=1;i<=10;i++)

/**********found**********/

fprintf(___1___,"%d %f\n",i,sqrt((double)i));

printf("\nSucceed!\n");

/**********found**********/

___2___;

printf("\nThe data in file :\n");

/**********found**********/

if((fp=fopen(___3___,"r"))==NULL)

return 0;

fscanf(fp,"%d%f",&n,&x);

while(!feof(fp))

{ printf("%d %f\n",n,x);

fscanf(fp,"%d%f",&n,&x);

}

fclose(fp);

return 1;

}

main()

{ char fname[]="myfile3.txt";

fun(fname);

}

解题思路:

本题要求所求出的数写入到指定的文件中保存。程序中共有三处要填上适当的内容,使程序能运行出正确的结果。

第一处:int fprintf(FILE *stream, const char *format [,argument, ]); 因此本处只能填写文件流的变量fp

第二处:由于文件打开写操作,所以必须要关闭,因此,只能填写关闭文件的函数fclose(fp)

第三处:由于本题要把刚写入文件中的数据重新显示出来,读方式已经给出,但没有给出文件名,所以本处只能写文件名变量fname或者直接给出文件名"myfile3.dat"

 

核发:nclgjsj 点击数:160收藏本页