第一章 程序入门设计

来源:互联网 发布:js select 触发事件 编辑:程序博客网 时间:2024/05/20 05:54

内容:
1.1算术表达式
1.2变量及其输入
1.3顺序结构程序设计
1.4分支结构程序设计
[注解]:①C语言的概述及发展史:C99、C11及其它 ②数据类型与输入格式

1.1算术表达式

1-1 计算并输出1+2的值

#include<stdio.h>int main(){    printf("%d\n", 1+2);    return 0;}

3

修改1-1,输出3-4、5*6、8/4、8/5

#include<stdio.h>int main(){    printf("%d\n", 3-4);    return 0;}

-1

#include<stdio.h>int main(){    printf("%d\n", 5*6);    return 0;}

30

#include<stdio.h>int main(){    printf("%d\n", 8/4);    return 0;}

2

#include<stdio.h>int main(){    printf("%d\n", 8/5);    return 0;}

1

#include<stdio.h>int main(){    printf("%d\n", -8/5);    return 0;}

-1
对比:

#include<stdio.h>int main(){    printf("%d\n", (-8)/5);    printf("%d\n", 8/(-5));    printf("%d\n", (-8)/(-5));    return 0;} 

-1
-1
1

引申

#include<stdio.h>int main(){    printf("%d\n", (-8)%5);    printf("%d\n", 8%(-5));    printf("%d\n", (-8)%(-5));    return 0;} 

-3
3
-3

为什么是1而不是1.6?为什么不是-1.6而是-1?

1-2 计算并输出8/5的值,保留小数点后一位

#include<stdio.h>int main(){    printf("%.1f\n", 8.0/5.0);    return 0;}

1.6

修改:%.1f->%.2f或者%f 8./5->8/5 %.1f->%d

#include<stdio.h>int main(){    printf("%.2f\n", 8.0/5.0);    return 0;} 

1.60

#include<stdio.h>int main(){    printf("%f\n", 8.0/5.0);    return 0;} 

1.600000

#include<stdio.h>int main(){    printf("%.1f\n", 8/5);    return 0;} 

0.0

#include<stdio.h>int main(){    printf("%f\n", 8/5);    return 0;} 

0.00000

为什么是0.0和0.00000呢?

#include<stdio.h>int main(){    printf("%d\n", 8.0/5.0);    return 0;} 

-1717986918

为什么是这个结果呢?

问题①②涉及:整数和浮点数的编码

这个问题可能也跟计算机深层的东西有关,如果有很好的解答,会跟大家分享

这里有个注意点:-1717986918(虽然书里没讲,但是对于这么与众不同的数据,我还是满怀好奇的,对于这个特殊的数,在查阅有关资料之后,再分享出来)
这是一个比较合理的解释,不过可能要学习计算机更深层的东西才能完全理解:http://zhidao.baidu.com/link?url=NWXrjH-GvpPuoTXQlJ-nsj-BnavLCf76fFrVtdZl3nE1askseYm7GDQ3tBMQYKKsrPpYRFiEoz2fYRkTH87R-uddvWwf-na45n-WujF0TC_

1-3 复杂的程序计算(某些数学运算符的表示)

#include<stdio.h>#include<math.h>int main(){    printf("%.8f\n", 1+2*sqrt(3)/(5-0.1));    return 0;}

1.70695951

1.2 变量及其输入

1-4 a+b的问题

#include<stdio.h>int main(){    int a, b;    scanf("%d%d", &a, &b);    printf("%d\n", a+b);    return 0;}

1 5
6

1-5 圆柱体的表面积
输入底面半径r和高h,求圆柱体表面积(保留三位小数)

#include<stdio.h>#include<math.h>int main(){    double r, h, area;    scanf("%lf%lf", &r, &h);    const double PI = acos(-1);    area = 2*PI*r*r + 2*PI*r*h;    printf("Area = %.3f\n", area);     return 0;}

3.5 9
Area = 274.889

这里要注意的点是:%lf%lf—–>如果是%f%f,可以编译一下看看结果

PI求法:
1、一般:#define PI 3.14
2、这里:const double PI = acos(-1);

1-6 三位数反转

#include<stdio.h>int main(){    int num;    scanf("%d", &num);    printf("%d%d%d\n", num%10, num/10%10, num/100);    return 0;}
#include<stdio.h>int main(){    int num;    scanf("%d",&num);    int a = num/100;    int b = num/10%10;    int c = num%10;    int sum = c*100 + b*10 + a;    printf("%03d\n", sum);    return 0;}

120
021

理解:%03d的用意

上面是对于三位数的,下面是int 数通用的:[也是hdoj中金山的一道题]

#include<stdio.h>int main(){    int num;    scanf("%d", &num);    while(num/10){        printf("%d", num%10);        num /= 10;    }    printf("%d\n", num);    return 0;}

1-7 交换两个变量a、b

最简单的就是(keep it simple and stupid:kiss):

#include<stdio.h>int main(){    int a, b, temp;    scanf("%d%d", &a, &b);    printf("%d  %d\n", b, a);    return 0;}
#include<stdio.h>int main(){    int a, b;    scanf("%d%d", &a, &b);    printf("a = %d, b = %d\n", a, b);    int temp = a;    a = b;    b = temp;    printf("a = %d, b = %d\n", a, b);    return 0;}
#include<stdio.h>int main(){    int a, b;    scanf("%d%d", &a, &b);    a = b - a;    b = b - a;    a = b + a;    printf("%d %d\n", a, b);    return 0;} 
#include<stdio.h>int main(){    int a, b;    scanf("%d%d", &a, &b);    a = a + b;    b = a - b;    a = a - b;    printf("%d %d\n", a, b);     return 0;}
#include<stdio.h>int main(){    int a, b, temp;    scanf("%d%d", &a, &b);    a = a^b;    b = a^b;    a = a^b;    printf("%d  %d\n", a, b);    return 0;}

用指针实现:

#include<stdio.h>void exchang(int *i, int *j){    int temp;    temp = *i;    *i = *j;    *j = temp; }int main(){    int a, b;    scanf("%d%d", &a, &b);    exchang(&a, &b);    printf("%d %d\n", a, b);    return 0;} 

1-8 鸡兔同笼
总数:n,总脚数:m

#include<stdio.h>int main(){    int a, b, m, n;    scanf("%d%d", &n, &m);    a = (4*n - m)/2;    b = (m - 2*n)/2;    if(m%2==1 || a<0 || b<0){        printf("No answer");    }    else{        printf("%d  %d\n", a, b);    }    return 0;}
#include<stdio.h>int main(){    int n, m;    scanf("%d%d", &n, &m);    if((4*n-m)/2>0 && (m-2*n)/2>0){        printf("%d %d\n", (4*n-m)/2, (m-2*n)/2);    } else {        printf("No answer\n");    }    return 0;}

1-9 三整数排序(从小到大)

#include<stdio.h>int main(){    int a, b, c, temp;    scanf("%d%d%d", &a, &b, &c);    if(a>b){        temp = a;        a = b;        b = temp;    }    if(a>c){        temp = a;        a = c;        c = temp;    }    if(b>c){        temp = b;        b = c;        c = temp;    }    printf("%d %d %d\n", a, b, c);    return 0;}

下面使用指针实现交换:

#include<stdio.h>int swap(int *i, int *j){    int temp;    temp = *i;    *i = *j;    *j = temp;    return 0;}int main(){    int a, b, c;    scanf("%d%d%d", &a, &b, &c);    int *x = &a;    int *y = &b;    int *z = &c;    if(a>b)        swap(x, y);    if(a>c)        swap(x,z);    if(b>c)        swap(y,z);    printf("%d %d %d\n", a, b, c);    return 0;}
#include<stdio.h>void getChange(int *i, int *j){    int temp = *i;    *i = *j;    *j = temp;}int main(){    int a, b, c;    scanf("%d%d%d", &a, &b, &c);    if(a>b){        getChange(&a, &b);    }    if(a>c){        getChange(&a, &c);    }    if(b>c){        getChange(&b, &c);    }    printf("%d %d %d\n", a, b, c);    return 0;}

关于数据类型及格式输入符

#include<stdio.h>int main(){    printf("%d\n", 11111 * 11111);    return 0;}

123454321

#include<stdio.h>int main(){    printf("%d\n", 111111 * 111111);    return 0;}

[Warning] integer overflow in expression [-Woverflow]
-539247567

修改如下:

#include<stdio.h>int main(){    printf("%ld\n", 111111 * 111111);    return 0;}

[Warning] integer overflow in expression [-Woverflow]
-539247567

再次修改:

 #include<stdio.h>int main(){    printf("%lld\n", 111111 * 111111);    return 0;}

本章有7道习题,5个问题
·平均数
·温度
·连续和
·正弦余弦
·打折
·三角形
·年份
问题:int、double的范围、运算符的优先性

注:一些个人课后题解题想法在:“ 算法竞赛课后习题解题”(类别)

0 0