C语言程序设计基础PTA考试复习资料

选择判断题

已知字符 B的ASCII码是66,那么也可以通过转义符 \,用 '\66'来表示字符常量 B。(F)

定义变量 int a;,则表达式 a = 3, 5; 执行过后,a的值和表达式的值分别是:(3 , 5)

#include <math.h> 对应的方法是fabs(),而不是abs()

在对数组全部元素赋初值时,不可以省略行数,但能省略列数。(F)

函数strcmp从头至尾顺序地将其对应字符比较,遇到两个字符不等时,两个字符相减得到一个int型值,两个字符串完全相同时,则返回0。(T)

指向数组元素的指针只可指向数组的首元素。(F)

对于已正确定义的二维数组a, *(a[i]+j)a[i][j]的含义相同。(T)

image-hjrk.png

image-qkhv.png

字符串字面值的内部字符序列

"abc\000def\n" 会被编译器解析为以下字符(用 ASCII 码表示):

  • 'a' → 97
  • 'b' → 98
  • 'c' → 99
  • '\000' → 八进制转义,值为 0(即空字符 '\0'
  • 'd' → 100
  • 'e' → 101
  • 'f' → 102
  • '\n' → 换行符(ASCII 10)
  • 最后还有一个隐含的字符串结束符 '\0'(因为这是双引号字符串字面值)。

字符串长度 len

len 是指用 strlen(str) 计算的结果,即从开头到第一个 '\0' 之前的字符个数。

这里第一个 '\0' 出现在 'c' 之后(第 4 个字节,下标 3),所以:
strlen(str) = 3(字符 'a','b','c')。

3. 数组大小 size

char str[] 用字符串字面值初始化,数组大小等于整个初始值(包括末尾隐含的 '\0')的字符数。

我们数一下上面字节序列的总数:

  1. a
  2. b
  3. c
  4. \000
  5. d
  6. e
  7. f
  8. \n
  9. \0(自动添加的结尾)

一共 9 个 char。

所以 sizeof(str) = 9

程序题

水仙花数判断

问题描述
水仙花数是指一个三位数,其各位数字立方和等于该数本身。例如:153 = 1³ + 5³ + 3³。输入一个三位数,判断是否为水仙花数。
输入格式
一个三位整数。
输出格式
如果是水仙花数,输出 Yes;否则输出 No

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

int main(){
    int num;
    scanf("%d",&num);
    if(pow(num/100,3)+pow(num/10%10,3)+pow(num%10,3)==num){
        printf("Yes");
    }else{
        printf("No");
    }
}

统计大小写字母数目

从键盘读入不超过20个字符,统计其中大写字母、小写字母、数字、其他字符的个数。

#include <stdio.h>
#include <string.h>

int main() {
    char str[21];
    int upper = 0, lower = 0, digit = 0, other = 0;
    if (fgets(str, sizeof(str), stdin) != NULL) {
        int len = strlen(str);
        if (len == 20 && str[19] != '\n') {
            printf("ERROR\n");
            return 0;
        }
        for (int i = 0; i < len && str[i] != '\n'; i++) {
            if (str[i] >= 'A' && str[i] <= 'Z') upper++;
            else if (str[i] >= 'a' && str[i] <= 'z') lower++;
            else if (str[i] >= '0' && str[i] <= '9') digit++;
            else other++;
        }
        printf("%d,%d,%d,%d\n", upper, lower, digit, other);
    }
    return 0;
}

十进制转N进制

任务描述

将十进制非负整数M转换成N进制数。(N进制的数有0,1,2,...,N-1共N个数字,逢N进1。)(用循环解决)
其中,1000000>=M>=0,10>=N>=2。

输入格式:

若干行,每行2个整数M和N,代表一组数据。

输出格式:

依次输出每组数据转换成的十进制数,每个输出结果单独占一行。

输入样例:

10 4
100 8
56 7

输出样例:

22
144
110
#include <stdio.h>

int main() {
    int M, N;
    while (scanf("%d %d", &M, &N) != EOF) {
        if (M == 0) {
            printf("0\n");
            continue;
        }
    
        int digits[32]; 
        int len = 0;
    
        int num = M;
        while (num > 0) {
            digits[len++] = num % N;
            num /= N;
        }
    
        for (int i = len - 1; i >= 0; i--) {
            printf("%d", digits[i]);
        }
        printf("\n");
    }
  
    return 0;
}

字符串循环左移

输入一个字符串和一个非负整数N,要求将字符串循环左移N次。

输入格式:

输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N

输出格式:

在一行中输出循环左移N次后的字符串。

输入样例:

Hello World!
2

输出样例:

llo World!He
#include <stdio.h>
#include <string.h>

int main() {
    char str[101];
    int n, len;
  
    fgets(str, 101, stdin);
    len = strlen(str);
    if (str[len - 1] == '\n') {
        str[len - 1] = '\0';
        len--;
    }
  
    scanf("%d", &n);
  
    n = n % len;
  
    for (int i = n; i < len; i++) {
        printf("%c", str[i]);
    }
    for (int i = 0; i < n; i++) {
        printf("%c", str[i]);
    }
  
    return 0;
}

为梦想创造现实!