Top

CSD STDC01 DAY03

  1. 字符型char的定义和使用
  2. 整型int和浮点型double的定义和使用
  3. 变量的输入和输出
  4. 变量的输入和输出(续1)
  5. 运算符sizeof()
  6. 进制转换

1 字符型char的定义和使用

1.1 问题

C语言对字符类型视为整数类型,就是字符对应的ASCII码。ASCII码是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。ASCII是American Standard Code for Information Interchange缩写,意为美国标准信息交换代码。

1.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:字符型char的定义和使用

代码如下所示:

#include <stdio.h>

int main()
{
        char c = 'a';

        printf("%c\n", c);
        printf("%d\n", c);
        
        c = c + 1;

        printf("%c\n", c);
        printf("%d\n", c);

        c = 65;

        printf("%c\n", c);
        
        return 0;
}

上述代码中,以下代码:

        char c = 'a';

声明字符型变量c,并初始化为字符a的ASCII码,字符a的ASCII码定义为97,所以字符变量c中存放的实际是整形数字97。

上述代码中,以下代码:

        printf("%c\n", c);

使用函数printf输出字符型变量c,其中字符型变量所对应的格式控制符为%c。

上述代码中,以下代码:

        printf("%d\n", c);

因为字符型变量c中实际保存的是整形数字97,所以字符型变量也可以用整形的格式控制符%d来输出,与格式控制符%c的区别是,%c输出的是字符a,%d输出的是数字97。

上述代码中,以下代码:

        c = c + 1;

因为字符型变量c中存放的是数字97,所以字符型变量c可以进行算术运算。

上述代码中,以下代码:

        c = 65;

        printf("%c\n", c);

因为字符型变量c中存放的是数字97,所以字符型变量c中也可以被赋值为其他的整形数字。此时如果用格式控制符%c输出字符变量c,输出的结果将是字符A。因为字符A的ASCII码是65。

1.3 完整代码

本案例的完整代码如下所示:

#include <stdio.h>

int main()
{
        char c = 'a';

        printf("%c\n", c);
        printf("%d\n", c);
        
        c = c + 1;

        printf("%c\n", c);
        printf("%d\n", c);

        c = 65;

        printf("%c\n", c);
        
        return 0;
}

2 整型int和浮点型double的定义和使用

2.1 问题

int代表整数,是最常用的类型。整型按照符号分为有符号和无符号两种,有符号整型表示的是正整数、0和负整数;无符号整型表示的是正整数和0。按照所表示的整数大小分为短整型(short int)、整型(int)、长整型(long int)和长长整型(long long int)。

浮点型代表小数,C提供三种浮点类型,float(单精度)、double(双精度)和long double(扩展双精度),它们的区别是表示的小数精度和范围不同。

2.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:整型int的定义和使用

代码如下所示:

#include <stdio.h>

int main()
{
    short int si = 10;
    int i = 20;
    long int li = 30L;
    long long int lli = 40LL;

    unsigned short int usi = 50;
    unsigned int ui = 60u;
    unsigned long int uli = 70UL;
    unsigned long long int ulli = 80ULL;

    printf("%hd\n", si);
    printf("%d\n", i);
    printf("%ld\n", li);
    printf("%lld\n", lli);
    printf("%hu\n", usi);
    printf("%u\n", ui);
    printf("%lu\n", uli);
    printf("%llu\n", ulli);

    return 0;
}

上述代码中,以下代码:

    short int si = 10;

声明短整型变量si,并初始化为10。

上述代码中,以下代码:

    int i = 20;

声明整型变量i,并初始化为20。

上述代码中,以下代码:

    long int li = 30L;

声明长整型变量li,并初始化为30。

上述代码中,以下代码:

    long long int lli = 40LL;

声明长长整型变量lli,并初始化为40。

上述代码中,以下代码:

    unsigned short int usi = 50;

声明无符号短整型变量usi,并初始化为50。

上述代码中,以下代码:

    unsigned int ui = 60u;

声明无符号整型变量ui,并初始化为60。

上述代码中,以下代码:

    unsigned long int uli = 70UL;

声明无符号长整型变量uli,并初始化为70。

上述代码中,以下代码:

    unsigned long long int ulli = 80ULL;

声明无符号长长整型变量ulli,并初始化为80。

上述代码中,以下代码:

    printf("%hd\n", si);

使用函数printf输出短整型变量si,短整型的格式控制符为%hd。

上述代码中,以下代码:

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

使用函数printf输出整型变量i,整型的格式控制符为%d。

上述代码中,以下代码:

    printf("%ld\n", li);

使用函数printf输出长整型变量li,长整型的格式控制符为%ld。

上述代码中,以下代码:

    printf("%lld\n", lli);

使用函数printf输出长长整型变量lli,长长整型的格式控制符为%lld。

上述代码中,以下代码:

    printf("%hu\n", usi);

使用函数printf输出无符号短整型变量usi,无符号短整型的格式控制符为%hu。

上述代码中,以下代码:

    printf("%u\n", ui);

使用函数printf输出无符号整型变量ui,无符号整型的格式控制符为%u。

上述代码中,以下代码:

    printf("%lu\n", uli);

使用函数printf输出无符号长整型变量uli,无符号长整型的格式控制符为%lu。

上述代码中,以下代码:

    printf("%llu\n", ulli);

使用函数printf输出无符号长长整型变量ulli,无符号长长整型的格式控制符为%llu。

步骤二:浮点型double的定义和使用

代码如下所示:

#include <stdio.h>

int main()
{
    float f = 5.5f;
    double d = 6.6;
    long double ld = 8.8L;
    
    printf("%f\n", f);
    printf("%lf\n", d);
    printf("%Lf\n", ld);
    
    return 0;
}

上述代码中,以下代码:

    float f = 5.5f;

声明单精度浮点型变量f,并初始化为5.5。注意,单精度浮点型常量5.5后面需要加f。

上述代码中,以下代码:

    double d = 6.6;

声明双精度浮点型变量d,并初始化为6.6。

上述代码中,以下代码:

    long double ld = 8.8L;

声明扩展双精度浮点型变量ld,并初始化为8.8。注意,扩展双精度浮点型常量8.8后面需要加L。

上述代码中,以下代码:

    printf("%f\n", f);

使用函数printf输出单精度浮点型变量f,单精度浮点型的格式控制符为%f。

上述代码中,以下代码:

    printf("%lf\n", d);

使用函数printf输出双精度浮点型变量d,双精度浮点型的格式控制符为%lf。

上述代码中,以下代码:

    printf("%Lf\n", ld);

使用函数printf输出扩展双精度浮点型变量d,扩展双精度浮点型的格式控制符为%Lf。

2.3 完整代码

本案例的完整代码如下所示:

整型int的定义和使用,代码如下所示:

#include <stdio.h>

int main()
{
    short int si = 10;
    int i = 20;
    long int li = 30L;
    long long int lli = 40LL;

    unsigned short int usi = 50;
    unsigned int ui = 60u;
    unsigned long int uli = 70UL;
    unsigned long long int ulli = 80ULL;

    printf("%hd\n", si);
    printf("%d\n", i);
    printf("%ld\n", li);
    printf("%lld\n", lli);
    printf("%hu\n", usi);
    printf("%u\n", ui);
    printf("%lu\n", uli);
    printf("%llu\n", ulli);

    return 0;
}

浮点型double的定义和使用,代码如下所示:

#include <stdio.h>

int main()
{
    float f = 5.5f;
    double d = 6.6;
    long double ld = 8.8L;
    
    printf("%f\n", f);
    printf("%lf\n", d);
    printf("%Lf\n", ld);
    
    return 0;
}

3 变量的输入和输出

3.1 问题

使用函数printf输出变量的值到屏幕。使用函数scanf从键盘输入值到变量中。

本案例要求输入一个圆形的半径,输出圆形的面积。

3.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:变量的输入和输出

代码如下所示:

#include <stdio.h>

int main()
{
        int r;
        printf("请输入圆的半径:");
        scanf("%d", &r);

        double area;
        area = 3.1415 * r * r;
        printf("圆的面积是:%lf\n", area);

        return 0;
}

上述代码中,以下代码:

        int r;

声明整型变量r,用于存储圆的半径。

上述代码中,以下代码:

        printf("请输入圆的半径:");
        scanf("%d", &r);

首先使用函数printf提示用户"请输入圆的半径:",这是输入数据的惯常用法。

然后使用函数scanf从键盘输入圆的半径到整型变量r中。scanf函数有两个参数,第一个参数为格式控制符,与printf类似,对应后面的变量,第二个参数必须为变量的地址。

上述代码中,以下代码:

        double area;

声明双精度浮点型变量area,用于存放圆的面积。

上述代码中,以下代码:

        area = 3.1415 * r * r;
        printf("圆的面积是:%lf\n", area);

计算圆的面积并使用函数printf输出圆的面积值。

3.3 完整代码

本案例的完整代码如下所示:

#include <stdio.h>

int main()
{
        int r;
        printf("请输入圆的半径:");
        scanf("%d", &r);

        double area;
        area = 3.1415 * r * r;
        printf("圆的面积是:%lf\n", area);

        return 0;
}

4 变量的输入和输出(续1)

4.1 问题

输入三个学生的考试成绩,计算总分。

4.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:变量声明

代码如下所示:

#include <stdio.h>

int main()
{
    int zhangSan;
    int liSi;
    int wangWu;

    printf("请输入张三的成绩:");
    scanf("%d", &zhangSan);
    printf("请输入李四的成绩:");
    scanf("%d", &liSi);
    printf("请输入王五的成绩:");
    scanf("%d", &wangWu);

    int sum;
    sum = zhangSan + liSi + wangWu;
    printf("三个人的总成绩是:%d\n", sum);

    return 0;
}

上述代码中,以下代码:

    int zhangSan;
    int liSi;
    int wangWu;

定义三个整型变量,分别用于存储张三、李四、王五这三个学生的成绩。

上述代码中,以下代码:

    printf("请输入张三的成绩:");
    scanf("%d", &zhangSan);

首先使用函数printf提示输入张三的成绩。

然后,使用函数scanf输入。

上述代码中,以下代码:

    printf("请输入李四的成绩:");
    scanf("%d", &liSi);

首先使用函数printf提示输入李四的成绩。

然后,使用函数scanf输入。

上述代码中,以下代码:

    printf("请输入王五的成绩:");
    scanf("%d", &wangWu);

首先使用函数printf提示输入王五的成绩。

然后,使用函数scanf输入。

上述代码中,以下代码:

    int sum;
    sum = zhangSan + liSi + wangWu;

首先定义一个整型变量sum,用于存储三个学生的总成绩。

然后计算张三、李四、王五的总成绩并存入整型变量sum中。

上述代码中,以下代码:

    printf("三个人的总成绩是:%d\n", sum);

使用函数printf输出三个学生的总成绩。

4.3 完整代码

本案例的完整代码如下所示:

#include <stdio.h>

int main()
{
    int zhangSan;
    int liSi;
    int wangWu;

    printf("请输入张三的成绩:");
    scanf("%d", &zhangSan);
    printf("请输入李四的成绩:");
    scanf("%d", &liSi);
    printf("请输入王五的成绩:");
    scanf("%d", &wangWu);

    int sum;
    sum = zhangSan + liSi + wangWu;
    printf("三个人的总成绩是:%d\n", sum);

    return 0;
}

5 运算符sizeof()

5.1 问题

运算符sizeof用于计算类型所占的存储空间。sizeof的使用方法看起来像一个函数,但其实是一个运算符。

5.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:运算符sizeof()

代码如下所示:

#include <stdio.h>

int main()
{
    int i;
    short int si;
    long int li;
    unsigned int ui;
    unsigned short int usi;
    unsigned long int uli;
    float f;
    double d;
    long double ld;
    char c;
    unsigned char uc;

    printf("int 型所占的字节数为:%ld\n", sizeof(i));
    printf("short int 型所占的字节数为:%ld\n", sizeof(si));
    printf("long int 型所占的字节数为:%ld\n", sizeof(li));
    printf("unsigned int 型所占的字节数为:%ld\n", sizeof(ui));
    printf("unsigned short int 型所占的字节数为:%ld\n", sizeof(usi));
    printf("unsigned long int 型所占的字节数为:%ld\n", sizeof(uli));
    printf("float 型所占的字节数为:%ld\n", sizeof(f));
    printf("double 型所占的字节数为:%ld\n", sizeof(d));
    printf("long double 型所占的字节数为:%ld\n", sizeof(ld));
    printf("char 型所占的字节数为:%ld\n", sizeof(c));
    printf("unsigned char 型所占的字节数为:%ld\n", sizeof(uc));

    printf("int 型所占的字节数为:%ld\n", sizeof(int));
    i = 5;
    printf("表达式 i = 10 所占的字节数为:%ld\n", sizeof(i = 10));
    printf("i = %d\n", i);

    return 0;
}

上述代码中,以下代码:

    int i;
    short int si;
    long int li;
    unsigned int ui;
    unsigned short int usi;
    unsigned long int uli;
    float f;
    double d;
    long double ld;
    char c;
    unsigned char uc;

声明了C语言提供的各种数据类型的变量。

上述代码中,以下代码:

    printf("int 型所占的字节数为:%ld\n", sizeof(i));
    printf("short int 型所占的字节数为:%ld\n", sizeof(si));
    printf("long int 型所占的字节数为:%ld\n", sizeof(li));
    printf("unsigned int 型所占的字节数为:%ld\n", sizeof(ui));
    printf("unsigned short int 型所占的字节数为:%ld\n", sizeof(usi));
    printf("unsigned long int 型所占的字节数为:%ld\n", sizeof(uli));
    printf("float 型所占的字节数为:%ld\n", sizeof(f));
    printf("double 型所占的字节数为:%ld\n", sizeof(d));
    printf("long double 型所占的字节数为:%ld\n", sizeof(ld));
    printf("char 型所占的字节数为:%ld\n", sizeof(c));
    printf("unsigned char 型所占的字节数为:%ld\n", sizeof(uc));

使用函数printf输出C语言提供的各种数据类型变量所占的字节数。

注意:sizeof运算符的运算结果对应的格式控制符为%ld。

上述代码中,以下代码:

    printf("int 型所占的字节数为:%ld\n", sizeof(int));

运算符sizeof除了可以计算变量所占的字节数,还可以直接计算数据类型所占的字节数。

上述代码中,以下代码:

    i = 5;
    printf("表达式 i = 10 所占的字节数为:%ld\n", sizeof(i = 10));

运算符sizeof也可以计算表达式的运算结果所占的字节数。

注意:sizeof只关心类型,只会分析括号中的类型,不会对括号中的内容进行运算。如下语句:

    printf("i = %d\n", i);

输出的变量i的值还为5。

5.3 完整代码

本案例的完整代码如下所示:

#include <stdio.h>

int main()
{
    int i;
    short int si;
    long int li;
    unsigned int ui;
    unsigned short int usi;
    unsigned long int uli;
    float f;
    double d;
    long double ld;
    char c;
    unsigned char uc;

    printf("int 型所占的字节数为:%ld\n", sizeof(i));
    printf("short int 型所占的字节数为:%ld\n", sizeof(si));
    printf("long int 型所占的字节数为:%ld\n", sizeof(li));
    printf("unsigned int 型所占的字节数为:%ld\n", sizeof(ui));
    printf("unsigned short int 型所占的字节数为:%ld\n", sizeof(usi));
    printf("unsigned long int 型所占的字节数为:%ld\n", sizeof(uli));
    printf("float 型所占的字节数为:%ld\n", sizeof(f));
    printf("double 型所占的字节数为:%ld\n", sizeof(d));
    printf("long double 型所占的字节数为:%ld\n", sizeof(ld));
    printf("char 型所占的字节数为:%ld\n", sizeof(c));
    printf("unsigned char 型所占的字节数为:%ld\n", sizeof(uc));

    printf("int 型所占的字节数为:%ld\n", sizeof(int));
    i = 5;
    printf("表达式 i = 10 所占的字节数为:%ld\n", sizeof(i = 10));
    printf("i = %d\n", i);

    return 0;
}

6 进制转换

6.1 问题

分别完成二进制和十进制之间的转换,包括正数和负数。

6.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:从十进制正整数到二进制的转换:

例如:十进制数34转换成二进制数的过程如下

34 ÷ 2 = 17 余数为 0

17 ÷ 2 = 8 余数为 1

8 ÷ 2 = 4 余数为 0

4 ÷ 2 = 2 余数为 0

2 ÷ 2 = 1 余数为 0

1 ÷ 2 = 0 余数为 1

将余数从下向上读出的二进制数即为转换后的二进制数。

即十进制数34转换成的二进制数为 100010。

步骤二:从十进制负整数到二进制的转换:

方法:先将负数对应的正数转换成二进制,然后对二进制数按位取反后加1即可。

例如:十进制数-34转换成二进制数的过程如下:

首先,将34转换成二进制数为100010。

然后,把这个二进制数按位取反为011101。

最后,把取反后的二进制数加1为011110,即得到十进制数-34的二进制格式。

步骤三:从二进制正数到十进制的转换:

例如:二进制数100010转换成十进制数的过程如下:

首先将二进制数100010从最后一位开始算,依次为0、1、2、… 位。

第0位 0 * 20 = 0

第1位 1 * 21 = 2

第2位 0 * 22 = 0

第3位 0 * 23 = 0

第4位 0 * 24 = 0

第5位 1 * 25 = 32

然后把结果加起来 0 + 2 + 0 + 0 + 0 + 32 = 34

即二进制数100010转换成的十进制数为34。

步骤四:从二进制负数到十进制的转换:

方法:按位取反后加1可以得到对应的正数,然后加上负号即可。

例如:二进制数011110转换成十进制数的过程如下:

首先,将二进制数011110按位取反得到100001。

然后,将取反后的二进制数100001加1,得到100010。

最后,使用步骤三的方法,将二进制数100010转换成十进制数34,在加上-号,记得到二进制数011110的十进制格式-34。