C-Free中能从把字符串a给字符串b中从第b个字符开始读取c个字符的函数

C语言程序改错:下列给定程序中,函数fun()的功能是逐个比较a,b两个字符串对应位置中的字符,_百度知道
C语言程序改错:下列给定程序中,函数fun()的功能是逐个比较a,b两个字符串对应位置中的字符,
把ASCII值小或相等的字符依次存放到c数组中,形成一个新的字符串。
例如:a中的字符串为fshADfg,b中的字符串为sdAEdi,则c中的字符串应为fdAADf。
请改正程序中的错误,使它能得到正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结...
我有更好的答案
&stdio.h&#include
&string.h&void fun(char *p,char *q,char *c){ int k=0;
while(*p||*q)/**********************found***********************/
{ if (*p&=*q)
//只需要改这里的就是了
else c[k]=*p;
q++ ;/**********************found***********************/
k++;//这里是有分号的
}}main(){ char a[10]=&fshADfg&,b[10]=&sdAEdi&,c[80]={'\0'};
fun(a,b,c);
printf(&The string a:&); puts(a);
printf(&The string b:&); puts(b);
printf(&The result :&); puts(c);}
采纳率:20%
if (*p&=*q)
//只需要改这里的就是了 k++;//这里是有分号的
自己修改,学习就得自己来,别人帮不了的。
为您推荐:
其他类似问题
c语言程序的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。以下试题来自:
单项选择题以下说法中错误的是A.strcpy(A,B.函数是将A字符串的内容复制到B字符串中B) strlen(cha*s)返回字符串S的长度,未尾的字符不计算在内C.char a[20]="string";中字符串长度为6D.strstr(S1,S2)函数在字符串S1中从左边开始查找字符串S2,若查找成功则返回S2在S1中首次出现的位置,否则返回NULL,如果S2为"",则返回S1。
为您推荐的考试题库
你可能感兴趣的试题
1A.42B.6C.7D.212A.64B.63C.32D.313A.软件测试的主要目的是确定程序中错误的位置B.软件调试的主要目的是发现程序中错误的类型C.程序经调试后还应进行测试D.软件的测试与调试工作最好都由程序编制者来完成4A.类中可以定义与类名相同的数据成员B.直接子类中可以定义与父类名相同的数据成员C.孙子类中可以定义与爷爷类名相同的数据成员。D.类的所有子孙中都不可以定义与该类同名的数据成员。5A.wsB.octC.setfill(int)D.setw(int)
热门相关试卷
最新相关试卷C中字符串操作
字符串可以看作一个数组,它的每个元素是字符型的,例如字符串"Hello, world.\n"图示如下:
H e l l o ,
w o r l d . \n \0(15个字符)
注意每个字符串末尾都有一个字符'\0'做结束符,这里的\0是ASCII码的八进制表示,也就是ASCII码为0的Null字符,在C语言中这种字符串也称为以零结尾的字符串(Null-terminatedString)。
数组元素可以通过数组名加下标的方式访问,而字符串字面值也可以像数组名一样使用,可以加下标访问其中的字符:char c = "Hello, world.\n"[0];但是通过下标修改其中的字符却是不允许的:
"Hello, world.\n"[0] = 'A';
这行代码会产生编译错误,说字符串字面值是只读的,不允许修改。字符串字面值还有一点和数组名类似,做右值使用时自动转换成指向首元素的指针,printf原型的第一个参数是指针类型,而printf("hello world")其实就是传一个指针参数给printf。
前面讲过数组可以像结构体一样初始化,如果是字符数组,也可以用一个字符串字面值来初始化:
char str[10] = "Hello";
char str[10] = { 'H', 'e', 'l', 'l', 'o', '\0' };str的后四个元素没有指定,自动初始化为0,即Null字符。注意,虽然字符串字面值"Hello"是只读的,但用它初始化的数组str却是可读可写的。数组str中保存了一串字符,以'\0'结尾,也可以叫字符串。在本文中只要是以Null字符结尾的一串字符都叫字符串,不管是像str这样的数组,还是像"Hello"这样的字符串字面值。
如果用于初始化的字符串字面值比数组还长,比如:
char str[10] = "Hello, world.\n";则数组str只包含字符串的前10个字符,不包含Null字符,这种情况编译器会给出警告。如果要用一个字符串字面值准确地初始化一个字符数组,最好的办法是不指定数组的长度,让编译器自己计算:
char str[] = "Hello, world.\n";
字符串字面值的长度包括Null字符在内一共15个字符,编译器会确定数组str的长度为15。
有一种情况需要特别注意,如果用于初始化的字符串字面值比数组刚好长出一个Null字符的长度,比如:
char str[14] = "Hello, world.\n";
则数组str不包含Null字符,并且编译器不会给出警告。补充一点,printf函数的格式化字符串中可以用%s表示字符串的占位符。在学字符数组以前,我们
用%s没什么意义,因为printf("string: %s\n", "Hello");还不如写成printf("string: Hello\n");
但现在字符串可以保存在一个数组里面,用%s来打印就很有必要了:printf("string: %s\n", str);printf会从数组str的开头一直打印到Null字符为止,Null字符本身是Non-printable字符,不打印。这其实是一个危险的信号:如果数组str中没有Null字符,那么printf函数就会访问数组越界,后果
可能会很诡异:有时候打印出乱码,有时候看起来没错误,有时候引起程序崩溃。
程序按功能划分可分为数值运算、符号处理和I/O操作三类,符号处理程序占相当大的比例,符号处理程序无处不在,编译器、浏览器、Office套件等程序的主要功能都是符号处理。无论多复杂的符号处理都是由各种基本的字符串操作组成的,本节介绍如何用C语言的库函数做字符串初始化、取长度、拷贝、连接、比较、搜索等基本操作。
strcpy与strncpy
char *strcpy(char *dext,const char *src);
char * strncpy(char *dest,const char *src,sze_t n);
dest表示Destination,src表示Source,看名字就能猜到是把src所指向的字符串拷贝到dest所指向的内存空间。这一点从两个参数的类型也能看出来,dest是char *型的,而
src是const char *型的,说明src所指向的内存空间在函数中只能读不能改写,而dest所指向的内存空间在函数中是要改写的,显然改写的目的是当函数返回后调用者可以读取改写的结果。因此可以猜到strcpy函数是这样用的:
char buf[10];
strcpy(buf, "hello");
printf(buf);
在拷贝字符串时会把结尾的'\0'也拷到dest中,因此保证了dest中是以'\0'结尾的字符串。但另外一个要注意的问题是,strcpy只知道src字符串的首地址,不知道长度,它会一直拷贝到'\0'为止,所以dest所指向的内存空间要足够大,否则有可能写越界,例如:
char buf[10];
strcpy(buf, "hello world");
如果没有保证src所指向的内存空间以'\0'结尾,也有可能读越界,例如:
char buf[10] = "abcdefghij", str[4] = "hell";
strcpy(buf, str);
因为strcpy函数的实现者通过函数接口无法得知src字符串的长度和dest内存空间的大小,所以“确保不会写越界”应该是调用者的责任,调用者提供的dest参数应该指向足够大的内存空间,“确保不会读越界”也是调用者的责任,调用者提供的src参数指向的内存应该确保以'\0'结尾。
src和dest所指向的内存空间不能有重叠。凡是有指针参数的C标准库函数基本上都有这条要求,每个指针参数所指向的内存空间互不重叠,例如这样调用是不允许的:
char buf[10] = "hello";
strcpy(buf, buf+1);strncpy的参数n指定最多从src中拷贝n个字节到dest中,换句话说,如果拷贝到'\0'就结束,如果拷贝到n个字节还没有碰到'\0',那么也结束,调用者负责提供适当的n值,以确保读写不会越界,比如让n的值等于dest所指向的内存空间的大小:
char buf[10];
strncpy(buf, "hello world", sizeof(buf));
然而这意味着什么呢?文档中特别用了Warning指出,这意味着dest有可能不是以'\0'结尾的。例如上面的调用,虽然把"hello world"截断到10个字符拷贝至buf中,但buf不是以'\0'结尾的,如果再printf(buf)就会读越界。如果你需要确保dest以'\0'结束,可以这么调用:
char buf[10];
strncpy(buf, "hello world", sizeof(buf));
buf[sizeof(buf)-1] = '\0';
strncpy还有一个特性,如果src字符串全部拷完了不足n个字节,那么还差多少个字节就补多少个'\0',但是正如上面所述,这并不保证
dest一定以'\0'结束,当src字符串的长度大于n时,不但不补多余的'\0',连字符串的结尾'\0'也不拷贝。
进程有一个堆空间,C标准库函数malloc可以在堆空间动态分配内存,它的底层通过brk系统调用向操作系统申请内存。动态分配的内存用完之后可以用free释放,更准确地说是归还给malloc,这样下次调用malloc时这块内存可以再次被分配。本节学习这两个函数的用法和工作原理。
#include &stdlib.h&
void *malloc(size_t size);
返回值:成功返回所分配内存空间的首地址,出错返回NULL
void free(void *ptr);malloc的参数size表示要分配的字节数,如果分配失败(可能是由于系统内存耗尽)则返回
NULL。由于malloc函数不知道用户拿到这块内存要存放什么类型的数据,所以返回通用指针void *,用户程序可以转换成其它类型的指针再访问这块内存。malloc函数保证它返回的指针所指向的地址满足系统的对齐要求,例如在32位平台上返回的指针一定对齐到4字节边界,以保证用户程序把它转换成任何类型的指针都能用。动态分配的内存用完之后可以用free释放掉,传给free的参数正是先前malloc返回的内存块首地址。举例如下:
#include &stdio.h&
#include &stdlib.h&
#include &string.h&
typedef struct {
int main(void)
unit_t *p = malloc(sizeof(unit_t));
if (p == NULL) {
printf("out of memory\n");
p-&number = 3;
p-&msg = malloc(20);
strcpy(p-&msg, "Hello world!");
printf("number: %d\nmsg: %s\n", p-&number, p-&msg);
free(p-&msg);
关于这个程序要注意以下几点:
unit_t *p = malloc(sizeof(unit_t));这一句,等号右边是void *类型,等号左边是unit_t*类型,编译器会做隐式类型转换,我们讲过void *类型和任何指针类型之间可以相互隐式转换。
虽然内存耗尽是很不常见的错误,但写程序要规范,malloc之后应该判断是否成功。以后要习的大部分系统函数都有成功的返回值和失败的返回值,每次调用系统函数都应该判断是否成功
free(p);之后,p所指的内存空间是归还了,但是p的值并没有变,因为从free的函数接口来看根本就没法改变p的值,p现在指向的内存空间已经不属于用户,换句话说,
p成了野指针,为避免出现野指针,我们应该在free(p);之后手动置p = NULL;。
void foo(void)
char *p = malloc(10);
foo函数返回时要释放局部变量p的内存空间,它所指向的内存地址就丢失了,这10个字节也就没法释放了。内存泄漏的Bug很难找到,因为它不会像访问越界一样导致程序运行错误,少量内存泄漏并不影响程序的正确运行,大量的内存泄漏会使系统内存紧缺,导致频繁换页,不仅影响当前进程,而且把整个系统都拖得很慢。
关于malloc和free还有一些特殊情况。malloc(0)这种调用也是合法的,也会返回一个非NULL的指针,这个指针也可以传给free释放,但是不能通过这个指针访问内存。
free(NULL)也是合法的,不做任何事情,但是free一个野指针是不合法的,例如先调用malloc返回一个指针p,然后连着调用两次free(p);,则后一次调用会产生运行时错误。
初始化字符串
#include &string.h&
void *memset(void *s, int c, size_t n);
返回值:s指向哪,返回的指针就指向哪
memset函数把s所指的内存地址开始的n个字节都填充为c的值。通常c的值为0,把一块内存区清零。例如定义
char buf[10];
,如果它是全局变量或静态变量,则自动初始化为0(位于.bss段),如果它是函数的局部变量,则初值不确定,可以用memset(buf, 0, 10)清零,由malloc分配的内存初值也是不确定的,也可以用memset清零。
取字符串的长度
#include &string.h&
size_t strlen(const char *s);返回值:字符串的长度strlen函数返回s所指的字符串的长度。该函数从s所指的第一个字符开始找'\0'字符,一旦找到就返回,返回的长度不包括
\0'字符在内。例如定义char buf[] = "hello";,则strlen(buf)的值是5,但要注意,如果定义char buf[5] = "hello";,则调用strlen(buf)是危险的,会造成数组访问越界。
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?C辅导习题_学霸学习网
第一章 基础知识 练习题 1.以下说法中正确的是__________。 A)C 语言程序总是从第一个定义的函数开始执行 B)C 语言程序总是从 main()函数开始执行 C)C 语言程序中的 main()函数必须放在程序的开始部分 D)一个 C 函数中只允许一对花括号 2.下列标识符中正确的一组是_______。 A)name,char,_abc,As B)abc.c,5bytes, USA,_54321 C)pnnt,corlst,type,define D)include,integer,Double,short_iht 3.下面的单词中属于 C 语言保留字的是_________。 A)Int B)typedef C)ENUM D)unlen 4.C 语言规定,在一个 C 程序中,main()函数的位置_______。 A)必须在开始 B)必须在最后 C)可以任意 D)必须在系统调用库函数之后 5.一个 C 语言源程序是由____________组成的。 A)若干过程 B)若干子程序 C)一个主程序和若干子程序 D)若干函数 6.下列四个叙述中,错误的是___________。 A)C 语言中的关键字必须小写 B)C 语言中的标识符必须全部由字母组成 C)C 语言不提供输入输出语句 D)C 语言中的注释行可以出现在程序的任何位置 第二章运算符与表达式 一、选择题 1.c 语言中允许的基本数据类型包括________。 A)整型、实型、逻辑型 B)整型、实型、字符型 c)整型、字符型、逻辑型 D)整型、实型、逻辑型、字符型 2.c 语言规定,不同类型的数据占用存储空间的长度是不同的。下列各组数据类型中,满足占用存储空 间从小到大顺序排列的是_____________。 A)short int,char,float,double B)char,float,int,double C)int,unsigned char,long int,float D)char,int,float,double 3.c 语言中能用八进制表示的数据类型为_____________。 A)字符型、整型 B)整型、实型 c)字符型、实型、双精度型 D)字符型、整型、实型、双精度型 4. 下列属于 c 语言合法的字符常数是_____________。 A)'\97' B)&A& C)'\t' D)&\0& 5.在 c 语言中,合法的长整型常数是_________。 A)0L B)4962710 C) D)0xa34b7fe 6. 若有以下定义和语句: charcl='b',c2='e';printf(&%d,%c\n&,c2-c1,c2-'a'+'A'); 则输出结果是________。 A)2,M B)3,E C)2,E D)输出项与对应的格式控制不一致,输出结果不确定 7.若有以下定义和语句: int u=010,v=0x10,w=10; printf(&%d,%d,%d\n&,u,v,w);则输出结果是_________。 A)8,16,10 B)10,10,10 C)8,8,10 D)8,10,10 8.下面程序的输出是_________。 main() {unsigned a=32768; printf(&a=%d\n&,a); } A) a=32768 B) a=32767 C) a=-32768 D) a=-1 9.下面程序的输出是________。 main() {int k=11; printf(&k=%d,k=%o,k=%x\n&,k,k,k); } A) k=11,k=12,k=11 B) k=11,k=13,k=13C) k=11,k=013,k=0xb D) k=11,k=13,k=b 10.若有以下说明和语句: int a=5; printf(&%d\n&,a++);输出结果为__________。 A)6 B)0 C)5 D)4 11.设 x 为 int 型变量,执行以下语句,x=10;x+=x-=x-x;x 的值为_________。 A)10 B)20 C)40 D)30 12.以下合法的赋值语句是_________。 A)x=y=100 B)d--;C)x+y;D)c=int(a+b); 13.设变量 t 为 int 型,下列选项中不正确的赋值语句是______。 A) ++t; B) n1=(n2=(n3=0)); C) k=i==l; D) a=b+c=1; 14.若已定义 x 和 y 为 double 型变量,则表达式 x=1,y=x+3/2 的值是___________。 A)1 B)2 C)2.0 D)2.5 15.若 t 为 double 型变量,表达式 t=1,t+5,t++的值是_________。 A)1 B)6.0 C)2.0 D)1.0 16.在以下一组运算符中,优先级最高的是___________。 A)&= B)= = C)% D)&& 17.表达式 10!=9 的值是___________。 A)非 0 值 B)1 C)0 D)true 18.下列能正确表示 a≥10 或 a≤0 的关系表达式是___________。 A)a&=10ora&=0 B)a&=10|a&=0 C)a&=10||a&=0 D)a&=10&&a&=0 19.下列只有当整数 x 为奇数时,才是逻辑“真”的表达式是_______。 A)x%2==0 B)!(x%2==0) C)(x-x/2*2)==0 D)!(x%2) 20.设 a 为整型变量,不能正确表达数学关系 10&a&15 的 C 语言表达式是_______。 A)10&a&15 B)a==11||a==12||a==13||a=14 C)a&10&&a&15 D)!(a&=10)&&!(a&=15) 21.设 x,y,z 和 t 均为 int 型变量,执行以下语句 x=y=z=1; t=++x||++y&&++z;t 的值为_________。 A)不定值 B)2 C)1 D)0 22.设 a=1,b=2,c=3,d=4,则表达式 a&b?a:c&d?a:d 的值为________。 A)4 B)3 C)2 D)1 23.以下程序段 iht a=2,b=3; printf(a&b?&***a=%d&:&###b=%d&,a,b);的运行结果是___________。 A)有正确的输出格式控制 B)输出为:***a=2 C)输出为:###b=2 D)输出为:***a=2###b=3 24.假定 w,x,y,z 和 m 均为 int 型变量,如下程序段 w=1;x=2;y=3;z=4; m=(w&x)?w:x;m=(m&y)?m:y; m=(m&z)?m:z; 执行后,m 的值为______。 A)4 B)3 C)3 D)1 25.用十进制表示,表达式 12|012 的运算结果是___________。 A)1 B)0 C)14 D)12 26.设 int b=2;,表达式(b&&2)/(b&&1)的值是_________。 A)0 B)2 C)4 D)8 27.以下程序的输出结果是_________。 main() {int x=05; char z='a'; printf(&%d\n&,(x&1)&&(z&'z')); } A)0 B)1 C)2 D)3 28.整型变量 x 和 y 的值相等,且为非 0 值,则以下选项中,结果为 0 的表达式是_______。 A)x||y B)x|y C)x&y D)x^y 29.若有定义 int x,y;char a,b,c;,并有以下输入数据(此处&CR&代表回车符,u 代表空格) :1u2&CR& AuBuC&CR& 则能给 x 赋整数 1,给 y 赋整数 2,给 a 赋字母 A,给 b 赋字母 B,给 c 赋字母 C 的正确 程序段是________。 A) scanf(&x=%dy=%d&,&x,&y);a=getchar();b=getchar();c=getchar(); B) scanf(&%d %d&,&x,&y); a=getchar();b=getchar();c=getchar(); C) scanf(&%d%d%c%c%c&,&x,&y,&a,&b,&c); D) scanf(&%d%d%c%c%c%c%c%c&,&x,&y,&a,&a,&b,&b,&c,&c); 30.语句 printf(&a\bre\'hi\y\\\bou\n&);的输出结果是_________。 A)a\bre\'hi\y\\\bou B)a\bre\'hiy\bou C)re'hi'you D)abre'hi'\bou(说明:\b 是退格符) 二、填空题 1.数学式a b ?c的 C 语言表达式为_________。2.以下程序的输出结果是__________? main() {unsigned short a=65536; int b; printf(&%d\n&, b=a); } 3.若有定义 int a=10,b=9,c=8;,接着顺序执行下列语句后,变量 b 的值为__________。 c=(a-=b-5)); c=(a%11)+(b=3); 4.设 x 和 y 均为 int 型变量,且 x=1 和 y=2,则表达式 1.0+x/y 的值为_________。 5.语句 x++;,++x;,x=x+1;和 x=1+x;执行后都使变量 x 的值增 1,请写出一条同一功能的赋值语 句(不得与列举的相同)____________。 6.表示“整数 x 的绝对值大于 5”时值为“真”的 C 语言表达式是__________。 7.设 x 为 int 型变量,与逻辑表达式!x 等价的最简单的 C 语言关系表达式为____________。 8.设 y 是 int 型变量,请写出判断 y 为奇数的关系表达式__________。 9.若已知 a=1O,b=20,则表达式!a&b 的值为___________。 10.若 u 和 v 均为 int 型变量,表示“u 和 v 之一为 0,但不同时为 0”的 C 语言表达式是___________。 11 . 若 已 定 义 int a=25 , b=14 , c=19; , 以 下 三 元 运 算 符 所 构 成 的 语 句 a++&=25&&b--&=2&&c++&=18?printf(&***a=%d,b=%d,c=%d\n&,a,b,c):printf(&###a=%d,b=%d,c=%d\n&,a, b,c);的执行结果是_________。 12.若想通过以下输入语句将 1 赋予 a,将 2 赋予 b,则输入数据的形式应该是___________。 inta,b; scanf(&a=%d,b=%d&,&a,&b); 13.设已定义 int n=5; float a; 则条件表达式 n&0?n:f 的数据类型为_______。 练习题 一、选择题 1.已知字母 A 的 ASCII 码为十进制的 65,下面的程序输出是_________。 main() {char ch1,ch2; ch1='A'+'5'-'3'; ch2='A'+'6'-'3'; printf(&%d,%c\n&,ch1,ch2); } A)67,D B)B,C C)C,D D)不确定的值 2.设 int 型占 2 字节,则 unsigend int 所能表示的数据范围是________。 A)0~65535 B)-3 C)1~65536 D)0~32767 3.在 C 语言中,设 int 型占 2 字节,下列不正确的 int 型常数为________。 A)32768 B)0 C)037 D)0xaf 4.在 C 语言中不同数据类型的的长度是__________。 A)固定的 B)由用户自己定义的 C)任意的 D)与机器字长有关的 5.下列四组(八进制或十六进制)常数中,正确的一组是____________。 A)016 0xbf 017 B)0abc 017 0xa C)010 x11 0x16 D)0A12 7FF -123 6.下列四组整型常量中,合法的一组是_________。 A)160 0xffff 011 B)-0xcdf 01a 0xe C)-01 986,012 0668 D)-0x48a 2e5 0x 7.在 C 语言中,合法的字符常数是_________。 A)'\084' B)'\x43' C)'\84' D)&\0& 8.下列不正确的转义字符是___________。 A)'\\' B)'\& C)'074' D)'\0' 9.下列四个叙述中,错误的是_________。 A)在 C 程序中。无论是整数还是实数,都能被准确地表示 B)在 C 程序中,变量名代表存储器中的一个位置 c)静态变量的生存期与整个程序的运行期相同 D)C 语言中变量必须先说明后引用 10.当用#define X 23.6f 定义后,下列叙述正确的是__________。 A)X 是实型常数 B)X 是实型变量 C)X 是―串字符 D)X 是字符串常数 11.当用 const int A=9;定义后,下列叙述正确的是________。 A)A 是整型常数 B)A 是整型变量 C)A 是字符型常数 D)A 是不定类型的常数 12.有以下定义: char a; int b; float c;double d; 则表达式 a*b+d-c 值的类型为__________。 A)float B)int C)char D)double 13.下列变量定义中合法的是__________。 A)short _a=1-.1e-1;B)double b=1+5e2.5; C)long do=0xfdaL; D)float 2_and=1-e-3; 14.语句 printf(&%d&,(a=2)&&(b=-2));的输出结果是_________。 A)无输出 B)结果不确定 C)-1 D)1 15.当 c 的值不为 0 时,下列选项中能正确将 c 的值赋给变量 a 和 b 的是_______。 A)c=b=a B)(a=c)||(b=c) C)(a=c)&&(b=c) D)a=c=b 16.设有如下变量定义: int i=8,k,a,b; unsigned long w=5; double x=1.42,y=5.2; 则以下符合 C 语言语法的表达式是____________。 A)a+=a-=(b=4)*(a=3) B)x%(-3) C)a=a*3=2 D)y=float(i) 17.设已定义 int k=7,x=12;,则能使值为 3 的表达式是_________。 A)x%=(k%=5) B)x%=(k-k%5) C)x%=k-k%5 D)(x%=k)-(k%=5) 18.以下程序 main() {int a=12,b12; printf(&%d %d\n&,--a,++b); } 的输出结果是__________。 A)10 10 B)12 12 C)11 10 D)11 13 19.有如下程序 main() {int y=3,x=3,z=1; printf(&%d%d\n&,(++x,y++),z+2); }运行该程序的输出结果是_________。 A)34 B)42 C)43 D)33 20.设 x 和 y 均为 int 型变量,且 x=10 和 y=3,则以下语句 printf(&%d,%d\n&,x++,--y);的输出结果 是____________。 A)10,3 B)9,3 C)9,2 D)10,2 21.下列可作为 C 语言赋值语句的是________。 A)x=3,y=5 B)a=b=6 C)i--; D)y=int(x); 22.以下程序 main() {int a=3; printf(&%d\n&,(a+=a-=a*a)); } 的输出结果是________。 A)-6 B)12 C)0 D)-12 23.设 x 和 y 均为 int 型变量,则以下语句:x+=y;y=x-y;x-=y;的功能是_________。 A)把 x 和 y 按从大到小排列 B)把 x 和 y 按从小到大排列 C)无确定结果 D)交换 x 和 y 的值 24.表示关系 x≤y≤2 的 C 语言表达式为____________。 A)(x&=y)&&(y&=z) B)(x&=y)AND(y&=z) C)(x&=y&=z) D)(x&=y)&(y&==z) 25. a, c, 和 n 均为 int 型变量, a=5, 设 b, m 且 b=6, d=8, 和 n=2, c=7, m=2 则逻辑表达式(m=a&b)&&(n=c&d) 运算后,n 的值为____________。 A)0 B)1 C)2 D)3 26.以下程序 #include&stdio.h& main() {int a,b,c=246; a=c/100%9; b=(-1)&&(-1); printf(&%d,%d\n&,a,b); } 的输出结果是_________。 A)2,1 B)3,2 C)4,3 D)2,-1 27. 以下程序的输出结果是 main() {int a=-1,b=4,k; k=(++a&0)&&!(b--&=0); printf(&%d%d\n&,k,a,b); } A)104 B)103 C)003 D)004 28.设 int a=1,b=2,c=3,d=4;则条件表达式:a&b?a:c&d?a:d 的值是__________。 A)4 B)3 C)2 D)1 29.设已定义 int x=1,y=-1;,则语句 printf(&%d\n&,(x--&&++y));的输出结果是_______。 A)1 B)0 C)-1 D)2 30.设 int i=2,j=1,k=3;,则表达式 i&&(i+j)&k|i+j 的值是_________。 A)0 B)2 C)1 D)3 31.sizeof(double)是_________。 A)一种函数调用 B)一个双精度表达式 C)一个整型表达式 D)一个不合法的表达式 32. i 是 int 型变量, 是 float 型变量, 设 f 用下面的语句给这两个变量输入值: scanf(&i=%d,f=%f&,&i,&f); 为了将 100 和 765.12 分别赋给 i 和 f,正确的输入为(&CR&为回车符,u 为空格)_______。 A)100u765.12&CR& B)i=100,f=765.12&CR& C)100&CR&765.12&CR& D)x=100&CR&y=765.12&CR& 33.以下叙述中正确的是――。 A)输入项可以是一个实型常数,如 scanf(&%f&,3.3); B)只有格式控制,没有输入项,也能正确输入数据到内存,如 scanlf(&a=%d,b=%d&); C)当输入一个实型数据时,格式控制部分可以规定小数点后的位数,如 scanf(&%4.2f&,&f); D)当输入数据时,必须指明变量地址,如 scanf(&%f&,&f); 第三章程序控制结构 练习题 一、选择题 1.为了避免嵌套的 if-else 的二义性,C 语言规定:else 与______配对。 A)缩排位置相同的 if B)其之前最近的 if C)其之后最近的 if D)同一行上的 if 2.下面的程序 main() {int x=3,y=0,z=0; if(x=y+z)printf(&****&); else printf(&####&); ) A)有语法错误,不能通过编译 B)输出**** C)可以通过编译,但不能通过连接,因而不能运行 D)输出#### 3.下面的程序运行时,若从键盘输入 3 和 4,则输出是______。 main() {inta,b,s; scanf(%d%d&,&a,&b); s=a; if(s&b) s=b; s=s*s; printf(&%d\n&,s); } A)14 B)16 C)18 D)20 4.下面的程序执行时,若从键盘输入 5,则输出是――。 main() {int a; scanf(&%d&,&a); if (a++&5) ptintf(&%d\n&,a); else pfintf(&%d\n',a--); } A)7 B)6 C)5 D)4 5.有如下程序 main() {float x=2.0,y; if(x&0.0) y=0.0; else if(x&10.0) y=1.0/x; else y=1.0; printf(&%f\n&,y); } 该程序的输出结果是______。 A)0.000000 B)0.250000 C)0.500000 D)1..下面程序的输出是______。 main() {int x=100,a=10,b=20,okl=5,ok2=0; if(a&b) if(b!=15) if(!okl) x=1; else if (ok2) x=10; x= -1; printf(&%d\n&,x); } A)-1 B)0 c)1 D)不确定的值 7.与 y=(x&O?1:x&0?-1:0);的功能相同的 if 语句是_____。 A) if (x&0) y=l; B) if (x) else if(x&0) y=-l; if (x&0) y=1; else y=0; else if (x&0) y=-1; else y=0; C) y=-1; D) y=0; if (x) if (x&=0) if (x&0) y=1; if (x&0) y=1; else if(x= =0) y=0; else y=-l; else y=-1; 8.以下程序的输出结果是――。 A) -1 1 B)01 C)1 0 D)00 main() {int a=-1,b=1,k; if ((++a&0)&&!(b--&=0)) printf(“%d%d\n” ,a,b); else printf(“%d%d\nl” ,b,a); } 9.若有定义 float x.w; int a,b; ,则下列合法的 switch 语句是_______。 A) switch(x) B) switch(x) {case l.0:printf(“*\n”); {case l,2:printf(“*\n”); case2.0:printf(“**\n”); case3: printf(“**\n”); } } C) switch(a+lb) D) switch(a+b); {case l:printf(“*\n”); {case l:printf(“*\n”); case l+2:printf(“**\n”); case2:printf(“**\n”); } } 10.若定义 int d,c=6; ,则执行下面的语句后,d 的值为______。 switch(c) {case 0:d=0;break; case 1: case2:d=l;break; case3: case4:d:2;break; default:d=3; } A)0 B)1 C)2 D)3 11.下面程序的输出结果是_____。 main() {int i; for(i=0;i&10;i++); printf(&%d&,i); } A)0 B) C) D)10 12.以下程序的输出结果是______。 A)#*#*# B)#### C)***** D)*#*#* main() {int i; for(i=1;i&6;i++) {if (i%2) {printf(&#&);continue;} printf(&*&); } printf(&\n&); } 13.以下程序的输出结果是_______。 A)编译不通过,无输出 B)aceg C)acegi D)abcdefShi main() {int i; for (i='A';i&'H';i++,i++) printf(&%c&,i+32); printf(&\n&); } 14.执行语句 for(i=1;i++&4;);后,变量 i 的值为______o A)3 B)4 C)5 D)不定 15.以下程序的输出结果是________。 main() {int a,b; for (a=1,b=1;a&=100;a++) {if (b&=10) break; if (b%3==1) {b+=3; continue;) } printf(&%d\n&,a); } A)101 B)6 C)5 D)4 16.若 i 和 j 已定义为 int 类型,则以下程序段中的内循环体总共被执行_______次。 for(i=5;i;i--) for(j=0;j&4;j++){.......} A)20 B)24 C)25 D)30 17.以下程序的输出结果是____。 A)10 1 9 2 B)9 8 7 6 C)10 9 9 0 D)10 10 9 1 main() {int x=10,y=10,i; for (i=0;x&8;y=++i printf(&%d %d&,x--,y); } 18.定义 int a=l0; ,下列循环的输出结果是_____。 while(a&7) {a--;printf(&%d&,a);} A)1098 B)987 C)10987 D)9876 19. 以下程序段的输出结果是______。 intx;3; dO {printf(&%3d&,x-=2); )while(!(--X)); A) 1 B) 3 0 C) 1 ―2 D)死循环 20.下列程序段中,不是死循环的是________。 A) int i=100 B) int k=0; while (1) do {i=i%100+1;; {++k; }while (k&=0); if(i&=100) break; } C) for(; ;); D) int s=3379; . while(s++%2+s%2) s++;21.以下程序的输出结果是______。 A)20 B)3 1 C)321 D)210 main() {int n=4; while(n--) printf(&%d&,--n); } 22.以下叙述正确的是______. A)do-while 语句构成的循环不能用其他语句构成的循环来代替。 B)do-while 语句构成的循环只能用 break 语句退出。 C)用 do-while 语句构成的循环,在 while 后的表达式为非 0 时结束循环。 D)用 do-while 语句构成的循环,在 while 后的表达式为 0 时结束循环。 二、填空题 1.下列程序段的输出结果是_______。 int n='C'; switch(n++) { default:printf(&error&);break; case'a':case'A':case'b':case'B':printf(&good&);break; case'c':case'C':printf(&pass&); case'd':case'D':printf(&warn&); } 2.下列程序的运行结果是______。 #include&stdio.h& main() {int x=1,i=1; for(;x&50;i 十十) {if (x&=10) break; if (x%2!=1) {x+=3;continue;} x-=l; } printf(&x=%d,i=%d\n&,x,i; } 3.以下程序运行后的输出结果是_______。 main() {int i=10,j=0; dO {j=j+i; i--; }while(i&2); printf(&%d\n&,j); } } 4.以下程序运行后的输出结果是_______。 #include&stdiO.h& main() {int m=7,n=5,i=l; dO {if (i%m==0) if (i%n==0) {printf(&%d\n&,i;break;} i++; }while (i!=0); } 5.以下程序运行后的输出结果是_______。 #include&stdio.h& main() { int x=3; do {printf(&%d&,x-=2);} while(!(--x)); } 6.有如下程序 #include&stdio.h& main0 {int i=0,j=10,k=2,s=0; for(;;) {i+=k; if(i&j) {printf(&%d\n&,s);break;) s+=1; } } 该程序执行时,判断 i&j 共被执行了______多少次。 第四章 数组 一、选择题 1.若有以下说明语句: int a[12]={1,2,3,4,5,6,7,8,9,10,11,12}; char c='a',d,g; 则数值为 4 的表达式是________。 A) a[g-c] B)a[4] C) a['d'-'c'] D)a['d'-c] 2.假设 int 型变量占两个字节的存储单元,若有定义:int x[10]={0,2,4};则数组 x 在内存中所占字节数为 __________。 A)3 B)6 C)10 D)20 3.下列合法的数组定义是________。 A) int a[]=&string&; B) int a[5]={0,1,2,3,4,5}; C) char a=&string&; D) char a[]={0,1,2,3,4,5}; 4.若给出以下定义: char x[]=&abcdefg&; char y[]={'a','b','c','d','e','f','g'}; 则正确的叙述为____________。 A)数组 x 和数组 y 等价 B)数组 x 和数组 y 的长度相同 C)数组 x 的长度大于数组 y 的长度 D)数组 x 的长度小于数组 y 的长度 5.若定义如下变量和数组: int i; int x[3][3]={1,2,3,4,5,6,7,8,9}; 则下面语句的输出结果是_________。 for(i=0;i&3;i++) printf(&%d&,x[i][2-i]); A)159 B)147 C)357 D)369 6.下列程序: main() {int n[3],i,j,k; for(i=0;i&3;i++) n[i]=0; k=2; for(i=0;i&k;i++) for(j=0;j&3;j++) n[j]=n[i]+1; printf(&%d\n&,n[1]); } 运行后,输出结果是________。 A)2 B)1 C)0 D)3 7.以下程序的输出结果是__________。 A)14 B)0 C)6 D)值不确定 main() {int n[3][3],i,j; for(i=0;i&3;i++) for(j=0;j&3;j++) n[i][j]=i+j; for(i=0;i&2;i++) for(j=0;j&2;j++) n[i+1][j+1]+=n[i][j]; printf(&%d\n&,n[i][j]); } 8.以下程序的输出结果是_________。 main() {int i,k,a[10],p[3]; k=5; for(i=0;i&10;i++) a[i]=i; for(i=0;i&3;i++) p[i]=a[i*(i+1)]; for(i=0;i&3;i++) k+=[i]*2; printf(&%d\n&,k); } A)20 B)21 C)22 D)23 9.以下程序运行后,输出结果是___________。 A)10000 B)10010 C)00110 D)10100 main() {int y=18,i=0,j,a[8]; do {a[i]=y%2;i++; y=y/2; }while(y&=1); for(j=i-1;j&=0;j--) printf(&%d&,a[j]); printf(&\n&); } 10.以下程序的输出结果是_________。 A)ABCD B)ABCD C)EFG D)FGH FGH EFG JK KL KL U O M #include&stdio.h& #include&string.h& main() { char w[][10]={&ABCD&,&EFGH&,&IJKL&,&MNOP&},k; for(k=1;k&3;k++) printf(&%s\n&,&w[k][k]); } 11.以下程序的输出结果是_______。 A)ABCD B)ABCD C)EFG D)EFGH FGH EFG JK DKL KL U O M main() { char w[][10]={&ABCD&,&EFGH&,&IJKL&,&MNOP&},k; for(k=1;k&3;k++) printf(&%s\n&,w[k]); } 12.当执行下面的程序时,如果输入 ABC,则输出结果是________。 A)ABC6789 B)ABC67 C)12345ABC6 D)ABC456789 #include &stdio.h& #include &string.h& main() {char ss[10]=&12345&; gets(ss);strcat(ss,&6789&); printf(&%s\n&,ss); } 13.下列程序运行后的输出结果是_________。 A)you&me B)you C)me D)err #include&string.h& main() {char arr[2][4]; strcpy(arr,&you&);strcpy(arr[1],&me&); arr[0][3]='&'; printf(&%s\n&,arr); } 14.不能把字符串“Hello!”赋给数组 b 的语句是_________。 A)char b[10]={'H','e','l','l','o','!'}; B)char b[10];b=&Hello!&; C)char b[10];strcpy(b,&Hello!&); D)char b[10]=&Hello!&; 15.若有定义和语句: char s[10];s=&abcd&;printf(&%s\n&,s); 则运行结果是____________。 A)输出 abcd B)输出 a C)输出 abcd D)编译不通过 16.若有以下程序段: char str[]=&ab\n\012\\\&&; printf(&%d&,strlen(str)); 该程序段的输出结果是__________。 A)3 B)4 C)6 D)12 17.函数调用 strcat(strcpy(strl,str2),str3)的功能是__________。 A)将串 str1 复制到串 str2 中后再连接到串 str3 之后 B)将串 str1 连接到串 str2 之后再复制到串 str3 之后 C)将串 str2 复制到串 str1 中后再将串 str3 连接到串 str1 之后 D)将串 str2 连接到串 strl 之后再将串 str1 复制到串 str3 中 18.下列程序的输出结果是__________。 A)12ba56 B)6521 C)6 D)62 main() {char ch[7]={&65ab21&}; int i,s=0; for(i=O;ch[i]&='0'&&ch[i]&='9';i+=2) s=10*s+ch[i]-'0'; printf(&%d\n&,s); } 19.下面程序的输出是________。 main() {char s[]=&&; int v1=0,v2=0,v3=0,v4=0,k; for(k=0;s[k];k++) switch(s[k]) {default:v4++; case '1':v1++; case '3':v3++; case '2':v2++; } printf(&v1=%d,v2=%d,v3=%d,v4=%d\n&,v1,v2,v3,v4); } A)v1=4,v2=2,v3=1,v4=1 B)v1=4,v2=9,v3=3,v4=1 C)v1=5,v2=8,v3=6,v4=1 D)v1=8,v2=8,v3=8,v4=8 20.运行下面的程序,如果从键盘上输入: ab&回车& c&回车& def&回车& 则输出结果为________。 A)a B) a C)ab D)abcdef b b c c c d d d e f #include&stdio.h& #define N 6 main() {char c[N]; int i=0; for(;i&N;c[i]=getchar(),i++); for(i=0;i&N;i++) putchar(c[i]); printf(&\n&); } 二、填空题 1. 若想通过以下输入语句使 a 中存放字符串 “1234” b 中存放字符 , “5” 则输入数据的形式应该是_______。 , char a[10],b; scanf(&a=%sb=%c&,a,&b); 2.以下程序的功能是:从键盘上输入若干个学生的成绩,统计计算出平均成绩,并输出低于平均分的学 生成绩,用输入负数结束输入。请填空。 main() { float x[1000],sum=0.0,ave,a; int n=0,i; printf(&Enter mark:\n&);scanf(&%f&,&a); while(a&=0.0&&n&1000) {sum+=______(1)________;x[n]=_______(2)__________; n++; scanf(&%f&,&a); } ave=_______(3)_________; printf(“Output:\n&); for(i=0;i&n;i++) if(_______(4)_________) printf(&%f\n&,x[i]); } 3.下面程序的功能是将一个字符串按逆序存放,请填空。 #include&stdio.h& #include&string.h& main() {char str[80],m; int i,j; gets(str); for(i=0,j=strlen(str);i&_____(1)________;i++,j--) {m=str[j-1]; str[j-1]=_______(2)________; str[i]=m; printf(&%s\n&,str); } 4. 以下程序用来对从键盘输入的两个字符串进行比较, 然后输出两个字符串中第一个不相同字符的 ASCII 码之差。例如,输入的两个字符串分别为 abcdefg 和 abceef,则输出为-1。请填空。 #include&stdio.h& main() { char str1[100],str2[100],c; int i,s; printf(&\nInput string1:\n&);gets(str1); printf(&\nInput string2:\n&);gets(str2); i=0; while((str1[i]==str2[i])&&str1[i]!=_______(1)________)) i++; s=________(2)_________; printf(&%d\n&,s); } 5.下面程序的功能是:将字符数组 a 中下标值为偶数的元素从小到大排列,其他元素不变。请填空。 #include&stdio.h& #include&string.h& main() {char a[]=&clanguage&,t; int i,j,k; k=strlen(a); for(i=0;i&=k-2;i+=2) for(j=i+2;j&k;________(1)________) if(______(2)_________) {t=a[i];a[i]=a[j];a[j]=t;} puts(a); printf(&\n&); } 6.若有定义语句:char s[100],d[100];int j=0,i=0; ,且 s 中已赋字符串,请填空以实现字符串拷贝。(注 意:不得使用逗号表达式。) while(s[i]) {d[j]=_________________; j++; } d[j]=0; 7.下列程序段的输出结果是_____________。 main() {char b[]=&Hello,you&; b[5]=0; printf(&%s\n&,b); } 8.以下程序可以把从键盘输入的十进制数(long 型)以二到十六进制数的形式输出,请填空。 #include&stdio.h& main() {char b[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; int c[64],d,i=0,base; long n; printf(&Enter a number:\n&);scanf(&%ld&,&n); printf(&Enter new base:\n&);scanf(&%d&,&base); do {c[i]=____________________; i++;n=n/base; }while(n!=0); printf(&Transmite new base:\n&); for(--i;i&=0;--i) {d=c[i]; printf(&%c&,b_______________); } } 第五章函数 一、选择题 1.若函数调用时用数组名作为函数参数,以下叙述中不正确的是―――。 A)实参与其对应的形参共用同一段存储空间 B)实参将其地址传递给形参,结果等同于实现了参数之间的双向值传递 C)实参与其对应的形参分别占用不同的存储空间 D)在调用函数中必须说明数组的大小,但在被调函数中可以使用不定尺寸数组 2.若定义函数 float*fuocl(),则函数 funcl 的返回值为――o A)一个实数 B)一个指向实型变量的指针 C)一个指向实型函数的指针 D)一个实型函数的入口地址 3.下列程序的运行结果是―――? A)6 3 B)3 6 C)编译出错 D)0 0 void fun(int *a,int *b) {int *k; k=a;k=b;b=k; } main() {int a=3,b=6,*x=&a,*y=&b; fun(x,y); printf(&%d%d,a,b); } 4.下列程序的输出结果是――。 A)4 B)6 C)8 D)10 int b=2; int fun(int a) {b+=a; return(b); } main() {int a=2,res=2; res+=fun(&a); printf(&%d\n&,res); } , 5.下列程序执行后的输出结果是――。 A)hello D)hel C)hlo D)hlm void funl(int i); void fun2(int i); char st[]=&hello,friend!&; void funl(int i) {printf(&%c&,st[i]); if(i&3){i+=2;fun2(i);} } void fun2(int i) {ptintf(&%c&,st[i]; if(i&3){i+=2;fun2(i);} } main() {int i=0; fun1(i); printf(&\n&); } 6.以下程序运行后,输出结果是――。 #include&stdio.h& ss(char,s) {char *s; while(*p) p++; return(p-s); } main() {char *a=&abded&; int i; i=ss(a); printf(&%d\n&,i); } A)8 B)7 C)6 D)5 7.以下程序运行后,输出结果是――。 A)84 B)99 C)95 D)44 int d=l; fun(int p) {int d=5; d+=p++; printf(&%d&,d); } main() {int a=3; fun(a); d+=a++; printf(&%d\n&,d); } 8.以下程序运行后,输出结果是――? A)1234567 B)7654321 C)1711717 #include&stdio.h& #include&string.h&D)7177171 fun(char *w,int n) {char t,*s1,*s2; sl=w;s2=w+n-1; while(sl&s2) {t=*s1++; *sl=*s2--; *s2=t; } main() {char *p; p=&1234567&; fun(p,strlen(p)); puts(p); } 9.以下程序的输出结果是――。 A)ihgfedcba B)abcdefghi C)abcdedcba D)ihgfeefghi ginclude&string.h& main() {char *a=&abcdefghi&; int k; fun(a); puts(a); } fun(char *s) {int x,y; char c; for(x=0,y=strlen(s)-1;x&y;x++,y--) {c=s[y];s[y]=s[x];s[x]=c;) } 10.下面的程序用来将一个十进制正整数转化成八进制数,例如输入一个正整数 25,则输出 31。请 选择正确的选项填入程序空白处。 #include&stdio.h& main() {int i=9,a,b[10]={0}; printf(&\nplease input a integer:&); scanf(&%d&,&a); sub(a,b); for(;i&=0;i--) printf(&%d&,b[i]); } sub(int c,int d[]) {int e,i=0; while(c!=0) {e=c%8; d[i]=e; (1) ; i++; } retur n; } A)c=e/8 B)c=c%8 C)c=c/8 D)c=e%8 11.以下程序的功能是计算函数 f(x,y,z)=(x+z)/(y-z)+(y+2*2)/(x-2*z)的值,请选择正确的选项填入程序空缺 处。 #include&sdio.h& float f(float x,float y) {float value; value=x/y; return(value); } main() {float x,y,z,sum; scanf(&%f%f%f&,&x,&y,&z); sum=f(―(1)―)+f(―(2)―); printf(&sum=%f\n&,sum); } (1) A)y-2,x+z B)x+z,y-z C)x,y D)y,x (2) A)y+2z,x-22 B)y+z,x-z C)x+z,y-z D)y+2*z,x-2*z 12.以下程序运行时,若从键盘输入-32768,则程序输出是――。 abs(int x) {if(x&=0)return x; else return -x; } main() {int y,z,(*p)()=abs; scanf(&%d&,&y); z=(*p)(y); printf(&%d\n&,z); } A) 32768 B)-32768 C)-1 D)32767 13.假定以下程序经编译和连接后生成的可执行文件为 PROG.EXE,如果在此文件所在目录的 DOS 提示 符下键入:PROGABCDEFGIJKL&回车&,则输出结果为――。 ’ A)ABCDEFG B)IJKL C)ABCDEFGIJKL D)IJKLABCDEFG main(int argc,char *argv[]) {while(--argc&0) printf(&%s&,argv[argc]); printf(&\n&); } 二、填空题 1.阅读程序: #include&string.h& #include&stdio.h& strlen(char a[],char b[]) {int num=O,n=O; while(*(a+num)!='\0')num++; while(b[n]) {*(a+num)=b[n];num++;n++;} return num; } main() {char strl[81],str2[81],*pl=strl,*p2=str2; gets(1);gets(p2); printf(&%d\n&,strlen(p1,p2)); } 运行上面的程序,如果从键盘输入字符串 qwerty 和字符串 abcd,则程序的输出结果是――。 2.以下程序运行时,若从键盘输入 1234,则输出结果是――。 void printopp(long int n) {int i=0; if(n==0) return; else while(n) {if(n&0) printf(&%ld&,n%10); else printf(&%ld&,n%10); n/=10; } } main() {long int n; scanf(&%ld&,&n); printfopp(n); printf(&\n&); } 3.函数 void fun(float *sn,int n)的功能是:根据以下公式计算 s,计算结果通过形参指针 sn 传回,n 的值大于等于 0。请填空。 s=1-1/3+1/5-1/7+……+1/(2n+1) void fun(float *sn,int n) {float s=0.0,w,f=-1.0; int i=0; for(i=0;i&=n;i++) {f= (1)*f; w=f/(2*i+1); s+=w; } (2)=s; } 4.下面程序的输出结果是――。 #define MAX 3 int a[MAX]; main() {funl();fun2(a);printf(&\n&);} fun1() {int k,t=0; for(k=0;k&MAX;k++,t++)a[k]=t+t; } fun2(int b[]) {int k; for(k=0;k&MAX;b++)printf(&%d&,*(b+k)); } 5.以下函数的功能是把两个整数指针所指向的存储单元中的内容进行交换。请填空。 exchange(int *x,int *y) {int t; t=*y;*y= (1) ; *x=(2) ; } 6.以下 fun()函数的功能是累加数组元素的值,其中 n 为数组中元素的个数,累加和放入 x 所指的存储单 元中。请填空。 fun(int b[],int n,int *x) {int k,r=0; for(k=0;k&n;k++) r= (1) ; (2) =r; } 7.若变量 n 中的值为 24,则 prnt 函数共输出 (1) 行,最后一行有 (2) 个数。 void prnt(int n,int aa[]) {int i; for(i=l;i&=n;i++) {printf(&%6d&,aa[i]); if(!(i%5))printf(&\n&); } printf(&\n&); } 8.以下程序中,主函数调用了 LineMax 函数,以实现在 N 行 M 列的二维数组中找出每一行上的最大值。 请填空。 #defme N 3 #defme M 4 void LineMax(int x[N][M] {int i,j,p; for(i=0;i&N;i++) {p=0; for(j=1;j&M;j++) if(x[i][p]&x[i][j]) (1) ; printf(&The max value in line %d is %d\n&,i, (2) ); } } main() {int x[N][M]={1,5,7,4,2,6,4,3,8,2,3,1}; (3) ; } 9.以下程序的输出结果是――。 void fun() { static int a=0; a+=2; printf(&%d&,a); } main() { for(cc=l;cc&4;cc++) fun(); printf(&\n&); } 第六章指针 一、选择题 1.设有以下语句,则_____________不是对 a 数组元素的正确引用,其中 0&=i&10。 int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a; A) a[p-a] B) *(&a[i]) C) p[i] D) *(*(a+i)) 2.程序 main () {int a[10]={1,2,3,4,5,6,7,8,9,0},*p; p=a; printf (“%x\n”,p); prinrf (“%x\n”,p+9); } 中有两个 printf (),如果第一个 printf () 输出的是 194,则第二个 printf ()输出是__________。 A) 203 B) 204 C) la4 D) la6 3.下面的程序运行后,a=______(1)_______,b=________(2)_________。 main() {int a=10,b=20; int *pa=&a,*pb=&b; *pa=*(pb-1)+5; *(pa+1)=*pa-5; printf (“a=%d,b=%d\n”,a,b); } (1) A) 10 B) 15 C) 25 D) 20 (2) A) 10 B) 20 C) 5 D) 15 4.下面程序的输出结果是_____________。 main() {int a[]={2,4,6,8,10};int y=l,x,*p; p=&a[1]; for (x=0;x&3;x++) y+=*(p+x); printf (“%d\n” , y ); } A) 17 B) 18 C) 19 D) 20 5.以下程序运行后,输出结果是_____________。 A) ABCDEFG B) CDG C) abcdefgh D) abCDefGH main() { static char a[]=”ABCDEFGH”,b[]=”abCDefGh”;char *p1,*p2;int k; p1=a,p2=b; for (k=0;k&=7;k++) if (*(p1+k)==*(p2+k)) printf (“%c”,*(p1+k)); printf (“\n”); } 6.以下程序运行后,如果从键盘输入: book&回车& book&空格&&回车&则输出结果是_______________。 A) *8 B) #9 C) #6 D) *9 # include&string.h& main() { char al[80],a2[80],*s1=a1,*s2=a2; gets (s1);gets(s2); if (!strcmp (s1,s2)) printf (“*”); else printf (“#”); printf (“%d\n”, strlen (strcat(s1,s2) ) ); } 7.程序 main() { static int a[][3]={{1,2,3},{4,5},7};int *pa[3]={a[0],a[1],a[2]}; int **pp=pa; printf (“%d\n”,*a[1]); 输出为_____(1)______ printf (“%d\n”,*(*(a+1)+1)); 输出为_____(2)______ printf (“%d\n”,*pa[1]); 输出为_____(3)______ printf (“%d\n”,*pp[1]); 输出为_____(4)______ printf (“%d\n”, pp[2][1]); 输出为_____(5)______ } (1) A) 4 B) 5 C) 1 D) 2 (2) A) 5 B) 4 C) 3 D) 2 (3) A) 1 B) 3 C) 4 D) 7 (4) A) 5 B) 2 C) 4 D) 6 (5) A) 4 B) 5 C) 7 D) 0 8.程序 main() { char *s1=”ABCD,*s2=”CDEF”;char *psl=s1,*ps2=s2; while (*s1) s1++; while (*s1++=*s2++); printf (“%s\n”,ps1); 输出为_______(1)_________ printf (“%s\n”,ps2);} 输出为_______(2)___________ (1) A) ABCD B) CDEF C) ABCDEF D) ABCDCDEF (2) A) DEF B) ABCD C) CDEF D) ABCDEP 9.以下程序运行后,输出结果是________________。 A) -5823 B) 22 C) 33 D) 693825 main() { char ch[2][5]={“693”,”825”},*p[2];int i,j,s=0; for (i=0;i&2;i++) p[i]=ch[i]; for (i=0;i&2;i++) for (j=0;p[i][j]&=?0?&&p[i][j]&=?9?:j+=2) s=10*s+p[i][j]; printf (“%d\n”,s); } 二、填空题 1.以下程序的运行结果是___________。 # include&Stdio.h& main() { char b[]=”ABCDEFG”;char *chp=&b[7]; while (--chp&&b[0]) putchar(*chp); putchar(?\n?);} 2.下列程序的输出结果是______________。 main() { int a[]={2,4,6},*ptr=&a[0],x=8,y,z; for (y=0;y&3;y++) z= (*(ptr+y)&x)?*(ptr+y):x; printf (“%d\n”,z); } 3.下列程序的输出结果是____________。 # include&string.h& main() { char b[30],*chp; strcpy (&b[0],”GH”); strcpy (&b[1],”DEF”); strcpy (&b[2],”ABC”); printf (“%s\n”,b); } 4.下面程序的输出结果是__________。 char b[]=”ABCD”; main() { char *chp; for (chp=b;*chp;chp+=2) printf (“%s”, chp); printf (“\n”);} 5.下面的程序能将输入的字符串反向打印出来,请将程序填完全。 # include&stdio.h& # include&string.h& main() {char *string, str[50]; int n; string=str; scanf (“%50s”, string); n=________(1)_________; while (______(2)________) { _____(3)_______; printf (“%c”,*string); } } 6.下面的程序可对指定字符串中的字符进行从大到小排序,请将程序填完全(注:程序采用了冒泡排序 算法) 。 # include&stdio.h& # include&string.h& main() { char *str=”ABCDabcd”, temp;int n,i; n= string (str); while (n--&1) for (i=0;i&n;i++) if (str[i]&str[i+1]) {temp=______(1)_________; str[i]=str[i+1]; ______(2)______ =temp; } printf (_____(3)________); } 第七章结构体共用体 一、选择题 1.设有如下结构定义: struct addr { char name[30];char street[40]; char city[20];char office[30]; char phone[10];int age;}stud; 若用 printf(“%s\n”,?)访问该结构中 name 值的正确方法是_____(1)_______,用 scanf(“%d”,?)访问结 构元素 age 的地址的正确方法是______(2)________。 (1) A)stud-&name B)&stud.name C)stud.&name D)stud.name (2) A)stud.&age B)&stud.age C)stud.age D)stud-&age 2.下面的程序的输出是_______________。 main() { struct cmplx {int x;int y;} cnum[2]={1,3,2,7); printf(&%d\n&, cnum[0].y/cnum[0].x*cnum[l].x); } A)0 B)1 C)3 D)6 3.设有以下说明语句: struct ex { int x;float y;char z;} example; 下面的叙述中不正确的是____________。 A) struct 是结构体类型的关键宇 B) example 是结构体类型名 C) x,y,z 都是结构体成员名 D) struct ex 是结构体类型名 4.若有以下说明和语句: struct st { int n;char *ch;}; struct st a[3]={5,”abc”,7,”def”,9,&ghk&},*p=a; 则值为 6 的表达式是___________。 A) p++-&n B) p-&n++ C) (*p).n++ D) ++p-&n 5.已知字符 0 的 ASCII 码为十六进制的 30,下面的程序输出是__________。 main() { union{unsigned char c;unsigned int i[4];}z; z.i[0]=0x39;z.i[1]=0x36; printf(“%c\n”,z.c); } A)6 B)9 C)0 D)3 6.以下程序的输出结果是――。 struct HAR {int x, struct HAR *p; } h[2]; main() { h[0].x=l; h[0].y=2; h[1].x=3; h[1].y=4; h[0].p=&h[1]; h[1].p=h; printf(&%d%d\n&, (h[0].p)-&x, (h[1].p)-&y); } A) 12 B) 23 C) 14 D) 32 7.下列程序的输出结果是――。 main() {union {int k;char ch[2];}*s,a; s=&a; s-&ch[0]=0x39;s-&ch[1]=0x38; printf(“%x\n”,s-&k); } A)3839 B)3938 C)38 D)39 8.以下程序的输出结果是――。 union myun { struct {int x,y,z;}u; int k;}a; main() {a.u.x=4;a.u.y=5;a.u.z=6; a.k=0; printf(“%d\n”, a.u.x); } A)4 B)5 C)6 D)0 二、填空题 1.指出下面程序的运行结果。 struct strl{char c[5];char *s;}; main() { struct strl sl[2]={{&ABCD&,&EFGH&},{&IJK&,&LMN&}}; struct str2 {struct strl sr;int d;}s2={&OPQ&, &RST&, 32767}; struct strl *p=s1; printf(“%c\n”,p-&c[1]); /* 输出为_______(1)________。*/ printf(“%s\n”,++p-&s); /* 输出为_______(2)________。*/ printf(“%c\n”,s2.sr.c[2]); /* 输出为_______(3)________。*/ printf(“%d\n”,s2.d+1); /* 输出为_______(4)________。*/ } 2.以下程序的输出是――。 A)10 B)11 C)51 D)60 struct st { int x; int *y;}*p; int dt[4]={10, 20, 30, 40}; struct st aa[4]={50, &dt[0],60, &dt[0],60, &dt[0], 60, &dt[0]}; main() { p=aa; printf(“%d\n”,++(p-&x)); } 3.以下程序用来输出结构体变量 ex 所占存储单元的字节数,请填空。 struct st { char *name;double score;}; main() { struct st ex; printf(&ex size:%d\n&, sizeof(__________)); } 4.以下程序段用于构成一个简单的单向链表,请填空。 struct STRU { int x,y; float rate; _____________p; }a,b; a.x=0;a.y=0;a.rate=0;a.p=&b; b.x=0;b.y=0;b.rate=0;b.p=NULL; 5.若有如下结构体说明: struct STRU { int a,b; char c; double d; struct STRU pl, p2; }; 请填空,以完成对 t 数组的定义,其中 t 数组的每一个元素为该结构体类型: _____________ t[20]; 6.下面程序的输出结果是____________。 main() {union u {char name[10];int age;int income;}s; s.name=”Wangling”;s.age=28;s.income=1000; printf(“%d\n”,s.age); } 7.以下程序建立了一个带有头节点的单向链表,链表节点中的数据通过键盘输入,当输入数据为-1 时, 表示输入结束(链表头节点的 data 域不放数据,表空的条件是 ph-&next==NULL)。请填空。 #include&stdio.h& struct list { int data; struct list *next;}; ______(1)_______creatlist() { struct list p, q, *ph; int a; ph=(struct list *)malloc(sizeof(struct list)); p=q=ph; printf(&Input an integer number, enter-1 to end:\n&); scanf(“%d”,&a); while( a!= -1) { p=(struct list *)malloc(sizeof(struct list)); p-&data=a; q-&next=p; ______(2)______ = p; scanf(“%d”,&a); } p-&next=?\0?; return ph; } main() { struct list *head; head=creatlist(); } 第八章文件 一、选择题 1.在 C 语言中,用 w+方式打开一个文件后,可以执行的文件操作是――。 A)可任意读写 B)只读 C)只能先写后读 D)只写 2.下面的程序用来建立一个名为 myflle 的文本文件,并将键盘输入的 10 个字符(不含回车键)存入该文 件。请为程序空白处选择正确的答案。 #include&stdio.h& main() {FILE * fp= (1) (&myfile&,&w&); for(i=O;i&1O;i++) { c=getchar(); c=getchar(); fputc( (2) ,fp); } fclose(fp);. } (l) A) fgets B) fopen C) fclose D) fgetc (2) A) c B) fp,c C) fp D) c,fp 3.下面的程序是把一个名为 old.dat 的文本文件拷贝到 new.dat 中。请为程序的空白处选择正确的答案。 #include &stdio.h& main() { FILE *pl,*p2; pl=fopen(&old.dat&, (1) ); p2=fopen(&new.dat&, (2) ); c=getc(pl); while(c!=EOF) { fputc(c,p2); c=fgetc(pl ); } fclose(pl); fclose(p2); } (l) A) &r& B) &w+& C) &ab& D) &wb& (2) A) &rb+& B) &r& C) &w& D) &rb 4.下面程序的功能是―――。 A)计算文件 junk.txt 的起始地址 B)计算文件 junk.txt 的终止地址 C)计算文件 junk.txt 的长度(字节数) D)将文件指针定位到文件末尾 #include &stdio.h& #include &stdlib.h& main() { FILE * fp=fopen(&junk.txt&,&rb&); fseek(fp,OL,SEEK_END); n-=ftell(fP); fclose(fp); printf(&%ld&,n); } 5.下面的程序将一个名为 list 的结构存入数据文件 mynum.dat 中,然后将文件中的数据读出并存入名为 k 的结构中。请为程序空白处进行正确的选择。 #include&stdio.h& struct employee { char name[36]; }; main() { FILE * struct employee k[3].list[3]={&wang&,23,'f',1OOO, &li&,25,'m',1020, &zhang&,30,'f',1500}; if((fp=fopen(&mynum.dat&,&w&))==NULL) { puts(&Couldn't open file.\n&); exit(0); } for(i=0;i&3;i++) if(fwrite( (1) ,sizeof(struct employee),1,fp)!=1) printf(& Successfully write.\n&); else printf(&Unsuccessfully write.\n&); rewind(fp); for(i=O;i&3;i++) if(fread( (2) ,sizeof(struct employee),1,fp)!=13) if(feof(fp)) printf(&File read successfilny.\n&); fclose(fp); . } (l) A) &list[i] B) list C) list[i] D) *list[i] (2) A) k B) k[i] C) *k[i] D) &k[i] 二、填空题 1.下面的程序将一个浮点数写到文件 test 中。请填空。 #include&stdio.h& main(void) { FILE * float r=12.23; if(( (1) (&test&,&wb&))==NULL) { puts(&Can not open file.&); exit(O); } if(fwrite(&f,sizeof(float),l,fp)!=1) printf(&File enor.&); } 2.下面程序的功能是从文件中读取 10 个浮点数,并存入数组 bal 中。请填空。 #include&stdio.h& main() { FILE * float bal[1O]; if(!(fp= (1) (&test&,& (2) &))) { puts(&Can not open file.&); exit(O); } if(fread( (3) ,sizeof(float), (4) ,fp)!=10) if(feof (5) ) puts(&premature end of file.&); else puts(&File read error.&); fclose(fp); } 3.下面程序的功能是读取并显示一个文本文件的内容。请填空。 #include &stdio.h& main(int argc,char *argv[]) {FILE *p; if((p=fopen(argv[l],&r&))==NULL) { puts(&Can not open file.&);exit(0); } while((ch=fgetc( (1) ))!= (2) ) printf(&%c&, (3) ); fclose(p); } 4.下面的程序将磁盘中的一个文件复制到另一个文件中,两个文件名在命令行中给出。请填空。 #include&stdio.h& main(int argc,char *argv[]) { FILE *n,*a; if(argc& (1) ) { puts(&Parameters missing.&); exit(0); } if((f1=fopen(argv[l],&r&))==NULL) (f2=fopen(argv[2],&w&))==NULL) { puts(&can not open file.&); exit(0); } while ( (2) )fputc(fgetc(f1),f2); fclose(f1); fclose(f2); } 第九章编译预处理 一、选择题 1.宏定义的宏展开是在―――阶段完成的。 A)第一遍编译 B)第二遍编译 C)程序执行 D)预编译 2.下面程序的运行结果是――。 A)3..141593 B)PI=3.141593 C)3.141593=PI D)以上答案都不正确 #define PI 3.141593 main() { printf(&PI=%f&,PI); } A)5 B)6 C)8 D)9 6.以下程序的输出结果是――。 A)16 B)2 C)9 D)l #define SQR(X) X*X main() { int a=l6,k=2,m=1; a/=SQR(k+m)/SQR(k+m); printf(&%d\n&,a); } 7.编译预处理命令以―――结尾。 A); B). C)\ D)回车键 8.下面的程序中,第一个输出值是(1),第二个输出值是(2)。 (1) A)3 B)4 C)6 D)8 (2) A)17 B)18 C)30 D)40 #define M 3 #define N M+l #define NN N*N/2 main() {printf(&%d\n&,NN); printf(&%d\n&,5*NN); } 9.程序中有如下定义 #define S(r) r/r int a=4,b=3, 则表达式 area=S(a+b)的值为――。 A)1 B)4 C)7 D)8 二、填空题 1.下面程序的输出结果是―――。 #define SUB(x) (x)-(x) main() {int a=4,b=6,c=7,d; d=SUB(a+b)*c; printf(&d=%d\n&,d); } 2.C 语言中,宏定义有效范围从定义处开始,到本源程序结束处终止。但可以用―――来提前解除 宏定义的作用。 3.下面程序的输出结果是―――。 #define MAX(x,y,z ) ((x)&(y)?((x)&(z)?(x):(z)):(y)&(z)?(y):(z)) main() { int a=1,b=2,c=3; printf(&%d&,MAX(a,b,c)); printf(&%d&,MAX(a+b,b,b+c)); printf(&%d\n&,MAX(a,b+c,c)); } 4.程序中定义以下宏 #define w 3 #define L (w+4) 若定义 int val;且令 val=L*L,则变量 val 的值为――。 A)14 B)19 C)24 D)49 5、C 的编译预处理命令总是以 字符开始的 第十章 DOS 操作题DOS 命令操作题说明:DOS 命令操作题为一级 DOS 及二级各种语言的第一道上机操作题, 分值为 30 分,共十五套,考生在上机时系统会随机抽出一套用来考试。 第一套 1.将考生目录下的 TCYCX\TSR 目录中的 MOVE 子目录删除。 2.将考生目录下 APPLE\CUABC 子目录中的文件 README.DOC 更名为 README.TXT。 3.将考生目录下 L\M 子目录中的文件 A1.BAT 删除。 4.在考生目录下 UNIX\GROUP 子目录中建立一个新的子目录 L。 5.取消考生目录下 P\P 子目录中文件 PERSON.PAS 的隐含属性。 6.将考生目录下 SAVE 子目录中的文件 HEAD.TXT 和考生目录下 CHECK 子目录中的文件 SEARCH.DAT 顺序合并拷贝到考生目录下的 PCS 子 目录中, 文件名为 BASE.OUT。 第二套 1.在考生目录下的 CALL\ZR 子目录中建立一个新的子目录 DISK。 2.将考生目录下的 CALL\PROD 子目录中的 VVV 子目录删除。 3.将考生目录下的 EXEC\OBJET 子目录中的文件 ABC.DOC 更名为 LINK.DOC。 4.将考生目录下的 SIGIO\USB 子目录中的文件 XYZ.PAS 删除。 5.取消考生目录下 HELP 子目录中文件 PERSON.HLP 的只读属性。 6.将考生目录下的 INTO\FP 子目录中的文件 P1.BAT 复制到考生 目录下的 CALL 目录中,文件名为 T1.BAT。 第三套 考生目录──┬─ERROR──EVENT──ADD.PAS ├─PORTS──Q ├─BOTH──RMON──FILE.BAS ├─NIT──GSX──HALT.LIB ├─ACPI──NAME.PAS ├─DOWS──CRT──CRAY.LIB └─DBMEM──DMS──LOTUS.LIB 1.将考生目录下的 ERROR 目录中的 EVENT 子目录删除。 2.在考生目录下的 PORTS\Q 子目录中建立一个新的子目录 CREAT。 3.将考生目录下的 BOTH\RMON 子目录中的文件 FILE.BAS 删除。 4.将考生目录下的 NIT\GSX 子目录中的文件 HALT.LIB 更名为 ADD.PAS。 5.取消考生目录下 ACPI 子目录中文件 NAME.PAS 的系统属性。 6.将考生目录下的 DOWS\CRT 子目录中的文件 CRAY.LIB 和考生目录 下 DBMEM\DMS 子目录中的文件 LOTUS.LIB 顺序合并拷贝到考生目 录下 ERROR 子目录中, 文件名为 ABC.LIB。 第四套 1.将考生目录下的 GETDAT\ADDR 子目录中的文件 ABC.C 和考生目录 下 RECV\TLI 子目录中的文件 XYZ.PAS 顺序合并拷贝到考生目录下 STREAM 子目录中, 文件名为 TWICE.DOC。 2.在考生目录下的 H1\H2\H 子目录中建立一个新的子目录 BUREAU。 3.将考生目录下的 QUEUE\POINT 子目录中的文件 NET12.PAS 更名为 NETWORK.PAS。 4.将考生目录下的 ZPEN 目录中的 INFO 子目录删除。 5.将考生目录下的 ASSIGN\WWW 子目录中的文件 ENERGY.FOR 删除。 6.将考生目录下的 IN\IBRW 子目录中的文件 REAL.PRG 设置成具有系 统属性的文件。 第五套 1.在考生目录下的 ATM\LOAD 子目录中建立一个新的子目录 APPR。 2.取消考生目录下 TASM\P1 子目录中文件 OPENERR.ASM 的隐含属性。 3.将考生目录下的 CBC\HRD 子目录中的文件 CTOD.PAS 和考生目录下 PARSTR 子目录中的文件 INTER.C 顺序合并拷贝到考生目录下 PARSTR 子目录中, 文件名为 TAG.NIT。 4.将考生目录下的 WANG\V\W 子目录中的文件 FRAME.OLD 删除。 5.将考生目录下的 ETHER 目录中的 SOOT 子目录删除。 6.将考生目录下的 GTVVA\LIE 子目录中的文件 NOT.DAT 更名为 TOOLS.TXT。 第六套 1.将考生目录下的 RECEI\J 子目录中的文件 SCRE.FOR 和考生目录下 KIRG\MHDQ 子目录中的文件 TMS.BAS 顺序合并拷贝到考生目录下 RECEI 子目录中, 文件名为 BUTID.PAS。 2.在考生目录下的 RECEI\DWM 子目录中建立一个新的子目录 GYRW。 3.将考生目录下的 ORDH\XRH 子目录中的文件 DELAY.BAS 删除。 4.取消考生目录下 P\P 子目录中文件 PERSON.PAS 的只读属性。 5.将考生目录下的 SIGNED\CCP 子目录中的文件 VISOR.DAT 更名为 USER.WPS。 6.将考生目录下的 KINGFA 目录中的 BUS 子目录删除。 第七套 考生目录──┬─ADD──RECORD.TXT ├─RD16──BLUE ├─PACKET──DAT──FORT.BAS ├─GRAPH──TERMINAT──LINE.LIB ├─GOOD──VV ├─LENGTH──COF──DRINK.TXT └─GRAPE──SOFAR.PAS 1.将考生目录下的 ADD 子目录中的文件 RECORD.TXT 拷贝到考生 目录下 RD16\BLUE 子目录中, 文件名为 SENSE.DAT。 2.将考生目录下的 PACKET\DAT 子目录中的文件 FORT.BAS 更名为 PASC.PAS。 3.将考生目录下的 GRAPH 的 TERMINAT 子目录删除。 4.在考生目录下的 GOOD\VV 子目录中建立一个新的子目录 BLACK。 5.将考生目录下的 LENGTH\COF 子目录中的文件 DRINK.TXT 删除。 6.取消考生目录下 GRAPE 子目录中文件 SOFAR.PAS 的隐含属性。 第八套 1.将考生目录下的 CODEWST\CBL 子目录中的文件 DIUM.PAS 删除。 2.将考生目录下的 CODEWST 目录中的 NET 子目录删除。 3.将考生目录下的 APPEL\BELL 子目录中的文件 SNA.TXT 更名为 DNA.HLP。 4.在考生目录下的 TSY\SPX 子目录中建立一个新的子目录 RETURN。 5.取消考生目录下 DRIVE 子目录中文件 DRIVE.INI 的系统属性。 6.将考生目录下 POE\UVW 子目录中的目录、文件清单信息存于考生 目录下 PPP 子目录中的 PRID 文件中。 第九套 1.取消考生目录下 LETTER 子目录中文件 NAME.PAS 的系统属性。 2.将考生目录下的 MARK\OPEN 子目录中的文件 LIBRARY.C 删除。 3.将考生目录下的 MARK\TAG 子目录中的文件 GOD.DOC 更名为 GOOD.TXT。 4.在考生目录下的 FALSE 子目录中建立一个新的子目录 FAT。 5.将考生目录下的 NCBPTR 目录中的 FEET 子目录删除。 6.将考生目录下 MARK\OPEN 子目录中的文件 V1.BAT 复制到考生 目录下 FALSE 目录中,文件名为 W1.BAT。 第十套 1.将考生目录下 APPL\MATH 子目录中的文件 K1.BAT 删除。 2.取消考生目录下 ARGV\P 子目录中文件 MAP.PAS 的隐含属性。 3.将考生目录下的 PROG\YUW 子目录中的文件 TOTAL.C 更名为 SUM.C。 4.将考生目录下的 APPL\MATH 子目录中的文件 CREA.FOR 和考生目 录下 PUB\FORE 子目录中的文件 USING.FOR 顺序合并拷贝到考生目 录下 SYS\CLAS 子目录中, 文件名为 MORTH.FOR。 5.将考生目录下的 ZHANG\PIC 子目录中的 PB 子目录删除。 6.在考生目录下的 ZHANG 子目录中建立一个新的子目录 ARIAL。 第十一套 考生目录──┬─VALUE──WANG──BOOK.BAK ├─A──B──C──PASTE.FOR ├─SOLID──EMAIL──VOLT.FOR └─DEF──NOTE─┬─TODAY.C ├─TODAY.BAK └─FIRE.FOR 1.将考生目录下的 VALUE\WANG 子目录中的文件 BOOK.BAK 更名为 BOOK.PRG。 2.在考生目录下的 A\B\C 子目录中建立一个新的子目录 MODEM。 3.将考生目录下的 SOLID 目录中的 EMAIL 子目录删除。 4.将考生目录下的 DEF\NOTE 子目录中的文件 TODAY.C 设置成具 有系统属性。 5.将考生目录下的 DEF\NOTE 子目录中的文件 TODAY.BAK 删除。 6.将考生目录下的 DEF\NOTE 子目录中的文件 FIRE.FOR 和考生目录 下的 A\B\C 子目录中的文件 PASTE.FOR 顺序合并拷贝到考生目录 下的 A 子目录中, 文件名为 WPASTE.FOR。 第十二套 1.将考生目录下 OPEN\NEW 子目录中的文件 FILE1.BAT 复制到考生目 录下 C\BAT 目录中,文件名不变。 2.将考生目录下 CLIP 子目录中的文件 EDITOR.BMP 更名为 256C.BMP。 3.将考生目录下 CLIP\BOARD 子目录中的文件 DA.DOC 设置成具有只 读属性的文件。 4.将考生目录下 C\BAT\A 子目录中的文件 CLEAR.PAS 删除。 5.在考生目录下的 C\BAT 子目录中建立一个新的子目录 CONST。 6.将考生目录下的 SAMPLE 目录中的 TEST 子目录删除。 第十三套 1.将考生目录下的 FAST 目录中的 AMS 子目录删除。 2.将考生目录下的 FAST\SORT 子目录中的文件 BAUD.BMP 删除。 3.在考生目录下的 L\M\N 子目录中建立一个新的子目录 BLOCK。 4.将考生目录下的 CHAR\CRT 子目录中的文件 FILE.PAS 设置成具有 只读属性的文件。 5.将考生目录下的 PIPEA\CREATS 子目录中的文件 BACK.LIB 更名为 BOTT.LIB。 6.将考生目录下 RATE\RX 子目录中的文件 MAIN.PRG 复制到考生目录 下的 BINARY 子目录中,文件名为 SUB.PRG。 第十四套 考生目录──┬─BAUD──OK──LEVEL.C ├─BORW──LINES──USER.PAS ├─BITMAP──BIN──ONLINE.C ├─BRUSH──BLOCK ├─BOTTOM──DRAW.DOC └─BLUE──DOCTOR──X3──TIME.C 1.将考生目录下的 BAUD\OK 子目录中的文件 LEVEL.C 设置成具有 隐含属性的文件。 2.将考生目录下的 BORW\LINES 子目录删除。 3.将考生目录下的 BITMAP\BIN 子目录中的文件 ONLINE.C 更名为 DATE.OUT。 4.在考生目录下的 BRUSH\BLOCK 子目录中建立一个新的子目录 BIT。 5.将考生目录下的 BOTTOM 子目录中的文件 DRAW.DOC 拷贝到考生目 录下 BLUE\DOCTOR\X3 子目录中, 文件名为 ADD.DOC。 6.将考生目录下的 BLUE\DOCTOR\X3 目录中的 TIME.C 文件删除。 第十五套 1.在考生目录下的 HERE\ZHO 子目录中建立一个新的子目录 CHENG。 2.将考生目录下的 NETSET\YEAR 子目录中的 OPTER 子目录删除。 3.将考生目录下 MAK\TOO 子目录中的文件 N1.BAT 删除。 4.将考生目录下的 NODE\ZHANG 子目录中的文件 MEMT.BAS 更名为 METER.BAS。 5.将考生目录下的 LI\I 子目录中的文件 MAIN.FOR 设置成具有归 档属性的文件。 6.将考生目录下的 HAI\LI 子目录中的文件 DAN.TXT 和考生目录下 HE\LIU 子目录中的文件 XIE.TXT 顺序合并拷贝到考生目录下 HE 子目录中, 文件名为 ABC.TXT。 第十一章程序修改题目 (1)做题时应该注意的事项 程序行的错误标志为“***found***”。有的题目明确指出错误紧跟在“***found***”下面的一行,而 有的没有明确指出来。应重点注意“***found***”下面的第一条语句(有时候一条语句可以占几行) 。同时 应注意有时候几条语句(类似于文学中的排比句)错误雷同,是作为一个错误来处理的。 程序修改题目只能通过两种方式进行判分: A、 程序修改题目编译运行后可以有结果输出到文件中。依据结果文件进行评判。 (次要) B、 程序运行结果没有输出为文件中,按程序的行进行评判。 (主要) 程序修改题目一般是根据行进行判断的,因此改正错误语句时一定注意不可增减程序行。因为当评 分时机器死板地检查第 X 个“***found***”下面第 N 行(第 X 个错误语句应在的行)是否修改得 和若干标准答案中的一个相同,相同则给分,否则不给分。行数不对,无论程序怎样正确,评分时 一定算作错误来处理。 程序修改题中还应注意考虑原程序作者的思路,所作改动应尽量小。因为出题者给出的答案数是有 限的,考生的答案如果出了出题者所给的范围,正确也被当作错误来处理了。 (2)做题的步骤 A、 理解题目要求 B、 对照题目要求,了解原程序的算法(编程思路) C、 判断错误所在行的位置,并进行修改 D、 调试运行 例题 1 给定程序 MODI1.C 中函数 fun 的功能是:从低位开始取出长整型变量 s 中偶数位上的数, 依次构成一个新数放在 t 中。例如,当 s 中的数为:7654321 时,t 中的数为:642。请改正程序中的 错误,使它能得出正确的结果。注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结 构! #include &conio.h& #include &stdio.h& /************FOUND************/ void fun (long s, long *t) { long sl=10; s /= 10; *t = s % 10; /************FOUND************/ while ( s && 0) { s = s/100; *t = s%10*sl + *t; sl = sl * 10; } } main() { long s, clrscr(); printf(&\nPlease enter s:&); scanf(&%ld&, &s); fun(s, &t); printf(&The result is: %ld\n&, t); } 试题分析: 在本题源程序中有二个错误标识,也就是说在程序中有两个错误存在。 错误 1--位置:第一个错误标识下一行。 参考答案:void fun (long s, long *t) 错误 2-- 位置:第二个错误标识下一行。 参考答案:while ( s & 0) 例题 2 给定程序 MODI1.C 中函数 fun 的功能是:统计子字符串 substr 在字符串 str 中出现的次数。 例如,若字符串为 aaas lkaaas,子字符串为 as,则应输出 2。请改正程序中的错误,使它能计算出正 确的结果。注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构! #include &stdio.h& fun (char *str,char *substr) { int i,j,k,num=0; /************FOUND************/ for(i = 0;str[i]; i++) for(j=i,k=0;substr[k]==str[j];k++,j++) /************FOUND************/ if(substr[k+1]=='\0') { num++; } } main() { char str[80],substr[80]; printf(&Input a string:&) ; gets(str); printf(&Input a substring:&) ; gets(substr); printf(&%d\n&,fun(str,substr)); } 试题分析: 本题源程序中有二个错误标识,也就是说在本题中有二个错误存在。 错误 1 位置:第一个错误标识下一行。 说明:for 循环的格式为 for (表达式 1;表达式 2;表达式 3) { } 可知,在各个表达式之间使用&;&分隔。 参考答案:for(i = 0; str[i]; i++) 错误 2 位置:第二个错误标识下一行。 说明:在 C 语言中,大写和小写字母被认为是两个不同的字符,因此 if 和 IF 是完全不同的字符。根 据题目要求和程序可知在这里应该为 if。 例题 3 给定程序 MODI1.C 中函数 fun 的功能是:将未在字符串 s 中出现、而在字符串 t 中出现的字符,形 成一个新的字符串放在 u 中, 中字符按原字符串中字符顺序排列, u 但去掉重复字符。 例如: s=&ABCDE&, 当 t=&BDFGG&时,u 中的字符为:&FG&。请改正函数 fun 中的错误,使它能得出正确的结果。注意:不要改 动 main 函数,不得增行或删行,也不得更改程序的结构! #include &conio.h& #include &stdio.h& #include &string.h& void fun (char *s, char *t, char *u) { int i, j, sl, tl, k, ul=0; sl = strlen(s); tl = strlen(t); for (i=0; i& i++) { for (j=0; j& j++) if (t[i] == s[j]) if (j&=sl) { for (k=0; k& k++) if (t[i] == u[k]) /************FOUND************/ if (k==ul) u[ul++] = t[i]; } } /************FOUND************/ u[ul] = '\0'; } main() { char s[100], t[100], u[100]; clrscr(); printf(&\nPlease enter string s:&); scanf(&%s&, s); printf(&\nPlease enter string t:&); scanf(&%s&, t); fun(s, t, u); printf(&The result is: %s\n&, u); } 在给定的程序中有二个标识行,因此本题共有二个错误。本题要求考生根据题目要求和程序,找出 错误行所在位置并修改。 错误点 1: 错误点 1 说明: 根据题意和程序的分析可知:在函数 fun()中外 for 循环循环主要用来逐个从字符串 t 中提取单个字 符。 程序段: for (j=0; j& j++) if (t[i] == s[j]) 的作用是判断字符 t[i]是否存在于字符串 s 中, 如果存在跳出该循环。 这样当存在时 j&s1, 否则 j=s1。 if (j&=sl) 下的语句用来判断 t[i]不存在于字符串 s 中时,其是否和字符串 u 中有重复的字符。如 果没有的话,赋值到 u 的下标为 u1++的元素。 for (k=0; k& k++) if (t[i] == u[k]) 这个循环用来判断 t[i]是否在字符串 u 中存在,如果不存在的话 k 的值和 u1 的应该相同。 if (k&ul) u[ul++] = t[i]; 用来判断如果 t[i]不在字符串 u 中的话,将其添加到 u 的末尾。根据前面的分析这里的 if 语句的判断 条件就是错误的。 参考答案:if (k==u1) 错误点 2:在第二个错误标识的下一行。 在 C 语言中规定,字符串末尾标识为‘\0?,在本题中数组字符串 u 存储有效字符的最大数组下标 u1-1,这样就应该在下标为 u1 的元素中加一个'\0'。此语句明显错误。 参考答案:u[u1]='\0'; 或其等效语句。 例题 4 给定程序 MODI1.C 中函数 fun 的功能是:求二分之一的圆面积,函数通过形参得到圆的半径, 函数返回二分之一的圆面积。例如输入圆的半径值:19.527, 输出为:s = 598.950017。请改正 fun 函数 中的错误,使它能得出正确的结果。注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结 构! #include &stdio.h& #include &conio.h& /**********FOUND**********/ fun ( r ) { /**********FOUND**********/ return 1/2*3.14159* r * } main ( ) { clrscr( ); printf ( &Enter x: &); scanf ( &%f&, &x ); printf (& s = %f\n &, fun ( x ) ); } 在程序中有两个错误标识,也就是说在此程序中有两个错误点的存在。 错误点 1: 错误说明: 函数的参数表是由逗号分隔的变量表,变量表由变量类型和变量名组成,与普通的变量说明不同, 函数参数必须同时具有变量类型和变量名;另外,当函数前面的返回数据类型省略时,C 语言默认函 数返回整型,本题中 x 是浮点型的数据,由“printf (& s = %f\n &,fun ( x ) );”可以知道 fun 函数应该返回 浮点型数据,所以 fun 函数的返回数据类型不能省略。 参考答案: “fun ( r )”语句改为“float fun(float r)” 或者其等效语句。 错误点 2: 错误点说明: 因为*运算符和/运算符具有相同的优先级,C 编译器在运算时按照从左到右的原则,在计算 “1/2*3.14159* r * r”时,首先计算 1/2,因为 1 和 2 都没有浮点标记,C 编译器将会把它们都默认为整 型,这样就会得出 0 的结果。 参考答案: return 1/2*3.14159* r *”语句改为“ return 1.0/2*3.14159* r *”或等效语句。 “ 例题 5 给定程序 MODI1.C 中 fun 函数的功能是:判断两个指针所指的存储单元中的值的符号是否相 同,若相同函数返回 1,否则返回 0。这两个存储单元中的值都不为 0。请改正函数 fun 中的错误,使它能 得出正确的结果。注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构! #include &stdio.h& #include &conio.h& /**********FOUND**********/ fun ( double *a, *b ) { /**********FOUND**********/ if ( a * b & 0.0 ) return 1; else return 0; } main( ) { double n , clrscr( ); printf (&Enter n , m : &); scanf (&%lf%lf&, &n, &m ); printf( &\nThe value of function is: %d\n&, fun ( &n, &m ) ); } 在给定的程序中有两个错误标识行,也就是说在本题中共有两个错误存在。两个错误标识行之间有 错误存在,但是并不确定究竟在哪一行。 错误点 1: 错误点说明: 函数的参数表是由逗号分隔的变量表,变量表由变量类型和变量名组成,与普通的变量说明不同, 函数参数必须同时具有变量类型和变量名。 修改说明:程序中“fun ( double *a, *b )”语句第二个函数参数没有变量类型,是错误的,应该改为 “void fun ( double *a, double *b )”或等效语句。 错误点 2: 错误点 2 说明: 在程序中,a 和 b 均为基类型为双精度型的指针变量,根据题目要求需要判断这两个指针变量所指 向的变量*a、*b 的乘积是否大于 0。所以在程序中使用 if ( a * b & 0.0 )语句来进行判断显然是错误的。 修改说明:把程序中的“if ( a * b & 0.0 )”语句改为“if((*a) * (*b) & 0.0 )”或等效语句。 例题 6 文件 MODI1.C 中程序的功能是:将十进制正整数 m 转换成 k 进制数(2≤k≤9)并输出。例如,若 输入 8 和 2,则应输出 1000(即十进制数 8 转换成二进制表示是 1000) 。请改正程序中的错误或在横线处 填上适当的内容(并把横线删除),使它能计算出正确的结果。注意:不得增行或删行,也不得更改程序的 结构! #include &conio.h& #include &stdio.h& void Trans( int m, int k ) {int aa[20], for( i = 0; i++ ) {aa[i] = m%k; m /= } /************FOUND**********/ for( ; i-- ) ______________ } main() { int b, clrscr(); printf( &\nPlease enter a number and a base:\n& ); /************FOUND***

我要回帖

更多关于 把字符串a给字符串b 的文章

 

随机推荐