哈尔滨工业大学c语言实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

哈尔滨工业大学计算机科学与技术学院
苏小红
sxh@
主教材:
苏小红等,《C语言大学实用教程》,电子工业出版社,2004,8
苏小红等,《C语言大学实用教程(第2版)》,电子工业出版社,2007,2
实验教材:
苏小红等,《C语言大学实用教程习题与实验指导》,电子工业出版社,2004,8
苏小红等,《C语言大学实用教程学习指导》,电子工业出版社,2007,4
实验内容
问题1:要使下面程序的输出语句在屏幕上显示1,2,34,则从键盘输入的数据格式应为以下备选答案中的哪一个?
#include <stdio.h>
main()
{
char a,b;
int c;
scanf("%c%c%d",&a,&b,&c);
printf("%c,%c,%d\n",a,b,c);
}
A) 1 2 34 B) 1, 2, 34
问题2:与上面程序的键盘输入相同的情况下,要使上面程序的输出语句在屏幕上显示1 2 34,则应修改程序中的哪条语句?怎样修改?
#include <stdio.h>
main()
{
char a,b;
int c;
scanf("%c%c%d",&a,&b,&c);
printf("%c,%c,%d\n",a,b,c);
}
练习——键盘输入与屏幕输出练习
问题3:要使上面程序的键盘输入数据格式为1,2,34,输出语句在屏幕上显示的结果也为1,2,34,则应修改程序中的哪条语句?怎样修改?
#include <stdio.h>
main()
{
char a,b;
int c;
scanf("%c%c%d",&a,&b,&c);
printf("%c,%c,%d\n",a,b,c);
}
练习——键盘输入与屏幕输出练习问题4:要使上面程序的键盘输入数据格式为1,2,34,而输出语句在屏幕上显示的结果为
’1’,’2’,34,则应修改程序中的哪条语句?怎样修改?
–[提示:利用转义字符输出字符单引号字符。

]
#include <stdio.h>
main()
{
char a,b;
int c;
scanf("%c%c%d",&a,&b,&c);
printf("%c,%c,%d\n",a,b,c);
}
练习——键盘输入与屏幕输出练习问题5:要使上面程序的键盘输入无论用下面哪种格式输入数据,程序在屏幕上的输出结果都为’1’,’2’,34,则程序应修改程序中的哪条语句?怎样修改?
–第一种输入方式:1,2,34↙(以逗号作为分隔符)
–第二种输入方式:1 2 34↙(以空格作为分隔符)
–第三种输入方式:1 2 34↙(以Tab 键作为分隔
符)
–第四种输入方式:1↙
2↙
34↙(以回车符作为分隔符)
练习——计算定期存款本利之和设银行定期存款的年利率rate为2.25%,并已知存款期为n年,存款本金为capital元,试编程计算n年后的本利之和deposit。

要求定期存款的年利率rate、存款期n和存款本金capital均由键盘输入。

实验2:选择结构编程练习
——身高预测
每个做父母的都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后身高的因素有遗传、饮食习惯与坚持体育锻炼等。

小孩成人后身高与其父母身高和自身性别密切相关。

设faHeight为其父身高,moHeight为其母身高,身高预测公式为:
–男性成人时身高= (faHeight + moHeight) * 0.54(cm)
–女性成人时身高= (faHeight * 0.923 + moHeight) / 2(cm)此外,如果喜爱体育锻炼,那么可增加身高2%,如果有良好的卫生饮食习惯,那么可增加身高1.5%。

实验2:选择结构编程练习
——身高预测
编程从键盘输入你的性别(用字符型变量sex存储,输入字符F表示女性,输入字符M表示男性)、父母身高(用实型变量存储,faHeight为其父身高,moHeight为其母身高)、是否喜爱体育锻炼(用字符型变量sports存储,输入字符Y表示喜爱,输入字符N表示不喜爱)、是否有良好的饮食习惯等条件(用字符型变量diet存储,输入字符Y表示喜爱,输入字符N表示不喜爱),利用给定公式和身高预测方法对你的身高进行预测。

实验2:选择结构编程练习
——简单的计算器程序
要求用switch语句编程设计一个简单的计算器程序。

要求根据用户从键盘输入的表达式:
操作数1 运算符op 操作数2
计算表达式的值,指定的算术运算符为加(+)、减(-)、乘(*)、除(/)。

例4.8:计算器程序
编程设计一个简单的计算器程序,要求根据用户从键盘输入如下形式的表达式:
操作数1 运算符op 操作数2
然后,计算并输出表达式的值
指定的运算符为
加(+)
减(-)
乘(*)
除(/)
main ()
{
例4.8 int data1, data2; /*定义两个操作符*/
char op; /*定义运算符*/
printf("Please enter the expression:");
scanf("%d%c%d", &data1, &op, &data2); /*输入运算表达式*/
switch (op)
{
case '+': /*处理加法*/
printf("%d + %d = %d\n", data1, data2, data1 + data2);
break ;
case '-': /*处理减法*/
printf("%d -%d = %d\n", data1, data2, data1 -data2);
break ;
case'*': /*处理乘法*/
printf("%d * %d = %d\n", data1, data2, data1 * data2);
break ;
case'/': /*处理除法*/
if (0 == data2)
printf("Division by zero!\n");
else
printf("%d/%d = %d\n", data1, data2, data1/data2);
break ;
default:
printf("Unknown operator! \n");
本实验程序是在例4.8基础上,增加如下要求:
–(1)如果要求程序能进行浮点数的算术运算,程序应该如何修改?如何比较实型变量data2和常数0是否相等?–(2)如果要求输入的算术表达式中的操作数和运算符之间可以加入任意多空白符,那么程序如何修改?
–(3)(选作题)如果要求连续做多次算术运算,每次运算结束后,程序都给出提示:
Do you want to continue(Y/N or y/n)?
–如果用户输入Y或y时,程序继续进行其它算术运算,否则程序才退出运行状态。

那么,程序如何修改?
语句if (0 == data2)的必要性
–1998年11月《科学美国人》杂志,描述了美国导弹巡洋舰约克敦号上的一起事故,除零错导致军舰推进系统的关闭
如果要求程序能进行浮点数的算术运算,语句if (0 == data2)还能用于比较实型变量data2和
常数0的大小吗?
–if (fabs(data2) <= 1e-7)
如果要求输入的算术表达式中的操作数和运算符之间可以加入任意多个空格符,那么程序如何修改?–scanf("%d%c%d", &data1, &op, &data2);
–scanf("%d%1s%d", &data1, &op, &data2);
实验3:循环结构编程练习
——猜数游戏
在这个实验中,我们将尝试编写一个猜数游戏程序,这个程序看上去有些难度,但是如果你按下列要求以循序渐进方式进行编程实现,你就会发现其实这个程序是很容易实现的。

先编写第一个程序,然后试着在第一个程序的基础上编写第二个程序,……。

程序1:编程先由计算机“想”一个1到100之间的数请人猜,如果人猜对了,则计算机给出提示:“Right!”,否则提示:“Wrong!”,并告诉人所猜的数是大(Too high)还是小(Too low),然后结束游戏。

要求每次运行程序时机器所“想”的数不能都是一样的。

猜数游戏用到的库函数
随机函数srand
–为函数rand()设置随机数种子来实现对函数rand所产生的伪随机数的“随机化”
通过键入随机数种子,产生[0,100]之间的随机数scanf("%u", &seed);
srand(seed);
magic = rand() % 100 + 1;
#include<stdlib.h>
#include<stdio.h>
main()
{
int magic;
int guess;
int counter;
unsigned int seed;
printf("Please enter seed:");
scanf("%u", &seed);
srand(seed);
magic = rand() % 100 + 1;
counter = 0;
do{
printf("Please guess a magic number:");
scanf("%d", &guess);
counter ++;
if(guess > magic)
printf("Wrong! Too high!\n");
else if(guess < magic)
printf("Wrong! Too low!\n");
}while(guess != magic);
printf("Right!\n");
printf("counter = %d \n", counter);
猜数游戏用到的库函数
使用计算机读取其时钟值并把该值自动设置为随机数种子,产生[0,100]之间的随机数
函数time()返回以秒计算的当前时间值,该值被转换为无符号整数并用作随机数发生器的种子
#include <time.h>
srand(time(NULL));
magic = rand() % 100 + 1;
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
main()
{
int magic;
int guess;
int counter;
srand(time(NULL));
magic = rand() % 100 + 1;
counter = 0;
do{
printf("Please guess a magic number:");
scanf("%d", &guess);
counter ++;
if(guess > magic)
printf("Wrong! Too high!\n");
else if(guess < magic)
printf("Wrong! Too low!\n");
}while(guess != magic);
printf("Right!\n");
程序2:编程先由计算机“想”一个1到100之间的数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平,否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止。

程序3:编程先由计算机“想”一个1到100之间的数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平,否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜中的话,则结束游戏。

#include<stdlib.h>
#include<stdio.h>
#include<time.h>
main()
{
int magic;
int guess;
int counter;
srand(time(NULL));
magic = rand() % 100 + 1;
counter = 0;
do{
printf("Please guess a magic number:");
scanf("%d", &guess);
counter ++;
if(guess > magic)
printf("Wrong! Too high!\n");
else if(guess < magic)
printf("Wrong! Too low!\n");
else
printf("Right!\n");
}while((guess != magic) && (counter < 10));
程序4:编程先由计算机“想”一个1到100之间的数请人猜,如果人猜对了,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平,且结束游戏,否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜中的话,则停止本次猜数,然后继续猜下一个数。

每次运行程序可以反复猜多个数,直到操作者想停止时才结束。

实验3:循环结构编程练习——猜数游戏
程序1:
通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则显示“Not correct! Try again!”;
/* 函数功能:计算两整型数之和,如果与用户输入的答案相同,则返回1,否则返回0
函数参数:整型变量a和b,分别代表被加数和加数
函数返回值:当a加b的结果与用户输入的答案相同时,返回1,否则返回0 */
int AddTest(int a, int b)
{
int answer;
printf("%d+%d=", a, b);
scanf("%d", &answer);
if(a+b == answer)
return1;
else
return0;
}void Print(int flag)
{
if (flag)
printf("Right!\n");
else
程序2:
通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则显示“Not correct! Try again!”,直到做对为止;
main(){int a, b, answer;printf("Input a,b:");scanf("%d,%d ", &a, &b); answer = AddTest(a, b);Print(answer);}do { }while
(answer == 0);
程序3:
通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则提示重做,显示“Not correct! Try again!”,最多给三次机会,如果三次仍未做对,则显示“Not correct. You have tried three times! Test over!”程序结束;
main()
{
answer = AddTest(a, b);
Print(answer , chance);
}
chance = 0;
do { chance++;
}while (answer == 0 && chance < 3
);
程序4:
连续做10道题,通过计算机随机产生两个1~10之间的加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则显示“Not correct!”,不给机会重做,10道题做完后,按每题10分统计总得分,然后打印出总分和做错的题目数量。

srand(time(NULL));
error = 0;
score = 0;
for(i=0; i<10; i++)
{
a = rand()%10 + 1;
b = rand()%10 + 1;
answer = AddTest(a, b);
Print(answer);
if(answer == 1)
score = score + 10;
else
error++;
}
实验5:数组编程练习
——检验并打印魔方矩阵
在下面的5×5魔方矩阵中,每一行、每一列、每一对角线上的元素之和都是相等的,试编写程序将这些魔方矩阵中的元素读到一个二维整型数组中,然后,检验其是否为魔方矩阵,并将其按如下格式显示到屏幕上。

17241815
23571416
46132022
101219213
11182529
有40个学生被邀请给自助餐厅的食品和服务质量打分(1~10等级),统计调查结果,并用*打印如下形式的统计结果直方图
Grade Count Histogram
15*****
210**********
37*******
...
提示
–定义数组score存放打的分数
–定义数组count为计数器(count[0]不用)
–计算统计结果:设置一个循环,依次检查数组元素值
score[i],是1则将数组元素count[1]加1,是2则将数组元素count[2]加1,依此类推
for(i=0; i<STUDENTS; i++)
{
count[score[i]] ++;
}
–打印统计结果,设置一个循环,按count数组元素的值,打印相应个数的符号’*’
练习——学生成绩统计
从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别统计下列内容:
–(1)统计不及格人数并打印不及格学生名单;–(2)统计成绩在全班平均分及平均分之上的学生人数并打印其学生名单;
–(3)统计各分数段的学生人数及所占的百分比;
练习——学生成绩统计
提示:
–(1)用num[i]存放第i+1个学生的学号,用score[i]存放第i+1个学生的成绩。

设置计数器count,当score[i]<60分时,计数器count计数一次,并打印num[i]和score[i]。

–(2)先计算全班平均分aver,当第i个学生的成绩
score[i]>=aver时,打印num[i]和score[i]。

–(3)将成绩分为六个分数段,60分以下为第0段,
60~69为第1段,70~79为第2段,80~89为第3段,90~99为第4段,100分为第5段,因此,成绩与分数段的对应关系为:
各分数段的学生人数保存在数组stu中,用stu[i]存放第i段的学
生人数。

对于每个学生的成绩,先计算出该成绩所对应的分
数段,然后将相应的分数段的人数加1,即stu[i]++。

法综合编程练习——成绩排名次某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过30人参加考试。

考试后要求:
–(1)计算每个学生的总分和平均分;
–(2)按总分成绩由高到低排出成绩的名次;
–(3)打印出名次表,表格内包括学生编号、各科
分数、总分和平均分;
–(4)任意输入一个学号,能够查找出该学生在班
级中的排名及其考试分数
法综合编程练习——成绩排名次
提示:用二维数组score存放每个学生各门课程的成绩,用一维数组num存放每个学生的学号,用一维数组sum存放每个学生的总分,用一维数组aver存放每个学生的平均分。

–(1)用函数编程实现计算每个学生的总分;
–(2)用函数编程实现按总分由高到低对学生成绩排序,注意:排序时,一维数组sum元素的变化应连同二维数组score和一维数组num和aver一起变化;
–(3)用函数编程实现查找学号为k的学生在班级中的排名名次及相关成绩等信息,找不到时返回-1值。

实验8:数组、指针和函数综合编程练习——打印最高分和学号假设每班人数最多不超过40人,具体人数由键盘输入,试编程打印最高分及其学号。

程序1:用一维数组和指针变量作函数参数,编程打印某班一门课成绩的最高分和学号。

–int FindMax(int score[], long num[], int n, long *pMaxNum);
/* 函数功能:计算最高分及最高分学生的学号
函数参数:整型数组score,存储学生的成绩
长整型数组num,存储学生的学号
长整型指针变量pMaxNum,存储求出来的最高分学生的学号函数返回值:最高分
*/
int FindMax(int score[], long num[], int n, long *pMaxNum) {
int i;
int maxScore;
maxScore = score[0];
*pMaxNum = num[0];
for (i=1; i<n; i++)
if (score[i] > maxScore)
{
maxScore = score[i];
*pMaxNum = num[i];
}
return (maxScore);
}
程练习——打印最高分和学号程序2:用二维数组和指针变量作函数参数,编程打印3个班学生(假设每班4个学生)的某门课成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。

–int FindMax(int score[CLASS][STU],
int m, int *pRow, int *pCol);
程练习——打印最高分和学号
int FindMax(int score[][STU], int m, int *pRow, int *pCol) {
int i, j, maxScore;
maxScore = score[0][0];
*pRow = 0;
*pCol = 0;
for (i = 0; i<m; i++)
{
for (j = 0; j<STU; j++)
{
if (score[i][j] > maxScore)
{
maxScore = score[i][j];
*pRow = i;
*pCol = j;
}
}
}
return (maxScore);
程练习——打印最高分和学号程序3:用指向二维数组第0行第0列元素的指针作函数参数,编写一个能计算任意m行n列的二维数组中的最大值,并指出其所在的行列下标值的函数,利用该函数计算3个班学生(假设每班4个学生)的某门课成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。

–int FindMax(int *p, int m, int n,
int *pRow, int *pCol);
程练习——打印最高分和学号
int FindMax(int *p, int m, int n, int *pRow, int *pCol) {
int i, j, maxScore;
maxScore = p[0];
*pRow = 0;
*pCol = 0;
for (i = 0; i<m; i++)
{
for (j = 0; j<n; j++)
{
if (p[i*n+j] > maxScore)
{
maxScore = p[i*n+j];
*pRow = i;
*pCol = j;
}
}
}
return (maxScore);
程练习——打印最高分和学号程序4:编写一个能计算任意m行n列的二维数组中的最大值,并指出其所在的行列下标值的函数,利用该函数和动态内存分配方法,计算任意m个班、每班n个学生的某门课成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。

–int FindMax(int *p, int m, int n,
int *pRow, int *pCol);
实验9:结构体编程练习——
在屏幕上模拟显示一个数字式时钟
定义一个时钟结构体类型:
struct clock
{
int hour;
时:分:秒
int minute;
int second;
};
typedef struct clock CLOCK;
然后,将下列用全局变量编写的时钟模拟显示程序改成用CLOCK 结构体变量类型重新编写。

void update(CLOCK *t) {
t->second++;
if(t->second == 60)
{
t->second = 0;
t->minute++;
}
if(t->minute == 60)
{
t->minute = 0;
t->hour++;
}void display(CLOCK *t) {
printf("%2d:%2d:%2d\r",
t->hour,
t->minute,
t->second);
}
实验9:结构体编程练习——
在屏幕上模拟显示一个数字式时钟
实验10:文件编程练习
——文件拷贝
程序1:根据程序提示从键盘输入一个已存在的文本文件的完整文件名,并再输入一个新文本文件的完整文件名,然后编程将已存在文本文件中的内容全部拷贝到新文本文件中去,利用文本编辑软件,通过查看文件内容验证程序执行结果。

相关文档
最新文档