C语言实验 哈尔滨工业大学计算机科学与技术学院 苏小红 sxh@hit.edu.cn
主教材: 苏小红等,《 C语言大学实用教程》,电子工业出版社,2004,8 苏小红等,《 C语言大学实用教程(第2版)》,电子工业出版社,2007,2 实验教材: 苏小红等,《C语言大学实用教程习题与实验指导》,电子工业出版社,2004,8 苏小红等,《C语言大学实用教程学习指导》,电子工业出版社,2007,4
实验内容
实验1: 熟悉上机环境和顺序结构编程练习——键盘输入与屏幕输出练习 问题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 C) ’1’,’2’,34 D) 12 34
实验1: 熟悉上机环境和顺序结构编程练习——键盘输入与屏幕输出练习 问题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); }
实验1: 熟悉上机环境和顺序结构编程练习——键盘输入与屏幕输出练习 问题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); }
实验1: 熟悉上机环境和顺序结构编程练习——键盘输入与屏幕输出练习 问题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); }
实验1: 熟悉上机环境和顺序结构编程练习——键盘输入与屏幕输出练习 问题5:要使上面程序的键盘输入无论用下面哪种格式输入数据,程序在屏幕上的输出结果都为’1’,’2’,34,则程序应修改程序中的哪条语句?怎样修改? 第一种输入方式:1,2,34↙(以逗号作为分隔符) 第二种输入方式:1 2 34↙(以空格作为分隔符) 第三种输入方式:1 2 34↙(以Tab键作为分隔符) 第四种输入方式:1↙ 2↙ 34↙(以回车符作为分隔符)
实验1: 熟悉上机环境和顺序结构编程练习——计算定期存款本利之和 设银行定期存款的年利率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 然后,计算并输出表达式的值 指定的运算符为 加(+) 减(-) 乘(*) 除(/)
例4.8 main() { 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); case '*': /*处理乘法*/ printf("%d * %d = %d\n", data1, data2, data1 * data2); case '/': /*处理除法*/ if (0 == data2) printf("Division by zero!\n"); else printf("%d/%d = %d\n", data1, data2, data1/data2); default: printf("Unknown operator! \n"); } 例4.8
实验2:选择结构编程练习 ——简单的计算器程序 本实验程序是在例4.8基础上,增加如下要求: (1)如果要求程序能进行浮点数的算术运算,程序应该如何修改? 如何比较实型变量data2和常数0是否相等? (2)如果要求输入的算术表达式中的操作数和运算符之间可以加入任意多空白符,那么程序如何修改? (3)(选作题)如果要求连续做多次算术运算,每次运算结束后,程序都给出提示: Do you want to continue(Y/N or y/n)? 如果用户输入Y或y时,程序继续进行其它算术运算,否则程序才退出运行状态。那么,程序如何修改?
实验2:选择结构编程练习 ——简单的计算器程序 语句 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 通过键入随机数种子,产生[0,100]之间的随机数 为函数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"); printf("counter = %d \n", counter); }
实验3:循环结构编程练习 ——猜数游戏 程序2:编程先由计算机“想”一个1到100之间的数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平,否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止。
实验3:循环结构编程练习 ——猜数游戏 程序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)); printf("counter = %d \n", counter); }
实验3:循环结构编程练习 ——猜数游戏 程序4:编程先由计算机“想”一个1到100之间的数请人猜,如果人猜对了,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平,且结束游戏,否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜中的话,则停止本次猜数,然后继续猜下一个数。每次运行程序可以反复猜多个数,直到操作者想停止时才结束。
实验4:函数编程练习 ——小学生加法考试题 程序1: 通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则显示“Not correct! Try again!”;
实验4:函数编程练习 ——小学生加法考试题 /* 函数功能: 计算两整型数之和,如果与用户输入的答案相同,则返回1,否则返回0 /* 函数功能: 计算两整型数之和,如果与用户输入的答案相同,则返回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) return 1; else return 0; } void Print(int flag) { if (flag) printf("Right!\n"); else printf("Not correct!\n"); }
实验4:函数编程练习 ——小学生加法考试题 程序2: 通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则显示“Not correct! Try again!”,直到做对为止;
实验4:函数编程练习 ——小学生加法考试题 main() { int a, b, answer; printf("Input a,b:"); scanf("%d,%d", &a, &b); answer = AddTest(a, b); Print(answer); } do{ }while (answer == 0);
实验4:函数编程练习 ——小学生加法考试题 程序3: 通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则提示重做,显示“Not correct! Try again!”,最多给三次机会,如果三次仍未做对,则显示“Not correct. You have tried three times! Test over!”程序结束;
实验4:函数编程练习 ——小学生加法考试题 main() { answer = AddTest(a, b); chance = 0; Print(answer, chance); } chance = 0; do{ chance++; }while (answer == 0 && chance < 3);
实验4:函数编程练习 ——小学生加法考试题 程序4: 连续做10道题,通过计算机随机产生两个1~10之间的加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则显示“Not correct!”,不给机会重做,10道题做完后,按每题10分统计总得分,然后打印出总分和做错的题目数量。
实验4:函数编程练习 ——小学生加法考试题 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魔方矩阵中,每一行、每一列、每一对角线上的元素之和都是相等的,试编写程序将这些魔方矩阵中的元素读到一个二维整型数组中,然后,检验其是否为魔方矩阵,并将其按如下格式显示到屏幕上。 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
实验5:数组编程练习 ——餐饮服务质量调查打分 有40个学生被邀请给自助餐厅的食品和服务质量打分(1~10等级),统计调查结果,并用*打印如下形式的统计结果直方图 Grade Count Histogram 1 5 ***** 2 10 ********** 3 7 ******* ...
实验5:数组编程练习 ——餐饮服务质量调查打分 提示 定义数组score存放打的分数 定义数组count为计数器(count[0]不用) 计算统计结果:设置一个循环,依次检查数组元素值score[i],是1则将数组元素count[1]加1,是2则将数组元素count[2]加1,依此类推 for (i=0; i<STUDENTS; i++) { count[score[i]] ++; } 打印统计结果,设置一个循环,按count数组元素的值,打印相应个数的符号’*’
实验6:一维数组和函数综合编程练习 ——学生成绩统计 从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别统计下列内容: (1)统计不及格人数并打印不及格学生名单; (2)统计成绩在全班平均分及平均分之上的学生人数并打印其学生名单; (3)统计各分数段的学生人数及所占的百分比;
实验6:一维数组和函数综合编程练习 ——学生成绩统计 提示: (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]++。
实验7:二维数组、函数和常用算法综合编程练习 ——成绩排名次 某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过30人参加考试。考试后要求: (1)计算每个学生的总分和平均分; (2)按总分成绩由高到低排出成绩的名次; (3)打印出名次表,表格内包括学生编号、各科分数、总分和平均分; (4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数
实验7:二维数组、函数和常用算法综合编程练习 ——成绩排名次 提示:用二维数组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);
实验8:数组、指针和函数综合编程练习 ——打印最高分和学号 程序2:用二维数组和指针变量作函数参数,编程打印3个班学生(假设每班4个学生)的某门课成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。 int FindMax(int score[CLASS][STU], int m, int *pRow, int *pCol);
实验8:数组、指针和函数综合编程练习 ——打印最高分和学号 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);
实验8:数组、指针和函数综合编程练习 ——打印最高分和学号 程序3:用指向二维数组第0行第0列元素的指针作函数参数,编写一个能计算任意m行n列的二维数组中的最大值,并指出其所在的行列下标值的函数,利用该函数计算3个班学生(假设每班4个学生)的某门课成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。 int FindMax(int *p, int m, int n, int *pRow, int *pCol);
实验8:数组、指针和函数综合编程练习 ——打印最高分和学号 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);
实验8:数组、指针和函数综合编程练习 ——打印最高分和学号 程序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结构体变量类型重新编写。 时:分:秒
实验9:结构体编程练习—— 在屏幕上模拟显示一个数字式时钟 void update(CLOCK *t) { t->second++; if (t->second == 60) t->second = 0; t->minute++; } if (t->minute == 60) t->minute = 0; t->hour++; if (t->hour == 24) t->hour = 0; void display(CLOCK *t) { printf("%2d:%2d:%2d\r", t->hour, t->minute, t->second); }
实验10:文件编程练习 ——文件拷贝 程序1:根据程序提示从键盘输入一个已存在的文本文件的完整文件名,并再输入一个新文本文件的完整文件名,然后编程将已存在文本文件中的内容全部拷贝到新文本文件中去,利用文本编辑软件,通过查看文件内容验证程序执行结果。
实验10:文件编程练习 ——文件拷贝 程序2:模拟DOS命令下的COPY命令,在DOS状态下键入命令行,以实现将一个已存在文本文件中的内容全部拷贝到新文本文件中去,利用文本编辑软件,通过查看文件内容验证程序执行结果。
实验10:文件编程练习 ——文件拷贝 程序3:(选作)根据提示从键盘输入一个已存在的文本文件的完整文件名,并再输入另一个已存在的文本文件的完整文件名,然后编程将第一个文本文件的内容追加到第二个文本文件的原内容之后,利用文本编辑软件,通过查看文件内容验证程序执行结果。
实验10:文件编程练习 ——文件拷贝 程序4:(选作)根据提示从键盘输入一个已存在的文本文件的完整文件名,并再输入另一个已存在的文本文件的完整文件名,然后编程将源文本文件的内容追加到目的文本文件的原内容之后,并编程实现在显示器上显示源文件和目的文件的文件内容,以此来验证程序执行结果。
课外实验题目 实验一 计算到期存款本息之和 已知银行整存整取存款不同期限的月息利率分别为: 实验一 计算到期存款本息之和 已知银行整存整取存款不同期限的月息利率分别为: 2.25% 期限一年 2.43% 期限二年 2.70% 期限三年 2.88% 期限五年 3.00% 期限八年 要求输入存钱的本金和期限,求到期时,能从银行得到的利息与本金的合计。 提示:用switch语句编程。
课外实验题目 实验二 存款预算 假设银行一年整存零取的月息为1.875%,现在某人手头有一笔钱,他打算在今后的五年中每年的年底取出1000元作为孩子来年的教育金,到第五年孩子毕业时刚好取完这笔钱,现在请你算一算第一年年初他应存入银行多少钱呢?
课外实验题目 实验二 存款预算 提示:分析存钱和取钱的过程可采用逆推的方法,然后采用迭代法求解。若第五年年底连本带息要取出1000元,则第五年年初银行中的存款数额y5应为: y5 = 1000 / (1 + 12 * 0.01875) 按题意,由第五年年初银行中的存款数额y5,求得第四年年初银行中的存款数额y4应为: y4 = (y5 + 1000) / (1 + 12 * 0.01875) 依此类推,可由第n+1年年初银行中的存款数额yn+1求得第n年年初银行中的存款数额y n为: y n = (y n+1 + 1000) / (1 + 12 * 0.01875) 以0作为y n+1的初值,对上式进行逆推迭代,迭代5次的结果即为第1年年初银行中的存款数额y 1,也就是他现在要存入银行的钱数。
课外实验题目 实验三 寻找最佳存款方案 已知银行整存整取存款不同期限的月息利率分别为: 实验三 寻找最佳存款方案 已知银行整存整取存款不同期限的月息利率分别为: 2.25% 期限一年 2.43% 期限二年 2.70% 期限三年 2.88% 期限五年 3.00% 期限八年 假设银行对定期存款过期部分不付利息,现在某人有2000元钱,要存20年,问怎样存才能使20年后得到的本利之和合计最多?
课外实验题目 实验三 寻找最佳存款方案 提示:为了得到最多的利息,存入银行的钱应在到期时马上就取出来,然后立刻将原来的本金和利息加起来再作为新的本金存入银行,这样本利不断地滚动直到满二十年为止。由于存款的利率不同,所以,不同的存款方法(年限)存二十年得到的利息也是不一样的。 分析题意,设2000元存20年,其中一年期存了n1次,二年期存了n2次,三年期存了n3次,五年期存了n5次,八年期存了n8次,则到期时存款人应得的本利之和为: 其中,rateN对应存款年限的利率。
课外实验题目 实验三 寻找最佳存款方案 根据题意,还可得到以下限制条件: 实验三 寻找最佳存款方案 根据题意,还可得到以下限制条件: 0 ≤ n8 ≤ 2 0 ≤ n5 ≤ (20 – 8 * n8) / 5 0 ≤ n3 ≤ (20 – 8 * n8 – 5 * n5) / 3 0 ≤ n2 ≤ (20 – 8 * n8 – 5 * n5 – 3 * n3) / 2 n1 = 20 – 8 * n8 – 5 * n5 – 3 * n3 – 2 * n2 采用穷举法穷举所有的n8,n5,n3,n2,n1组合,代入本利计算公式,计算得到所有的存款方案。 求最大存款方案的方法为:将现行存款方案与过去记录的最大存款方案max进行比较,若现行存款方案可得到的本利之和大,则记录现行存款方案(即n1,n2,n3,n5,n8的值)和本利之和的最大值max。
课外实验题目 实验四 抓交通肇事犯 一辆卡车违反了交通规则,撞人后逃逸。现场有三人目击事件,但都没有记住车号,只记住车号的一些特征。甲说:车号的前两位数字是相同的;乙说:车号的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号正好是一个整数的平方。现在请你根据以上线索帮助警方找出车号以便尽快破案。
课外实验题目 实验四 抓交通肇事犯 提示:假设这个四位数的前两位数字都是i,后两位数字都是j,则这个可能的四位数k为: 实验四 抓交通肇事犯 提示:假设这个四位数的前两位数字都是i,后两位数字都是j,则这个可能的四位数k为: k = 1000 * i + 100 * i + 10 * j + j 其中,i和j都在0~9之间变化。 现在还需使k满足是一个整数m的平方,由于k是一个四位数,所以,m值不可能小于31,因此,可从31开始试验是否满足k == m*m,若不满足,则m加1再试,直到找到满足这些限制条件的k为止结束测试。
课外实验题目 实验五 求解不等式 已知立方和不等式为: 对指定的n值,试求满足上述立方和不等式的m的整数解。 实验五 求解不等式 已知立方和不等式为: 13 + 23 + … + m3 < n 对指定的n值,试求满足上述立方和不等式的m的整数解。 提示:对指定的n值,设置累加求和的循环,从i=1开始,i递增1取值,把i*i*i累加到和变量sum中去,直到sum >= n时,利用break语句退出循环,打印出相应的结果。这里,因立方运算数值较大,n应定义为长整型。
课外实验题目 实验六 计算礼炮声响次数 为庆祝活动,现在,A、B、C三条军舰要同时开始鸣放礼炮各21响。已知A舰每隔5秒放1次,B舰每隔6秒放1次,C舰每隔7秒放1次。假设各炮手对时间的掌握非常准确,那么请问观众总共可以听到几次礼炮声呢?
课外实验题目 实验六 计算礼炮声响次数 提示:用n作为听到的礼炮声响的计数器,用t表示时间,从第0秒开始放第1响,到放完最后一响,最长时间为20*7,因此,可以用一个for循环来模拟每一秒钟的时间变化,即t从0开始循环到t>20*7时结束。在循环体中判断:如果时间t是5的整数倍且21响未放完,则A舰放一响,计数器n加1;如果时间t是6的整数倍且21响未放完,则B舰放一响,计数器n加1;如果时间t是7的整数倍且21响未放完,则C舰放一响,计数器n加1。但要注意:当有两舰或三舰同时鸣放时,应作1响统计,即n不能同时计数,只要有一个执行了计数,其它两个就不能再进行计数。 利用continue语句编程实现。
课外实验题目 实验七 产值翻番 假设当年产值为100,工业产值的增长率为每年c%,当c分别为6,8,10,12时,试求工业产值分别过多少年可实现翻番(即增加一倍)。
课外实验题目 实验七 产值翻番 提示:增长率存于数组c[i]中,并用6,8,10,12初始化。产值翻番所需年数存于变量y中,各年对应的产值存于变量s中。设置i的循环,对增长率c[i],设产值翻番所需年数为y,年数y每增1一次,产值的计算方法为: s = s * (1 + c[i] / 100.0) 利用迭代法计算,执行循环,计算下一年产值,并增长年数,直到s[i] >= 200时为止,当s[i] >= 200时,表示已达到翻番,继续对下一个增长率计算翻番所需的年数,对所有增长率全部计算完后,打印相应的增长率、翻番所需年数以及翻番后的产值。
课外实验题目 实验八 简单的口令检查程序 按下述要求编写口令检查程序(假设正确的口令为8888)。 实验八 简单的口令检查程序 按下述要求编写口令检查程序(假设正确的口令为8888)。 (1)若输入口令正确,则提示“You are welcom!”,程序结束; (2)若输入口令不正确,则提示“Wrong passward!”,同时检查口令是否已输入三次,若未输入三次,则提示”Enter again:”,且允许用户再次输入口令,相反,若已输入了三次,则提示“You have entered three times! You are not welcom!”, 且不允许用户再输入口令,程序结束。
课外实验题目 实验八 简单的口令检查程序 提示:设置一个计数器,每输入一次口令,计数器计数一次,同时,设置标志变量flag,当输入口令正确或虽然输入不正确但已输入三次时,置标志变量flag置为0,不允许再输入,结束程序,反之,如果标志变量未发生改变(即为1)时,则请求用户继续输入口令。
课外实验题目 实验九 大奖赛现场统分 以往各类大奖赛的报分与统分脱节,参赛选手的最后得分总要等到下一个选手赛完后才报,影响竞赛的正常节奏,也不能满足观众的期待心理。现在请你为某大奖赛编写一个现场统分的程序,在各评委打分之后,及时通报评分结果,同时,为了给评委一个约束,有利于竞赛评判的公正,要求增加给评委打分和排序的功能。
课外实验题目 实验九 大奖赛现场统分 已知:某大奖赛有n个选手参赛,m(m>2)个评委为依次参赛的选手评判打分:最高10分,最低0分。统分规则为:每个选手所得的m个得分中,去掉一个最高分,去掉一个最低分,然后平均为该选手的最后得分。要求编程: (1)根据n个选手的最后得分,从高到低排出名次表,以便确定获奖名单; (2)根据各选手的最后得分与各评委给该选手所评分的差距,给各个评委评分的准确性一个定量的评价。
课外实验题目 实验九 大奖赛现场统分 提示:设置5个数组:sh[i]为第i个选手的编号,sf[i]为第i个选手的最后得分,ph[j]为第j个评委的编号,f[i][j]为第j个评委给第i个选手的评分,pf[j]为第j个评委的得分,作为评委评分水准的代表。 (1)对n个参赛选手设置i循环(i从1变化到n):第i个选手上场,输入该选手的编号sh[i],在j循环(j从1变化到m)中依次输入第i个选手的m个得分f[i][j],每一个得分f[i][j]都累加到sf[i]中,同时比较:若f[i][j] > max,则max = f[i][j];若f[i][j] < min,则min = f[i][j]。当第i个选手的m个得分输入完毕,去掉一个最高分max,去掉一个最低分min,第i个选手的最后得分于是为: sf[i] = (sf[i] – max – min) / (m - 2) n个参赛选手的最后得分sf[0]、sf[1]、…、sf[n]全部计算完后,将其从高到低排序,打印参赛选手的名次表。
课外实验题目 实验九 大奖赛现场统分 提示:设置5个数组:sh[i]为第i个选手的编号,sf[i]为第i个选手的最后得分,ph[j]为第j个评委的编号,f[i][j]为第j个评委给第i个选手的评分,pf[j]为第j个评委的得分,作为评委评分水准的代表。 (2)评委给选手评分存在误差即f[i][j] ≠ sf[i]是正常的,也是允许的。但如果某个评委给每个选手的评分与各选手的最后得分都相差太多,则说明该评委的评分有失水准。可用下面的公式计算结果作为对各个评委评分水准的定量评价。 pf[j]高的评委的评判水平高,依据m个评委的pf[j]值可打印出评委评判水平高低的名次表。
课外实验题目 实验十 递归程序设计练习 ——求游戏人员的年龄 实验十 递归程序设计练习 ——求游戏人员的年龄 有5个人围坐在一起,问第五个人多大年纪,他说比第4个人大2岁;问第4个人,他说比第3个人大2岁;问第3个人,他说比第2个人大2岁;问第2个人,他说比第1个人大2岁。第一个人说自己10岁,问第5个人多大年纪。
课外实验题目 实验十 递归程序设计练习——求游戏人员的年龄 提示:此程序为递归问题,递归公式为:
课外实验题目 实验十 递归程序设计练习——计算最大公约数 利用计算最大公约数的三条性质,用递归方法计算两个整数的最大公约数。 实验十 递归程序设计练习——计算最大公约数 利用计算最大公约数的三条性质,用递归方法计算两个整数的最大公约数。 性质1:如果x>y,则x和y的最大公约数与x-y和y的最大公约数相同,即 性质2:如果y>x,则x和y的最大公约数与x和y-x的最大公约数相同,即 性质3:如果x=y,则x和y的最大公约数与x值和y值相同,即