案例分析题

阅读以下说明和C代码,填写代码中的空(1)~(6),将解答写入答题纸的对应栏内。

【说明】

下面的C代码在输入的100个英文单词中找出最小单词和最大单词。约定每个单词是仅由英文字母构成的字符串,且都不超过20个字符。单词的大小按照字典序定义。例如,单词“entry”大于“enter"、“art”小于“ article”、“an”等于“An”。

【C代码】

#include 

#define NUMBER 100

int is Valid(const char*s1);  //若字符串s1仅包含英文字母则返回1,否则返回0

char to Lower(char ch);//将大写字母转换为小写字母

int usr_strcpy(har*s1,char*s2);   //比较字符串s1和s2,相等时返回0,

//s1大则返回正整数,s1小则返回负整数

void usr_strcpy(char*s1,const char*s2);//字符串s2拷贝给s1

int main__(4)__

{ char word [32]:

char max Word[32]="", min Word[32] ="";

int num Word=0;

while(num Word

scanf("%s",(1));//输入一个单词存入word

if(is Valid(word)){

if(0==num Word){usr_strcpy(min Word,word):usr_strcpy(max Word,word);}

num Word++;

if(    (2)   >0) //调用usr_strcpy比较单词

usr_strcpy(max Word,word);//用max Word记下最大单词

else

if(  (3)   <0) //调用usr_strcpy比较单词

usr_strcpy(min Word,word);  //用min Word记下最小单词

}

}

printf("max Word=%s min Word=%s\n",max Word,min Word);

return 0;

}

int is Valid(const char*s)

{

for(;*s;s++)

if(!(*s>='a'&&*s<='z')&&!(*s>='A'&&*s<='Z'))

return 0;

return 1;

}

Char to Lower(char ch)

{//若ch为大写字母则返回其小写形式,否则直接返回原字符

if(ch>='A'&&ch<='Z')

ch=(4)+'a';

return ch;

}

Int usr_strcpy(char*s1,char*s2)

{  //按字典序比较两个英文单词,若s1表示的单词大,则返回正整数,

//若s1表示的单词小,则返回负整数;否则返回0

for(;  (5)  ;){

if(to Lower(*s1)==to Lower(*s2)) {s1++,s2++;}

else

break;

}

return(to Lower(*s1)-to Lower(*s2));

}

void usr_strcpy(char*s1,const char*s2)

{   //将s2表示的字符串复制给s1

for(;(6);)

*s1++=*s2++;

*s1='\0';

}

【正确答案】

(1) word
(2) usr_strcmp(word, maxWord)
(3) usr_strcmp(word, minWord)
(4) ch-‘A’
(5) *s1!=’ \0’ &&*s2!=’ \0’ 或*s1||*s2 等价表示
(6) *s2!=’ \0’ 或*s2 等价表示

【答案解析】

(1) scanf 函数是将输入的数据赋值给相应的变量, 在格式字符串后需要取变量地址, 即将数据赋值给相应地址的变量, word 是数组名, 因此可以直接作为地址。
(2)调用 usr_strcmp 比较单词, 当 usr_strcmp 返回的值为正整数时, 调用 usr_strcpy 将 word值赋值给 maxWord, 因此此处是比较 word 和 maxWord, 即 usr_strcmp(word, maxWord)。
(3)调用 usr_strcmp 比较单词, 当 usr_strcmp 返回的值为负整数时, 调用 usr_strcpy 将 word值赋值给 minWord, 因此此处是比较 word 和 minWord, 即 usr_strcmp(word, minWord)。
(4) toLower 函数是将大写字母转换为小写字母, if 函数是判断 ch 是否为大写字母, 当 ch为大写的时候, 将 ch 转换为小写, 小写是在’ a’ 的基础上加上一个值得到, 例如‘b’ =1+’a’, 这个值便是大写字母和‘A’ 之间的差值, 即例子中 1 为’ B’ -‘A’, 因此此处填写 ch-‘A’。
(5) usr_strcmp 是比较两个英文单词, 是需要对 s1 和 s2 中的字符逐一比较, 因此在 for 循环中进行比较, for 循环的判断条件是 s1 和 s2 中的字符是否为’ \0’, 因此此处填写*s1!=’\0’ &&*s2!=’ \0’。
(6) usr_strcpy 是将 s2 复制给 s1, 是需要将 s2 中的字符逐一赋值给 s1, 因此在 for 循环中进行赋值, for 循环的判断条件是 s2 中的字符是否为’ \0’, 因此此处填写*s2!=’ \0’。