C语言练习题(7-11~7-20)——基于PTA

7-11 计算平均分

已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分,求该生3门课程的平均成绩(结果按整型输出)。

输入格式:

本题无输入

输出格式:

按照下列格式输出结果:

math = 87, eng = 72, comp = 93, average = 计算所得的平均成绩
#include <stdio.h> 

int main(void)
{
	int math = 87,eng = 72,comp = 93;
	double average = (math + eng + comp)/3.0;
	printf("math = %d, eng = %d, comp = %d, average = %d", math, eng, comp, (int)average);
	return 0;	
}

7-12 日期格式化

世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。

输入格式:

输入在一行中按照“mm-dd-yyyy”的格式给出月、日、年。题目保证给出的日期是1900年元旦至今合法的日期。

输出格式:

在一行中按照“yyyy-mm-dd”的格式给出年、月、日。

输入样例:

03-15-2017

输出样例:

2017-03-15

#include <stdio.h> 

int main(void)
{
	int day,month,year;
	scanf("%d-%d-%d",&month,&day,&year);
	if(month<10 && day<10)
	{
		printf("%d-0%d-0%d",year,month,day);
	}
	else if(month<10 && day >=10)
	{
		printf("%d-0%d-%d",year,month,day);
	}
	else if(month>=10 && day <10)
	{
		printf("%d-%d-0%d",year,month,day);
	}
	else
	{
		printf("%d-%d-%d",year,month,day);
	}
	return 0;	
}

7-13 后天

如果今天是星期三,后天就是星期五;如果今天是星期六,后天就是星期一。我们用数字1到7对应星期一到星期日。给定某一天,请你输出那天的“后天”是星期几。

输入格式:

输入第一行给出一个正整数D(1 ≤ D ≤ 7),代表星期里的某一天。

输出格式:

在一行中输出D天的后天是星期几。

输入样例:

3

输出样例:

5
#include <stdio.h> 

int main(void)
{
	int n,hou;
	scanf("%d", &n);
	hou = n+2;
	if(hou>7)
	{
		hou = hou-7;
	}
	printf("%d", hou);
	return 0;	
}

7-14 然后是几点

有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。

读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。

输入格式:

输入在一行中给出 2 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 5 点 30 分表示为 530;0 点 30 分表示为 030。流逝的分钟数可能超过 60,也可能是负数。

输出格式:

输出不多于四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。

输入样例:

1120 110

输出样例:

1310
#include <stdio.h> 
#include <math.h>

int main(void)
{
	int ct,pm;
	scanf("%d %d", &ct, &pm); 
	int ch,cm;
	ch = ct/100;
	cm = ct%100;
	int dh,dm,dt;
	dm = cm + pm;
	if(dm >= 60)
	{
		dh = ch + dm/60;
		dm = dm - dm/60*60;	
	}
	else if(dm <= -60)
	{
		
		if(dm/60.0 < dm/60)
		{
			dh = ch + dm/60 - 1;	
		}
		else
		{
			dh = ch + dm/60;	
		}	
		dm = 60 + (dm - dm/60*60);
	}
	if(dm/10==0)
	{
		printf("%d0%d", dh, dm);
	}
	else 
	{
		printf("%d%d", dh, dm);
	}
	return 0;
}

7-15 BCD解密

BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!

现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。

输入格式:

输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。

输出格式:

输出对应的十进制数。

输入样例:

18

输出样例:

12

 

#include <stdio.h> 
int main(void) 
{
	int Dnum;//十进制数 
	scanf("%d",&Dnum);
	printf("%x",Dnum) ;
	return 0;
}

7-16 计算符号函数的值

对于任一整数n,符号函数sign(n)的定义如下:

请编写程序计算该函数对任一输入整数的值。

输入格式:

输入在一行中给出整数n。

输出格式:

在一行中按照格式“sign(n) = 函数值”输出该整数n对应的函数值。

输入样例1:

10

输出样例1:

sign(10) = 1

输入样例2:

0

输出样例2:

sign(0) = 0

输入样例3:

-98

输出样例3:

sign(-98) = -1
#include <stdio.h> 
int main(void) 
{
	int n,sign=0;
	scanf("%d", &n);
	if(n>0)
	{
		sign = 1;
	}
	else if(n<0)
	{
		sign = -1;
	}
	else
	{
		sign = 0;
	}
	printf("sign(%d) = %d",n,sign);
	return 0;
}

7-17 成绩转换

本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:

  • 大于等于90分为A;
  • 小于90且大于等于80为B;
  • 小于80且大于等于70为C;
  • 小于70且大于等于60为D;
  • 小于60为E。

输入格式:

输入在一行中给出一个整数的百分制成绩。

输出格式:

在一行中输出对应的五分制成绩。

输入样例:

90

输出样例:

A
#include <stdio.h> 
#include <math.h>

int main(void)
{
	float score;
	char grade;
	do{
		scanf("%f",&score);
	}while(score<0||score>100);
	switch((int)score/10)
	{
		case 10:
		case 9:grade = 'A';break;
		case 8:grade = 'B';break;
		case 7:grade = 'C';break;
		case 6:grade = 'D';break;
		case 5:
		case 4:
		case 3:
		case 2:
		case 1:
		case 0:grade = 'E';break;
	}
	printf("%c",grade);
	return 0;	
}

7-18 出租车计价

本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:

  • 起步里程为3公里,起步费10元;
  • 超起步里程后10公里内,每公里2元;
  • 超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
  • 营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。

输入格式:

输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。

输出格式:

在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。

输入样例1:

2.6 2

输出样例1:

10

输入样例2:

5.1 4

输出样例2:

14

输入样例3:

12.5 9

输出样例3:

34
#include <stdio.h> 
#include <math.h>
int main(void) 
{
	double price;
	double d;
	int m;
	scanf("%lf %d",&d,&m);
	if(d <= 3)
	{
		price = 10;
	}
	else if(d <= 10)
	{
		price = 10 + (d - 3)*2;
	}
	else 
	{
		price = 10 + 7*2 + (d - 10)*3;
	}
	if(m < 5)
	{
		;
	}
	else
	{
		price = price + (m/5)*2;
	}
	printf("%d", (int)round(price));
	return 0;
}

7-19 计算天数

本题要求编写程序计算某年某月某日是该年中的第几天。

输入格式:

输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。

输出格式:

在一行输出日期是该年中的第几天。

输入样例1:

2009/03/02

输出样例1:

61

输入样例2:

2000/03/02

输出样例2:

62
#include <stdio.h> 
int main(void) 
{
	int y,m,d,i;
	int result = 0; 
	int table[] = {31,28,31,30,31,30,31,31,30,31,30,31};
	scanf("%d/%d/%d",&y,&m,&d);
	if((y%4 == 0 && y%100 != 0 )|| y%400 == 0) //判断是否是闰年
	{
		table[1] = 29;
	} 
	for(i=0;i<m-1;i++)
	{
		result += table[i];
	}
	result += d;
	printf("%d",result);
	return 0;
}

7-20 简单计算器

模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。

输入格式:

输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。

输出格式:

在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。

输入样例:

1+2*10-10/2=

输出样例:

10
#include <stdio.h> 
int cal(int a, int b,char op);
int flag = 1;
int main(void) 
{
	int num,num1,result;
	char op;
	int num_table[100]={0};
	char op_table[100]={0};
	int i=0;
	while(1)
	{
		scanf("%d%c",&num_table[i],&op_table[i]);
		if(op_table[i] == '=')
		{
			break;
		}
		i++;
	}
	i=0;
	num = num_table[0];
	while(1)
	{
		op = op_table[i];
		if(op == '='|| flag == 0)
		{
			break;
		}
		num1 = num_table[i+1];
		if(op == '/'&& num1 == 0)
		{
			flag=0;
			break;
		}
		num = cal(num,num1,op);
		i++;
	}
	if(flag == 1)
	{
		printf("%d", num);
	}
	else
	{
		printf("ERROR");
	}
	return 0;
} 
int cal(int a, int b,char op)
{
	int c;
	if(op == '*')
	{
		c = a*b;
	}
	else if(op == '/')
	{
		c = a/b;
	}
	else if(op == '+')
	{
		c = a+b;
	}
	else if(op == '-')
	{
		c = a-b;
	}
	else
	{
		flag = 0;
	}
	return c;
}

  • 45
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值