高级语言程序设计课程第四次个人作业
高级语言程序设计课程第四次个人作业
- 这个作业属于哪个课程:2024高级语言程序设计
- 这个作业要求在哪里:高级语言程序设计课程第四次个人作业
- 学号:032201218
- 姓名:陈彦哲
一、编写并运行书本第6章6.16编程练习题目中的第1,5,7,8,9,10,12,13,15,16,18题
6.16.1
题目:
编写一个程序,创建一个包含26个元素的数组,并在其中储存26个小写字母。然后打印数组的所有内容。
#include <stdio.h>
int main(){
char a[26];
for(int i=0;i<26;i++){
a[i]=97+i;
}
for(int i=0;i<26;i++){
printf("%c\n",a[i]);
}
return 0;
}
思路:
根据题意理解即可。
问题:无
解决:无
6.16.5
题目:
编写一个程序,提示用户输入大写字母。使用嵌套循环以下面金字塔 型的格式打印字母:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
打印这样的图形,要根据用户输入的字母来决定。例如,上面的图形是在用户输入E后的打印结果。
#include <stdio.h>
int main(){
char a;
printf("请输入一个大写字母:");
scanf("%c",&a);
int line=a-65+1;
for(int i=1;i<=line;i++){
for(int j=0;j<line-i;j++){
printf(" ");
}
for(int k=1;k<=i;k++){
printf("%c",64+k);
}
for(int l=i-1;l>=1;l--){
printf("%c",64+l);
}
printf("\n");
}
}
思路:按题意理解即可
问题:无
解决:无
6.16.7
题目:编写一个程序把一个单词读入一个字符数组中,然后倒序打印这个单
词。提示:strlen()函数(第4章介绍过)可用于计算数组最后一个字符的下
标。
#include <stdio.h>
#include <string.h>
#define N 10000
int main(){
char a[N];
scanf("%s",&a);
for(int i=strlen(a)-1;i>=0;i--){
printf("%c",a[i]);
}
return 0;
}
思路:按题意理解即可
问题:无
解决:无
6.16.8
题目:编写一个程序,要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果。在用户输入非数字之前,程序应循环处理用户输入的每对值。
#include <stdio.h>
#include <string.h>
int main(){
double a,b;
printf("请输入两个浮点数:");
while (scanf("%lf %lf", &a, &b) == 2){
printf("%lf\n",(a-b)/(a*b) );
printf("请输入两个浮点数(输入非数字时退出):");
}
return 0;
}
思路:按题意理解即可
问题:不知道怎么实现对输入是否为浮点数的检测
解决:查询资料之后选择了下面这样的方法,即通过成功读取的浮点数类型的个数来判定是否输入了非数字字符
while (scanf("%f %f", &i, &l) == 2) // scanf的返回值是成功读的浮点类型数据的个数,即2
6.16.9
题目:修改练习8,使用一个函数返回计算的结果。
#include <stdio.h>
#include <string.h>
double cal(double a,double b){
return (a-b)/(a*b);
}
int main(){
double a,b;
printf("请输入两个浮点数:");
while (scanf("%lf %lf", &a, &b) == 2){
printf("%lf\n",cal(a,b) );
printf("请输入两个浮点数(输入非数字时退出):");
}
return 0;
}
思路:按题意理解即可
问题:无
解决:无
6.16.10
题目:编写一个程序,要求用户输入一个上限整数和一个下限整数,计算 从上限到下限范围内所有整数的平方和,并显示计算结果。然后程序继续提 示用户输入上限和下限整数,并显示结果,直到用户输入的上限整数小于下限整数为止。
程序的运行示例如下:
Enter lower and upper integer limits: 5 9
The sums of the squares from 25 to 81 is 255
Enter next set of limits: 3 25
The sums of the squares from 9 to 625 is 5520
Enter next set of limits: 5 5
Done
#include <stdio.h>
#include <string.h>
int main(){
int a,b;
printf("Enter lower and upper integer limits:");
while (scanf("%d %d", &a, &b)&&a<b){
int sum=0;
for(int i=a;i<=b;i++){
sum+=i*i;
}
printf("The sums of the squares from %d to %d is %d\n",a*a,b*b,sum);
printf("Enter lower and upper integer limits:");
}
printf("Done");
return 0;
}
思路:按题意理解即可
问题:无
解决:无
6.16.12
题目:考虑下面两个无限序列:
1.0 + 1.0/2.0 + 1.0/3.0 + 1.0/4.0 + ...
1.0 - 1.0/2.0 + 1.0/3.0 - 1.0/4.0 + ...
编写一个程序计算这两个无限序列的总和,直到到达某次数。提示:奇数个-1 相乘得-1,偶数个-1相乘得1。让用户交互地输入指定的次数,当用 户输入0或负值时结束输入。查看运行100项、1000项、10000项后的总和, 是否发现每个序列都收敛于某值?
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(){
int n;
printf("请输入一个整数:");
while(scanf("%d",&n)&&n>0){
double sum1=0;
double sum2=0;
for(int i=0;i<n;i++){
//printf("%d\n",i);
sum1+=1.0/(i+1);
sum2+=pow(-1,i)*1.0/(i+1);
}
printf("累加%d次后\n",n);
printf("1.0 + 1.0/2.0 + 1.0/3.0 + 1.0/4.0 + ... = %lf\n",sum1);
printf("1.0 - 1.0/2.0 + 1.0/3.0 - 1.0/4.0 + ... = %lf\n",sum2);
printf("请输入一个整数:");
}
return 0;
}
答案:全加的数列不收敛,有加有减的数列收敛
思路:按题意理解即可
问题:无
解决:无
6.16.13
题目:编写一个程序,创建一个包含8个元素的int类型数组,分别把数组元素设置为2的前8次幂。使用for循环设置数组元素的值,使用do while循环显示数组元素的值。
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(){
int a[8];
for(int i=0;i<8;i++){
a[i]=pow(2,i+1);
}
int i=0;
do{
printf("%d\n",a[i]);
i++;
}while(i<8);
return 0;
}
思路:按题意理解即可
问题:无
解决:无
6.16.15
题目:编写一个程序,读取一行输入,然后把输入的内容倒序打印出来。 可以把输入储存在char类型的数组中,假设每行字符不超过255。回忆一 下,根据%c转换说明,scanf()函数一次只能从输入中读取一个字符,而且 在用户按下Enter键时scanf()函数会生成一个换行字符(\n)。
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(){
char s[300];
fgets(s,sizeof(s),stdin);
int len=strlen(s);
//printf("%d",len);
for(int i=len-2;i>=0;i--){
printf("%c",s[i]);
}
return 0;
}
思路:按题意理解即可
问题:忘记了怎么一次性读取一行
解决:查了一下资料,发现可以用if (fgets(buffer, sizeof(buffer), stdin) != NULL)
来解决
6.16.16
题目:Daphne以10%的单利息投资了100美元(也就是说,每年投资获利相当于原始投资的10%)。Deirdre以 5%的复合利息投资了 100 美元(也就是说,利息是当前余额的 5%,包含之前的利息)。编写一个程序,计算需要多少年Deirdre的投资额才会超过Daphne,并显示那时两人的投资额。
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(){
double da=100,de=100;
int cnt=0;
while(1){
da+=100*0.1;
de*=1.05;
cnt++;
if(de>da){
printf("第%d年超过了",cnt);
break;
}
}
return 0;
}
思路:按题意理解即可
问题:无
解决:无
6.16.18
题目:Rabnud博士加入了一个社交圈。起初他有5个朋友。他注意到他的朋 友数量以下面的方式增长。第1周少了1个朋友,剩下的朋友数量翻倍;第2 周少了2个朋友,剩下的朋友数量翻倍。一般而言,第N周少了N个朋友,剩 下的朋友数量翻倍。编写一个程序,计算并显示Rabnud博士每周的朋友数 量。该程序一直运行,直到超过邓巴数(Dunbar’s number)。邓巴数是粗略 估算一个人在社交圈中有稳定关系的成员的最大值,该值大约是150。
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(){
int f=5;
for(int i=1;f<=150;i++){
f-=i;
f*=2;
printf("第%d周Rabnud博士的朋友数量为:%d\n",i,f);
}
return 0;
}
思路:按题意理解即可
问题:无
解决:无
二、编写并运行书本第7章7.12编程练习题目中的第1,2,4~11题
7.12.1
题目:编写一个程序读取输入,读到#字符停止,然后报告读取的空格数、 换行符数和所有其他字符的数量。
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
char c;
int s=0,e=0,o=0;
while((c=getchar())!='#')
{
if(c==' '){
s++;
}
else if(c=='\n'){
e++;
}
else{
o++;
}
}
printf("空格数:%d\n", s);
printf("换行符数:%d\n", e);
printf("其他字符数:%d\n", o);
return 0;
}
思路:按题意理解即可
问题:无
解决办法:无
7.12.2
题目:编写一个程序读取输入,读到#字符停止。程序要打印每个输入的字符以及对应的ASCII码(十进制)。一行打印8个字符。建议:使用字符计数 和求模运算符(%)在每8个循环周期时打印一个换行符。
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
int k=0;
char s[300];
char ch;
while((ch = getchar())!='#'){
s[k]=ch;
k++;
}
for(int i=0;i<k;i++)
{
printf("%c-%d ", s[i], s[i]);
if ((i+1) % 8 == 0){
printf("\n");
}
}
return 0;
}
思路:按题意理解即可
问题:无
解决:无
7.12.4
题目:
使用if else语句编写一个程序读取输入,读到#停止。用感叹号替换句号,用两个感叹号替换原来的感叹号,最后报告进行了多少次替换。
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
char s[300];
char ch;
int cnt=0;
for(int i=0;(ch=getchar())!='#';i++)
{
if (ch == '.')
{
s[i] = '!';
cnt++;
}
else if (ch == '!')
{
s[i] = '!';
i++;
s[i] = '!';
cnt++;
}
else
s[i] = ch;
}
printf("发生了%d次替换\n换后字符串为:\n", cnt);
for (int j=0; j<strlen(s); j++){
printf("%c", s[j]);
}
return 0;
}
思路:按题意理解即可
问题:无
解决:无
7.12.5
题目:使用switch重写练习4。
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
char s[300];
char ch;
int cnt=0;
for(int i=0;(ch=getchar())!='#';i++)
{
switch (ch)
{
case '.':
s[i] = '!';
cnt++;
break;
case '!':
s[i] = '!';
i++;
s[i] = '!';
cnt++;
break;
default:
s[i] = ch;
break;
}
}
printf("发生了%d次替换\n换后字符串为:\n", cnt);
for (int j=0; j<strlen(s); j++){
printf("%c", s[j]);
}
return 0;
}
思路:按题意理解即可
问题:无
解决:无
7.12.6
题目:
编写程序读取输入,读到#停止,报告ei出现的次数。 注意该程序要记录前一个字符和当前字符。用“Receive your eieio award”这 样的输入来测试
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
char ch1,ch2;
int cnt=0;
while ((ch2=getchar()) != '#')
{
if (ch1=='e'&&ch2=='i')
{
cnt++;
}
ch1=ch2;
}
printf("出现了%d次\"ei\"", cnt);
return 0;
}
思路:按题意理解即可
问题:无
解决:无
7.12.7
题目:编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。做如下假设:
a.基本工资 = 10.00美元/小时
b.加班(超过40小时) = 1.5倍的时间
c.税率: 前300美元为15% 续150美元为20%
余下的为25%
用#define定义符号常量。不用在意是否符合当前的税法。
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
double pay=0,tax=0,nce=0;
double n;
printf("请输入一周工作的小时数:");
scanf("%lf",&n);
// 算工资
if(n<=40){
pay=10.00*n;
}
else{
pay=10.00*40+(n-40)*1.5*10.00;
}
// 算税率
if(pay<=300){
tax=0.15*pay;
}
else if(pay>300&&pay<=450){
tax=300*0.15+(pay-300)*0.2;
}
else{
tax=300*0.15+150*0.2+(pay-450)*0.25;
}
// 算净收入
nce=pay-tax;
printf("工资总额:%lf\n", pay);
printf("税金:%lf\n", tax);
printf("净收入:%lf\n", nce);
return 0;
}
思路:按题意理解即可
问题:无
解决:无
7.12.8
题目:修改练习7的假设a,让程序可以给出一个供选择的工资等级菜单。使用switch完成工资等级选择。
#include <stdio.h>
#include <string.h>
#include <math.h>
#define l1 8.75
#define l2 9.33
#define l3 10.00
#define l4 11.20
int main()
{
double pay=0,tax=0,nce=0;
double n;
while(1){
printf("****************************************************************\n");
printf("Enter the number corresponding to the desired pay rate or action:\n");
printf("1) $8.75/hr 2) $9.33/hr\n");
printf("3) $10.00/hr 4) $11.20/hr\n");
printf("5) quit\n");
printf("****************************************************************\n");
int choice;
printf("请选择时薪等级:");
scanf("%d",&choice);
if (choice==5){
break;
}
printf("请输入一周工作的小时数:");
scanf("%lf",&n);
double level;
switch (choice)
{
case 1: level=l1; break;
case 2: level=l2; break;
case 3: level=l3; break;
case 4: level=l4; break;
default:
printf("请输入正确的数字:\n");
continue;
}
// 算工资
if(n<=40){
pay=level*n;
}
else{
pay=level*40+(n-40)*1.5*10.00;
}
// 算税率
if(pay<=300){
tax=0.15*pay;
}
else if(pay>300&&pay<=450){
tax=300*0.15+(pay-300)*0.2;
}
else{
tax=300*0.15+150*0.2+(pay-450)*0.25;
}
// 算净收入
nce=pay-tax;
printf("工资总额:%lf\n", pay);
printf("税金:%lf\n", tax);
printf("净收入:%lf\n", nce);
}
return 0;
}
思路:按题意理解即可
问题:无
解决:无
7.12.9
题目:
编写一个程序,只接受正整数输入,然后显示所有小于或等于该数的素数。
#include <stdio.h>
#include <string.h>
#include <math.h>、
int IsPrime(int x){
int flag=1;
if(x==1){
flag=0;
}
else if(x==2){
flag=1;
}
for(int i=2;i<=pow(x,0.5);i++){
if((x%i)==0){
flag=0;
break;
}
}
return flag;
}
int main()
{
printf("请输入一个正整数:");
int n;
scanf("%d",&n);
for(int i=1;i<n;i++){
if(IsPrime(i)){
printf("%d\n",i);
}
}
return 0;
}
思路:按题意理解即可
问题:忘记了字符串里要怎么输出%
字符了
解决办法:经过多次测试,发现用%%
即可
7.12.10
题目:
1988年的美国联邦税收计划是近代最简单的税收方案,它分为4个类别,每个类别有两个等级。下面是该税收计划的摘要(美元数为应征税的收入):
类别 税金
单身 17850美元按15%计,超出部分按28%计
户主 23900美元按15%计,超出部分按28%计
已婚,共有 29750美元按15%计,超出部分按28%计
已婚,离异 14875美元按15%计,超出部分按28%计
例如,一位工资为20000美元的单身纳税人,应缴纳税费0.15×17850
+0.28×(2000-17850)美元,编写一个程序,让用户指定缴纳税余的种类和应纳税收入,然后计算税金。程序应通过循环让用户可以多次输入
#include <stdio.h>
#include <string.h>
#include <math.h>、
int main()
{
int choice,l;
double income,tax1,tax2,total;
while(1){
printf("1:单身; 2:户主; \n3:已婚,共有; 4:已婚,离异; \n");
printf("选择你的类型:(输入q退出):");
if(scanf("%d",&choice)!=1){
break;
}
switch (choice){
case 1:
l=17850;
break;
case 2:
l=23900;
break;
case 3:
l=29750;
break;
case 4:
l=14870;
break;
default:
printf("输入有误!请重新输入!");
continue;
}
printf("请输入你的收入:");
scanf("%lf",&income);
if(income>l){
tax1=l;
tax2=income-l;
}
else{
tax1=income;
tax2=0;
}
total=tax1*0.15+tax2*0.28;
printf("应缴纳税款为:%lf\n",total);
}
return 0;
}
思路:按题意理解即可
问题:无
解决:无
7.12.11
题目:
ABC 邮购杂货店出售的洋蓟售价为 2.05 美元/磅,甜菜售价为 1.15 美元/磅,胡萝卜售价为 1.09美元/磅。在添加运费之前,100美元的订单有 5%的打折优惠。少于或等于5磅的订单收取6.5美元的运费和包装费,5磅~ 20磅的订单收取14美元的运费和包装费,超过20磅的订单在14美元的基础上 每续重1磅增加0.5美元。编写一个程序,在循环中用switch语句实现用户输 入不同的字母时有不同的响应,即输入a的响应是让用户输入洋蓟的磅数,b 是甜菜的磅数,c是胡萝卜的磅数,q 是退出订购。程序要记录累计的重 量。即,如果用户输入 4 磅的甜菜,然后输入 5磅的甜菜,程序应报告9磅 的甜菜。然后,该程序要计算货物总价、折扣(如果有的话)、运费和包装 费。随后,程序应显示所有的购买信息:物品售价、订购的重量(单位: 磅)、订购的蔬菜费用、订单的总费用、折扣(如果有的话)、运费和包装 费,以及所有的费用总额
#include <stdio.h>
#include <string.h>
#include <math.h>
const double A_PRICE = 2.05; // 洋蓟价格
const double B_PRICE = 1.15; // 甜菜价格
const double C_PRICE = 1.09; // 胡萝卜价格
const double DISCOUNT_RATE = 0.05; // 折扣率
const double SHIPPING_LOW = 6.5; // 低于5磅运费
const double SHIPPING_MED = 14; // 5-20磅运费
const double ADDITIONAL_SHIPPING = 0.5; // 超过20磅每磅额外运费
int main() {
char c;
double A_WT=0, B_WT=0, C_WT=0,wt=0;
double totalCost = 0;
// 选择界面
while (1) {
printf("请选择你要购买的蔬菜: a: 洋蓟, b: 甜菜, c: 胡萝卜, q: 退出: ");
scanf(" %c", &c);
switch (c) {
case 'a':
printf("洋蓟磅数: ");
scanf("%lf", &wt);
A_WT += wt;
break;
case 'b':
printf("甜菜磅数: ");
scanf("%lf", &wt);
B_WT += wt;
break;
case 'c':
printf("胡萝卜磅数: ");
scanf("%lf", &wt);
C_WT += wt;
break;
case 'q':
goto calc;
default:
printf("输入错误。\n");
break;
}
}
calc:
// 总价格
totalCost = (A_WT * A_PRICE) + (B_WT * B_PRICE) + (C_WT * C_PRICE);
// 计算折扣
double discount = 0;
if (totalCost >= 100) {
discount = totalCost * DISCOUNT_RATE;
}
// 计算运费
double shippingCost = 0;
float totalWeight = A_WT + B_WT + C_WT;
if (totalWeight <= 5) {
shippingCost = SHIPPING_LOW;
} else if (totalWeight <= 20) {
shippingCost = SHIPPING_MED;
} else {
shippingCost = SHIPPING_MED + (totalWeight - 20) * ADDITIONAL_SHIPPING;
}
// 计算最终总费用
double finalTotal = totalCost - discount + shippingCost;
// 显示购买信息
printf("\n购买信息:\n");
printf("洋蓟: 购买%.2f磅 每磅%.2f美元,共计%.2f美元\n", A_WT, A_PRICE, A_WT * A_PRICE);
printf("甜菜: 购买%.2f磅 每磅%.2f美元,共计%.2f美元\n", B_WT, B_PRICE, B_WT * B_PRICE);
printf("胡萝卜: 购买%.2f磅 每磅%.2f美元,共计%.2f美元\n", C_WT, C_PRICE, C_WT * C_PRICE);
printf("总费用: %.2f美元\n", totalCost);
if (discount > 0) {
printf("折扣: %.2f美元\n", discount);
}
printf("运费: %.2f美元\n", shippingCost);
printf("实际花费: %.2f美元\n", finalTotal);
return 0;
}
思路:按题意理解即可
问题:无
解决:无
三、总结思考:
- 学会了判定输入的内容是否为浮点数的方法,请点击这里跳转
- 复习了goto和switch的用法
- 让我注意到了很多之前没有掌握好的细节,收获颇丰