《高级语言程序设计(Ⅰ)》课程实验大纲

作者: 时间:2020-07-10 点击数:

《高级语言程序设计(Ⅰ)》课程实验教学大纲

课程编号:19031002

课程总学时:56              实验学时:16

课程总学分:3

适用专业:计算机科学与技术

 

一、本课程实验的主要目的与任务

实验目的:通过C程序设计实验培养学生对学习程序设计的兴趣,加深对讲授内容的理解,尤其是通过上机来掌握语法规则,使学生全面了解 C 语言的特点,熟练掌握C 语言程序设计的基本方法和编程技巧。

实验任务:了解和熟悉C语言程序开发的环境;学会上机调试程序,善于发现程序中的错误,并且能很快地排除这些错误,使程序能正确运行,达到实验知识和理论知识的融会贯通。上机实验前,学生必须事先根据题目的内容编好程序,然后在实验时输入程序、调试程序、直至运行结果正确为止,上机结束后,应整理出实验报告。

 

二、本课程实验项目

序号

实验项目名称

学时

类型

必做/选做

所需主要设备

1

顺序程序设计

2

设计性

必做

PC机及C实验环境

2

选择程序设计

4

设计性

必做

PC机及C实验环境

3

循环程序设计

4

设计性

必做

PC机及C实验环境

4

数组

4

设计性

必做

PC机及C实验环境

5

函数

2

设计性

选做

PC机及C实验环境

 







三、各实验项目主要实验内容和基本要求

各实验项目的主要内容和基本要求见附录。

四、实验成绩考核与评定办法

学生应做好实验准备,认真完成每个实验,按时完成实验报告。任课教师应认真批改实验报告并给出实验报告成绩。

五、主要参考书目

1、《C程序设计案例教程》,钟家民;清华大学出版社,20186

2、《C程序设计(第四版)学习辅导》,谭浩强;清华大学出版社,20106

3、《C程序设计(第四版)》,谭浩强;清华大学出版社,20106

4、《C语言程序设计》,姬秀荔;清华大学出版社,20122

5、《深入体验C语言项目开发)》,薛小龙;清华大学出版社,20117

6 http://acm.nyist.net/,南阳理工学院ACM在线评测系统

7、《机试考点 百签题解)》,郎六琪;吉林大学出版社,20124

 

六、本大纲说明

本课程大纲是动态的,在实验过程中,可根据学生的程度适当调整实验的内容和时间。

 

 

 

 

 

撰写人: 周晏                         审定人:钟家民

批准人:                                   执行时间:

 

 


实验顺序结构程序设计

1.实验目的

1)掌握C语言数据类型,了解字符型数据和整型数据的内在关系

2)掌握对各种数值型数据的正确输入方法

3)学会使用教材中所介绍的运算符及表达式

4)学会编写和运行一些较简单的C程序

2.实验内容

1)输入华氏温度f,输出摄氏温度c

编程提示:参考例题2-2

#include <stdio.h>

 int main( )       

 {   

float f,c; 

printf(“请输入华氏温度:\n”);

scanf(“%f”,&f);

c=5.0/9*(f-32);

printf(“\n摄氏温度为%f\n”,c)

return 0;

}

为什么在计算摄氏温度时用5.0/9,可不可以换成5/9,为什么?能不能修改成其他形式?

2)从键盘输入一个3位整数,将输出该数的逆序数。

编程提示:先分离成百位、十位、个位,再个位乘以100加十位乘以10加百位。

#include<stdio.h>

int main(    )

{

int a,b,c,x,y;

printf(“请输入一个3位的正整数:\n”);

scanf(“%d”,&x);

a=x/100;                           /*x的百位数*/

b=(x-a*100)/10;                     /*x的十位数*/

c=x-a*100-b*10;                    /*x的个位数*/

y=c*100+b*10+a;

printf(“%d:%d\n”,x,y);

return 0;

}

思考:利用C语言运算符中的求余运算符求出末位数字,输出后,利用除法运算符整型和整型相除还是整型的特性切掉末位,将得出的数值,再次求余,只需三次就可以完全逆序输出,请试着编出此程序。

3)随机产生一个4位的自然数,输出它的逆序数。

编程提示:参考【3-40

4)输入3个字符型数据,将其转换成相应的整数后,求它们的平均值并输出。

编程提示:要解决这一问题需要定义三个字符或整数类型变量,用于存放三个字符型数据,还需要一个实型变量用于存放三个数据的平均值,因为整型和字符型可以互换,求得平均值输出即可。

3.实验要求

1)掌握C语言数据类型以及不同类型数据之间赋值的规律。

2)掌握对各种数值型数据的正确输入方法。

3)学会使用C的有关算术运算,以及包含这些运算符的表达式。

4)学会编写和运行简单的应用程序。

4.实验器材

1PC

2C实验环境

 

 

 

 

实验选择结构程序设计

1.实验目的

1)学会使用关系运算符和关系表达式以及逻辑运算符和逻辑表达式。

2)熟练掌握if语句的使用。

3)熟练掌握switch语句的使用。

2.实验内容

1)输入3个整数,输出它们中的最大值和最小值。(打擂台法)

1)编程提示      

设置最大值变量max和最小值变量min;首先比较a,b的大小,并把大数存入max 小数存入min;然后最大值变量max和最小值变量min再与c比较,若c大于max,则max取值c,否则保持不变;如果c小于min,则min取值c,否则保持不变。最后输出maxmin的值。

2)参考程序

#include<stdio.h>

int main()

{

   int a,b,c,min,max;

   printf("三个数中整数(必须以空格间隔):");

   scanf("%d %d %d",&a,&b,&c);  /* 输入时必须以空格间隔 */

   /* 打擂台法 */

   min=a;max=a;  /* 假定a既是最大值,又是最小值 */

   /* 求最大值 */

   if(b>max)

      max=b;

   if(c>max)

     max=c;

   /* 求最小值 */

   if(b<min)

     min=b;

   if(c<min)

     min=c;

   printf("三个数中最大值为:%4d\n三个数中最小值为:%4d\n",max,min);

}

2)有一个函数:

                

 

 

编写程序,输入一个x的值,并输出相应的y的值。

1)编程提示

这是一个分段函数,x三个不同域,y的值分别对应为x-23*x4*x+1。既可以用独立的3if语句实现,也可以用if语句的第三种形式实现,还可以用if嵌套语句实现。比较三种方法后,建议此类问题都采用用if语句的第三种形式实现。

2)参考程序

a.用独立的3if语句实现

#include <stdio.h>

int main()

{

   int x,y;

   scanf("%d",&x);

   if(x<0)

      y=x-2;

   if(x>=0&&x<10)

      y=3*x;

   if(x>=10)

      y=4*x-1;

   printf("x=%d,y=%d\n",x,y);

   return 0;

}

b.if语句的第三种形式实现

#include <stdio.h>

int main()

{

   int x,y

   scanf("%d",&x);

   if(x<0)    /* if的第三种形式 */

      y=x-2;

   else if(x<10)

     y=3*x;

   else

      y=4*x-1;

   printf("x=%d,y=%d\n",x,y);

   return 0;

}

c.if嵌套语句实现

#include <stdio.h>

int main()

{

   int x,y;

   scanf("%d",&x);

   if(x<0) 

     y=x-2;

   else  

      if(x<10)  /* 内嵌的if */

        y=3*x;

      else

        y=4*x-1;

   printf("x=%d,y=%d\n",x,y);

   return 0;

}

3)编程设计一个简单的计算器程序,要求根据用户从键盘输入的表达式:         

操作数1 运算符op 操作数2

计算表达式的值,其中算术运算符包括:加(+)、减(-)、乘(*)、除(/)

编程提示:

简单的计算机器可以实现加(+)、减(-)、乘(*)、除(/)运算。需要输入两个数及一个算术运算符,判断出运算符为加(+)、减(-)、乘(*)、除(/)后,根据运算符完成相应功能计算。其中,验证除(/)时,要考虑到除数不能为零的情况。当然如果输入的字符非加(+)、减(-)、乘(*)、除(/)中的符号,则输出输入数据无效!

4)运输公司对用户计算运输费用。路程(skm)越远,每吨·千米运费越低。(分别用if语句和switch语句实现)

标准如下:

              s < 250               没有折扣

         250s < 500               2%折扣

         500s < 1000              5%折扣

        1000s < 2000              8%折扣

        2000s < 3000             10%折扣

        3000s                    15%折扣

1)编程提示

设每吨每千米货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费f的计算公式为f = p * w * s * (1 - d / 100)

a.if语句实现

这是一个分段函数,不同的域对应不同的折扣,选择条件分别为当s<250时,无折扣;当250s < 500时,折扣d=2;500s < 1000时,折扣d=5; 1000s < 2000时,折扣d=8; 2000s < 3000时,折扣d=10; 3000s时,折扣d=15%。只需要将选择条件转换为关系表达式或逻辑表达式即可。因此,本题目既可以用独立的3if语句实现,也可以用if语句的第三种形式实现,还可以用if嵌套语句实现。但此类问题使用if语句的第三种形式实现结构更清晰。

b.switch语句实现

经过分析发现折扣的变化是有规律的:折扣的变化点都是250的倍数。利用这一点,定义c=s/250,当c<1时,表示s<250,无折扣;当1c <2时,表示250s < 500,折扣d=2;

2c <4时,表示500s < 1000,折扣d=5; 4c <8时,表示1000s < 2000,折扣d=8; 8c <12时,表示2000s < 3000,折扣d=10; 12c 时,表示3000s,折扣d=15%。

3.实验要求

1)掌握赋值语句的使用方法;

2)掌握数据的输入输出的方法,能正确使用各种格式转换符。

4.实验器材

1PC

2C实验环境

 

 

 

 

 

 

 

 

 

 

 

 

实验循环结构程序设计

1.实验目的

1)熟练掌握whiledo-whilefor三种循环控制语句,掌握循环结构程序设计和调试方法。

2)掌握二重循环结构程序的设计方法。

2.实验内容

1)求解猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,并又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩一个桃子了。求第一天共摘了多少桃子。

1)编程提示

猴子吃桃问题可用递推方法求解。设前一天开始时的桃子数为m,猴子吃掉之后剩余桃子数为n,则mn存在如下关系:

    n=m/2-1

已知第10天开始时只有一个桃子,根据上述关系,有如下递推数据:

9天:n=1m=2*(n+1)=4

8天:n=4m=2*(n+1)=10

7天:n=10m=2*(n+1)=22

6天:n=22m=2*(n+1)=46

……

按照上述递推过程,用whiledo whilefor循环语句求解猴子吃桃问题。

2)参考程序

a.while语句实现

#include<stdio.h>

int main()

{

    int i=1,m,n=1;

    while(i<10)

    {

      m=2*n+2;

      n=m;

      i++;

     }

   printf("total=%dn",m);

     return 0;

}

b.do while语句实现

#include<stdio.h>

int main()

{

   int i=1,m,n=1;

   do

   {

      m=2*n+2;

      n=m;

      i++;

   }while(i<10);

   printf("total=%d\n",m);

   return 0;

}

c.for语句实现

#include<stdio.h>

int main()

{

   int i,m,n=1;

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

   {

      m=2*n+2;

      n=m;

   }

   printf("total=%d\n",m);

   return 0;

}

2)从键盘输入一批整数,统计其中不大于100的非负整数的个数。

实验步骤:

1) 编程提示

由于输入数据个数是不确定的,因此每次执行程序时,循环次数都是不确定的。在进行程序设计时,确定循环控制的方法是本实验的一个关键问题。循环控制条件可以有多种确定方法:

使用一个负数作为数据输入结束标志。

输入一个数据后通过进行询问的方式决定是否继续输入下一个数据。

2)参考程序

/*参考程序一:使用负数作为数据输入结束标志的程序*

#include<stdio.h>

int main()

{

   int m,counter=0;

   while(1)

   {

      printf("请输入-个整数: ");

      scanf("%d",&m);

      if(m<0)

        break;

      if(m<=100)

        counter++;

      printf("\n");

   }

   printf("符合要求的整数个数为:%d\n",counter);

     return 0;

}

/*参考程序二:通过进行询问的方式决定是否继续输入下一个数据的程序*

#include<stdio.h>

int main()

{

   int m,counter=0;

   char ask;

   while(1)

   {

      printf("请输入-个整数: ");

      scanf("%d",&m);

      getchar();

      if(m>=0&&m<=100)

        counter++;

      printf("继续输入下一个数据?(YN) ");

      ask=getchar();

      getchar();

      if(ask!='y'&&ask!='Y')

        break;

      printf("\n");

   }

   printf("符合要求的整数个数为:%d\n",counter);

     return 0;

}

3)打印所有的水仙花数。所谓水仙花数是指一个三位数,其各位数字的立方和等于该数本身。例如153=13+53+33等。

编程提示:

a、用一重循环实现

水仙花数的取值范围100999的三位整数

分离出每个三位整数的百位、十位、个位。

用百位数3+十位数3+个位数3的和与100999的三位整数分别比较判断是否水仙花数

b、用三重循环实现

分别设百位、十位、个位分别为ijk

判断i*100+j*10+ki*i*i+j*j*j+k*k*k是否相等判断是否水仙花数

4)无重复数字的3位数问题。用12344个数字组成无重复数字的3位数,将这些3位数据全部输出。

编程提示:

可填在百位、十位、个位的数字都是1234

首先组成所有的排列,然后去掉不满足条件的排列。

该问题可用三重循环实现。

3.实验要求

1)掌握关系运算符和关系表达式、逻辑运算符和逻辑表达式的使用。

2)掌握if语句的使用(包括if语句的嵌套)和switch语句的使用。

4.实验器材

1PC

2C实验环境

 

 

 

 

 

 

 

 

 

 

实验数组

1.实验目的

1)掌握一维数组和二维数组的定义、赋值和输入输出的方法。

2)掌握字符数组和字符串函数的使用。

2.实验内容

1)已知两个升序数组,将它们合并成一个升序数组并输出。

1)编程提示:利用已知条件(两数组AB均为升序),循环在每个数组中均选取一个元素来对比,较小的放到新数组C中。直到一个数组中的元素已全部放入C中,此时将另一个数组未放入的元素全放入到C中。

2)参考程序

#include<stdio.h>

int main() 

int str1[5]={3,9,13,35,45};

int str2[5]={2,14,19,23,26}; 

int out[10];             /*输出数组*/  

int i=0,j=0,k=0; 

while (i<5&&j<5)         /*循环将较小元素放入*/

{      

    if (str1[i]<str2[j])

          { 

         out[k]=str1[i]; 

         i++; 

         k++; 

      } 

    else

      { 

         out[k]=str2[j]; 

         j++; 

         k++; 

      } 

}

if(i==5)

{              /*1个数组元素已经全部放到C中,将第2个数组剩余元素全放到C*/ 

     while (j<5)

      { 

         out[k]=str2[j]; 

         k++; 

         j++; 

      } 

if(j==5)

{             /* 2个数组元素已经全部放到C中,将第1个数组剩余元素全放到C */ 

     while (i<5)

             { 

          out[k]=str1[i]; 

          k++; 

          i++; 

      } 

   } 

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

    printf("%d ",out[i]); 

  }

return 0;

2)输出杨辉三角。

1

1   1

1   2   1

1   3   3   1

1   4   6   4   1

1   5  10  10   5   1

……

1)编程提示:

杨辉三角是二项式系数在三角形中的一种几何排列,我国南宋数学家杨辉1261年所著的《详解九章算法》一书里就出现了。杨辉三角的两个腰边的数都是1,其它位置的数都是上顶上两个数之和。

我们先定义一个二维数组:a[N][N],略大于要打印的行数。再令两边的数为1,即当每行的第一个数和最后一个数为1a[i][0]=a[i][i-1]=1n为行数。除两边的数外,任何一个数为上两顶数之和,即a[i][j]=a[i-1][j-1]+a[i-1][j],最后输出杨辉三角。

2)参考程序

#include <stdio.h>

#define N 14

int main()

{

    int i, j, k, n=0, a[N][N];  /*定义二维数组a[14][14]*/

    while(n<=0||n>=13)          /*控制打印的行数不要太大,过大会造成显示不规范*/

{        

            printf("请输入要打印的行数:");

            scanf("%d",&n);

      }

    printf("%d行杨辉三角如下:\n",n);

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

            a[i][1] = a[i][i] = 1;

/*两边的数令它为1,因为现在循环从1开始,就认为a[i][1]为第一个数*/

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

        for(j=2;j<=i-1;j++)

            a[i][j]=a[i-1][j-1]+a[i-1][j]; /*除两边的数外都等于上两顶数之和*/

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

{

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

            printf("   "); 

        for(j=1;j<=i;j++)             /*j<=i的原因是不输出其它的数,只输出我们想要的数*/

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

         printf("\n");                /*当一行输出完以后换行继续下一行的输出*/

    }

    printf("\n");

return 0;

}

3)有一个数组a[6]={2,5,3,9,5,4},将其逆序(不借助其他数组实现)。

4)输入字符串并统计各字母出现的次数。

5)把从键盘输入的字符串“1234”转换为整型数据1234

3.实验要求

1)掌握一维数组和二维数组的定义、赋值和输入输出方法。

2)掌握字符数组与字符串函数的使用。

3)掌握与数组有关的算法。

4.实验器材

1PC

2C实验环境

 

 

 

实验函数

1.实验目的

1)熟悉定义函数的方法。

2)熟悉声明函数的方法。

3)熟悉调用函数时实参与形参的对应关系,以及“值传递”的方式。

4)学习对多文件的程序的编译和运行。

 

2.实验内容

1)写一个判断素数函数,在主函数输入一个整数,输出是否素数的信息。

① 输入程序,进行编译和运行,分析结果。

② 将要排列的字符串改为5个,按由小到大的顺序排列。

2)写一个函数,将一个字符串中的元音字母复制到另一字符串,然后输出。

① 输入程序,进行编译和运行,分析结果。

② 分析函数声明中参数的写法。先后用以下两种形式。

(a) 函数声明中参数的写法与定义函数时的形式完全相同,如:void cpy(char s[],char c[]);

(b) 函数声明中参数的写法与定义函数时的形式基本相同,但省略写数组名,如:void cpy(char [],char []);

分别编译和运行,分析结果。

③ 如果随便指定数组大小行不行,如:void cpy(char s[40],char c[40]) ;

3)输入10个学生5门课的成绩,分别用函数实现下列功能:

① 计算机每个学生平均分。

② 计算每门课的平均分。

③ 找出所有50个分数中最高的分数所对应的学生和课程。

4)用一个函数来实现将一行字符串中最长的单词输出。此行字符串从主函数传递给该函数。

① 把两个函数放在同一个程序文件中,作为一个文件进行编译和运行。

② 把两个函数放在两个程序文件中,作为两个文件进行编译、连接和运行。

 

3.实验要求

1)掌握定义函数的方法。

2)掌握实参和形参的对应关系。

4.实验器材

1PC机(2C实验环境

Copyright© 2020 Anyang Institute of Technology.All rights reserved.

学院地址:河南省安阳市黄河大道西段