《高级语言程序设计(Ⅰ)》课程实验教学大纲
课程编号: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程序设计案例教程》,钟家民;清华大学出版社,2018年6月
2、《C程序设计(第四版)学习辅导》,谭浩强;清华大学出版社,2010年6月
3、《C程序设计(第四版)》,谭浩强;清华大学出版社,2010年6月
4、《C语言程序设计》,姬秀荔;清华大学出版社,2012年2月
5、《深入体验C语言项目开发)》,薛小龙;清华大学出版社,2011年7月
6、 http://acm.nyist.net/,南阳理工学院ACM在线评测系统
7、《机试考点 百签题解)》,郎六琪;吉林大学出版社,2012年4月
六、本大纲说明
本课程大纲是动态的,在实验过程中,可根据学生的程度适当调整实验的内容和时间。
撰写人: 周晏 审定人:钟家民
批准人: 执行时间:
实验1 顺序结构程序设计
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.实验器材
(1)PC机
(2)C实验环境
实验2 选择结构程序设计
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,否则保持不变。最后输出max和min的值。
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-2、3*x、4*x+1。既可以用独立的3条if语句实现,也可以用if语句的第三种形式实现,还可以用if嵌套语句实现。比较三种方法后,建议此类问题都采用用if语句的第三种形式实现。
2)参考程序
a.用独立的3条if语句实现
#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 没有折扣
250
s < 500 2%折扣
500
s < 1000 5%折扣
1000
s < 2000 8%折扣
2000
s < 3000 10%折扣
3000
s 15%折扣
1)编程提示
设每吨每千米货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费f的计算公式为f = p * w * s * (1 - d / 100)。
a.用if语句实现
这是一个分段函数,不同的域对应不同的折扣,选择条件分别为当s<250时,无折扣;当250
s < 500时,折扣d=2%;当500
s < 1000时,折扣d=5%; 当1000
s < 2000时,折扣d=8%; 当2000
s < 3000时,折扣d=10%; 当3000
s时,折扣d=15%。只需要将选择条件转换为关系表达式或逻辑表达式即可。因此,本题目既可以用独立的3条if语句实现,也可以用if语句的第三种形式实现,还可以用if嵌套语句实现。但此类问题使用if语句的第三种形式实现结构更清晰。
b.用switch语句实现
经过分析发现折扣的变化是有规律的:折扣的变化点都是250的倍数。利用这一点,定义c=s/250,当c<1时,表示s<250,无折扣;当1
c <2时,表示250
s < 500,折扣d=2%;
当2
c <4时,表示500
s < 1000,折扣d=5%; 当4
c <8时,表示1000
s < 2000,折扣d=8%; 当8
c <12时,表示2000
s < 3000,折扣d=10%; 当12
c 时,表示3000
s,折扣d=15%。
3.实验要求
(1)掌握赋值语句的使用方法;
(2)掌握数据的输入输出的方法,能正确使用各种格式转换符。
4.实验器材
(1)PC机
(2)C实验环境
实验3 循环结构程序设计
1.实验目的
(1)熟练掌握while、do-while和for三种循环控制语句,掌握循环结构程序设计和调试方法。
(2)掌握二重循环结构程序的设计方法。
2.实验内容
(1)求解猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,并又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩一个桃子了。求第一天共摘了多少桃子。
1)编程提示
猴子吃桃问题可用递推方法求解。设前一天开始时的桃子数为m,猴子吃掉之后剩余桃子数为n,则m和n存在如下关系:
n=m/2-1
已知第10天开始时只有一个桃子,根据上述关系,有如下递推数据:
第9天:n=1,m=2*(n+1)=4
第8天:n=4,m=2*(n+1)=10
第7天:n=10,m=2*(n+1)=22
第6天:n=22,m=2*(n+1)=46
……
按照上述递推过程,用while、do while与for循环语句求解猴子吃桃问题。
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=%d\n",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("继续输入下一个数据?(Y/N) ");
ask=getchar();
getchar();
if(ask!='y'&&ask!='Y')
break;
printf("\n");
}
printf("符合要求的整数个数为:%d\n",counter);
return 0;
}
(3)打印所有的“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身。例如153=13+53+33等。
编程提示:
a、用一重循环实现
“水仙花数”的取值范围100~999的三位整数
分离出每个三位整数的百位、十位、个位。
用百位数3+十位数3+个位数3的和与100~999的三位整数分别比较判断是否“水仙花数”。
b、用三重循环实现
① 分别设百位、十位、个位分别为i、j、k。
② 判断i*100+j*10+k与i*i*i+j*j*j+k*k*k是否相等判断是否“水仙花数”。
(4)无重复数字的3位数问题。用1、2、3、4等4个数字组成无重复数字的3位数,将这些3位数据全部输出。
编程提示:
① 可填在百位、十位、个位的数字都是1、2、3、4。
② 首先组成所有的排列,然后去掉不满足条件的排列。
③ 该问题可用三重循环实现。
3.实验要求
(1)掌握关系运算符和关系表达式、逻辑运算符和逻辑表达式的使用。
(2)掌握if语句的使用(包括if语句的嵌套)和switch语句的使用。
4.实验器材
(1)PC机
(2)C实验环境
实验4 数组
1.实验目的
(1)掌握一维数组和二维数组的定义、赋值和输入输出的方法。
(2)掌握字符数组和字符串函数的使用。
2.实验内容
(1)已知两个升序数组,将它们合并成一个升序数组并输出。
1)编程提示:利用已知条件(两数组A、B均为升序),循环在每个数组中均选取一个元素来对比,较小的放到新数组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,即当每行的第一个数和最后一个数为1。a[i][0]=a[i][i-1]=1,n为行数。除两边的数外,任何一个数为上两顶数之和,即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.实验器材
(1)PC机
(2)C实验环境
实验5 函数
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.实验器材
(1)PC机(2)C实验环境