【C语言】学习笔记 第7章 基本类型 编程题

【C语言】学习笔记

第7章 基本类型

在这里插入图片描述

计算机处理的是数而不是符号。我们用对行为的算术化程度 来衡量我们的理解力(和控制力)。

编程题

【1】如果 i * i 超出了 int 类型的最大取值,那么 6.3 节的程序 square2.c 将失败(通常会显示奇怪的答 案)。

在这里插入图片描述

运行该程序,并确定导致失败的 n 的最小值。尝试把变量 i 的类型改成 short 并再次运行该 程序。(不要忘记更新 printf 函数调用中的转换说明!)然后尝试将其改成 long。从这些实验中, 你能总结出在你的机器上用于存储整数类型的位数是多少吗?

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可以看见,46341 的平方就已经超过了32 位int 类型的最大值 2147483647,直接溢出了,

修改为short int:

在这里插入图片描述

在这里插入图片描述

效果也很明显,182的时候,182平方会超过16位短整型的最大数32767,进而溢出。

修改为long 类型:

在这里插入图片描述

效果也很明显,和int 一样。

【说明】 在笔者的Windows11 操作系统下,使用MinGW 编译器,int 是32位,long int 也是32位。

【2】修改 6.3 节的程序 square2.c,每 24 次平方运算后暂停,并显示下列信息:

Press Enter to continue...

显示完上述消息后,程序应该使用 getchar 函数读入一个字符。getchar 函数读到用户输入的回车 键才允许程序继续。

#include<stdio.h>

int main(void) {

    int i, n;

    printf("This program prints a table of squares.\n");
    printf("Enter number of entries in table: ");

    scanf("%d", &n);
    getchar();

    for (i = 1; i <= n; i++) {
        printf("%10d%10d\n", i, i * i);
        if (i % 24 == 0) {
            printf("Press Enter to continue...");
            while (getchar() != '\n');
        }
    }

    return 0;
}

在这里插入图片描述

【3】修改 7.1 节的程序 sum2.c,对 double 型值组成的数列求和。

在这里插入图片描述

#include<stdio.h>

int main(void) {

    double lf, sum = 0;

    printf("This program sums a series of double integers.\n");
    printf("Enter integers (0 to terminate): ");

    scanf("%lf", &lf);
    while (lf != 0) {
        sum += lf;
        scanf("%lf", &lf);
    }

    printf("The suum is: %lf\n", sum);

    return 0;
}

在这里插入图片描述

【4】编写可以把字母格式的电话号码翻译成数值格式的程序:

Enter phone number: CALLATT 2255288

(如果没有电话在身边,参考这里给出的字母在键盘上的对应关系:2=ABC、3=DEF、4=GHI、5=JKL、 6=MNO、7=PQRS、8=TUV、9=WXYZ。)原始电话号码中的非字母字符(例如数字或标点符号)保持不变:

Enter phone number: 1-800-COL-LECT
1-800-265-5328

可以假设任何用户输入的字母都是大写字母。

#include<stdio.h>

int main(void) {

    char c;
    printf("Enter phone number: ");

    while ((c = getchar()) != '\n') {

        if (c >= 'A' && c <= 'C') printf("%d", 2);
        else if (c >= 'D' && c <= 'F') printf("%d", 3);
        else if (c >= 'G' && c <= 'I') printf("%d", 4);
        else if (c >= 'J' && c <= 'L') printf("%d", 5);
        else if (c >= 'M' && c <= 'O') printf("%d", 6);
        else if (c >= 'P' && c <= 'S') printf("%d", 7);
        else if (c >= 'T' && c <= 'V') printf("%d", 8);
        else if (c >= 'W' && c <= 'Z') printf("%d", 9);
        else printf("%c", c);
    }

    return 0;
}

在这里插入图片描述

【5】在十字拼字游戏中,玩家利用小卡片组成英文单词,每张卡片包含一个英文字母和面值。面值根据 字母稀缺程度的不同而不同。(面值与字母的对应关系如下:1——AEILNORSTU;2——DG;3—— BCMP;4——FHVWY;5——K;8——JX;10——QZ。)编写程序,通过对单词中字母的面值求和 来计算单词的值:

Enter a word: pitfall 
Scrabble value: 12 

编写的程序应该允许单词中混合出现大小写字母。提示:使用 toupper 库函数。

#include <stdio.h>
#include <ctype.h>

int main(void) {

    char c;
    int sum = 0;

    printf("Enter a word: ");

    while ((c = getchar()) != '\n') {
        c = toupper(c);
        if (c == 'D' || c == 'G') sum += 2;
        else if (c == 'J' || c == 'X') sum += 8;
        else if (c == 'Q' || c == 'Z') sum += 10;
        else if (c == 'K') sum += 5;
        else if (c == 'B' || c == 'C' || c == 'M' || c == 'P') sum += 3;
        else if (c == 'F' || c == 'H' || c == 'V' || c == 'W' || c == 'Y') sum += 4;
        else sum += 1;
    }

    printf("Scrabble value: %d", sum);

    return 0;
}

在这里插入图片描述

【6】编写程序显示 sizeof(int)、sizeof(short)、sizeof(long)、sizeof(float)、sizeof(double) 和 sizeof(long double)的值。

#include <stdio.h>

int main(void) {

    printf("Size of int is : %zu\n", sizeof(int));
    printf("Size of short is : %zu\n", sizeof(short));
    printf("Size of long is : %zu\n", sizeof(long));
    printf("Size of float is : %zu\n", sizeof(float));
    printf("Size of double is : %zu\n", sizeof(double));
    printf("Size of long double is : %zu\n", sizeof(long double));

    return 0;
}

不同计算机运行结果可能不同

在这里插入图片描述

【7】修改第 3章的编程题 6,使得用户可以对两个分数进行加、减、乘、除运算(在两个分数之间输入+-*/符号)。

在这里插入图片描述

#include<stdio.h>

int main(void) {

    int num1, denom1, num2, denom2, result_num, result_denom;
    char operate;

    printf("Enter two fractions separated by a operator sign: ");
    scanf("%d/%d%c%d/%d", &num1, &denom1, &operate, &num2, &denom2);


    switch (operate) {
    case '+':
        result_num = num1 * denom2 + num2 * denom1;
        result_denom = denom1 * denom2;
        break;
    case '-':
        result_num = num1 * denom2 - num2 * denom1;
        result_denom = denom1 * denom2;
        break;
    case '*':
        result_num = num1 * num2;
        result_denom = denom1 * denom2;
        break;
    case '/':
        result_num = num1 * denom2;
        result_denom = denom1 * num2;
        break;
    }

    printf("The result is %d/%d\n", result_num, result_denom);

    return 0;
}

在这里插入图片描述

【8】修改第 5章的编程题 8,

在这里插入图片描述

要求用户输入 12小时制的时间。输入时间的格式为时:分后跟 A、P、AM或 PM(大小写均可)。数值时间和 AM/PM 之间允许有空白(但不强制要求有空白)。有效输入的示 例如下:

1:15P 
1:15PM 
1:15p 
1:15pm 
1:15 P 
1:15 PM 
1:15 p 
1:15 pm

可以假定输入的格式就是上述之一,不需要进行错误判定。

#include<stdio.h>

int main(void) {

    int hour, minute;
    int input_minutes;
    char am_pm;

    printf("Enter a 24-hour time: ");
    scanf("%d:%d %c", &hour, &minute, &am_pm);

    if (am_pm == 'A' || am_pm == 'a') {
        input_minutes = hour * 60 + minute;
    }
    else {
        input_minutes = hour * 60 + minute + 12 * 60;
    }

    if (input_minutes < (615) / 2) {
        printf("Closet departure time is 9:45 PM, arriving at 11:58 PM.");
    }
    else if (input_minutes < (8 * 60 + 9 * 60 + 43) / 2) {
        printf("Closet departure time is 9:43 AM, arriving at 10:16 AM.");
    }
    else if (input_minutes < (9 * 60 + 43 + 11 * 60 + 19) / 2) {
        printf("Closet departure time is 11:19 AM, arriving at 1:31 PM.");
    }
    else if (input_minutes < (12 * 60 + 47 + 14 * 60) / 2) {
        printf("Closet departure time is 12:47 PM, arriving at 3:00 PM.");
    }
    else if (input_minutes < (14 * 60 + 15 * 60 + 45) / 2) {
        printf("Closet departure time is 2:00 PM, arriving at 4:08 PM.");
    }
    else if (input_minutes < (15 * 60 + 45 + 19 * 60) / 2) {
        printf("Closet departure time is 3:45 PM, arriving at 5:55 PM.");
    }
    else if (input_minutes < (19 * 60 + 21 * 60 + 45) / 2) {
        printf("Closet departure time is 7:00 PM, arriving at 9:20 PM.");
    }
    else {
        printf("Closet departure time is 9:45 PM, arriving at 11:58 PM.");
    }

    return 0;
}

在这里插入图片描述

【9】编写程序,要求用户输入 12 小时制的时间,然后用 24 小时制显示该时间:

Enter a 12-hour time: 9:11 PM
Equivalent 24-hour time: 21:11
#include<stdio.h>

int main(void) {

    int hour, minute;
    int input_minutes;

    char am_pm;

    printf("Enter a 12-hour time: ");
    scanf("%d:%d %c", &hour, &minute, &am_pm);

    if (am_pm == 'A' || am_pm == 'a') {
        printf("Equivalent 24-hour time: %d:%d", hour, minute);
    }
    else {
        printf("Equivalent 24-hour time: %d:%d", hour + 12, minute);
    }

    return 0;
}

在这里插入图片描述

【10】编写程序统计句子中元音字母(a、e、i、o、u)的个数:

Enter a sentence: And that's the way it is.
Your sentence contains 6 vowels.
#include <stdio.h>
#include <ctype.h>

int main(void) {

    int counter = 0;
    char c;

    printf("Enter a sentence: ");
    while ((c = getchar()) != '\n') {
        c = toupper(c);
        if (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') counter++;
    }

    printf("Your sentence contains %d vowels.", counter);

    return 0;
}

在这里插入图片描述

【11】编写一个程序,要求用户输入英文名和姓,并根据用户的输入先显示姓,其后跟一个逗号,然后显 示名的首字母,最后加一个点:

Enter a first and last name: Lloyd Fosdick
Fosdick, L.

用户的输入中可能包含空格(名之前、名和姓之间、姓氏之后)。

#include<stdio.h>

int main(void) {

    char fname = ' ';
    char c;
    int lname = 0;

    printf("Enter a first and last name: ");

    while ((c = getchar()) != '\n') {
        if (c != ' ' && fname == ' ') fname = c;
        else if (c == ' ' && lname == 0) lname = 1;
        else if (c != ' ' && lname == 1) printf("%c", c);
    }

    printf(", %c.", fname);

    return 0;
}

在这里插入图片描述

【12】编写程序对表达式求值:

Enter an expression: 1+2.5*3
Value of expression: 10.5

表达式中的操作数是浮点数,运算符是+、-、*和/。表达式从左向右求值(所有运算符的优先级都 一样)。

#include <stdio.h>

int main(void) {

    char operate;
    float number, result = 0;

    printf("Enter an expression: ");
    scanf("%f", &result);

    while ((operate = getchar()) != '\n') {

        scanf("%f", &number);

        if (operate == '+') result += number;
        else if (operate == '-') result -= number;
        else if (operate == '*') result *= number;
        else if (operate == '/') result /= number;
    }

    printf("Value of expression: %f\n", result);

    return 0;
}

在这里插入图片描述

【13】编写程序计算句子的平均词长:

Enter a sentence: It was deja vu all over again.
Average word length: 3.4

简单起见,程序中把标点符号看作其前面单词的一部分。平均词长显示一个小数位。

#include <stdio.h>

int main(void) {

    int words = 1;
    int allchars = 0;
    char c;

    printf("Enter a sentence: ");
    while ((c = getchar()) != '\n') {
        if (c == ' ') words++;
        else allchars++;
    }

    printf("Average word length: %.1f\n", 1.0 * allchars / words);

    return 0;
}

在这里插入图片描述

【14】编写程序,用牛顿方法计算正浮点数的平方根:

Enter a positive number: 3
Square root: 1.73205

设 x 是用户输入的数。牛顿方法需要先给出 x 平方根的猜测值 y(我们使用 1)。后续的猜测值通过计 算 y 和 x/y 的平均值得到。下表中给出了求解 3 的平方根的过程。

在这里插入图片描述

注意,y 的值逐渐接近 x 的平方根。为了获得更高的精度,程序中应使用 double 类型的变量代替 float类型的变量。当y的新旧值之差的绝对值小于0.000 01和y的乘积时程序终止。提示:调用fabs 函数求 double 类型数值的绝对值。(为了使用 fabs 函数,需要在程序的开头包含<math.h>头。)

#include <stdio.h>
#include <math.h>

int main(void) {

    double x, newy, y = 1.0;
    printf("Enter a positive number: ");
    scanf("%lf", &x);

    do {
        newy = (y + x / y) / 2;
        if (fabs(newy - y) < 0.00001 * y) break;
        else y = newy;
    } while (1);

    printf("Square root: %f\n", y);

    return 0;
}

在这里插入图片描述

【15】编程计算正整数的阶乘:

Enter a positive integer: 6
Factorial of 6: 720
#include <stdio.h>
#include <math.h>

int main(void) {

    int n, result = 1;

    printf("Enter a positive integer: ");
    scanf("%d", &n);

    for (int i = 1; i <= n; i++) {
        result *= i;
    }

    printf("Factorial of %d: %d", n, result);

    return 0;
}

在这里插入图片描述

(a) 用 short 类型变量存储阶乘的值。为了正确打印出 n 的阶乘,n 的最大值是多少

short类型通常是16位,因此最大值是32 767,最多只能计算7 的阶乘 = 5040

(b) 用 int 类型变量重复(a)。

int类型通常是32为,最大值为2147483647,最多只能计算到12的阶乘 = 479001600

© 用 long 类型变量重复(a)。

long类型通常和int 长度一样

(d) 如果你的编译器支持 long long 类型,用 long long 类型变量重复(a)。

long long类型最多能够计算20的阶乘

(e) 用 float 类型变量重复(a)。

(f) 用 double 类型变量重复(a)。

double 最多能计算170的阶乘,其结果是近似值,约为 7.2574 × 1 0 306 7.2574 \times 10^{306} 7.2574×10306

(g) 用 long double 类型变量重复(a)。

在(e)~(g)这几种情况下,程序会显示阶乘的近似值,不一定是准确值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ding Jiaxiong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值