10月10号日结

今天发现了一本不错的书
C语言大学实用教程,苏小红老师出版的书
在里面给出了容易出错的地方,总结了一下很有收获性,争取在尽快这本书看完

早上老师提出了一个问题10.0/33等于多少
这里首先因为是10.0/3,已经转换成浮点数了
所以这里10.0/3=3.33333
然后3.333
3=9.99999
在c语言里面就转换成了10.0

今天从新看了一下龟兔赛跑的问题
7-12 龟兔赛跑 (20 分)
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?

输入格式:
输入在一行中给出比赛时间T(分钟)。

输出格式:
在一行中输出比赛的结果:乌龟赢输出@@,兔子赢输出_,平局则输出--;后跟1空格,再输出胜利者跑完的距离。

先把代码打出来

#include<stdio.h>
 
int main()
{
    int T, i;
    int rabbitT=0; 
 	scanf("%d",&T);
    if(T<10)
    {
        printf("^_^ %d\n",T*9);
        return 0;
    }
    rabbitT=10;
    for(i=10;i<=T;i++)
    {
        if(i%10==0) 
        {
            if(rabbitT*9>i*3 && (T-i)>=30)
            	i=i+29; 
            else if(rabbitT*9>i*3 && (T-i)<30)
            {
                i=T;
                break;
            }
            else if(T-i>=10) 
            {
                rabbitT+=10;
                i=i+9;
            }
            else 
            {
            	rabbitT+=T-i;
                i=T;
                break;
            }
 
        }
    }
    if(i*3>rabbitT*9)
    	printf("@_@ %d\n",i*3);
    else if(i*3<rabbitT*9)
        printf("^_^ %d\n",rabbitT*9);
    else
        printf("-_- %d\n",rabbitT*9);
    return 0;
}

这题与虫子向上爬有一定的相似之处,稍后会补充这道题的题我自己的思路;
首先是如果T<10因为他们刚开始所以兔子和乌龟都在跑
结果肯定是兔子赢

然后用一个循环,找出每十分钟
如果兔子比乌龟跑得远且时间还大于30分钟,则i=i+29,因为有i++所以这里只能加29
如果T-i<30分钟,则i=T
如果兔子在乌龟后面,且T-i>10,兔子就跑兔子时间+10
乌龟就+9同上面原理,然后进入下一个循环中
如果时间小于10时间相加后结束循环

7-2 计算火车运行时间 (15 分)
本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。

输入格式:
输入在一行中给出2个4位正整数,其间以空格分隔,分别表示火车的出发时间和到达时间。每个时间的格式为2位小时数(00-23)和2位分钟数(00-59),假设出发和到达在同一天内。

输出格式:
在一行输出该旅途所用的时间,格式为“hh:mm”,其中hh为2位小时数、mm为2位分钟数。

#include <stdio.h>
int main()
{
  int m,n;
	scanf("%d%d",&m,&n);
	int a,b,c,d;
	a=m/100;
	b=m%100;
	c=n/100;
	d=n%100;
	int x,y;
	if(b<=d)
	{
		x=c-a;
		y=d-b;
	}
	else
	{
		x=c-a-1;
		y=60+d-b;
	}
	if(x<10)
    {
        printf("0%d:%d\n",x,y);
    }
    else if(y<10)
    {
        printf("%d:0%d\n",x,y);
    }
    else
    {
        printf("%d:%d\n",x,y);
    }
	return 0;
}

首先输入两个整数
m/100得到的是前两位数
m%100得到的是后两位数
如果后到达的时间的后两位大于出发的分钟数则直接相减
如果到达的时间的分钟数小于出发时的分钟数则向小时借1+60,进而小时数-1
如果他是两位数就直接输出,如果他不是两位数则在前面加0

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

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

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

输出格式:
输出四位数字表示的终止时间。题目保证起始时间和终止时间在同一天内。

#include<stdio.h>
int main ()
{
	int star,last,end,past,s,f;
	scanf("%d%d",&star,&past);
	s=star/100*60+star%100;
	end=s+past;
	f=end/60*100+end%60;
	printf("%d",f);
	
	return 0;
	
}

呃。。。。。。没啥好解释的

7-8 输出闰年 (15 分)
输出21世纪中截止某个年份以来的所有闰年年份。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。

输入格式:
输入在一行中给出21世纪的某个截止年份。

输出格式:
逐行输出满足条件的所有闰年年份,即每个年份占一行。输入若非21世纪的年份则输出"Invalid year!"。若不存在任何闰年,则输出“None”。

#include<stdio.h>
int main()
{
	int year, i, count=0;
	scanf("%d", &year);
	if(year<=2000||year>2100)
		printf("Invalid year!\n");
	else{
		for(i=2001; i<=year; i++){
			if(i%4==0&&i%100!=0||i%400==0){
				printf("%d\n", i);
				count++;
			}
		}
		if(count==0)
			printf("None\n");
	}	
	return 0;
 }

这里注意的是2000年还是20世纪

7-9 求一元二次方程的根 (20 分)
本题目要求一元二次方程的根,结果保留2位小数。

输入格式:
输入在一行中给出3个浮点系数a、b、c,中间用空格分开。

输出格式:
根据系数情况,输出不同结果:

1)如果方程有两个不相等的实数根,则每行输出一个根,先大后小;

2)如果方程有两个不相等复数根,则每行按照格式“实部+虚部i”输出一个根,先输出虚部为正的,后输出虚部为负的;

3)如果方程只有一个根,则直接输出此根;

4)如果系数都为0,则输出"Zero Equation";

5)如果a和b为0,c不为0,则输出"Not An Equation"。

#include <stdio.h>
#include<math.h>
#define EPSILON 1e-6
int main()
{
    float a,b,c,p,m,n,delta, real, imaginary;
    scanf("%f%f%f",&a,&b,&c);
    p=b*b-4*a*c;
    if(p>0&&a!=0)
    {
        m=(sqrt(p)-b)/2/a;
        n=(-sqrt(p)-b)/2/a;
        printf("%.2f\n%.2f",m,n);
    }
    else if(p==0&&a!=0)
        printf("%.2f",-b/a/2);
    else if(a==0&&b==0&&c==0)
        printf("Zero Equation");
    else if(a==0&&b==0&&c!=0)
        printf("Not An Equation");
    else if(a==0&&b!=0&&c!=0)
        printf("%.2f",-c/b);
    else if(a!=0&&p<0)
    {
        delta = b * b - 4 * a * c;
		real = -b / (2 * a);
		imaginary = sqrt(fabs(delta)) / (2 * a);
			if(fabs(real) <= EPSILON) {
				printf("0.00+%.2fi\n", imaginary);
				printf("0.00-%.2fi\n", imaginary);
			}
			else {
				printf("%.2f+%.2fi\n", real, imaginary);
				printf("%.2f-%.2fi\n", real, imaginary);
			}
    }
    return 0;

}

这里要注意在考虑的时候要考虑虚部为0的情况
还有几处问题稍后补充

7-13 大笨钟 (10 分)

微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律,所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数;如果过了整点,就敲下一个整点数。另外,虽然一天有24小时,钟却是只在后半天敲1~12下。例如在23:00敲钟,就是“当当当当当当当当当当当”,而到了23:01就会是“当当当当当当当当当当当当”。在午夜00:00到中午12:00期间(端点时间包括在内),笨钟是不敲的。

下面就请你写个程序,根据当前时间替大笨钟敲钟。

输入格式:
输入第一行按照hh:mm的格式给出当前时间。其中hh是小时,在00到23之间;mm是分钟,在00到59之间。

输出格式:
根据当前时间替大笨钟敲钟,即在一行中输出相应数量个Dang。如果不是敲钟期,则输出:

#include<stdio.h>
int main()
{
	int m, n,h,i,k;
	char c;
	scanf("%d%c%d", &m, &c, &n);
	if (m >= 13 && m < 24)
	{
		h = m - 12;
		if (n != 0)
			k = h + 1;
		else if (n == 0)
			k = h;
 
		for (i = 0; i < k; i++)
		{
			printf("Dang");
		}
	}
	else
		printf("Only %02d:%02d.  Too early to Dang.",m,n);
}

判断后两位是否等于0
如果不是0就+1
然后用循环输出Dang

7-15 谁是赢家 (10 分)
某电视台的娱乐节目有个表演评审环节,每次安排两位艺人表演,他们的胜负由观众投票和 3 名评委投票两部分共同决定。规则为:如果一位艺人的观众票数高,且得到至少 1 名评委的认可,该艺人就胜出;或艺人的观众票数低,但得到全部评委的认可,也可以胜出。节目保证投票的观众人数为奇数,所以不存在平票的情况。本题就请你用程序判断谁是赢家。

输入格式:
输入第一行给出 2 个不超过 1000 的正整数 Pa 和 Pb,分别是艺人 a 和艺人 b 得到的观众票数。题目保证这两个数字不相等。随后第二行给出 3 名评委的投票结果。数字 0 代表投票给 a,数字 1 代表投票给 b,其间以一个空格分隔。

#include<stdio.h>
int main()
{
	int Pa,Pb,a,b,c,count1=0,count2=0;
	scanf("%d%d",&Pa,&Pb);
	scanf("%d%d%d",&a,&b,&c);
	if(a==0)
	{
		count1++;
	}
	else
	{
		count2++;
	}
		if(b==0)
	{
		count1++;
	}
	else
	{
		count2++;
	}
		if(c==0)
	{
		count1++;
	}
	else
	{
		count2++;
	}
	if(Pa>Pb&&count2!=3)
		printf("The winner is a: %d + %d",Pa,count1);
	else
		printf("The winner is b: %d + %d",Pb,count2);
	
		
	return 0;
 } 

呃。。。也没啥可以说的

最后补充一个题目
7-10 计算个人所得税 (10 分)
假设个人所得税为:税率×(工资−1600)。请编写程序计算应缴的所得税,其中税率定义为:

当工资不超过1600时,税率为0;
当工资在区间(1600, 2500]时,税率为5%;
当工资在区间(2500, 3500]时,税率为10%;
当工资在区间(3500, 4500]时,税率为15%;
当工资超过4500时,税率为20%。
输入格式:
输入在一行中给出非负工资。

输出格式:
在一行输出个人所得税,精确到小数点后2位。

#include<stdio.h>
int main()
{
	int galary;
	double money;
 	scanf("%d", &galary);
 	if (galary <= 1600)
		money = 0;
	else if (galary > 1600 && galary <= 2500)
		money = (galary - 1600)*0.05;
	else if (galary > 2500 && galary <= 3500)
		money = (galary - 1600)*0.1;
	else if (galary > 3500 && galary <= 4500)
		money = (galary - 1600)*0.15;
	else if (galary > 4500)
		money = (galary - 1600)*0.2;
 	printf("%.2lf", money);
 	return 0;
}

本来是不用写的,后来同学给了一个神奇的代码,然后一时间我没有看出来什么问题

#include<stdio.h>
int main()
{
  float s,l;
  int m;
  scanf("%d",&m);
  if(m<=1600)
    s=0;
  else if(m>1600&&m<=2500)
    s=0.05;
  else if(m>2500&&m<=3500)
    s=0.1;
  else if(m>3500&&m<=4500)
    s=0.15;
  else if(m>4500)
    s=0.2;
  l=(m-1600)*s;
  printf("%.2f",l);
  return 0;
}

后来经过老师,学长指导发现,如果是m<1600,输出的结果是-0.00与答案不符,
在c语言中
如果是一个负数*0得到的答案就是-0,而不是0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值