改错本

数组

1.假设有定义如下: int array[10]; 则该语句定义了一个数组array。其中array的类型是整型指针(即: int * )。
F array是指向int array[0]的地址的指针

2.假设scanf语句执行时输入ABCDE<回车>,能使puts(s)语句正确输出ABCDE字符串的程序段是__。

A,char s[5]={“ABCDE”}; puts(s);
B,char s[5]={‘A’, ‘B’, ‘C’, ‘D’, ‘E’}; puts(s);
C,char *s; scanf("%s", s); puts(s);
D,char *s; s=“ABCDE”; puts(s);
D
错选c,char * s不是字符串,不能用%s

3,如果变量定义如下,则正确的语句是( )。
int i, j, tab[3][4];
A,tab[0][ ] = 0;
B,tab[ ][3] = 3;
C,tab = 100;
D,for(i = 1; i <= 3; i++){
for(j = 1; i <= 4; j++){
scanf(“%d ”, &a[i][j];
}
}

E,for(i = 0; i < 3; i++){
for(j = 0; j < 4; j++){
printf("%4d", tab[i][j]);
}
printf("\n");
}
E
错选D,二维数组行列均从0开始

4,在以下描述中,( )是正确的。
A,int a[5] = {1, 2, 3, 4, 5};
定义了数组a,并对数组元素赋初值。此时,a[0]为1,a[1]为2,a[2]为3,a[3]为4,a[4]为5。

B,static int b[10];
定义了静态数组b,且10个数组元素的初值都为0。

C,int fib[45] = {1, 1};
定义了数组fib,并对数组 fib 的前2个元素赋初值,其余元素的值都为0。

D,static int week[7] = {1, 2, 3};
定义了静态数组week,并对数组 week 的前3个元素week[0]~week[2]赋初值,week[3]~week[6]值都是不确定的。
AB
c,没有static,fib后几个元素的值是不确定的

5,在以下描述中,( )是正确的。
A,int a[3][3] = {1};
定义了数组a,并对数组a赋初值。此时,a[0][0]的值为1,而其余元素的值都是不确定的。

B,static int b[4][3] = {{ }, { }, { },{9}};
定义了静态数组b,并对数组赋初值。此时,b[3][0]的值为9,而其余元素的值都为0。

C,int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
等价。

D,static int b[4][3] = {{1, 2, 3}, { }, {4, 5}};

static int b[4][3] = {1, 2, 3, 0, 0, 0, 4, 5};
等价。

E,int a[3][3] = {{},{4},{}};
定义了数组a,并对数组a赋初值。此时,a[1][1]的值为4,而其余元素的值都是不确定的。
ABCD
E,a[1][0]和a[1][2]都是0

6,选择法排序:本题要求将给定的n个整数从小到大排序后输出。输出时相邻数字中间用一个空格分开,行末不得有多余空格。

#include <stdio.h>
# define MAXN 10

int main()
{
    int i, index, k, n, temp;
    int a[MAXN];

    scanf("%d", &n);
    for(i = 0; i < n; i++){
        scanf("%d", &a[i]);
    }

    for(k = 0; k < n-1; k++){
        index =   ;  
        for
{
            if
{
                index = i;  
            }    
        }  
        

    }

   for(i = 0; i < n; i++) {
        if
{
            printf("%d", a[i]);
        }else{
            printf(" %d", a[i]);
        }
    }
    printf("\n");

    return 0;
}

答案

#include <stdio.h>
# define MAXN 10
int main()
{
    int i, index, k, n, temp;
    int a[MAXN];
    scanf("%d", &n);
    for(i = 0; i < n; i++){
        scanf("%d", &a[i]);
    }

    for(k = 0; k < n-1; k++){
        index = k;  //index做擂主下标
        for(i = k + 1; i < n; i++)//从k+1个数组开始打擂
{
            if( a[index]>a[i] )//比较擂主与打雷人的大小
{
                index = i;  //如果擂主小,index记下标
            }    
        }  
        
	if(index != k){temp=a[k];a[k]=a[index];a[index]=temp;}//擂主与打擂人交换数值

    }

   for(i = 0; i < n; i++) 
   {
        if(i == 0)
{
            printf("%d", a[i]);
        }
        else{
            printf(" %d", a[i]);
        }
    }
    printf("\n");

    return 0;
}

7.大小写字母转换。以下程序段A和B的功能都是:将字符串中的小写字母全部转换成大写字母,大写字母全部转换成小写字母,其他字符不变。

/* 程序段A */
int k;
char str1[81];

k = 0;
while (str1[k] != '\0') {
    if (str1[k] >= 'a' && str1[k] <= 'z'){
        

    }
    else if (str1[k] >= 'A' && str1[k] <= 'Z'){
        

    }
    k++;
}
/* 程序段B */
   int k;
   char str1[81], str2[81];

    k = 0;
    while (str1[k]!='\0') {
        if (str1[k]>='a' && str1[k]<='z'){
            

        }
        else if (str1[k]>='A' && str1[k]<='Z'){
            

        }
        else{
            

        }
        k++;
    }

答案

/* 程序段A */
int k;
char str1[81];

k = 0;
while (str1[k] != '\0') {
    if (str1[k] >= 'a' && str1[k] <= 'z'){
        
str1[k]=str1[k]-32;

    }
    else if (str1[k] >= 'A' && str1[k] <= 'Z'){
        
str1[k]=str1[k]+32;

    }
    k++;
}
/* 程序段B */
   int k;
   char str1[81], str2[81];

    k = 0;
    while (str1[k]!='\0') {
        if (str1[k]>='a' && str1[k]<='z'){
            
str2[k]=str1[k]-32;

        }
        else if (str1[k]>='A' && str1[k]<='Z'){
            
str2[k]=str1[k]+32;

        }
        else{
            
str2[k]=str1[k];

        }
        k++;
    }
str2[k] = '\0';

文件流

8.随机操作只适用于二进制文件。
F

9.如果二进制文件a.dat已经存在,现在要求写入全新数据,应以()方式打开。
A,“w”
B,“wb”
C,“w+”
D,“wb+”
B
改写二进制文件要加b
错选A

10.定义FILE * fp; 则文件指针fp 指向的是()。
A,文件在磁盘上的读写位置
B,文件在缓冲区上的读写位置
C,整个磁盘文件
D,文件类型结构体
B
错选A

11.缓冲文件系统的文件缓冲区位于()。
A,磁盘缓冲区中
B,磁盘文件中
C,内存数据区中
D,程序文件中
C
错选A

12.按存储介质划分,文件可以分为:
A,记录文件和流式文件
B,普通文件和设备文件
C,文本文件和二进制文件
D,程序文件和数据文件
B
错选D

13.函数fgetc的作用是从指定文件读入一个字符,该文件的打开方式必须是( )。
A,只写
B,追加
C,读或读写
D,答案B和C都正确
D
fgetc函数是指从指定的文件读入一个字符,该文件必须是以读或读写方式打开的。fgetc的调用形式为ch=fgetc(fp);
错选C

14.关于C语言中的函数,下列说法正确的是

A,函数应该以它们调用的顺序来定义。
B,return 语句可以出现在函数的任何地方。
C,函数定义可以在主函数前面也可以在主函数后面。
D,函数总是返回一个整型数据。
BC
错选AC,函数定义顺序随意

15.设变量已正确定义,以下()是合法的C语句。
A,if ( n <= 10 );
B,switch ( k ) {
case 1: printf(“one”); break;
case 2: printf(“two”); break;
case 1: printf(“one”); break;
default: printf(“zero”); break;
}
C,switch ( k%2 ) {
default: printf(“zero”); break;
case 1: printf(“one”);
case 1+1: printf(“two”);
}
D,n = 10;
switch ( k ) {
case n%3: printf(“one”);
case n%4: printf(“two”);
default: printf(“zero”);
}
AC
错选CD,D中case后必须是常量

16.只能向指定文件写入一个字符的函数是 __ 。
fputc

17.判断文件指针是否已经到了文件尾部的函数是 __ 。
feof

18.有穷状态自动机识别手机号码
本题目要求读入1个手机号码,然后判断手机号码是否合法。合法的手机号码判断有如下要求:
要求一:手机号码必须是11位。
要求二:手机号码开头三个字符必须是151|153|180|173|198开头,其他的开头判断不符合要求。
(注:对于刚学C语言的大一学生可以无视该要求)要求三:【不满足该要求视为0分】读入手机号码时一次只能读入1位数字,并且只能1位1位地判断,不允许同时使用手机号码中的多位数字进行联合逻辑运算(即不允许使用类似“a[0]‘1’&&a[1]‘5’"或者"a==‘1’&&b==‘5’”的表达式)。
(注:对于刚学C语言的大一学生可以无视该要求)要求四:【不满足该要求视为0分】在判断手机号码状态时,只允许遍历1次手机号码即可获取四种状态值,不允许回溯。

输入格式:
直接输入11位十进制。
输出格式:
测试输入的字符串 is ok/short/long/illegal
ok状态:表示完全符合手机号码正确,输出ok
short状态:表示当输入字符串位数为1、位数为2以及位数为3时,满足【要求二】中规定的前三位字符要求且由0~9字符串构成,但是位数不满11位,输出short
long状态:表示前三位满足了【要求二】中规定的前三位字符要求且所有位的字符都由0~9字符串构成,但位数超过11位,输出long
illegal状态:未满足【要求二】中规定的前三位字符要求,或者字符串中含有除0~9之外的字符构成,输出illegal

输入样例:
19843239892
1984323989
198432398922
198a32398922
输出样例:
19843239892 is ok
1984323989 is short
198432398922 is long
198a32398922 is illegal

#include <stdio.h>
#include<string.h>
int main()
{
	char a[20];
	int count=0,i;
	while(~scanf("%s",&a))
	{
		if(a[0]=='1'&&a[1]=='5'&&a[2]=='1'||
			a[0]=='1'&&a[1]=='5'&&a[2]=='3'||
			a[0]=='1'&&a[1]=='8'&&a[2]=='0'||
			a[0]=='1'&&a[1]=='7'&&a[2]=='3'||
			a[0]=='1'&&a[1]=='9'&&a[2]=='8')
		{
			for( i = 0 ; i < strlen(a) ; i++)
			{
				if(a[i]<'0'||a[i]>'9')
				{
					count=1;
				}
			}
			if(count==1)
			{
				printf("%s is illegal\n",a);
			}
			else
			{
				if(strlen(a)==11)
				{
					
					printf("%s is ok\n",a);
				}
				if(strlen(a)<11)
				{
					printf("%s is short\n",a);
				}
				if(strlen(a)>11)
				{
					printf("%s is long\n",a);
				}
			}
		}
		else
		{
			printf("%s is illegal\n",a);
		}
	}
	return 0;
}

指针

19.int ( * p)[4]它表示p是一个指针数组,它包含4个指针变量元素。 (1分)
F

20.p为指向包含4个元素的一维数组的指针变量
以下结构类型可用来构造链表的是()。

A,struct aa{ int a;int * b;};
B, struct bb { int a;bb * b;};
C,struct cc{ int * a;cc b;};
D, struct dd{ int * a;aa b;};
B
错选A

21.若程序中有下面的说明和定义
struct abc
{ int x;
char y;
}
struct abc s1,s2;
A,编译出错,结构体定义完要加分号。
B,程序将顺利编译连接执行
C,能顺利通过编译连接但不能执行
D,能顺利通过编译但连接出错
A
错选B

22.设变量已正确定义,以下()是合法的C语句。
A,if ( n <= 10 );
B,switch ( k ) {
case 1: printf(“one”); break;
case 2: printf(“two”); break;
case 1: printf(“one”); break;
default: printf(“zero”); break;
}
C,switch ( k%2 ) {
default: printf(“zero”); break;
case 1: printf(“one”);
case 1+1: printf(“two”);
}
D,n = 10;
switch ( k ) {
case n%3: printf(“one”);
case n%4: printf(“two”);
default: printf(“zero”);
}
AC
错选AD,case后面必须是常量

23.如果变量定义如下,则正确的语句是( )。

int k, a[10];
A,a[-1] = -1;
B,a[0] = 23;
C,k = 3; a[k - 2] = a[9] + 1;
D,for(k = 1; k <= 10; k++){
printf(“%d ”, a[k]);
}
E,for(k = 0; k < 10; k++){
scanf(“%d ”, &a[k]);
}
BCE
错选BDE

24.下面函数用于求出两个整数之和,并通过形参传回两整数相加之和值。请填空。
void add(int x, int y, __ z )
{
__= x + y;
}
int * * z

25.下面程序可以逐行输出由language数组元素所指向的5个字符串。请填写程序中相应语句。
#include<stdio.h>
int main(void)
{
char *language[] = {“BASIC”, “FORTRAN”, “PROLOG”, “JAVA”, “C++” } ;
char __ ;
int k ;
for(k = 0 ; k < 5 ; k++) {
q= __ ;
printf("%s\n", *q);
}
return 0;
}
**q language+k

以下程序的输出结果是__。
void swap(int *a, int *b)
{
int *t;
t=a; a=b; b=t;
}
Int main()
{
int i=2,j=5,*p=&i,*q=&j;
swap(p,q);
printf("%d %d\n",*p,*q)
}
2 5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值