高级语言程序设计课程第四次个人作业

高级语言程序设计课程第四次个人作业


一、编写并运行书本第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;
}


思路:按题意理解即可
问题:无
解决:无


三、总结思考:

  1. 学会了判定输入的内容是否为浮点数的方法,请点击这里跳转
  2. 复习了goto和switch的用法
  3. 让我注意到了很多之前没有掌握好的细节,收获颇丰
posted @ 2024-10-27 19:11  空余晚秋  阅读(7)  评论(0编辑  收藏  举报