C语言程序设计:现代方法(1-6章)

第2版修订版

第1章 C语言概述

学习C有助于理解C++和C#。

第2章 C语言基本概念

  • int 的最大值一般是 21亿+ ,但有些计算机上是 32767
  • float 一般只能存储实际值的近似值
  • scanf,printf 中的f都是 format的意思

关键字(41个):

  • 数据类型(14个)
    • char
    • short, int, long
    • float, double
    • const
    • enum
    • signed
    • struct
    • typedef
    • union
    • unsigned
    • volatile
  • 控制结构(10个)
    • if, else
    • for, while,do
    • continue,default
    • goto
    • return
    • switch
  • 其他(17个)
    • extern ,register
    • inline
    • restrict
    • sizeof
    • static
    • void
    • _Alignas(C11)
    • _Alignof(C11)
    • _Atomic(C11)
    • _Bool(C99)
    • _Complex(C99)
    • Generic(C11)
    • _Imaginary(C99)
    • _Noreturn(C11)
    • _static_assert(C11)
    • _Thread_local(C11)

字母顺序关键字:

  • auto
  • break
  • case
  • char
  • const
  • continue
  • do
  • double
  • else
  • enum
  • extern
  • float
  • for
  • goto
  • if
  • inline, c99引入,内联函数
  • int
  • long
  • register:声明局部变量的关键字,它建议编译器尽可能将变量存储在CPU的寄存器中,以提高变量的存取速度
  • restrict,c99引入
  • return
  • short
  • signed
  • sizeof
  • static:隐藏、保持变量内容的持久性和默认初始化为0
  • struct
  • switch
  • typedef:为已存在的类型创建一个新的名称
  • union
  • unsigned
  • void
  • volatile
  • _Alignas(C11)
  • _Alignof(C11)
  • _Atomic(C11)
  • _Bool(C99)
  • _Complex(C99)
  • Generic(C11)
  • _Imaginary(C99)
  • _Noreturn(C11)
  • _static_assert(C11)
  • _Thread_local(C11)

练习1:编写一个程序,使用printf在屏幕上显示下面的图形:

       *
      *
     *
*   *
 * *
  *

代码

#include <stdio.h>

int main() {
    int i = -4, j = 8; //i,j 用来控制是否打印星号,i=j的时候只打印i,i和j大于零时打印对应位置的星号
    while (i <= j) {
        for (int k = 0; k <= j; k++) {
            if (k == i) { printf("*"); } else if (k == j) { printf("*\n"); } else { printf(" "); }
        }
        i++;
        j--;
    }
    printf("\n");
    return 0;
}

练习2:编写一个计算球体体积的程序,其中球体半径为10m,参考公式 $v=4/3 \pi r^3$ 。注意,分数4/3应写作4.0f/3.0f。(如果分数写成4/3会产生什么结果?)

#include <stdio.h>
#define PI 3.14159265358979323846

double volume(double r) {
    return (4.0 / 3.0) * PI * r * r * r;
}

int main(void) {
    double r ;
    printf("Enter the radius:\n");
    scanf("%lf", &r);
    printf("the volume is:%f\n", volume(r));
    return 0;
}
/*
Enter the radius:
10
the volume is:4188.790205
*/

第3章 格式化输入/输出

  • printf格式用%m.pX
  • m表示打印的最小宽度,大于该宽度依然会打印出来
  • .p中p为小数位数或有效数字(X为g时)
  • X表示在数据显示前进行的转换操作
    • d:十进制整数
    • e:科学计数法
    • f:十进制浮点数
    • g:显示为指数或者浮点数
#include <stdio.h>

int main() {
    int i=1234567890;
    double d = 123456789.123456789;

    printf("%20d\n", i);
    printf("%-20d\n", i);

    printf("%25.8f\n", d);
    printf("%-25.8f\n", d);

    printf("%25.8g\n", d);
    printf("%-25.8g\n", d);

    return 0;
}
/*
          1234567890
1234567890
       123456789.12345679
123456789.12345679
            1.2345679e+08
1.2345679e+08
*/

不建议用scanf函数,而是读入字符然后转换

第4章 表达式

练习:逆序输出输入的3位数

#include <stdio.h>

int main() {
    int d=0;
    int i1,i2,i3;
    printf("请输入一个三位整数:");
    scanf("%d",&d);
    printf("逆序三位数:");
    i1=d%10;
    i2=(d-i1)/10%10;
    i3=(d-i1-i2*10)/100%10;
    printf("%d%d%d",i1,i2,i3);
    return 0;
}
/*
请输入一个三位整数:123
逆序三位数:321
*/

第5章 选择语句

_Bool 只能取值0或1,如果赋值非零值,取值为1.

#include <stdio.h>

int main() {
    _Bool flag=5;
    printf("%d\n", flag);//1
    return 0;
}

stdbool.h头文件定义了如下的宏:

  • bool:_Bool
  • true:1
  • false:0
#include <stdio.h>
#include <stdbool.h>

int main() {
    bool b1=true,b2=false;
    printf("%d %d\n", b1,b2);//1 0
    return 0;
}

第6章 循环

计算常量$e=1+1/1! + 1/2! + 1/3!+…+1/n!$

#include <stdio.h>

double js(long long n) {
    long long result = 1;
    for (long long i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}

int main() {
    double e = 1;
    long long js_result;
    for (long long i = 1; i <= 22; i++) {
        js_result = js(i);
        e += 1.0 / js_result;// 分子必须用1.0 而不是1

        printf("n=%d\n", i);
        printf("阶乘:%lld\n", js_result);
        printf("e=%20.19f\n", e);
    }
    return 0;
}

/*
n=1
阶乘:1
e=2.0000000000000000000
n=2
阶乘:2
e=2.5000000000000000000
n=3
阶乘:6
e=2.6666666666666665186
n=4
阶乘:24
e=2.7083333333333330373
n=5
阶乘:120
e=2.7166666666666663410
n=6
阶乘:720
e=2.7180555555555554470
n=7
阶乘:5040
e=2.7182539682539683668
n=8
阶乘:40320
e=2.7182787698412700372
n=9
阶乘:362880
e=2.7182815255731922477
n=10
阶乘:3628800
e=2.7182818011463845131
n=11
阶乘:39916800
e=2.7182818261984929009
n=12
阶乘:479001600
e=2.7182818282861687109
n=13
阶乘:6227020800
e=2.7182818284467593628
n=14
阶乘:87178291200
e=2.7182818284582301871
n=15
阶乘:1307674368000
e=2.7182818284589949087
n=16
阶乘:20922789888000
e=2.7182818284590428703
n=17
阶乘:355687428096000
e=2.7182818284590455349
n=18
阶乘:6402373705728000
e=2.7182818284590455349
n=19
阶乘:121645100408832000
e=2.7182818284590455349
n=20
阶乘:2432902008176640000
e=2.7182818284590455349
n=21
阶乘:-4249290049419214848
e=2.7182818284590455349
n=22
阶乘:-1250660718674968576
e=2.7182818284590455349
*/

注意n=21时阶乘计算已经溢出。

正文完
 0
评论(没有评论)