C编程解析2

题目一:企业发放的奖金根据利润提成。利润低于或等于 10 万元时,奖金可提 10%;利润高 于 10 万元,低于 20 万元时,低于10万元的部分按10%提成,高于10 万元的部分,可可提  成 7.5%;20 万到 40 万之间时,高于 20 万元的部分,可提成 5%;40 万到 60万之间时高于 40 万元的部分,可提成 3%;60 万到 100 万之间时,高于 60 万元的部分,可提成1.5%,高于 100万元时, 超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?

分析:先不管任务只看需要的材料,可知道变量有利润profit和奖金bonus两个,细节之处见注释。

          看任务可知变量之间的关联,需要分段,为了简化分段我们在分段前用一下宏定义来分段。

 #include<stdio.h>

#define  Bonus10   (100000*0.1F) //UL无符号长整型放在括号中,会报错的,利润满10万

#define  Bonus20   (Bonus10+100000*0.075F)       //利润满20万

#define  Bonus40   (Bonus20+200000*0.05F)       //利润满40万

#define  Bonus60   (Bonus40+200000*0.03F)        //利润满60万

#define  Bonus100   (Bonus60+400000*0.015F)    //利润满100万

void main(void)

{

double profit; //注意此变量的数据类型
float bonus; 
scanf("%f",&profit); 
if(profit<=100000)   bonus=profit*0.1; 

else if(profit<=200000)   bonus=Bonus10+(profit-100000)*0.075; 

else if(profit<=400000)   bonus=Bonus20+(profit-200000)*0.05; 
else if(profit<=600000)   bonus=Bonus40+(profit-400000)*0.03; 
else if(profit<=1000000) bonus=Bonus60+(profit-600000)*0.015;  

else bonus=Bonus100+(profit-1000000)*0.01; 
printf("bonus=%d",bonus); 

}

注:#define SECONDS_PER_YEAR  (60 * 60 * 24 * 365UL)//此处(60 * 60 * 24 * 365)UL会报错,注意括号中写的数据类型不同,UL和F是不同的数据类型。


题目二:输入某年某月某日,判断这一天是这一年的第几天? 
1.程序分析:以3月5日为例,应该先把前两个月的加起来, 然后再加上 5天即本年的第几天,特殊 情况, 闰年且输入月份大于 3时需考虑多加一天。 

 #include<stdio.h> 
void main(viod) 

int day,month,year,sum=0,leap; 
printf("\nplease input year,month,day\n"); 
scanf("%d,%d,%d",&year,&month,&day); 
switch(month)  /*先计算某月以前月份的总天数*/ 

    case 1:sum=0;break; 
    case 2:sum=31;break; 
    case 3:sum=59;break; 
    case 4:sum=90;break; 
    case 5:sum=120;break; 
    case 6:sum=151;break; 
    case 7:sum=181;break; 
    case 8:sum=212;break; 
    case 9:sum=243;break; 
    case 10:sum=273;break; 
    case 11:sum=304;break; 
    case 12:sum=334;break;

    default:printf("data error");break; 

sum=sum+day;    /*再加上某天的天数*/ 
if(year%400==0||(year%4==0&&year%100!=0))/*判断是不是闰年*/ 
     leap=1; 
else 
     leap=0; 
if(leap==1&&month>2)/*如果是闰年且月份大于 2,总天数应该加一天*/ 
sum++; 
printf("It is the %dth day.",sum);



题目三:输出9*9 口诀。 
1.程序分析:分行与列考虑,共9行 9 列,i控制行,j控制列。这里我们不想输出重复的数,比如第一行输出了1*2,那么第二行我们就直接从2*2开始输出。 
 #include <stdio.h> 
void main(void) 

    int i,j,result; 
    printf("\n"); 
    for (i=1;i<10;i++) 
     { for(j=i;j<10;j++) 
       { 
        result=i*j; 
       printf("%d*%d=%-3d",i,j,result);/*-3d表示左对齐,占 3位*/ 
       } 
      printf("\n\r");/*每一行后换行*/ 

    }

}


题目三:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 
1. 程序分 析:   兔子 的 规律 为 数列
1,1,2,3,5,8,13,21.... 
#include <stdio.h> 

void main(void) 


long f1,f2; 
int i; 
f1=f2=1; 
for(i=1;i<=20;i++) 
    { printf("%12ld %12ld",f1,f2); 
      if(i%2==0) printf("\n");/*控制输出,每行四个*/ 
      f1=f1+f2;  /*前两个月加起来赋值给第三个月*/ 
      f2=f1+f2;  /*前两个月加起来赋值给第三个月*/ 
    } 


题目四:利用条件运算符的嵌套来完成此题:学习成绩>=90 分的同学用 A 表示,60-89分之间的用B表示, 60分以下的用C表示。 

#include <stdio.h> 

void main(void) 


    int score; 
    char grade; 
    printf("please input a score\n"); 
    scanf("%d",&score); 
    grade=score>=90?'A':(score>=60?'B':'C');

    printf("%d belongs to %c",score,grade); 
}


题目五: 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
1.程序分析:利用 while 语句,条件为输入的字符不为'\n'. 

2.这里是实时处理数据,没有存储。如果是实时处理,就必须有个标识告诉程序,数据已经结束了。
#include"stdio.h" 
main() 
{char c; 
int letters=0,space=0,digit=0,others=0; 

printf("please input some characters\n"); 
while((c=getchar())!='\n')

     {

     if(c>='a'&&c<='z'||c>='A'&&c<='Z')  letters++; 
     else if(c==' ')  space++; 
     else if(c>='0'&&c<='9')  digit++; 
     else  others++;  

     }

printf("all  in  all:char=%d  space=%d  digit=%d others=%d\n",letters, space,digit,others); 
}



题目六: 请输入星期几的第一个字母来判断一下是星期几, 如果第一个字母一样, 则继续判断第二个字母。
1.程序分析:首先我们知道这里肯定要用到判断,问题是判断和谁结合着用。我们以往写的程序,if语句往往和循环结合着用,而这里用的是switch分支语句在加判断。
#include <stdio.h> 
void main() 

char letter; 
printf("please  input  the  first  letter  of someday\n"); 
while  ((letter=getchar())!='Y' )/* 当所按字母为Y 时才结束*/ 
    {

     switch (letter) 

          {case  'S': printf("please input second letter\n"); 

                          if((letter=getch())=='a' )   printf("saturday\n"); 
                          else if ((letter=getch())=='u')   printf("sunday\n"); 
                          else printf("data error\n"); 

                           break; 
           case  'F':    printf("friday\n");  break; 
           case  'M':   printf("monday\n");  break; 
           case  'T':    printf("please input second letter\n"); 
                            if((letter=getch())=='u')  printf("tuesday\n"); 
                            else if ((letter=getch())=='h')   printf("thursday\n"); 
                           else printf("data error\n");  

                            break; 
          case   'W':  printf("wednesday\n");break; 
          default: printf("data error\n"); 
         }

     }

}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值