c语言谭浩强第五版---全书笔记+习题(一)

写在开始之前,适合有一点基础的人复习使用!!!!!!!
写在开始之前,适合有一点基础的人复习使用!!!!!!!
写在开始之前,适合有一点基础的人复习使用!!!!!!!

常用的头部文件

#include 
#include 
#include 
#include 

案例:求5! 求5的阶乘 1x2x3x…

    int i,t;
    t=1;
    i=2;
    while(i<=5){
        t=t*i;
        i=i+1;
    }
    printf("5的阶乘是 %d",t);

案例:求多项式(1-1/2+1/3-1/4+…+1/99-1/100)的值

    int i=2;
    double t=1;
    double time=2;
    while (i<=100){
        //double remainder = i%2;
        //printf("i取余2的值是 %lf",remainder);
        if(i%2==0){
            t=t-1/time;
            i=i+1;
            time=time+1;
        }else{
            t=t+1/time;
            i=i+1;
            time=time+1;
        }
    }
    printf("多项式之和 %lf",t);        //double需要用%lf 替换,int是用%d 替换

案例: 输出1900-2000年中 闰年的年份。(能被4整除,但不能被100整除,能被100整除,且能被400整除)

//第一种解法
    int year=1900;
    while (year<=2000){
        if(year%100==0){
            if(year%400==0){
                printf("%d ",year);
            }
        }else{
            if(year%4==0){
                printf("%d ",year);
            }
        }
        year=year+1;
    }
    //第二种解法
    int year;
    for(year=1900;year<=2000;year++)		//设置循环范围
    {
        if((year%4==0&&year%100!=0)||(year%400==0))			//满足条件输出
            printf("%d ",year);
    }

案例:求ax²+bx+c=0的根。分别从d=b平方-4ac大于0、等于0和小于0考虑

    double a,b,c;
    scanf("%lf%lf%lf", &a, &b, &c);
    double d=b*b-4*a*c;
    if(d>0){
        printf("有两根\n");
        printf("第一个根为%lf 第二个根为%lf", -1 * b + sqrt(d) / (2 * a), -1 * b - sqrt(d) / (2 * a));
    }else if (d==0){
        printf("只有一根:");
        printf("%lf", -b / (2 * a));
    }else{
        printf("无解");
    }

案例:输入10个数,输出其中一个最大的数

int a,b,c,d,e,f,g,h,i,j;
scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf", &a, &b, &c, &d, &e, &f, &g, &h, &i, &j);
//比较上面10的数字的大小

    int i =0;
    int a[10];
    int max=0;
    for(i=0;i<10;i++){
        scanf("%d",&a[i]);
    }
    for(i=0;i<10;i++){
        if(max<a[i]){
            max=a[i];
        }
    }
    printf("10个数字最大值是 %d",max);

案例:有人用测量出华式法表示的温度(如64°F,)现在需要把他们转换成摄氏度温度如(17.8°C);公式是:c=5/9(f-32)

    float f,c;
    f=64.0;
    c=(5.0/9)*(f-32);
    printf("f=%f\nc=%f",f,c);

银行存款:第1种 存一年活期利率是0.0036,第2种 存一年定期利率是0.0225,第三种 一年分两次存半年定期利率是0.0198。
比较这三种那种利息最多

    float r1=0.0036,r2=0.0225,r3=0.01968;
    float temp;
    float money=1000; //存1000元
    float r1Money=r1*money+1000;
    float r2Money=r2*money+1000;
    float r3Money=r3*money+1000;
    printf("r1Money=%f\nr2Money=%f\nr3Money=%f",r1Money,r2Money,r3Money);
    //比较三个数字的大小
    if(r1Money>=r2Money){
        if(r2Money>=r3Money){
            //最大的是人r1Money
            temp=r1Money;
        }else{
            if(r1Money>=r3Money){
                temp=r1Money;
            }else{
                temp=r3Money;
            }
        }
    }else{
        if(r2Money>=r3Money){
            temp=r2Money;
        }else{
         if(r1Money>=r3Money){
             temp=r2Money;
         }else{
             temp=r3Money;
         }
        }
    }
    printf("三个利息最多的是%f",temp);
  • 常量:值不能改变的量。

  • 整型常量:如1000,123,125等。

  • 实型常量:①十进制小数,如123.123,2.3 ②指数形式:如12.34e³ (12.34*10³) e前面必须有数字,e后面必须是整数

  • 字符常量:①普通字符:只有一个字符,如:'a'、'*'等 根据ASCII编码转换。②转义字符:\a—表示警告、\f—换页、\n—换行

  • 字符串常量:如"boy"、“我好帅” …

  • 符号常量:指定一个常量,本文件中直接使用定义的常量名,可以防止“一改全改”的地步。如# define PI 3.1415 定义之后,文件使用PI代表3.14159

  • 变量:先定义后使用。如int i; 有外部变量和全局变量之分

  • 常变量const int a=3; 定义一个整型变量a,值为3,且在变量存在期间其值不能发生变化

  • 常变量和符合常量有什么不同
    在预编译的时候,符号常量就不存在了。全部替换成其定义的值;有了常变量之后,可以不必多使用符号常量。

  • 标识符:只能由字母、数字、下划线组成

原、反、补码知识点

  • 原码、反码、补码 二进制首位是符号位,0–正数 1–负数
  • 正数的原、反、补 三码合一
  • 负数的反码是原码取反,补码是反码加1

数据类型

  • 基本整型:int–基本整型(4)、short intshort–短整型(2)、long int或者long–长整型(4)、long long intlong long --双长整型(8)、char–字符型(1)、布尔型(1)–bool

  • 整型有符号:unsigned–无符号 singed–有符号

  • 所以4种整型可以变成8种:[singed] intunsigned int[singed] short [int]unsigned short [int][signed] long [int]unsigned long [int][signed] long long [int]unsigned long long [int]

  • 无符号=正数 如果定义了无符号的整型,就只能存正数

  • 无符号的整型存放的正数比一般整型大一倍,因为他的原码的最高位不是符号位,可以存数

  • 只有整型、字符型 可以加signedunsigned修饰符,实型数据不能加

  • 无符号的整型数据用 %u 输出,unsigned int price=50; printf("%u/n",price);

  • char-字符型可以用 %d 或者%c 输出,区别是%d输出的是十进制的数字,%c是某个字符

  • 浮点型(实型数据–实数):float–单精度浮点型(4字节,小数点后有效数字6个)、double–双精度浮点型(8,有效数字15)、long double(visual c++定义8字节-有效数字15,turbo c定义16字节-有效数字19)、 float_complex double_complex long long_complex–复数浮点型

  • 实数是指以指数(3.14*10²)形式存放在存储单位

  • 在一个小数后面加上F,就表述float类型常量(编译的时候会自动把float转成double处理,加上F不会报警告),加上L或者l则置顶此常量是long double

  • 枚举型:enum

  • 空类型:void

  • 派生类型:指针类型(*),数组类型([]),结构体类型(struct),共用体类型(union),函数类型

运算符

  • +、-、*、/、++、--、%(取余)
  • 5/3=1 小数舍弃 5/-3=-1(Visual c++ 向0靠拢)
  • i=3,j=++i j=4,j=i++ j=3,printf("%d",i++) 答案:3,printf("%d",++i) 答案:4
  • >、<、==、>=、<=、!=
  • 逻辑运算符:!、&&、||
  • 位运算符:<<、>>、~、|、^、&
  • 赋值运算符:=
  • 条件运算符:?:
  • 逗号运算符:,
  • 指针运算符:*&
  • 求字节数运算符:sizeof
  • 强制类型转换运算符:(类型)
  • 成员运算符:.->
  • 下标运算符:[]

语句

  • if-elseforwhiledo-whilecontinuebreakswitchreturngoto(转向语句)
  • if-else的简写:if(x>y) z=x;else z=y;
  • ; 只有一个;叫空语句,啥也不干;但是它可以作为流程语句的转向点(流程语句从程序其他地方转向此处),也可以作为循环语句中的循环体,表啥此处啥也不做
  • 复合语句:又叫语句块,可以用{} 把一些语句和声明括起来,通常用在if语句和循环中,此时程序需要连续执行一组语句
  • 复合赋值运算符:a+=b相当于a=a+bx*=y+8相当于x=x*(y+8)

c语言中标准的输入输出函数putchar(输出字符)、getchar(输入字符)、printf(格式输出)、scanf(格式输入)、puts(输出字符串)、gets(输入字符串)

格式字符

  • d格式字符:printf("%d",12);输出的是12 printf("%5d",12);输出的是 12; 12前面有三个空格,%5d类似占位符 占5个字符
  • 若是输出long型数据,则是%ld,在d前面加l,同理long long类型的 加上ll
  • c格式符:char ch='a'; printf("%c",ch); 输出的值是a,也可以使用占位符 printf("%5c",ch); a;前面有4个空格
  • 如果一个整数在0~127直接,也是可以输出字符的,如 short a=121; printf("%c",a); 输出的结果是y
  • s格式符:用来输出一个字符串,printf("%s","CHINA");
  • f格式符:用来输出实数,整数部分全部输出,小数输出6位。 printf("%20.15f",1/3);输出的是: 0.333333333333333; 小数位是15,零前面有3个空格,加上0. 加上15位小数正好是20
  • 如果格式符前面是负数,则表示占位是在后面,如 printf("%-5d",12); 输出的是12 ;12后面是三个空格
  • %.2f 输出时保留两位小数
  • e(E)格式符:printf("%e",123.456); 输出的是 1.234560e+002 表示1.23456的10²printf("%13.2e",123.456); 输出的是 1.23e+002; 前面有4个空格,"%13.2e"13.2表示输出13位,小数点后面2
  • o格式符将按照数字的八进制输出
  • x(X)格式符将按照数字的十六进制输出
  • u格式符用来输出无符号型数据,十进制输出
  • g(G)格式符用来输出浮点数,系统自动选f格式或e格式输出,选择其中长度较短的格式

scanf函数
scanf("a=%d,b=%d",&a,&b); 应该输入a=1,b=3; 才能打印出a=1,b=3;
scanf("%c%c%c",&c1,&c2,&c3); 应该输出abc,中间不能有空格,才能打印出来abc
scanf("%d%c%f",&a,&b,&c); 若是输入1234a1230o.26 打印出的是1234a1230; 后面的数没有读入。

  • 格式字符
    d,i 输入有符号的十进制整数
    u 输入无符号的十进制整数
    o 输入无符号的八进制整数
    x,X 输入无符号的十六进制整数
    c 输入单个字符
    s 输入字符串,将字符串送到一个数组,在输入时以非空白字符开始,以第一个空白字符结束,结束标志’\0’作为做好一个字符
    f 输入实数,以小数或者指数形式
    e,E,g,G 和f作用相同,二者可以互换
  • 附加字符:
    l 输入长整型数据
    h 输入短整型数据
    域宽 指定输入数据所占列数(多长),域宽是正整数
    本输入项在输入后,不赋值给相应变量

解释一下 #include
相当于java中的包,导包;为了程序调用输入输出函数,#include 放在程序开头,所以stdio.h叫做头文件,.h是文件后缀

输出函数 putchar

  char a='A',b='B',c='C';
    putchar(a);
    putchar(b);
    putchar(c);
    putchar("\n");   //输出的是ABC

    int a=66,b=79,c=89;
    putchar(a);   //a对应的int值 转成ASCII码中对应的字符,所以输出的是B
    putchar(b);
    putchar(c);
    putchar('\n');   //输出的是BOY

    putchar('\101');   //输出A
    putchar('\\');      //输出的是'\'
    putchar('\015');   //八进制15相当于十进制13,ASCII表中对应的是回车

输入函数 getchar
getchar–取得一个字符,没有参数; 类似scanf
案例:从键盘输入BOY三个字符,打印到屏幕
注意:在键盘输入数据的时候,并不是输入一个字符,该字符就被立即使用的;
这些字符会被放到缓冲区中,只有按了enter才会把这些字符输入到计算机中
那么如果你输入的字符不够,如 你只输入B,就按了回车,会出现什么情况?
这时候aB,b是回车
在输入一个O,再按一次回车
此时a,b,c的值才补全,分别是:B 回车 O

 	char a,b,c;
 	a=getchar();
 	b=getchar();
 	c=getchar();
 	putchar(a);
	putchar(b);
 	putchar(c);
	//上面的6行代码可以简写
 	putchar(getchar());
 	putchar(getchar());
 	putchar(getchar());
	//也可以使用printf函数输出getchar得到的值
 	printf("%c",getchar());   //"%c" 是输出字符的格式声明


习题
1.假如我国人民生产总值年增长率是百分之7,计算10年后比现在增加了多少百分比

    //第一种解法
    double p;
    int n=10;
    double r=0.07;
    p=pow(1+r,n);    //p的10次方函数  要有头文件   比前10年增长了1.967151
    printf("比前10年增长了%f",p);
    //第二种解法
    int n=10;
    double r=0.07;
    double p=1+r;
    for(int i=1;i<10;i++){
        p=p*(1+r);
    }
    printf("比10年前增长了%15.15f",p);  //比10年前增长了1.967151357289567

2.有1000元,存5年,有5种方法,如下

	//一次性存5年 利率是3%    公式:p=1000*(1+n*r);
    float p=1000*(1+5*0.03);
    printf("一次性存五年的总金是:%f\n",p);
    //先存2年,再存3年
    float p1=(1000*(1+2*0.021))*(1+3*0.0275);
    printf("先存2年,在存3年的总金是:%f\n",p1);
    //先存3年,再存2年
    float p2=(1000*(1+3*0.0275))*(1+2*0.021);
    printf("先存3年,在存2年的总金是:%f\n",p2);
    //1年1年存
    float p3=(1000*(1+0.015))*(1+0.015)*(1+0.015)*(1+0.015)*(1+0.015);
    printf("1年1年存的总金是:%f\n",p3);
    //存活期  公式:1000*(1+r/4)⁴ⁿ
    float p4=1000*pow((1+0.035/4),20);
    printf("存5年活期的总金是:%f\n",p4);

3.购房贷款d,每月还款p,月利率是r,计算多少月能还清

    int d = 300000, p = 6000;    //定义贷款总额,每月还贷数
    double r = 0.01, m, x, y;    //定义利率,月份
    x = p / (p - d * r);
    y = 1 + r;
    m = log10(x) / log10(y);     //计算公式
    printf("m=%.2lf\n", m);
    system("pause");   //暂停程序,需要引入包 #include 

4.分析下面程序

    char c1, c2;
    c1 = 97;
    c2 = 98;
    printf("c1=%c, c2=%c\n", c1, c2);  // c1=a, c2=b     解释:输出的格式字符是 c,所以打印的是单个字符
    printf("c1=%d, c2=%d\n", c1, c2);  // c1=97, c2=98

    int c1, c2; //如果将c1和c2改成 int c1,c2;
    c1 = 97;
    c2 = 98;
    printf("c1=%c, c2=%c\n", c1, c2);  // c1=a, c2=b    //结果一样的
    printf("c1=%d, c2=%d\n", c1, c2);  // c1=97, c2=98

5.将China译成密码;用原来的字母后面第 4 个字母代替原来的字母。例如China变成Glmre

    char c1='C',c2='h',c3='i',c4='n',c5='a';
    c1+=4;
    c2+=4;
    c3+=4;
    c4+=4;
    c5+=4;
    printf("c1的值是%c\n",c1);  //c1的值是G    c2 c3 c4 c5都是类似的
    putchar(c1);  //G

6.设圆的半径是r,圆柱高h,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积,用scanf输入数据

    float r;
    float pi=3.1415926;
    printf("请输入圆的半径r:\n");
    fflush(stdout);          //使得printf和scanf按照顺序执行 printf语句之后scanf语句之前加入刷新缓冲的代码 fflush(stdout);   !!!
    scanf("%f",&r);

    float h;
    printf("请输入圆柱的高h:\n");
    fflush(stdout);
    scanf("%f",&h);
    float c=2*pi*r;   //周长
    printf("圆的周长是:%.2f\n",c); //保留两位小数  6.28
    float s=pi*r*r;  //面积
    printf("圆的面积是:%.2f\n",s);
    float qs=4*pi*r*r;  //表面积
    printf("圆球表面积是:%.2f\n",qs);
    float v=(4/3)*pi*r*r*r;  //圆球体积公式是  3分之4πr³
    printf("圆球的体积为:%.2f\n",v);
    float zhuv=pi*r*r*h;   //圆柱的体积
    printf("圆柱的体积为:%.2f\n",zhuv);

用if、if-else、if-else if-else 案例

  • 求二元一次方程的根
    float a,b,c,disc,x1,x2,p,q;
    scanf("a=%f,b=%f,c=%f",&a,&b,&c);
    printf("a的值是:%f\n",a);
    printf("b的值是:%f\n",b);
    printf("b的值是:%f\n",c);
    disc=b*b-4*a*c;
    printf("disc的值是:%f\n",disc);
    if(disc>0){
        //有根
        p=-b/2*a;
        q=sqrt(disc)/2*a;
        x1=p+q;
        x2=p-q;
        printf("根是:%f和%f",x1,x2);
    }else{
        //无根
        printf("the equation has not real boots;\n ");
    }
  • 将两个数从小到大输出,首尾追逐互换
    int a,b,t;
    scanf("a=%d,b=%d",&a,&b);
    if(a<b){
        t=a;
        a=b;
        b=t;
    }
    printf("两个值从小到大是%d和%d",b,a);
  • 输入三个数字,从小到大输出,上面有一种解法了,搜索三个可跳到
    int a,b,c,t;
    scanf("a=%d,b=%d,c=%d",&a,&b,&c);
    //经过三轮比较即可
    if(a>b){
        t=a; a=b; b=t;
    }
    if(a>c){
        t=a; a=c; c=t;
    }
    if(b>c){
        t=b; b=c; c=t;
    }
    printf("三个数字从小到大是:%d、%d和%d\n",a,b,c);

逻辑运算符
&&–逻辑与、||–逻辑或、!–逻辑非
运算顺序:非、与、或
案例:判断某一年是否是闰年
条件:能被4整除,但不能被100整除;能被400整除
用逻辑运算符表示:(year%4==0&&year%100!=0)||year%400==0

条件运算符和条件表达式—三目运算
案例:输入一个字符,判断他是否是大写字母(>A&&),是的话转成小写,不是不转换;然后输出最后得到的字符;用三目运算写程序

    char ch;
    scanf("%c",&ch);
    ch=(ch>='A'&&ch<='Z')?(ch+32):ch;
    printf("输入的字符是:%c\n",ch);

switch语句多分支选择结构 没有出现break,继续向下执行,直到出现break,如果一直没有出现 那就把程序执行完

案例:按照要求 输出考试等级,A等级是85分以上,B等级是70--84C等级是60~69D等级是60分一下;成绩等级由键盘输入,如果用if-else则需要三次判断。故用switch

    char grade;
    scanf("%c",&grade);
    printf("该等级对应的分数是:");
    switch (grade) {
        case 'A':printf("85分以上!!\n");break;
        case 'B':printf("70~84分!!\n");break;
        case 'C':printf("60~69分!!\n");break;
        case 'D':printf("60分以下!!\n");break; //break 结束程序判断
        default:printf("enter data error!\n"); //其余的情况 走此步!
    }

案例:输入’A’或者’a’,就会执行A的操作。输入’B’或者’b’就会执行B的操作

    void action(int,int);    //action方法在最下面的自定义函数列表中
    void action1(int,int);
    char ch=getchar();
    int a=15,b=2;

    switch (ch) {
        case 'a':
        case 'A':action(a,b);break;
        case 'b':
        case 'B':action1(a,b);break;
        default:printf("enter data error!!");
    }

选择结构程序综合使用
案例:输入一个年,输出闰年还是非闰年

    int year,leap;
    printf("enter year:\n");
    fflush(stdout);
    scanf("%d",&year);
    if ((year%4==0&&year%100!=0) || (year%400==0))
        leap=1;
    else
        leap=0;
    if (leap==1)
        printf("%d is a leap year.",year);
    else
        printf("%d is not a leap year.",year);

案例:求ax²+bx+c=0方程的解;考虑复根,就是b²-4ac<0的情况

    double a,b,c,x1,x2,disc,realpart,imagpart;
    scanf("%lf,%lf,%lf",&a,&b,&c);   //输入函数的时候,一定要加& 这个字符
    printf("The equation ");
    if (fabs(a) <= 1e-6)  //浮点型不能用==判断等于0,这样不准,基本都是用fabs(a)<=1e-6   判断是不是接近0;  1e  是数字1,1e-6=0.000001
        printf("is not a quadratic!");
    else
        disc=b*b-4*a*c;
        if (fabs(disc)<=1e-6)
            printf("has two equal roots:%8.4f\n",-b/(2*a));
        else{
            if (disc>1e-6){
                x1=(-b+sqrt(disc))/(2*a);
                x2=(-b-sqrt(disc))/(2*a);
                printf("has distinct real roots:%8.4f and %8.4f",x1,x2);
            }else{
                realpart=-b/(2*a);//复根的实部
                imagpart=sqrt(-disc)/(2*a);//复根的虚部
                printf("has complex roots:\n");
                printf("%8.4f+%8.4fi\n",realpart,imagpart);  //i是表示虚根的那个符号,这样就能输出q+pi的复数形式
                printf("%8.4f-%8.4fi\n",realpart,imagpart);
            }
        }

案例:某运输公司对用户计算运输费用,路程越远,费用越低,标准如下

    int c,s;
    float p,w,d,f;
    printf("please enter price,weight,distance:");
    fflush(stdout);
    scanf("%f,%f,%d",&p,&w,&s);
    if (s>=3000)
        c=12;
    else
        c=s/250;
    switch (c) {
        case 0:d=0;break;  //c=0 表示250km一下,d折扣是0
        case 1:d=2;break;
        case 2:
        case 3:d=5;break;
        case 4:
        case 5:
        case 6:
        case 7:d=8;break;   //没有出现break,继续向下执行
        case 8:
        case 9:
        case 10:
        case 11:d=10;break;
        case 12:d=15;break;
    }
    f=p*w*s*(1-d/100);
    printf("freight is %.2f",f);

习题
1.在C语言中逻辑常量只有两个,即0和1,用来表示两个对立的逻辑状态,其中0 假,1 真

    int a = 3, b = 4, c = 5;
    printf("%d\n", a+b>c&&b==c);

2.有3个整数a,b,c,由键盘输入,输出其中最大的数字

    int a,b,c,t;
    scanf("%d,%d,%d",&a,&b,&c);
    if(a>b){
        t=a; a=b; b=t;
    }
    if(a>c){
        t=a; a=c; c=t;
    }
    if(b>c){
        t=b; b=c; c=t;
    }
    printf("three numbers from small to large is %d and %d and %d.",a,b,c);

案例: 从键盘上输入一个小于1000的正数,要求输出他的平方根(如果不是整数,则输出整数部分)。要求校验是否是小于1000的正数,不是重新输入

    int x,y;
    printf("输入一个小于1000的整数:");
    fflush(stdout);
    scanf("%d",&x);
    while(x>=1000||x<=0){
        printf("输入的数不符合,请再输入一次\n");
        fflush(stdout);
        scanf("%d",&x);
    }
    y=sqrt(x);
    printf("y=%d\n",y);

案例:有一个函数y=x(x<1),y=2x-1(1<=x<10),y=3x-11(x>=10)。写一段程序,输入x,输出y

    int x,y;
    scanf("%d",&x);
    if(x<1)
        y=x;
    else if (1<=x<10)
        y=2*x-1;
    else
        y=3*x-11;
    printf("y的值是%d",y);

案例:输入一个百分制的分数,要求输出’A’、‘B’、‘C’、‘D’、‘E’。90分以上是A80-89分是B70-79分是C60-69分是D60分以下是E

    int score;
    char grade;
    scanf("%d",&score);
    if (score>=90) grade='A';
    else if(80<=score) grade='B';
    else if(70<=score) grade='C';
    else if(60<=score) grade='D';
    else grade='E';
    printf("分数的等级是:%c",grade);

案例:5位的正整数,求出它是几位数,分别输出每一位按逆序输出每一位数字 如123 输出的是321

    int a;
    scanf("%d",&a);
    void Nixu(int); //初始化函数    在最下面
    while(a>99999){
    printf("enter data error! please enter again!\n");
    fflush(stdout);
    scanf("%d",&a);
    }
    if(a>99999)
        printf("enter data error!");
    else
        Nixu(a);

案例:企业发放的奖金根据利润提成

i <= 100000 --- 10%
100000 < i <= 200000 --- 低于10000010%,高于1000007.5%
200000 < i <= 400000 --- 低于200000同上,高于2000005%
400000 < i <= 600000 --- 高于4000003%600000 < i <= 1000000 --- 高于6000001.5%
i > 1000000 --- 超过10000001%//从键盘输入当月利润i,求应发奖金总数
//if语句
    double i, bonus;
    printf("Please enter profit: ");
    fflush(stdout);
    scanf("%lf", &i);
    //输入低于0的数字,报错并重新输入
    while (i < 0){
        printf("Error!\n");
        printf("Please enter profit: ");
        fflush(stdout);
        scanf("%lf", &i);
    }
    if (i <= 100000)
        bonus = i * 0.1;
    else if (i > 100000 && i <= 200000)
        bonus = 10000 + (i - 100000) * 0.075;
    else if (i > 200000&& i <= 400000)
        bonus = 17500 + (i - 200000) * 0.05;
    else if (i > 400000 && i <= 600000)
        bonus = 33500 + (i - 400000) * 0.03;
    else if (i > 600000 && i <= 1000000)
        bonus = 39500 + (i - 600000) * 0.015;
    else
        bonus = 43500 + (i - 1000000) * 0.01;
    printf("Bonus = %.2lf\n", bonus);

//switch语句
    int i,t;
    float m;
    scanf("%ld",&i);
    if(i<100000){
        m=i*0.1;
        printf("bonus is %.2lf\n",m);
    }
    else{
        t=i/100000;
    }
    switch(t)
    {
        case 1:
        case 2:
            m=10000+(i-100000)*0.075;break;
        case 3:
        case 4:
            m=17500+(i-200000)*0.05;break;
        case 5:
        case 6:
            m=33500+(i-400000)*0.03;break;
        case 7:
        case 8:
        case 9:
            m=39500+(i-600000)*0.015;break;
        default:
            m=43500+(i-1000000)*0.01;break;
    }
    printf("This month's bonus is %lf",m);

案例:输入4个整数,由小到大的顺序输出

    int a[4],i,j,t;
    for(i=0;i<4;i++){
        printf("请输入%d个整数:",i+1);
        fflush(stdout);
        scanf("%d",&a[i]);
    }
    for(i=0;i<=3;i++){
        for(j=i+1;j<4;j++){
            if(a[i]>a[j]){
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
    }
    printf("从小到大输出的顺序是:");
    for(i=0;i<4;i++){
        printf("%d",a[i]);
    }

案例:有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2),(2,-2),圆半径为1,这4个塔的高度为10m,塔以外无建筑物。
今输入任一点的坐标,求该点的建筑高度 (塔外的高度为0),也就是说在圆内才有高度

    int  h=10;
    float x1=2,y1=2,x2=-2,y2=2,x3=-2,y3=-2,x4=2,y4=-2,x,y,d1,d2,d3,d4;
    printf("请输入一个点(x,y):");
    fflush(stdout);
    scanf("%f,%f",&x,&y);
    d1=sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1));          /*求该点到各中心点距离*/
    d2=sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2));
    d3=sqrt((x-x3)*(x-x3)+(y-y3)*(y-y3));
    d4=sqrt((x-x4)*(x-x4)+(y-y4)*(y-y4));
//第一种判断方法  
	if (d1>1 && d2>1 && d3>1 && d4>1)   h=0;  /*判断该点是否在塔外*/
//第二种判断方法  
	if (d1<=1 || d2<=1 || d3<=1 || d4<=1) ? h == 0 : h == 10; /*判断该点是否在塔外*/
    printf("该点高度为 %d\n",h);

第一阶段 - - 完结

你可能感兴趣的:(C语言,c语言)