C语言程序错题

C语言程序错题

1.函数strcmp从头至尾顺序地将其对应字符比较,遇到两个字符不等时,两个字符相减得到一个int型值,两个字符串完全相同时,则返回0。
答:对。我的理解产生了错误。误以为返回值的是ascii码的大小。事实上int大于0则是1,小于则是-1。
2.数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。
答:错。数组名是地址,不是指针常量,它的值可以赋给指针。
3.有说明语句int a[4][5];,则a[2]+3表示 A 。
A.a数组行下标为2、列下标为3的元素的地址
B.0a数组行下标为2、列下标为3的元素的值
C.a数组第2行的首地址
D.a数组第3行的首地址
答:a[2]表示地址。+3表示地址后移3个元素。
4.语句int *p; *p=50;执行时,不会有任何错误。
答:错。在执行时,*P没有值。printf不出来任何值。5
5.定义FILE *fp; 则文件指针fp 指向的是(B)。
A.文件在磁盘上的读写位置
B.文件在缓冲区上的读写位置
C.整个磁盘文件
D.文件类型结构体
6.int (*p)[4]它表示p是一个指针数组,它包含4个指针变量元素.
答:错。p为指向包含4个元素的一维数组的指针变量。它只是一个指针。
7.设变量定义为 int a[2]={1,3}, p=&a[0]+1;,则p的值是( B)。(2分)
A.2
B.3
C.4
D.&a[0]+1
答:p在定义时赋值,意为将&a[0]+1赋给了p。且,a为int型,所以+1就是a向后加了一个元素大小的位置。故等于a[1]的值。
8.根据声明int a[10], *p=a; ,下列表达式错误的是( D)。 (2分)
A.a[9]
B.p[5]
C.a++
D.*p++
答:a为数组首地址的值,是常量。不能自加。
9.数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。
答:错。数组名代表数组首地址,与指针常量无关。
10.有说明语句int a[4][5];则a[2]+3表示
A.a数组行下标为2、列下标为3的元素的地址
B.a数组行下标为2、列下标为3的元素的值
C.a数组第2行的首地址
D.a数组第3行的首地址
答案:A.因为a[2]是取二位数组a[2]的地址,+3是表示按照int 类型地址+3.所以答案为地址,且数组下标是以0开始,则0+3=3,答案为A.
11.以下哪个定义中的p不是指针,请选择恰当的选项: (C)
A.char **p;
B.char (*p)[10];
C.char *p[6];
D.给出的三项中,p都是指针
答:*p[6]代表指针数组,其中的元素才代表指针。
12.语句int *p; *p=50;执行时,不会有任何错误(F)
答:P需要指向一个地址后才能对 *p赋值.
13.对于定义 char str[] = “abc\000def\n”(注:其中0为数字零),求字符串str的长度len和数组str的大小size,len和size分别是: (C)
A.12 ,13
B.3 ,11
C.3 ,9
D.3 ,4
答:\0XX为八进制,当XX为1-77时。\000视为\0,strlen为3。sizeof是全部占用的大小,与\0无关,则为12.
14.若定义pf为指向float类型变量f的指针,下列语句中(B)是正确的。
A.float f, *pf = f;(地址没有浮点型的)
B.float f, *pf = &f;
C.float *pf = &f, f;
D loat f, *pf =0.0;
解析:定义时初始化float *pf = &f;的等价的语句是: float *pf; pf = &f;.
15.在下列形式的常数中,C程序不允许出现的是( B )。
A: .45
B: ±123
C: 25.6e-2 
D: 4e3
答案:
A:是常量,允许出现的。
B:在C语言中不允许像数学中一样同时表达一个数的正负,所以应该选择B答案。
C、D:都是表示指数形式的常量,书写格式正确。
16.下列可以作用C语言常量的是(A)
A: " "
B: ‘ab’
C: 二进制10010001
D: 3.0E
答:
B:不能写成‘ab’,只能是分开的‘a’,‘b’。(这是普通字符:用单撇号括起来的一个字符)
C:转义字符中有八进制字符,十六进制字符,没有二进制的转义字符。
D:有E的为指数形式的常量。规定以字母e或E代表以10为底的指数,在它们之前必须有数字,并且之后必须为整数,所以D这样的写法是错误的,E之后没有数字。
17.如果二进制文件a.dat已经存在,现在要求写入全新数据,应以(B)方式打开。
A.“w”
B.“wb”
C.“w+”
D.“wb+”
答:首先是dat(二进制)文件,必须带b。全新文件,不能有+号,故选B。
18.在一个以 h 为头的单向链表中,p 指针指向链尾的条件是(A)。
A.p->next=h
B.p->next=NULL
C.p->next->next=h
D.p->.data=-1
答:p 指针指向链尾那么p即为尾指针,循环链中尾指针下一个指向头指针。
19.对于以下结构定义,++p->str中的++加在 A。 (2分)
struct
{
int len;
char *str;
} *p;
A.指针str上
B.指针p上
C.str指的内容上
D.以上均不是
答:因为p->str是对指针str的引用。
20.以下哪个定义中的p不是指针,请选择恰当的选项: C
A.char **p;
B.char (*p)[10];
C.char p[6];
D.给出的三项中,p都是指针
答:[]的优先级高于,所以P先于[]结合,所以P是一个数组。数组里存放的元素都是指针。
21.c语言源程序是文本文件,目标文件和可执行文件是二进制文件。
答:对。只有二进制文件。才能被机器所识别。
22.以下不能对二维数组a进行正确初始化的语句是( C)
A: int a[2][3]={0}
B: int a[ ][3]={{1,2},{0}}
C: int a[2][3]={{1,2},{3,4},{5,6}}
D: int a[][3]={1,2,3,4,5,6}
答 :A整体赋值为0 B相当于a[2][3]={{1,2},{0}} C明显越界了 应该是a[3][2]={{1,2},{3,4},{5,6}}D相当于a[2][3]={1,2,3,4,5,6}
23.判断闰年
键盘输入一个四位数的年份,判断该年是否为闰年。闰年即如果是整百年,要求能被400整除,如果不是整百年,则能被4整除。如2000年是闰年,1900年不是闰年,1996年是闰年。如果是闰年,输出“OK”,否则输出“NO”。
样例输入:
1990
样例输出:
NO

#include <stdio.h>
int main()
{
    int i;
 scanf("%d",&i);
    if((i%100==!0&&i%4==0)||i%400==0)
 {
  printf("OK");
 }
 else
  printf("NO");
    return 0;
}
解析:这题主要是在对if语句的考察,在对闰年的判断上要注意;

24.判断是否为偶数
键盘输入一个整数,判断该整数是否为偶数,如果是,输出“YES”,如果不是,输出“NO”。
样例输入:
87
样例输出:
NO

#include <stdio.h>
int main()
{
    int i;
 scanf("%d",&i);
    if(i%2==0)
 {
  printf("YES");
 }
 else
  printf("NO");
    return 0;
}
解析:这题也是对if语句的考察,只要做好判断,这一题就能很轻松的解决

25.求从1开始加刚好超过某值的值
键盘输入一个整数,要求从1开始加,直到和刚好超过输入的数,输出刚好超过的和值和最后加的数,用一个空格隔开。例如输出20时,1+2+3+4+5+6=21,刚好超过了20,则输出21,最后加的数为6。
样例输入:
20
样例输出:
21 6
提示:可以使用for或while或do while循环实现。

#include<stdio.h>
int main()
{
 int n, sum, i;
 scanf("%d", &n);
 i = 0; sum = 0;
 while (sum <= n){
  i++;
  sum+=i;
 }
 printf("%d %d\n", sum, i);
 return 0;
} 
解析:这一题是对循环语句的考察,只要写好跳出循环的条件,就能完成此题
  • 13
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
错题重做功能可以通过C语言的文件操作实现。首先,你需要将所有的试题及答案存储在一个文本文件中。然后,当用户答题时,程序可以从文件中读取题目及答案,用户作答后,程序可以将用户的答案与正确答案进比较,如果答案不正确,则将此题存储在一个错题集文件中。当用户选择重做错题时,程序可以从错题集文件中读取错题,让用户重新回答。 以下是一个简单的实现代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LEN 100 // 最大题目长度 typedef struct { char question[MAX_LEN]; // 题目 char answer[MAX_LEN]; // 答案 } Question; int main() { FILE *fp; char filename[] = "questions.txt"; // 存储题目及答案的文件名 Question q; char user_answer[MAX_LEN]; char retry; int correct_count = 0; // 答对题目数量 int wrong_count = 0; // 答错题目数量 // 读取题目及答案 fp = fopen(filename, "r"); if (fp == NULL) { printf("无法打开文件 %s\n", filename); return 1; } while (fgets(q.question, MAX_LEN, fp) != NULL && fgets(q.answer, MAX_LEN, fp) != NULL) { // 去掉换符 q.question[strlen(q.question) - 1] = '\0'; q.answer[strlen(q.answer) - 1] = '\0'; // 提示用户作答 printf("%s\n", q.question); printf("请输入答案:"); scanf("%s", user_answer); // 判断答案是否正确 if (strcmp(user_answer, q.answer) == 0) { printf("回答正确!\n"); correct_count++; } else { printf("回答错误!正确答案是 %s\n", q.answer); wrong_count++; // 将错题存入文件 fp = fopen("wrong_questions.txt", "a"); if (fp != NULL) { fprintf(fp, "%s\n%s\n", q.question, q.answer); fclose(fp); } } // 询问是否继续作答 printf("是否继续作答?(y/n)"); scanf(" %c", &retry); if (retry == 'n' || retry == 'N') { break; } } fclose(fp); // 输出统计结果 printf("作答结束!共回答了 %d 道题,其中 %d 道题回答正确,%d 道题回答错误。\n", correct_count + wrong_count, correct_count, wrong_count); // 重做错题 fp = fopen("wrong_questions.txt", "r"); if (fp != NULL) { printf("是否重做错题?(y/n)"); scanf(" %c", &retry); if (retry == 'y' || retry == 'Y') { while (fgets(q.question, MAX_LEN, fp) != NULL && fgets(q.answer, MAX_LEN, fp) != NULL) { q.question[strlen(q.question) - 1] = '\0'; q.answer[strlen(q.answer) - 1] = '\0'; printf("%s\n", q.question); printf("请输入答案:"); scanf("%s", user_answer); if (strcmp(user_answer, q.answer) == 0) { printf("回答正确!\n"); } else { printf("回答错误!正确答案是 %s\n", q.answer); } } } fclose(fp); } return 0; } ``` 当程序时,它将从名为 "questions.txt" 的文件中读取题目及答案。如果用户的答案不正确,程序将此题存储在名为 "wrong_questions.txt" 的文件中,供用户重做。用户可以选择是否重做错题
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值