tt

C语言完整练习题(高清排版版)

说明:正确答案/程序结果用蓝色加粗高亮,解析简洁易懂,代码块格式清晰


一、单选题(含答案+解析)

答题说明

  • 正确选项与答案均用「蓝色加粗」标注
  • 解析覆盖核心考点,便于理解记忆

题目列表

1.若有int a=3,*p=&a;,则*p的值是( )。
A.地址 B.0 C.3 D.不确定
答案:C
解析*p是对指针p的解引用,p指向a的地址,因此*p等价于a,值为3。

2.若要正确输入int a; float b; double c;,则正确的scanf语句是( )。
A. scanf("%d %f %lf",&a,&b,&c);
B. scanf("%d %f %f",&a,&b,&c);
C. scanf("%d %lf %lf",&a,&b,&c);
D. scanf("%d %lf %f",&a,&b,&c);
答案:A
解析int对应%dfloat对应%fdouble对应%lf,只有A的格式符完全匹配。

3.若有char str[]="C";,则 strlen(str)的值为( )。
A.1 B.2 C.0 D.不确定
答案:A
解析strlen()统计\0前的字符数,"C"存储为'C'+'\0',因此结果为1。

4.表达式2.5+7/2-3%2的值是( )。
A. 3.5 B. 4.5 C. 3.0 D. 4.0
答案:A
解析7/2=3(整数除法)、3%2=1,计算得2.5+3-1=3.5

5.以下合法的用户标识符是( )。
A. 3test B. test-2 C._test3 D.float
答案:C
解析:标识符不能以数字开头、含特殊字符、是关键字;_test3以下划线开头,符合规则。

6.若有定义int a=4,b=5;,则表达式(a++>4)&&(--b<5)的值是( )。
A. 0 B. 1 C. 4 D. 5
答案:A
解析a++>4a=4,条件为假,&&短路,右侧不执行,表达式结果为0。

7.以下关于C语言关系运算符优先级的描述,正确的是( )。
A. 关系运算符优先级高于算术运算符
B. ==(等于)的优先级高于<(小于)
C.a+3>b-2中,先计算算术运算再判断关系
D. 关系运算符优先级低于赋值运算符
答案:C
解析:算术运算符优先级高于关系运算符,因此先算a+3b-2,再判断关系。

8.若有说明:int a[ ][3]={1,2,3,4,5,6,7};,则a数组第一维的大小是( )。
A.2 B.3 C.4 D.无确定值
答案:B
解析:列数为3,7个元素需7÷3=2行余1个,因此行数为3。

9.已知字母A的ASCII码为十进制数65,数字0的ASCII码为十进制数48,且c2为字符型。则执行语句c2 = 'A'+'6'-'3';printf("%c",c2);后的输出结果是( )。
A.不确定的值 B.C C.68 D.D
答案:D
解析'A'+'6'-'3'=65+3=68,对应字符'D'。

10.for(int i=0;i<5;i++);此循环语句执行次数为( )。
A.6 B. 4 C.0 D.5
答案:D
解析i从0到4共5次,满足i<5,循环次数为5。

11.若有定义int a=5,b,*p=&a;则下列语句中( )使b不为5。
A.b=*&a; B.b=&p; C.b=a; D.b=p;
答案:B、D
解析&p是指针地址,pa的地址,均不是5;A、C的b值为5。

12.为表示关系x≥y≥z,应使用C语言表达式( )。
A.(x>=y)AND(y>=z)
B.(x>=y)&&(y>=z)
C.(x>=y>=z)
D.(x>=y)&(y>=z)
答案:B
解析:C语言用&&表示逻辑与,x≥y≥z需拆分为两个关系表达式的逻辑与。

13.使用sqrt()函数计算平方根时,必须包含的头文件是( ) 。
A. #include<stdio.h>
B.#include<math.h>
C. #include<string.h>
D. 不需要包含额外头文件
答案:B
解析sqrt()是数学函数,需包含math.h头文件。

14.若要求x、c1、c2的值分别为9、'K'和'H',以下程序段正确的数据输入是( )。
char c1,c2; int x; scanf("%c%d%c",&c1,&x,&c2);
A. K 9H
B. K 9 H
C. K9 H
D. 9KH
答案:A
解析%c会读取空白字符,A中K对应%c9对应%dH对应%c,无多余空白。

15.以下程序段输出结果是( )。
int x=1; do{ printf("%d ",x); x++; }while(x<=3);
A.1 2 3 4 B.1 2 C.2 3 D.1 2 3
答案:D
解析do-while先执行后判断,输出1、2、3后x=4,退出循环。

16.对于以下递归函数f,调用f(4),其返回值为( )。
int f(int n){ if(n) return f(n-1)+n; else return n;}
A.10 B.4 C.0 D.以上均不是
答案:A
解析:递归展开为f(4)=f(3)+4=…=0+1+2+3+4=10

17.若int a=5, b=10; 执行printf("%d",a>b?a:b);的输出是( )。
A.5 B.10 C.0 D.1
答案:B
解析a>b为假,三目运算符返回b的值10。

18.变量的指针,其含义是指该变量的( )。
A.值 B.地址 C.名 D.一个标志
答案:B
解析:指针变量存储的是另一个变量的内存地址。

19.设有定义char str1[] = "abc\0def", str2[10] = "xyz";,则strlen(str1) + strlen(str2)的值是( )。
A.3 B.6 C.9 D.12
答案:B
解析strlen(str1)=3(遇\0停止),strlen(str2)=3,总和为6。

28.有以下程序段
main(){ while( getchar()!='\n'); … }
以下叙述中正确的是( )。
A. 此while语句将无限循环
B. getchar()不可以出现在while语句的条件表达式中
C.当执行此while语句时,只有按回车键循环才会结束
D. 当执行此while语句时,按任意键循环就能结束
答案:C
解析getchar()!='\n'表示“非回车则循环”,按回车键时条件为假,循环结束。

29.若有说明语句:int m=5,n=4,p=3,q=2; 则表达式m>n?m:p>q?p:q的值是( )。
A.5 B.4 C.3 D.2
答案:A
解析m>n为真,直接返回m=5,右侧表达式不执行。

30.若a为整型,则表达式a=10%3+5/2的值是()
A.1 B.2 C.3 D.4
答案:C
解析10%3=15/2=2,总和为1+2=3


二、填空题(含答案+解析)

答题说明

  • 答案用「蓝色加粗」标注,解析补充核心知识点

题目列表

  1. 字符串处理函数中的 strcmp 函数用于实现两个字符串按ASCII码值逐字符比较。(只写函数名)
    解析strcmp(str1, str2) 比较规则:str1>str2返回正数,相等返回0,小于返回负数。

  2. int a=7,b=3;,则a%b的结果是 1
    解析:取余运算7%3=1,余数符号与被除数一致。

  3. int a=5;,则 printf("%d",++a); 输出 6
    解析++a是前置自增,先自增(a=6)再输出。

  4. 若有定义int x=3,y=5,z=2;,则表达式x>y?x:z>y?z:y的值是 5
    解析:三目运算符从右到左结合,先算z>y?z:y(2>5为假,返回5),再算x>y?x:5(3>5为假,返回5)。

  5. 在循环中,用于立即结束本次循环并进入下一次循环的语句是 continue
    解析continue跳过本次循环剩余语句,break终止整个循环。

  6. 若有定义int arr[5]={1,3,5,7,9},*p=arr;,则*(p+3)的值是 7
    解析p指向数组首地址,p+3指向第4个元素(下标3),值为7。

  7. 定义指向整型的指针变量p的语句是 *int p;
    解析:指针定义格式:数据类型 *指针变量名;

  8. 循环结构中 break 关键字可以退出整个循环体。
    解析break可用于循环和switchcontinue仅用于循环。

  9. int a[5][6]; 则数组a第五行最后一个元素表示为 a[4][5]
    解析:数组下标从0开始,第五行下标为4,第六列(最后一列)下标为5。

  10. 设i,j,k均为int型变量,则执行完下面的for循环后,k的值为 10
    for(i=0,j=10;i<=j;i++,j--) k=i+j;
    解析:每次循环i+j=10(0+10、1+9、2+8…5+5),最终k=10。


三、判断题(含答案+解析)

答题说明

  • 答案用「蓝色加粗」标注(对/错),解析说明核心原因

题目列表

  1. 指针变量可以直接赋值一个整数作为地址。
    解析:指针需指向合法内存地址,直接赋值整数可能导致非法访问,需用(int *)强制类型转换(仍不推荐)。

  2. 程序中的注释在程序运行时是无效的。
    解析:注释仅用于可读性,编译时会被忽略,不参与运行。

  3. 使用scanf函数输入字符串时,遇到空格或回车符会停止输入。
    解析scanf("%s", str) 以空白字符(空格/回车/Tab)作为字符串结束标志。

  4. while(1)是一个死循环。
    解析1为恒真条件,无break时会无限循环。

  5. C语言中,一维数组的某一个数组元素等价于一个同数据类型的变量。
    解析:数组元素可像普通变量一样赋值、运算,本质是固定内存地址的变量。

  6. 函数在main函数之后定义时,必须提前进行函数声明。
    解析:C语言遵循“先声明/定义后使用”,未声明直接调用会报错。

  7. 字符串"hello"的长度是5,在内存中占用6个字节(包含结束符\0)。
    解析strlen("hello")=5(不含\0),sizeof("hello")=6(含\0)。

  8. break语句只能用于循环结构中。
    解析break还可用于switch语句,终止case执行。

  9. 逻辑运算符&&的优先级高于||。
    解析:逻辑运算符优先级:! > && > ||

  10. while的循环体语句如果仅有一条语句,可以没有花括号。
    解析:单语句循环体可省略{},多语句必须加。


四、阅读程序写结果(含结果+解析)

答题说明

  • 程序结果用「蓝色加粗」标注,解析简洁明了
  • 代码块独立展示,格式清晰

题目列表

1. 字符串ASCII码转换

#include<stdio.h>
int main()
{ char s[20]={"afkbag"},c='a';
  int i=0;
  while(s[i]!='\0')
  {   if(s[i]==c) s[i]=s[i]-32;
      else if(s[i]==c-32) s[i]=s[i]+32;
      i++;}
  puts(s);
return 0;}

程序结果:<font color="#0066cc">AfkbAg</font>
解析:小写 'a' 的 ASCII 码减 32 转为大写 'A',原字符串afkbag中第 1、5 位的 'a' 被转换,其余字符不变。
2. 指针地址比较
c
运行
#include<stdio.h>
int main(){
    int a[3]={1,2,3};
    int *p=a;
    int *q=&a[2];
    if(p<q){
        printf("%d %d\n",*p,*q);
    }else{
        printf("指针顺序错误\n");
    }
    return 0;
}
程序结果:<font color="#0066cc">1 3</font>
解析:指针p指向数组首元素a[0],q指向a[2],数组地址从低到高分配,p<q为真,输出对应值。
3. 指针传参修改变量
c
运行
#include<stdio.h>
void fun(int *x, int *y){
  printf("%d %d ",*x,*y);
  *x=3; 
 *y=4;}
int main( ){
  int x=1,y=2;  
  fun(&x,&y);  
  printf("%d %d", x, y);
  return 0;}
程序结果:<font color="#0066cc">1 2 3 4</font>
解析:函数接收变量地址,先输出x=1、y=2,再通过指针修改为3、4,主函数输出修改后的值。
4. 简单函数求和
c
运行
#include<stdio.h>
int add(int x,int y){
    return x+y;
}
int main(){
    int a=10,b=20;
    printf("%d\n",add(a,b));
    return 0;
}
程序结果:<font color="#0066cc">30</font>
解析:add函数返回10+20的和,主函数直接输出该返回值。
5. switch 穿透特性
c
运行
#include<stdio.h>
int main() {
char ch;
ch=getchar();
switch(ch){
case'A':printf("%c",'A');
case'B':printf("%c",'B');break;
default:printf("%s\n","other");
}
 return 0;}
输入字母 A 时,输出结果:<font color="#0066cc">AB</font>
解析:case 'A'后无break,执行完输出 'A' 后,继续执行case 'B'输出 'B',遇到break终止。
6. 条件判断输出
c
运行
#include<stdio.h>
void checkNumber(int num){
    if(num>0)
        printf("正数\n");
    else
        printf("非正数\n");
}
int main(){
    int x=5;
    checkNumber(x);
    return 0;
}
程序结果:<font color="#0066cc">正数</font>
解析:x=5满足num>0条件,执行printf("正数\n")。
7. 多条件判断
c
运行
#include<stdio.h> 
int main(){
    int num=12;
    if(num%3==0 && num%4!=0)
        printf("A");
    else if(num%4==0 && num%3!=0)
        printf("B");
    else if(num%3==0 && num%4==0)
        printf("C");
    return 0;}
程序结果:<font color="#0066cc">C</font>
解析:12%3=0且12%4=0,满足第三个else if条件,输出 'C'。
8. 循环累加求和
c
运行
#include<stdio.h>
int main(){
    int i,sum=0;
    for(i=1;i<=5;i++)
        sum +=i;
    printf("%d\n",sum);
    return 0;
}
程序结果:<font color="#0066cc">15</font>
解析:for循环累加 1~5 的和,1+2+3+4+5=15,输出sum的值。
9. 值传递特性
c
运行
#include<stdio.h>
void change(int a){
    a=100;
}
int main(){
    int x=50;
    change(x);
    printf("%d\n",x);
    return 0;
}
程序结果:<font color="#0066cc">50</font>
解析:值传递方式下,函数内修改形参a不会影响主函数的实参x,x仍为 50。
10. 重复题目(同第 1 题)
c
运行
#include<stdio.h>
int main()
{ char s[20]={"afkbag"},c='a';
  int i=0;
  while(s[i]!='\0')
  {   if(s[i]==c) s[i]=s[i]-32;
      else if(s[i]==c-32) s[i]=s[i]+32;
      i++;}
  puts(s);
return 0;}
程序结果:<font color="#0066cc">AfkbAg</font>
解析:与第 1 题逻辑一致,小写 'a' 转大写,结果为AfkbAg。

五、程序题(完整可运行代码 + 详细注释)
答题说明
代码块独立展示,注释清晰易懂
代码可直接编译运行,包含输入输出提示
题目列表

  1. 判断该数是否为素数

include<stdio.h>

int main() {
int num=0;
int a = 0;
printf("请输入一个整数:");
scanf("%d", &num);
for(int i =2;i<num;i++)
{
if (num%i==0) {
a++;
}
}
if(a=0)
{
printf("%d是素数\n", num);
} else {
printf("%d不是素数\n", num);
}
return 0;
}

  1. 统计字符串字符类型并转换大写为小写

include<stdio.h>

include<string.h>

int main() {
char str[100]; // 存储输入的字符串
int upper = 0, lower = 0, digit = 0; // 统计大写、小写、数字个数
printf("请输入一个字符串(不含空格):");
scanf("%s", str); // 输入字符串

// 遍历字符串,逐字符判断并处理
for (int i = 0; str[i] != '\0'; i++) {
    if (str[i] >= 'A' && str[i] <= 'Z') { // 大写字母
        upper++;
        str[i] += 32; // 大写转小写(ASCII码+32)
    } else if (str[i] >= 'a' && str[i] <= 'z') { // 小写字母
        lower++;
    } else if (str[i] >= '0' && str[i] <= '9') { // 数字字符
        digit++;
    }
}

// 输出结果
printf("转换后的字符串:%s\n", str);
printf("大写字母个数:%d\n", upper);
printf("小写字母个数:%d\n", lower);
printf("数字字符个数:%d\n", digit);
return 0;

}

  1. 计算指定年月的天数(考虑闰年)

include<stdio.h>

// 功能:判断年份是否为闰年
// 参数:year-待判断的年份
// 返回值:1-闰年,0-平年
int isLeapYear(int year) {
// 闰年规则:能被4整除但不能被100整除,或能被400整除
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
return 1;
}
return 0;
}

// 功能:计算指定年月的天数
// 参数:year-年份,month-月份
// 返回值:该月的天数
int getDays(int year, int month) {
// 平年各月天数(下标0对应1月)
int days[] = {31,28,31,30,31,30,31,31,30,31,30,31};
// 闰年2月特殊处理
if (month == 2 && isLeapYear(year)) {
return 29;
}
return days[month-1]; // 月份转下标(1月→0)
}

int main() {
int year, month;
printf("请输入年份和月份(用空格分隔):");
scanf("%d %d", &year, &month);

// 校验月份合法性
if (month < 1 || month > 12) {
    printf("月份输入错误!\n");
    return 1; // 异常退出
}

// 调用函数并输出结果
printf("%d年%d月的天数:%d\n", year, month, getDays(year, month));
return 0;

}
4. 2 行 3 列矩阵转置(3 行 2 列)

include<stdio.h>

int main() {
int matrix[2][3]; // 原矩阵:2行3列
int trans[3][2]; // 转置矩阵:3行2列

// 输入原矩阵元素
printf("请输入2行3列矩阵的元素(每行3个,空格分隔):\n");
for (int i = 0; i < 2; i++) { // 遍历行
    for (int j = 0; j < 3; j++) { // 遍历列
        scanf("%d", &matrix[i][j]);
    }
}

// 矩阵转置核心逻辑:trans[j][i] = matrix[i][j]
for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 3; j++) {
        trans[j][i] = matrix[i][j];
    }
}

// 输出原矩阵
printf("\n原矩阵(2行3列):\n");
for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 3; j++) {
        printf("%d ", matrix[i][j]);
    }
    printf("\n"); // 换行分隔行
}

// 输出转置矩阵
printf("\n转置矩阵(3行2列):\n");
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 2; j++) {
        printf("%d ", trans[i][j]);
    }
    printf("\n"); // 换行分隔行
}
return 0;

}

  1. 自定义字符串复制函数 scopy

include<stdio.h>

// 功能:自定义字符串复制(替代strcpy)
// 参数:p1-目标字符串指针,p2-源字符串指针
// 说明:逐字符复制,手动添加结束符\0
void scopy(char *p1, char p2) {
// 遍历源字符串,直到结束符\0
while (
p2 != '\0') {
*p1 = *p2; // 逐字符复制
p1++; // 指针后移,指向下一个字符
p2++;
}
*p1 = '\0'; // 给目标字符串添加结束符,避免乱码
}

int main() {
char str1[100], str2[100]; // 定义两个字符数组
printf("请输入字符串str1:");
scanf("%s", str1);
printf("请输入字符串str2:");
scanf("%s", str2);

// 调用自定义复制函数,将str2复制到str1
scopy(str1, str2);

// 输出复制后的结果
printf("复制后str1:%s\n", str1);
return 0;

}

posted @ 2026-01-14 20:32  99998  阅读(0)  评论(0)    收藏  举报