从键盘输入10输入两个整数数组保不到数组中,求值我小的儿素,将这个值最小的元素与数组的第一个元素交换,

一串字符的输入
Para ver esse vídeo, ative o JavaScript e considere fazer upgrade para um navegador web que
Loading...Experimente o curso por GratuitoExperimente o curso por Gratuito你有没有好奇过:计算机为什么能够进行计算?计算机程序是怎样运行的?你是否想知道:计算机未来可能的发展趋势有哪些?程序是如何编写出来的?如何学习程序设计语言?程序设计语言的基本成分有哪些?《计算导论》这门课将帮助你解决这些疑惑。
学完这门课,你将能够解释计算机和程序的基本运行原理以及它们的特性,向你的朋友讲述计算机的历史和发展趋势;同时,你也将充分“热身”,迎接“计算机程序设计语言”的学习!Na li??o在能够运用“数组”来解决问题的基础上,再来学习一下“字符串”的特性,在此基础上,我们将讲授C语言的中的“第四种成分”——输入输出成分。
本部分的重点在于:掌握“数组”与“字符串”的区别,理解“输入缓冲区”的基本机理,掌握cin cout的使用技巧。下面我们再来看一下一串字符的处理。我们先来看一下一串字符的 输出。就当我想输出一串字符的时候我应该怎么办。 先来看一个程序。这个程序是这样的。定义了一个字符数组a[10], 然后呢,我用一个字符串给它赋了一个初始值。 那这个字符串是computer,我们数一下就知道了computer里面 其实只有8个字母,只有8个字母。 那么通过刚才的讲解我们都知道这个赋值的结果会得到这样的一个结果,就是computer, 前8个全部都赋好值了,最后的两个呢是两个\0. 是这样的一个结果。那现在呢我就把这样的一个字符数组啊直接给它输出出来, cout直接写到字符数组的名字,这样可以吗?刚才我们说过,这样完全可以。 那么通过这个程序,你得到的结果就会是一个这样的结果,它就会输出一个computer。 那么输入完了之后呢,光标将会在这个地方闪烁, 就会在computer后面闪烁着。其实呀,是这样的,当我们使用这样的方法来 输出一个字符数组的时候,那么程序会从这个字符数组的第1个元素 开始,一直往后输出,直到我碰到第1个\0, 那么就终止。 所以说它会打印出来computer。然后呢,终止在第1个\0上。 所以我们才可以用cout直接去输出 一个字符数组。那有的同学可能接着就要问了, 那如果后面没有\0会怎样呢?我们来看一个程序。 在这个程序里头啊,我就定义了一个字符数组a8,然后呢,给它赋了 8个字符,那么这样的一个赋值的结果,我们会得到一个这样的数组。 那如果我想把这样的一个数组给打印输出的时候, 它会怎样呢?那在我的电脑里,它执行的结果是这样的。 也就说打印完了computer之后,后面接着出现的是一些乱码。 我们可以看到,在这种情况下,它仍然是会把这个数组啊,字符数组当作一个字符串来输出。 只不过呢,因为这个字符数组并不是以\0来结尾的, 所以说呢,它不会输出到这个地方就截止了, 它会一直往后输出,直到发现某一个\0。 于是在这个computer这些字符 之外,那么就会打印出来一堆没有意义的字符。 啊这就是用cout输出,所以说啊,当我们想用cout来输出一个字符数组的时候, 为了确保不会输出乱码,请你确保这个字符数组是以\0来结尾的。 这是用cout来直接输出一个字符数组。 那么既然可以输出一维的字符数组,我也可以用这种方法来输出一个 二维的字符数组。比方说,对于刚才我们所定义的用来存放星期几的英文字母的那个字符数组, 二维字符数组而言,通过这种方式呢,我对二维数组进行了一个赋初值,把初值都赋好了, 然后呢,我直接底下写了这样一段程序,cout, weekday,然后写了一个下标i。 首先这种方式允许吗?这个程序是正确的。我首先告诉你这个程序是正确的。 有的同学会觉得,哎呀,那为什么会在这,这个weekday后面怎么只写了一半呢? 还记得我们在讲二维数组的时候提到过的吗? 定义一个二维数组实际上就相当于定义了多个一维数组。 而且呢,一维数组的名字可以表示成这样子。你比方说,我们定义了一个这样的二维数组的话,就相当于我们 定义了7个一维数组,这7个一维数组的名字分别是weekday0,weekday1,weekday2,weekday3,一直到weekday7. 所以说在这,我可以把某个一维数组的名字写在这。 那么weekdayi就代表着那么这7行里边的某一行。 我可以通过这种方式把它打印输出出来。我们看一下这个程序的运行结果。程序的运行结果是这样的。 它可以把Sunday打印完了之后光标在这,然后接着打印Monday,Tuesday, Wednesday,Thursday,Friday,Saturday,ok,通过这种方式把它打印出来。 这是非常常用的一种输出二维数组的方法。 说到这儿啊,让我们明显有一个感觉就是,看来输出一个字符数组比输出一个 这个整数数组要简单太多了啊。我们只需要把字符数组的名字写在 cout的后面,就可以了。那么这种方法能不能用于普通的int型数组呢? 我们来看一个程序。在这儿啊,我就定义了一个普通int型数组。然后a[8]等于1,2,3,4,5,6. 然后呢,我直接去输出这个a。程序允许你这么去做吗?首先它允许你 这么去做。这个程序在我的电脑上执行的结果是这样的,它会打印出来这样的一串数字。 啊,为什么是这样的一串数组呀?其实啊,我先告诉大家,在这输出的是a。 a呢,对于普通的这种数组而言, 数组的名字其实代表了数组的起始地址。 在这你cout打印出来的,实际上是这个数组的起始 地址的值,所以说并不是数组的值。 那么关于这件事情,以后我们讲到指针的部分的时候我们会更详细的去介绍。 ok,这是关于呢, 一串字符的输出。 那么接下来呢我们再看一下,如何在程序里头啊, 输入一串字符。那么为什么把输入放在最后呢,因为它还稍微的有一点点麻烦。 首先我们想从键盘上输入一串字符,我们当然可以用传统的方法,就是直接 用cin去输入,这是我们的第1种方法。我们来看这个程序。在程序 里头呢,我定义了一个字符数组,名字叫str,它有10个元素。 输出了一行提示,然后呢我在程序里头啊写了这样一串语句,cin,然后呢,直接 把这个字符数组的名字呀放在这。大家都知道,这样一种方式对于普通的 数组而言,是不允许的。你比方说你如果是一个整型的数组是不允许的。 但是对字符数组而言,这样做是允许的。那程序呢, 会从缓冲区里头读一段相应的字符,并且把这个字符呢 赋给字符数组str,我们来看一下这个程序的执行过程,对照执行过程我们来说一下。 运行起这个程序来以后啊,我就从键盘上输入了这样一串字符, abc,空格,df,空格,g,然后敲了一个回车。我们cin会怎么做呢? cin是这样的。既然abc后面有一个空格,那cin就明白了, abc呢是一个独立的字符串,于是呢它就把abc先读取进来。 读取进来放给str,然后呢把str打印出来,并且打印一个换行。 于是我们得到了abc,这是第1个。打印完这个之后呢,接着我继续执行这个while的循环, 继续执行第2次while的循环,那么接着呢,又把def读取进来。 读取进来之后呢赋给str,然后接着再把str再打印出来,于是得到第2行的 def。同理结束之后呢,它再去读取第3个字符串, 也就是一个字符的g,然后再把这一个字符的g赋给str,然后再把它打印出来。 知道我们输入一个结束标志,ctrl z,这个while循环呢, 才被打破。那整个程序呢,才会结束。也就是说,当我们用 cin来输入一串字符的时候啊,程序怎么去界定一串字符的呀?它就会把 空格和回车来当作不同字符串之间的间隔标志, 并且呢通过这种方式把字符串读取进来,并且打印出来。这是一种非常常用的 用来读取字符串的一种方式。除了这种方式之外,还有什么办法啊? 对于一串字符的输入啊,我们照样可以利用一个函数,就是cin.get 这个函数来输入。那么这次呢,这个函数的用法就跟前面不太一样了。 这次呀,为了保证我们输入一串字符,我们需要给这个函数啊,填写3个参数。 比方说,我在这举了一个例子。在这个例子里头呀, ch是一个字符数组的名字。 然后在这输入的一个10,表示我 要从缓冲区里头读取多少个字符。 如果我这写的是10的话,那就标志着我每次要读取10减1,9个字符。 然后后面呢,还有单引号引起来一个\n,\n以前我们讲过,这个\n是一个 转义字符,它的含义就是换行。那么把这样的3个参数写进来,它表示什么意思呢? 要通过这个函数啊,从键盘上读入10减1个字符, 然后把这些字符赋给名字为ch的一个字符数组。 那么如果在读取这9个10减一个字符之前, 遇到了你所给定的后面这个字符,那我们把这个字符称作 终止字符。因为如果我还没读到第9个字符就已经碰到了 你所指定的这个字符,那么这个读取就提前结束。 那如果碰不到这个结束字符那我就读取9个字符回来。 读完了以后呢,把它送给名字为ch的 字符数组。如果我能够成功地完成这个过程, 整个这个函数就会返回一个非0的值,表示真。那如果在读取的过程中碰到了 失败了,比方说遇到输入的结束标志,那么就返回0。啊,返回一个假。 这就是这个函数的基本的含义。我们下面看一个例子,啊,来说明一下。Ok, 我们来看这个例子,那么在这个例子里头呢,我定义了一个字符数组ch, 20个元素。 那么打印一行提示。接下来呢,我使用cin.get这个函数,来读取一串字符。 然后呢,我紧接着把读取到的这个字符啊,给它打印出来。在这个过程里头呢,我要求读取10减1 个字符,9个字符,并且呢,我指定字母o,为终止字符。也就是说,如果碰到o,我就终止。 我们来看一下这个程序的运行结果。程序运行起来之后啊,我输入这样一串字符We, 空格,are,空格, good,空格,friends,点。然后,回车。当我敲入回车把这一串字符送入缓冲区之后, cin.get 这个函数就来读取这一串字符了。那它怎么来读取的呢? 从第一个字符开始,第一个字符,第二个字符,空格是第三个字符, 第四个,第五个,第六个,都没遇到终止字符。继续往后读,第七 个,第八个,第九个,我在读取第九个字符的时候,碰到了终止符, o。那本来如果不指定这个o的时候,我因该把这个o读进来,因为 它是第九字符,啊,因该读进来的。但是现在呢碰到了终止字符,所以说我就 终止,不要再读了。于是到目前为止我所读到的字符就是 We are g,看明白 这个过程了吧。就是说,如果不遇到终止字符,我就读取相应的个数。如果遇到了终止字符,我随时结束。 这是输入一串字符的第二个办法。除了这两个办法之外啊, 还有第三个办法,就是用另外一个函数,叫做cin.getline。 这也是cin 下面的一个函数。它的基本用法,跟 cin.get非常类似,我们来看这个程序。定义一个字符数组,啊, ch,然后包含20个元素,输出一行提示,然后呢, 利用这样的一个函数,来读入一串字符, cin.get。 紧接着把读到的这个字符数组再给它打印出来。啊,我们来看一下 这个程序的运行结果。这个运行结果看上去呢,跟刚才的运行结果完全一样。 我输入的是We are good friends.,回车。 然后程序去读取的时候呢,也是读第一个,第二个,第三个,第四个,第五个, 第六个,第七个,第八个,噢,第九个,读到第九个的时候碰到了终止字符 o,于是输入结束。所以说呢,这个函数读到的字符就是We are g, 最后把它打印出来。这个输入呢,很刚才的cin.get看上去完全一样。 那有的童鞋可能就问了,它们两个之间,有什么区别呢? ok, 它们两个的区别是我们今天要告诉大家的,要特别小心处理的一件事情。 它们两个有什么区别呢?它们的区别是这样的。 首先这两个函数在输入的时候遇到终止字符都会停止, 但是,cin.getline 遇到终止字符停止的时候啊, 缓冲区的指针会移到终止字符之后。 但是如果是用get,cin.get 来读取的话, 那它的情况就是,遇到终止字符它立刻停止。这个指针呢,不再移动。它不会移到 终止字符之后去。 那么对应于刚才的例子,我们来看一下, 如果你使用cin.get来读取,就像我们第一个例子那样, 当它碰到o的时候,那么这个输入, 缓冲区的指针呢,会停在这个字符的前面。终止字符的前面,它会停在这里, 啊,不会再动了。那么程序呢,读到的字符是We are g。 那如果你使用cin.getline来输入, 那么当碰到终止字符o的时候,那么缓冲区里的 指针呢,会一下子移到这个终止字符之后来。 当然,它所读到的字符串仍然是这个We are g,不包含这个o。所以说, 它们两个的区别就在于这个缓冲区指针 停下的位置,是不一样的。这就是它们两个之间的区别。 这个同学说,哎呀,这真是费劲儿。这的确,啊,有点儿费劲儿。 但是我想问你一个问题,你觉得这两个函数对这个缓冲区啊,指针的 处理,哪一个更接近人们普通的思维方式呀?那恐怖怕很多同学跟我一样 都会觉得cin.get 更接近人们普通的思维方式。 因为你想,你给了我一个终止字符嘛,o,那我就停在这个终止字符的前面。 那看上去这种呢,更符合人们普通的这种思维方式。但是我想告诉你的是, cin.getline 确实比cin.get更常用的一种 输入方式。但是同学说,为什么呢?原因非常简单。 为什么呢?因为人们在很多很多很多时候, 都会把终止字符设成换行。 那么在这样的情况下如果使用cin.getline 来读取的时候, 啊,就会方便得多,我们举一个例子。这个程序的作用呢, 是从键盘上,读入n个长度不超过10 个字母的 一个单词。当然,n大小也不超过10。好,这个程序的开始啊,要求你 从键盘上输入一个n。啊,用这个n呢来说明,后面你要读入 多少个字符串。比方说,程序运行起来,在读入n的这个地方你输入 7,那就意味着你接下来想从键盘上输入7行的 字符串。 输入7之后呢,接下来就构造了一个循环,从0开始到i,小于 7。我们用cin.getline 去一行一行地读入数据。 读入的每一行数据呢,存放在a[i] 这个字符数组里头。然后读完了之后呢,我再从0到 小于7,把我读入的这些字符串一行一行地打印出来。哎,从表面上看啊, 这个程序没有什么问题。但是当我们真正去运行这个程序的时候啊,你就会发现, 这个程序,是有问题的。比方说我们可以运行一下这个程序,来看一下它的输出结果。 我们来观察一些这个程序的输出结果。它的输出是这样的。当这个程序 运行起来之后呢,我输入7,然后呢,敲入一个回车。 啊这是我输入的第一行数据。然后呢,程序就把这个7读走了, 去执行这个for循环。从0开始到小于7, 不断地去getline, getline, getline,不断地去读入。于是呢,我就在这儿不断地输入,输入Sunday 回车,Monday,回车,Tuesday, 回车 Wednesday,回车,Thursday,回车,Friday,回车, 在我还没有键入Saturday的时候,这个程序一下子就进入了打印输出 的环节,立刻把刚才我键入的这一些单词一一 的全部都打印了出来。那这是为什么呢? 在这个地方我明明地输入了一个7,为什么我敲入了6行,它就 开始打印了呢?这个问题啊,出现在第一行输入上, cin,n。 当我们在键盘上输入了一个7,并且,键入了一个回车,那么第一行数据, 7,连同这个回车,就被送入了缓冲区里。然后程序呢,就利用cin 来读取这个7。cin在把这个7读取 之后,缓冲区的指针在这个地方, 停了下来。缓冲区的指针,停在了这个地方。 也就是说,停在了7 的后面,回车的前面。 然后呢,当程序开始执行cin.getline的时候, 第一次执行cin.getline,它读到的是哪一行啊? 因为cin.getline是以换行为终止符的,而 7 后面的这个回车符号, 是第一个cin.getline碰到的第一个换号符号。 于是,第一行的cin.getline,它起了个什么作用啊? 它起了的作用,仅仅是跳过了第一行的这个和回车, 7后面的这个回车。 当它跳过这个回车之后,cin.getline剩 下还会执行几次啊?只有执行6次了。 所以说,它的后面读取了6个单词 之后,就进入了接下来的打印程序。 所以,这个程序之所以不能够像我们所预期的那样去执行,原因在哪里呀? 在这里,第一行的这个回车上面。 因为你在程序中,首先使用了cin去读取了数字7。 然后呢,有使用了getline 去读取后面的字符串。就导致了这个问题的产生。 这个问题啊,非常的普遍。因为在我们的open judge上啊,很多类似的这种题目。 有些同学呢,就写一个类似的程序,结果呢,发现程序就会报错了。 那这个程序应该怎么去纠正呢?啊,也非常的简单。 因为,问题出现在第一行的这个回车上面,所以说,我们只需要在 第一行的cin后面,增加一条语句。 还记得吗?我们以前说过cin.get 可以读走换行符号, 所以说呢,我们在cin的后面增加了一行cin.get。 这句话的作用就是要读取多余的那一个换行符。 把这个换行符读走了以后呢,那么剩下的再去 利用cin.getline 读取数据,就不会出现问题了。 那么这个程序运行的结果呢,就是正常的。输入7, 然后呢,输入Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday, 输入完这7行单词之后呢,程序就把它读入了进来。然后呢,进入了打印的这个程序。 啊,紧接着把这7行单词呢,再打印出来。那这个程序呢,就是正确的。 那么这个问题呢,就是我们在使用 输入的时候,需要特别注意的一个问题。 Ok,那么关于如何输入一串数据,我们就讲到这里。 接下来呢,我们通过几个例子,来看一下, 字符串这种数据类型的应用。 Experimente o curso por Gratuito
Registre-se gratuitamente e obtenha recomenda??es, atualiza??es e ofertas personalizadas.Comece agoraO Coursera proporciona acesso universal à melhor educa??o do mundo fazendo parcerias com as melhores universidades e organiza??es para oferecer cursos on-line.(C) 2018 Coursera Inc. Todos os direitos reservados.定义1个一维数组:int arr[10],然后从键盘输入10个整数,编程求出其最大值、最小值以及平均值,并在屏幕上_百度知道
定义1个一维数组:int arr[10],然后从键盘输入10个整数,编程求出其最大值、最小值以及平均值,并在屏幕上
我自己写的程序如下,可是结果不尽人意,求解答。。。
#include&stdio.h&
void main()
int arr[10];
int max=arr[0];
int min=arr[9];
int sum=0;
printf(&请输入10个数字:\n&);
我有更好的答案
#include&stdio.h&void main(){
int arr[10];
int sum=0;
printf(&请输入10个数字:\n&);
for(i=0;i&10;i++)
scanf(&%d&,arr+i); max=arr[0];
min=arr[0];
for(i=0;i&10;i++)
if(max&arr[i])
max=arr[i];
printf(&max is %d\n&,max);
for(i=9;i&=0;i--)
if(min&arr[i])
min=arr[i];
printf(&min is %d\n&,min);
for(i=0;i&10;i++)
sum=sum+arr[i]; ave=(float)sum/10;printf(&ave is %.1f\n&,ave);return
0; }看看是怎么修改的,,,就知道原理了。。。
采纳率:14%
求最大最小值的时候,不需要交换数据。按照你的程序,可以找到最大值最小值,但是最后,最大值和最小值都不知arr[]里了,都被交换到max 和min里了。所以按你的程序,求平均值会有问题。
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。从键盘中输入10个整数存放到数组a中,编程求出数组a中每隔一个元素的两元素之和,并将这些和输出,要_百度知道
从键盘中输入10个整数存放到数组a中,编程求出数组a中每隔一个元素的两元素之和,并将这些和输出,要
从键盘中输入10个整数存放到数组a中,编程求出数组a中每隔一个元素的两元素之和,并将这些和输出,要求每行输出3个数
我有更好的答案
void main(){
int arr[10];
//计数,在输出最后结果的时候,每3个一换行
int num=0;
printf(&请输入10个整数&);
//输入十个整数
for(int i=0;i&arr.i++)
scanf(&%d&,&arr[i]);
printf(&\n&);
//上面的部分是输入十个数,下面的部分是打印输出
printf(&结果是:&);
printf(&\n&);
for(int i=2;i&arr.i++)
//隔一项的和
printf(&%d&,arr[i-2]+arr[i]);
//当每三个的时候换行
if(num%3==0)
printf(&\n&);
引用红S桃的回答:void main(){
int arr[10];
//计数,在输出最后结果的时候,每3个一换行
int num=0;
printf(&请输入10个整数&);
//输入十个整数
for(int i=0;i&arr.i++)
scanf(&%d&,&arr[i]);
printf(&\n&);
//上面的部分是输入十个数,下面的部分是打印输出
printf(&结果是:&);
printf(&\n&);
for(int i=2;i&arr.i++)
//隔一项的和
printf(&%d&,arr[i-2]+arr[i]);
//当每三个的时候换行
if(num%3==0)
printf(&\n&);
这里的.length不适用C++的
1条折叠回答
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下载作业帮安装包
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
从键盘输入一个整数n(n≤10)和n个整数,存入数组a中,先依次输出各个数组元素的值,然后找出最大值,并输
作业帮用户
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
int n,a[10],i,j,t;cout
为您推荐:
其他类似问题
扫描下载二维码当前位置: >>
C语言期末复习必备资料[1]
1、函数fun的功能是计算x^n。 double fun(double x,int n) { double y=1; for(i=1;i&=n;i++) y=y*x; } 主函数中已经正确定义m、a、b变量并赋值,并调用fun函数计算: m=a^4+b^4-(a+b)^3。实现这一计算的函数调用语句为______。 答案: 1:fun(a,4)+fun(b,4)-fun((a+b),3) 评析:函数fun的功能是计算x的n次方,所以a的4次方的调用函数应当 为fun(a,4),b的4次方的调用函数应当为fun(b,4),(a+b)的3次方的调 用函数应当为fun((a+b),3),所以,实现m=a^4+b^4-(a+b)^3这一计算 的函数458调用语句为:fun(a,4)+fun(b,4)-fun((a+b),3);。 知识点:知识点/函数/破函数的正确调用,嵌套调用,递归调用 2、以下sstrcpy()函数实现字符串复制,即将t所指字符串复制到s所指 内存空间中,形成一个新字符串s。请填空。 void sstrcpy(char *s,char *t) { while(*s++=______);} main() { char str1[100],str2[]=&abcdefgh&; sstrcpy(str1,str2); printf(&%s\n&,str1); } 答案: 1:*t++ 评析:要使sstrcpy()函数实现字符串复制,必须将t字符串中的每个字 符逐个拷到s字符串中,所以可以使用*s=*t;s++;t++。或者可以写成 *s++=*t++,本题只有一个空,可以填入*t++。 知识点:知识点/指针/用指针作函数参数 3、以下程序给指针p分配三个double型动态内存单元,请填空。 #include &stdlib.h& main() { double *p; p=(double*)malloc(______); p[0]=1.5; p[1]=2.5;p[2]=3.5; printf(&%f%f%f\n&,p[0],p[1],p[2]); } 答案: 1:3*sizeof(double) 评析: malloc(size)在内存的动态存储区中分配一个长度为size的连 续空间。此函数的值(即&返回值&)是一个指针,它的值是该分配域的 起始地址。如果此函数未能成功地执行,则返回值为0。 本题中要求分配三个double型动态内存单元,所以size处应当为 3*sizeof(double)。 知识点:知识点/指针/各类型的指针及指针变量,通过指针引用各类型 数据 4、以下程序运行后的输出结果是______。 main() { int a,b,c; a=25; b=025; c=0x25; printf(&%d %d %d\n&,a,b,c); } 答案: 25 21 37 评析: 本题考查的是格式字符的输出。 变量a、b、c分别为十进制、八进制、十六进制的25,格式字符d所 代表的含义是,以带符号的十进制形式输出整数(正数不输出符号), 所以本题a=25则输出值为25;b=025转换为10进制:b=2*8+5=16+5=21, 则输出的值为21;c=0x25转换为10进制:c=2*16+5=32+5=37,则输出的 值为37,而且printf中三个%d之用的是空格,所以输出的几个数字之间 也必须是空格。 知识点:知识点/函数/变量的存储类别,变量的作用域和生存期 5、以下程序运行后的输出结果是______。 main () { char a[]=&Language&,b[]=&Programe&; char *p1,*p2; p1=a; p2=b; for(k=0;k&=7;k++) if(*(p1+k)==*(p2+k)) printf(&%c&,*(p1+k)); } 答案: gae 评析: 本题考查的是字符指针变量与字符数组。 解题过程: (1) 当k=0时,*(p1+0)='L',*(p2+0)='P',L!=P,所以没有输出 (2) 当k=1时,*(p1+1)='a',*(p2+1)='r',a!=r,所以没有输出 (3) 当k=2时,*(p1+2)='n',*(p2+2)='o',n!=o,所以没有输出 (4) 当k=3时,*(p1+3)='g',*(p2+3)='g',g==g,所以输出g (5) 当k=4时,*(p1+4)='u',*(p2+4)='r',u!=r,所以没有输出 (6) 当k=5时,*(p1+5)='a',*(p2+5)='a',a==a,所以输出a (7) 当k=6时,*(p1+6)='g',*(p2+6)='m',g!=m,所以没有输出 (8) 当k=7时,*(p1+7)='e',*(p2+7)='e',e==e,所以输出e (9) 当k=8时结束循环 (10) 输出结果为:gae。 知识点:知识点/数组的定义和引用/字符串与字符数组 6、以下程序通过函数SunFun和f(x),x=0到10,这里f(x)=x^2+1,由F 函数实现,请填空。 main() { printf(&The sun=%d\n&,SunFun(10));} SunFun(int n) { int x,s=0; for(x=0;x&=n;x++)s+F(______); } F(int x) { return (______);} 答案: 1:x 2:x*x+1 评析:本题考查的是函数的调用。 解题过程: (1)f(x)的含义为x的平方加上1 (2)所以F(int x)的返回值应该为 x*x+1 (3)SunFun(10)的作用是将0到10之间所有的整数相加求和 (4)所以F()的形式参数为x。 知识点:知识点/函数/函数的正确调用,嵌套调用,递归调用 7、以下程序中,函数SumColumMin的功能是:求出M行N列二维数组每列 元素中的最小值,并计算它们的和值。和值通过形参传回主函数输出。 请填空。 #define M 2 #define N 4 void SumColumMin(int a[M][N],int *sum) { int i,j,k,s=0; for(i=0;i&N;i++) { k=0; for(j=1;j&M;j++) if(a[k][i]&a[j][i])k=j; s+=______ ; } ______ =s; } main() { int x[M][N]={3,2,5,1,4,1,8,3},s; SumColumMin(______); printf(&%d\n&,s); }答案: 1:a[k][i] 2:*sum 3:x,&s 评析:本题考查的是函数参数的传送。 解题过程: (1) 执行以i为变量的for语句 1)k=0 2)执行以j为变量的for语句 ①当j=1 ②比较a[0][0]和a[1][0]的大小,如果a[0][0]大于a[1][0]则 k=1;如果a[0][0]大于a[1][0]则k=0 ③j=2所以结束循环 3)此时a[k][i]就代表第一列中最小的值,要累计所有列中的最小 值的和,应该在第一空内填写 a[k][i],用变量s累加。 (2) SumColumMin是一个无返回值的函数,其中形式参数*sum是一个 指针类型,所以第二空应该填写 *sum,用来将该指针变量指向s (3) 当主函数main调用SumColumMin时,需要两个实际参数,一个代 表被操作的数组,一个为指向累计和的指针变量,所以第三个空应该为 x,&s,分别代表已经被定义的数组x,和整型变量s的地址。 知识点:知识点/函数/函数的正确调用,嵌套调用,递归调用 8、以下程序的输出结果是 。 main() { int a=0; a+=(a=8); printf(&%d\n&,a); } 答案: 16 评析:本题的考查点是表达式。 表达式a+=8相当于a=a+8,对表达式逐步求解过程如下: a+=(a+8)此时,a的值赋值为8,而不再是0; a+=8 a=a+8 a=16 故本题答案为16。 知识点:知识点/函数/形式参数与实在参数,参数值的传递 9、以下程序的输出结果是______。 #define MAX(x,y) (x)&(y)?(x):(y) main() { int a = 5, b = 2,c = 3, d = 3, t = MAX(a + b, c + d)*10; printf(&%d\n&, t); } 答案: 7 评析:本题的考查点是宏定义。 宏替换后, 表达式t = MAX(a + b, c + d)*10即变为: = (a+b)&(c+d) ? t (a+b) : (c + d)*10; 由于(a+b)&(c+d)为真, 所以t = (a+b),即为7。 故本题答案为:7。 知识点:知识点/编译预处理/宏定义:不带参数的宏定义;带参数的宏 定义 10、函数mycmp(char *s,char *t)的功能是比较字符串s和t的大小,当 s等于t时返回0,当s&t返回正值,当s&t时返回负值。请填空。 mycmp( char *s,char *t) { while (*s==*t) { if (*s=='\0')return 0; ++s;++t; } return(______); } 答案: *s-*t 评析: 本题的考查点是比较字符串的大小。 函数的两个形参是两个字符指针变量,字符串的首地址是指针变量 的值,*s和*t表示字符串数组s和t的第一个字符,在while循环中,是 通过s和t值的不断变化改变两个串的第一个字符,要返回s和t的第一个 不同字符的ASCII码的差值,必须使用&*s-*t&得出。 故本题答案为:*s-*t。 知识点:知识点/函数/库函数的正确调用 11、若给fun函数的形参s传送字符串:& 6354abc&,则函数的返 回值是______。(字符串中包括空格) long fun(char s[ ]) { for (; isspace(*s);s++); sign=(*s=='-')?-1:1; if (*s=='+' || *s=='-') s++; for (n=0;isdigit(*s);s++) n=10*n+(*s-'0'); return sign*n; } 答案: 6354 评析:本题的考查点是函数的返回值。 这个函数的目的是提取出由函数的形参传送来的字符串中的数字 字符,并通过相应各个字符位置计算出它们数值形式的幂,最后返回字 符串中的数字字符的数值形式,所以函数的返回值应当是&6354&。 故本题答案为:6354。 知识点:知识点/函数/函数的正确调用,嵌套调用,递归调用 12、以下程序段的输出结果为______。 char *p;int i,d; p=&PDP1-0&; for(i=0;i&7;i++) { d=isdigit(*(p+i) ); if(d!=0) printf(&%c\n&,*(p+i) ); } 答案: 1 评析:本题的考查点是函数isdigit()。 这段程序的目的是按从左至右的顺序从字符串p中找出阿拉伯数字 字符,如果找到,将其打印出来。最后的输出应当是: 1 0 知识点:知识点/函数/库函数的正确调用 13、下列程序中字符串中各单词之间有一个空格,则程序的输出结果是 ______。 # include&string.h& main( ) { char str1[ ]=&How do you do&, *p1=str1; strcpy(str1+strlen(str1)/2,&es she&); printf(&%s\n&,p1); }答案: How does she 评析: 本题的考查点是字符串拷贝函数strcpy()。 strlen(str1)是求str1字符串的长度,为13,然后,进行除2运算, 结果为6。strcpy()函数是把字符串&es she&拷贝到str1后的第6个字符 后面,也就是说,拷贝后的结果是&How does she&。 故本题答案为:How does she。 知识点:知识点/函数/库函数的正确调用 14、下面的函数strcat(str1,str2)实现将字符串str2拼接到字符串 str1后面的功能。请填空使之完整。 char *strcat(str1,str2) char *str1,*str2; { char *t=str1; while(______)str1++; while(______); return(t);} 答案: 1:*str1!='\0' 2:*str1++=*str2++ 评析:本题的考查点是字符串连接函数strcat()。 函数strcat(str1,str2)实现将字符串str2连接到字符串str1后 面,所以首先要找到字符串str1的串尾,根据C语言的语法规定,一个 串的串尾一定是一个隐含字符&\0&,而在程序中,对字符串中字符的访 问是通过两个指针变量来完成的,因此要找到字符串str1的串尾,要判 断*str1是否为&\0&,要找到字符串str2的串尾,要判断*str2是否为 &\0&,程序中必须可以使字符串中字符逐一顺序体现,所以在题中我们 应填写&*str1&和&*str1++=*str2++ &。 知识点:知识点/函数/库函数的正确调用 15、以下程序的输出结果是______。 void fun() { static int a=0; a +=2; printf(&%d&,a); } main() { for(cc=1;cc&4;cc++) fun(); printf(&\n&); }答案: 246 评析: 循环for(cc=1;cc&4;cc++)被执行了3次。在函数fun中,由于a 是static型变量,所以函数第1次调用后,a= 2;第2次调用后,a = 4; 第3次调用后,a = 6。 知识点:知识点/函数/函数的正确调用,嵌套调用,递归调用 16、若要使指针p指向一个double类型的动态存储单元,请填空。 p=______malloc(sizeof (double)); 答案: (double*) 评析: 函数malloc返回的是void*而不是double类型指针。所以要使指 针p指向一个double类型的存储单元就必须进行强制类型转换。 知识点:知识点/函数/函数的类型和返回值 17、下列程序段的输出结果是______。 main() { char b[]=&Hello,you&; b[5]=0; printf(&%s\n&,b); }答案: Hello 评析:字符串中,数值0或符号'\0'表示字符串的结束。本题中,b[5] 被赋了0值,表明字符串b的第六个字符就是结束标志。因此,只输出前 五个字符,即Hello。 知识点:知识点/数组的定义和引用/一维数组和多维数组的定义、初始 化和引用 18、下列程序的输出结果是______。 void fun(int *n) { while((*n)--); printf(&%d&,++(*n)); } main() { int a=100; fun(&a); }答案: 0 评析: 在函数fun()中,while((*n)--)是先引用*n的值,再做(*n)-运算,所以循环结束时*n的值为0,再做(*n)-- 运算后,*n的值为-1; 执行++(*n)后,*n的值是0。 知识点:知识点/函数/函数的正确调用,嵌套调用,递归调用 19、以下程序中,主函数调用了LineMax函数,实现在N行M列的二维数 组中,找出每一行上的最大值。请填空: #define N 3 #define 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])______; printf(&The max value in line %d is %d\n&,i,______); } } main() { int x[N][M]={1,.5,7,4,2,6,4,3,8,2, 3,1}; ______; } 答案: 1:p=j 2:a[i][p] 3:LineMax(x) 评析: LineMax函数中运用了两个循环,外循环来控制数组的行,内 循环控制列,在寻找每行最大的元素时,先把每行的第一个元素列下标 即0赋给p,然后把后面的数逐一与之比较,如果大于它,则把大的数的 列下标重新赋给p。 所以(1)处应该填p=j; 内循环结束后,便获得了本行中最大的数,即a[i][p],这也就是 (2)处应该填写的答案; 而(3)处,很显然是要调用函数,关键就在于参数怎么写,函数中 需要的是整个数组,所以应该把数组名做为实参,传递过去,(3)处的 答案应该是LineMax(x)。注意大小写,C语言中大小写是不等价的。 知识点:知识点/函数/函数的正确调用,嵌套调用,递归调用 20、若有如下结构体说明: struct STRU { int a,b;char c: struct STRU *p1,*p2; }; 请填空,以完成对t数组的定义,t数组的每个元素为该结构体类型。 ______t[20] 答案: struct STRU 评析: 本题主要考查考生对C语言中结构体的掌握。 结构体类型是构造数据类型,是用户自已定义的一种类型。 结构体类型的定义: struct 结构体类型名 { 成员项表; }; 定义结构体变量的的形式为: struct 结构体类型名 变量1,变量2,... 其中变量包括:一般变量、指针变量、数组变量等。 知识点:知识点/数组的定义和引用/一维数组和多维数组的定义、初始 化和引用 21、以下程序运行后的输出结果是______。 void fun(int x,int y) {x=x+y;y=x-y;x=x-y; printf(&%d,%d,&,x,y);} main() {int x=2,y=3; fun(x,y); printf(&%d,%d\n&,x,y); } 答案: 3,2,2,3 评析: 本题的考查点是交换变量的值。 被调函数fun()实现的功能是交换变量x和y的值并打印,由于该函 数无返回值,所以在主函数中打印出的x和y的值仍然为2,3。 故本题答案为:3,2,2,3。 知识点:知识点/函数/形式参数与实在参数,参数值的传递 22、下面程序的运行结果是:______。 #define N 10 #define s(x) x*x #define f(x) (x*x) main() {int i1,i2; i1=1000/s(N);i2=1000/f(N); printf(&%d %d\n&,i1,i2); } 答案: 1000 10 评析: 本题的考查点是宏定义。 根据宏定义,变量i1的值为=1000,变量i2的值为 )=10。 故本题答案为:1000和10。 知识点:知识点/编译预处理/宏定义:不带参数的宏定义;带参数的宏 定义 23、下面程序的运行结果是:______。 void swap(int *a,int *b) {int *t; t=a;a=b;b=t; } main() {int x=3,y=5,*p=&x,*q=&y; swap(p,q); printf(&%d%d\n&,*p,*q); }答案: 35 评析: 本题的考查点是函数调用。 观察本题的程序可以看出,被调函数swap()实现的功能是交换变量 的值,但由于函数不返回任何值,所以在main()函数中打印出的变量的 值并没有发生交换,即仍为3和5。 故本题答案为:3和5。 知识点:知识点/函数/函数的类型和返回值 24、fun函数的功能是:首先对a所指的N行N列的矩阵,找出各行中的最 大的数,再求这N个最大值中的最小的那个数作为函数值返回。请填空。 #include &stdio.h& #define N 100 int fun(int(*a)[N]) {int row,col,max, for(row=0;row&N;row++) {for(max=a[row][0],col=1;col&N;col++) if(______) max=a[row][col]; if(row==0) min= else if(______) min= } }答案: 1:max&a[row][col] 2:max&min 评析: 本题的考查点是求矩阵最大值的算法。 本题中的第一空要求判断出每一行中的最大数,应该填写条件 max&a[row][col],第二空要求从N个最大值中找出最小的数,应填入条 件max&min。 故本题答案为:max&a[row][col]和max&min。 知识点:知识点/函数/函数的正确调用,嵌套调用,递归调用 25、以下程序的输出结果是______。 #define MCRA(m) 2*m #define MCRB(n,m) 2*MCRA(n)+m main() { int i=2,j=3; printf(&%d\n&,MCRB(j,MCRA(i))); } 答案: 16 评析: 本题的考查点是带参数的宏定义。 带参数的宏定义是这样展开置换的:在程序中如果有带实参的宏, 则按#define 命令行中指定的字符串从左到右进行置换。如果串中包含 形参,则将程序语句中相应的实参(可以是常量、变量或表达式)代替 形参,如果宏定义中的字符串中的字符不是参数字符,则保留。因此对 MCRB(j,MCRA(i))进行宏展开就得到了2*MCRA(j)+MCRA(i),即: 2*2*j+2*i=2*2*3+2*2=16。 故本题答案为:16。 知识点:知识点/编译预处理/宏定义:不带参数的宏定义;带参数的宏 定义 26、以下程序的功能是调用函数fun计算:m=1-2+3-4+…+9-10,并输出 结果。请填空。 int fun ( int n) { int m=0,f=1,i; for(i=1; i&=n; i++) { m+=i*f; f=______; } } main() { printf(&m=%d\n&,______);} 1:-f 2:fun(10) 评析: 本题的考查点是C程序设计。根据程序写出运行结果。 考察的知识点主要是函数的调用。本题利用一个fun函数来完成题 目要求的计算。程序中f起的作用是控制i*f的符号,看的出,偶数位都 为负值,所以f的值为(-1)^(i+1),最后要求输出m的值,在输出中调用 fun函数,并把实参10传给n。 知识点:知识点/函数/函数的正确调用,嵌套调用,递归调用 27、以下程序运行后的输出结果是______。 main() { int i,n[]={0,0,0,0,0}; for(i=1;i&=4;i++) { n[i]=n[i-1]*2+1; printf(&%d &,n[i]); } }答案: 1 3 7 15 评析: 本题的考查点是C程序设计。根据程序写出运行结果。 该程序考察的是数组的知识点,n是一个有5个元素,且元素值全为 0的数组。程序运行过程时先进行for循环,i=1时,n[1]=n[0]*2+1,此 时n[1]=1; 执行i++; i=2时, 再进行循环, n[2]=n[1]*2+1, 此时n[2]=3, 再执行i++,此时i=3,继续循环,n[3]=n[2]*2+1,此时n[3]=7,然后 i=4时,n[4]=n[3]*2+1,此时n[4]=15。循环结束。注意输出函数中%d 后有空格。 知识点:知识点/数组的定义和引用/一维数组和多维数组的定义、初始 化和引用 28、 请在以下程序第一行的下划线处填写适当内容, 使程序能正常运行。 ______( double,double); main() { double x,y; scanf(&%1f%1f&,&x,&y); printf(%1f\n&,max(x,y)); } double max(double a,double b) { return(a&b ? a:b);} 答案: double max 评析: 本题的考查点是C程序设计。调试程序,把不完善的程序进 行修改和补充,使之能得到正确的结果。 主函数里可以看到调用了一个max函数,函数在被调用之前需要先 定义,所以要求填空的内容应该是对函数进行定义的语句。由题目内容 也可以看出此函数是double型的。答案: 知识点:知识点/函数/函数的正确调用,嵌套调用,递归调用 29、有以下程序 void f(int y,int *x) { y=y+*x; *x=*x+y;} main() { int x=2,y=4; f(y,&x); printf(&%d %d\n&,x,y); } 执行后输出的结果______。答案: 8 4 评析: f函数中变量x传递的是变量的地址,可以实现值的变换,而 变量y是传递的值,执行完f后,y的值是变了,但main函数中的y并未变 化。也就是说由于&单向传送&的&值传递&方式,形参值的改变无法传给 实参。 知识点:知识点/函数/形式参数与实在参数,参数值的传递 31、C语言程序的基本单位是______ 答案:函数 32、设有说明语句:char a= '\72';则变量a包含______个字符、答案: 1 33、c语言是一种______(选择面向对象或面向过程)高级程序设计语 言。 答案:面向过程 34、C语言中唯一的三目运算符是______ 答案:条件运算符#? : 35、C语言中结束一次循环的语句是______ 答案:continue 36、C语言中结束整个循环的语句是______ 答案:break 37、二维数组a中元素a[2][2]的值是______ a[4][5]= {{1,2,3},{3,2,1,6},{1}}; 答案:0 38、写出下面个逻辑表达式的值,设a=3,b=4,则c=5 a || b+c && b-c=______ 答案:1 39、写出下面个逻辑表达式的值,设a=3,b=4,则! (a+b)+c C1 && b+ c/2 =______ 答案:1 40、在C语言中打开文件的函数名称是______ 答案:fopen#fopen() 41、在C语言中关闭文件的函数名称是______ 答案:fclose#fclose() 42、C语言中基本的数据类型有______ 答案:int float char # 整型 实型 字符型 43、设y是int型变量,请写出判断y为奇数的关系表达______ 答案: y%2!=0 # y%2==1 # y%2 44、以下程序运行后的输出结果是______ main() { int i=10,j=0; do { j=j+i; i-; while(i&2); printf(&%d\n&,j); } 答案:52 45、设有以下程序: main() { int n1,n2; scanf(&%d&,&n2); while(n2!=0) { n1=n2%10; n2=n2/10; printf(&%d&,n1); } } 程序运行后,如果从键盘上输入1298;则输出结果为______答案:8921 46、以下程序输出的最后一个值是______ int ff(int n) { static int f=1; f=f*n; } main() { for(i=1;i&=5;i++) printf(&%d\n&,ff(i)); } 答案:120 47、设有以下程序: main() { int a, b, k=4, m=6, *p1=&k, *p2=&m; a=pl==&m; b=(*p1)/(*p2)+7; printf(&a=%d\n&,a); printf(&b=%d\n&,b); } 执行该程序后,a的值为______b的值为______ 答案:0 @ 7 48、 函数fun的功能是:累加数组元素中的值。n为数组中元素的个数。 累加的和值放入x所指的存储单元中。 fun(int b[], int n ,int *y) {for(k=0;______;k++) r=r+b[k]; *y=______; } 答案:k&n @ r 51、以下程序运行后的输出结果是______ main() { m='B'+32; printf(&%c&,m); } 答案:b 52、以下程序运行后的输出结果是______ main() { int a=1,b=3,c=5; if (c=a+b) printf(&yes\n&); else printf(&no\n&); } 答案:yes 53、以下程序运行后的输出结果是______ main() { int i,m=0,n=0,k=0; for(i=9; i&=11;i++) switch(i/10) { case 0: m++;n++; case 10: n++; default: k++;n++; } printf(&%d %d %d\n&,m,n,k); } 答案:1 3 2 54、执行以下程序后,输出'*'号的个数是______ #include &stdio.h& main() { int i,j; for(i=1; i&5; i++) for(j=2; j&=i; j++) putchar('*'); } 答案:6 55、以下程序的功能是调用函数fun计算:m=1-2+3-4+…+9-10,并输出结 果,请填空. int fun( int n) { int m=0,f=1,i; for(i=1; i&=n; i++) { m+=i*f; f=______; } } main() { printf(&m=%d\n&,______ ); } 答案:-f@ fun(10) 56、假定p所指对象的值为25,p+1所指对象的值为46,则执行&(*p)++; &语句后, p所指对象的值为______ 答案:26 56、空字符串的长度是______’\t’所占的长度为______ 答案:0@1 57、若从键盘输入58,则以下程序输出的结果是______ ??main() ??{ ??scanf(&%d&,&a); ??if(a&50) printf(&%d&,a); ??if(a&40) printf(&%d&,a); ??if(a&30) printf(&%d&,a); ??} 答案:、以下程序的输出结果是______ ??main() ?? { char *p=&abcdefgh&,*r; ?? long *q; ?? q=(long*)p; ?? q++; ?? r=(char*)q; ?? printf(&%s/n&,r); ??} 答案:efgh 59、以下定义的结构体类型拟包含两个成员,其中成员变量info用来存 入整形数据;成员变量link是指向自身结构体的指针.请将定义补充完 整。 ??struct node ?? { ??______ ??} 答案:struct node * 60、有以下程序 main( ) { int n=0,m=1,x=2; if(!n) x-=1; if(m) x-=2; if(x) x-=3; printf(&%d\n&,x); } 执行后输出结果是______ 答案:-4 61、#include &stdio.h& main() { char ch1,ch2; int n1,n2; ch1=getchar(); ch2=getchar(); n1=ch1-'0'; n2=n1*10+(ch2-'0'); printf(&%d\n&,n2); } 程序运行时输入:12,执行后输出结果是______ 答案:12 62、有以下程序 void f( int y,int *x) {y=y+*x; *x=*x+y;} main( ) { int x=2,y=4; f(y,&x); printf(&%d %d\n&,x,y); } 执行后输出的结果是______ 答案:8 4 63、以下程序段打开文件后,先利用fseek函数将文件位置指针定位在 文件末尾,然后调用ftell函数返回当前文件位置指针的具体位置,从 而确定文件长度,请天空。 FILE *long f1; fp=fopen(“test”,”rb”); ______ F1=ftell(fp); fclose(fp); 答案:fseek(fp,0,SEEK_END)#fseek(fp,0,-2) 64、以下程序功能是将数组里面的元素写入文件d2.dat中(使用fprintf 函数),请填空。 #include&stdio.h& main() {FILE * a[3]={1,2,3}; fp=fopen(&d2.dat&,&w&); ______ fclose(fp); } 答案:fprintf(fp,&%d%d%d\n&,a[0],a[1],a[2]); 65、以下程序功能是从文件d2.dat中读入读出数据放到数组a中(使用 fscanf函数),请填空。 #include&stdio.h& main() {FILE * a[2]; fp=fopen(&d2.dat&,&r&); ______ fclose(fp); } 答案:fscanf(fp,&%d%d&,&a[0],&a[1]); 66、以下程序的输出结果是______ main( ) {char s[ ]= &abcdef &; s[3]= '\0'; printf(&%s\n&,s); } 答案:abc 67、下列程序段的输出结果是______ main( ) { char b[]=&Hello,you&; b[5]=0; printf(&%s&, b ); } 答案:Hello 68、以下程序的输出结果是______ main() { int a[]={30,25,20,15,10,5},*p=a; p++; printf(&%d&,*(p+3)); } 答案:10 69、以下程序运行后的输出结果是______ main( ) { char s[]=&9876&,*p; p=s; p++; ++p; puts(p); } 答案:76 70、mystrlen函数的功能是计算str所指字符串的长度,并作为函数值返 回,请填空: int mystrlen(char *str) { for(i=0; str[i] != '\0';i++) ; return ______; } 答案:i-1 71、以下程序用来统计文件中字符个数、请填空: #include&stdio、h& main( ) {FILE * long num=0L; if((fp=fopen(&fname、dat&,&r&)==NULL) {printf(&Open error\n&); exit(0);} while(______) {fgetc(fp); num++;} printf(&num=%ld\n&,num-1); fclose(fp); } 答案:!feof(fp) 72、下面程序把从终端读入的文本(用@作为文本结束标志)输出到一个 名为bi.dat的新文件中,请填空. #include &stdio.h& FILE * { if( (fp=fopen (______) )= = NULL) exit(0); while( (ch=getchar( )) !='@') fputc (ch,fp); fclose(fp); } 答案:”bi.dat”,”r” 73、用以下语句调用库函数malloc,使字符指针st指向具有11个字节的 动态存储空间,请填空。 st=(char*) ______; 答案:malloc(11) 74、若要使指针p指向一个double类型的动态存储单元,请填空. p=______malloc(sizeof(double)); 答案:(double*) 75、以下程序通过函数指针p调用函数fun,请在填空栏内,写出定义变量 p的语句、 void fun(int *x,int *y) { ……} main( ) { int a=10,b=20; ______; /定义变量p */ p= p(&a,&b); …… } 答案:void (*p)(int,int); 76、以下程序的输出结果是______ main( ) { int arr[ ]={30,25,20,15,10,5}, *p= p++; printf(&%d\n&,*p++); } 答案:30 77、若有以下定义,则不移动指针p,且通过指针p引用值为98的数组元素 的表达式是______ int w[10]={23,54,10,33,47,98,72,80,61}, *p=w; 答案:*(p+5)#p[5] 78、以下定义的结构体类型拟包含两个成员,其中成员变量info用来存 入整型数据;成员变量link是指向自身结构体的指针,请将定义补充完 整、 struct node { ______ } 答案:struct node * 79、设有如下宏定义 #define MYSWAP(z,x,y) {z=x;x=y;y=z} 以下程序段通过宏调用实现变量a,b内容交换,请填空: float a=5,b=16,c; MYSWAP(______,a,b); 答案:c 80、以下程序段用于构成一个简单的单向链表,请填空. struct STRU { int x, ______p; } a, a.x=0; a.y=0; a.rate=0; a.p=&b; b.x=0; b.y=0; b.rate=0; b.p=NULL; 答案:struct STRU * 81、设有以下结构类型说明和变量定义,则变量a在内存所占字节数是 ______ Struct stud { char num[6]; int s[4]; } a,*p; 答案:14 82、下列程序段的输出结果是______ int n='c'; switch(n++) { default: printf(&error&); case 'a': case 'A': case 'b': case 'B': printf(&good&); case 'c': case 'C': printf(&pass&); case 'd': case 'D': printf(&warn&); } 答案:passwarn 83、以下程序的输出结果是______ main( ) {int s,i; for(s=0,i=1;i&3;i++,s+=i) ; printf(&%d\n&,s); } 答案:5 84、设有以下程序: main( ) { int n1,n2; scanf(&%d&,&n2); while(n2!=0) { n1=n2%10; n2=n2/10; printf(&%d&,n1);} } 程序运行后,如果从键盘上输入1234;则输出结果为______ 答 案:4321 85、要使以下程序段输出10个整数,请填入一个整数、 for(i=0;i&=______;printf(&%d\n&,i+=2)); 答案:18 86、若输入字符串:abcde,则以下while循环体将执行______次 While((ch=getchar( ))== 'e') printf(&*&); 答案:4 87、以下程序的输出结果是______ main( ) {int a=177; printf(&%o\n&,a); } 答案:261 88、以下程序的输出结果是______ main( ) {int a=0; a+=(a=8); printf(&%d\n&,a); } 答案:16 89、以下程序的输出结果是______ main( ) {int a=5,b=4,c=3,d; d=(a&b&c); printf(&%d\n&,d); } 答案:0 90、以下程序的输出结果是______ main( ) {int x=0; sub(&x,8,1); printf(&%d\n&,x); } sub(int *a,int n,int k) {if(k&=n) sub(a,n/2,2*k); *a+=k; } 答案:7 91、以下程序输出的最后一个值是______ int ff(int n) { static int f=1; f=f*n; } main( ) { for(i=1;i&=5;i++ ) printf(&%d\n&,ff(i)); } 答案:120 92、已知某程序中有预处理命令#include &stdio.h&,为使语 句”zx=fopen(“c:\\n.txt”,r”)能正常执行,在该语句之前必须有定义 ______ 答案:FILE *zx 93、以下程序的输出结果为______ main() { int a=10; a=(3*5,a=4); printf(“%d”,a); } 答案:14 94、变量a所占的字节数是______ union {char aa[10],long bb, int cc }答案:10 95、以下函数的功能是删除字符串s中的所有空格。请填空。? viod?dele(char?*s)? {?int?n=0,i;? for(i=0;s[i];i++)?? if(a[i]!=’ ’)? s[n++]=s[i];? s[n]= ______;? }? 答案:’\0’ 96、有以下程序 main() {char ch[]=“uvwxyz”,*pc; pc= printf(“%c\n”,*(pc+5)); } 程序运行后的输出结果是______ 答案:z 97、设有如下说明? typedef?struct? {?int?n;?char?c;?double?x;}STD; 则要定义一个变量stu是以上说明的变量则正确定义方式是______ 答案:STD stu 98、c语言运算符中优先级最低的是______运算符 答案:,#逗号 99、设有定义:FILE *请将以下文件的语句补充完整,以便可以向 文本文件readme.txt的最后续写内容。 fw=fopen(); 答案:”readme.txt”,”a” 100、以下程序输出结果是______ #include &stdio.h& #define M 5 #define N M+M main() { k=N*N*5; k=N*N*5; printf(&%d&,k); }_ 答案:55 所有单选题 1、C语言中下列叙述正确的是______。 A:不能使用do-while语句构成的循环 B:do-while语句构成的循环,必须用break语句才能退出 C:do-while语句构成的循环,当while语句中的表达式值为非零时结 束循环 D:do-while语句构成的循环,当while语句中的表达式值为零时结束 循环 答案:D 评析: 本题的考查点是do-while语句。 选项A是错误的,C语言支持do-while语句;选项B是错误的, do-while构成的循环, 当while语句中的表达式值为零时结束循环,而 不是非零;选项C也是错误的。故本题答案为D。 知识点:知识点/循环结构程序设计/WHILE和DO WHILE循环结构 2、以下选项中属于C语言的数据类型是______。 A:复数型B:逻辑型C:双精度型D:集合型 答案:C 评析: 本题的考查点是C语言的数据类型。 C语言的数据类型分为基本类型,构造类型,指针类型,空类型四 大类。其中,基本类型分为整型,字符型,实型三类。实型又称浮点型, 包括单精度型和双精度型两种类型。 故本题答案为C。 知识点:知识点/数据类型及其运算/C的数据类型及其定义方法 3、下列描述中不正确的是______。 A:字符型数组中可以存放字符串 B:可以对字符型数组进行整体输入、输出 C:可以对整型数组进行整体输入、输出 D:不能在赋值语句中通过赋值运算符&=&对字符型数组进行整体赋值 答案:C 评析: 本题的考查点是对数组的理解。 C语言规定只能逐个引用数组元素而不能一次引用整个数组。字符 数组的输入、输出可以将整个字符串一次输入或输出。所以,选项C的 说法是不正确的。 故本题答案为C。 知识点:知识点/基本语句/数据的输入与输出,输入输出函数的调用 4、以下程序的输出结果是______。 main() { int x=10,y=10,i; for(i=0;x&8 ;y=++i) printf(&%d %d &,x--,y); } A:10 1 9 2 B:9 8 7 6 C:10 9 9 0 D:10 10 9 1 答案:D 评析: 本题的考查点是for循环语句。 for语句的一般格式为:for(表达式1;表达式2;表达式3)语句执 行中只要表达式2为真,则执行for语句中指定的内嵌语句。所以,本题 在条件为真的情况下,先执行printf函数。x--是先使用后运算。 知识点:知识点/循环结构程序设计/FOR循环结构 5、以下程序的输出结果是______。 main() { char a[10]={'1','2','3','4','5','6','7','8','9',0},*p; i=8; p=a+i; printf(&%s\n&,p-3); } A:6 B:6789 C:'6' D:789 答案:B 评析: 本题的考查点是通过指针引用数组元素。 指针p指向数组中第8个元素,即a[8]='9'。输出时,输出字符串, 且指针把a[8]作为初始位置往前指3个元素,也就是共有4个字符输出。 最后指向a[5]为'6',所以输出为6789。 知识点:知识点/指针/指针数组,指向指针的指针,MAIN函数的命 令行参数 6、能正确表示a和b同时为正或同时为负的逻辑表达式是______。 A:(a&=0||b&=0)&&(a&0|| b&0) B:(a&=0&&b&=0)&&(a&0&&b&0) C:(a+b&0)&&(a+b&=0) D:a*b&0 答案:D 评析: 本题的考查点是对逻辑表达式的判断。 逻辑表达式是指用逻辑运算符将关系表达式或逻辑量连接起来。 选项A中,表达式表示的是a,b为异号; 选项B中,表达式 表示的是0,因为没有满足条件的值; 选项C中,表达式表示的是0,因为没有满足条件的值; 选项D表示的是a和b为同号。 知识点:知识点/基本语句/表达式语句,空语句,复合语句 7、以下程序的输出结果是______。 main() { int n=4; while(n--)printf(&%d &,--n); } A:2 0 B:3 1 C:3 2 1 D:2 1 0 答案:A 评析: 本题的考查点是while语句的判断。 n--是先使用后运算,--n是先运算后使用。n=4时,执行n--后,n 变为3,执行--n后,n变为2,所以,第一次输出时,n为2;同上过程, 第二次输出时,n为0。 知识点:知识点/循环结构程序设计/WHILE和DO WHILE循环结构 8、以下程序的输出结果是______。 main() { int k=17; printf(&%d,%o,%x\n&,k,k,k); } A:17,021,0x11 B:17,17,17 C:17,0x11,021 D:17,21,11 答案:D 评析: 本题的考查点是不同格式的数据输出。 printf函数对不同类型的数据用不同的格式字符,&%d&是以带符号 的十进制形式输出整数(正数不输出符号);&%o&以8进制无符号形式 输出整数(不包括前导符0);&%x&以16进制无符号形式输出整数(不 包括前导符0x)。 知识点:知识点/数据类型及其运算/C的数据类型及其定义方法 9、若有说明:long *p,a;则不能通过scanf语句正确给输入项读入数 据的程序段是______。 A:*p=&a;scanf(&%ld&,p); B:p=(long *)malloc(8);scanf(&%ld,p); C:scanf(&%ld&,p=&a); D:scanf(&%ld&,&a); 答案:A 评析 本题的考查点是格式输入函数Scanf()的使用。 scanf函数输入形式为:scanf(格式控制,地址表列); 选项B中, p=(long*)malloc(8)是分配8个字节的long型存储单元,所以能通过 scanf语句正确给输入项读入数据; 选项C中,p=&a,求出变量a的内存地址并赋给p; 选项D中,能正确给输入项读入数据; 知识点:知识点/基本语句/数据的输入与输出,输入输出函数的调用 10、以下选项中,能定义s为合法的结构体变量的是______。 A:typedef struct abc { char b[10]; } B:struct { char b[10]; }s; C:struct ABC { char b[10]; } ABC D:typedef ABC { char b[10]; } ABC 答案:B 评析: 本题的考查点是结构体变量的定义。 定义一个结构体类型的变量,可采用三种方法: (1)先定义结构体类型再定义变量名; (2)在定义类型的同时定义变量; (3)直接定义结构类型变量,即不出现结构体名; 选项B符合第三种定义方法。 知识点:知识点/结构体(即&结构&)与共用体(即&联合&)/结构 体和共用体类型数据的定义方法和引用方法 11、请读程序: #include &stdio.h& main() { int a, for(a = 1 , b = 1 ; a &= 100 ; a++) { if(b &= 20) if (b%3 == 1) { b += 3 ; } b -= 5 ; } printf(&%d\n&, a) ; } 上面程序的输出结果是______。 A:7 B:8 C:9 D:10 答案:B 评析: 本题的考查点是break语句和continue语句。 &%&是求余运算符,执行第一次循环时,条件(b%3 == 1)为真,b=4, 继续下一次循环,如此反复,当b=22时,条件(b &= 20)为假,跳出循 环,此时共循环8次,即a=8。 知识点:知识点/选择结构程序设计/用SWITCH语句实现多分支选择结构 12、请选出合法的C语言赋值语句______。 A:a=b=58 B:i++; C:a=58,b=58 D:k=int(a+b); 答案:B 评析: 本题的考查点是赋值语句。 选项A和C没有用分号表示语句结束,不合法; 选项D,函数名和C语言的关键字重名,不合法。 故本题答案为B。 知识点:知识点/基本语句/表达式语句,空语句,复合语句 13、请选出可用作C语言用户标识符的一组标识符______。 ① void ② a3_b3 ③ For ④ 2a define _123 _abc DO WORD IF case sizeof A:① B:② C:③ D:④ 答案:B 评析: 本题的考查点是C语言的标识符。 C语言规定标识符只能由字母、数字和下划线三种符号组成,而且 第一个字符必须是字母或下划线。 ①中的void和define都和C语言的关键字重名,不合法; ③中的case和C语言的关键字重名,不合法; ④中的2a是数字打头而且sizeof和C语言的关键字重名,不合法。 知识点:知识点/数据类型及其运算/C的数据类型及其定义方法 14、若x和y都是int型变量,x=100、y=200,且有下面的程序片段 printf(&%d&,(x,y) ); 上面程序片段的输出结果是______。 A:200 B:100 C:100 200 D:输入格式符不够,输出不确定的值 答案:A 评析: 本题的考查点是逗号表达式。 在(x,y)中的&,&是一个特殊的运算符,叫做逗号运算符,它的一 般形式为:表达式1,表达式2,求解过程为:先求解表达式1,再求解表 达式2,整个表达式的值是表达式2的值,(x,y)的值为200,所以输出 结果为200。 知识点:知识点/基本语句/数据的输入与输出,输入输出函数的调用 15、若x是int型变量,且有下面的程序片段 for(x=3;x&6;x++) printf((x%2)?(&**%d&):(&##%d\n&),x); 上面程序片段的输出结果是______。 ① **3 ② ##3 ③ ##3 ④ **3##4 ##4 **4 **4##5 **5 **5 ##5 A:① B:② C:③ D:④ 答案:D 评析: 本题的考查点是条件运算符。 这种条件表达式的一般形式为:表达式1?表达式2:表达式3,条件 运算符的执行顺序为:先求解表达式1,若非0则求解表达式2,此时表 达式2的值就是整个条件表达式的值,若表达式1的值为0,则求解表达 式3,此时表达式3的值就是整个条件表达式的值。 故本题答案为D。 知识点:知识点/数据类型及其运算/C运算符的种类、运算优先级和结 合性 16、若x是整型变量,pb是基类型为整型的指针变量,则正确的赋值表 达式是______。 A:pb=&x; B:pb=x; C:*pb=&x; D:*pb=*x 答案:A 评析: 本题的考查点是赋值表达式。 选项A是将变量x的地址赋给指针变量pb,使pb指向x,故为正确的 赋值表达式。 选项B是将x的值当作地址赋给指针pb,pb指向一个地址等于x值的 内存单元; 选项C是将x的地址赋给指针pb指向的那个地址等于x值的内存单 元; 选项D是不正确的语句; 本题答案为A。 知识点:知识点/基本语句/表达式语句,空语句,复合语句 17、若要用下面的程序片段使指针变量p指向一个存储整型变量的动态 存储单元 int *p; p= ______ malloc(sizeof(int) ); 则应填入______。 A:int B:int * C:(*int) D:(int*) 答案:D 评析: 本题的考查点是强制类型转换。 不论p是指向什么类型的指针变量,都可以通过强制类型转换的方 法使之类型一致,强制类型转换的格式为(数据类型 *)。 故本题答案为D。 知识点:知识点/数据类型及其运算/不同类型数据间的转换与运算 18、若有以下说明和语句,请选出哪个是对c数组元素的正确引用 ______。 int c[4][5],(*cp)[5]; cp=c; A:cp+1 B:*(cp+3) C:*(cp+1)+3 D:*(*cp+2) 答案:D 评析: 本题的考查点是数组元素的引用。 cp=c这个语句是将数组c的首地址赋给了指针数组cp的第一个数组 元素。 选项A,cp+1是指将数组c的首地址加1,不是对数组元素的引用; 选项B,*(cp+3)是地址等于数组c的首地址加3的那个内存单元的内容, 不是对数组元素的引用; 选项C,*(cp+1)+3是地址等于数组c的首地址加1的那个内存单元中 存放的值加3,不是对数组元素的引用。 知识点:知识点/指针/指针数组,指向指针的指针,MAIN函数的命 令行参数 19、若执行下面的程序时从键盘上输入3和4, main() { int a,b,s; scanf(&%d %d&,&a,&b); s=a; if(a&b)s=b; s=s*s; printf(&%d\n&,s); } 则输出是______。 A:14 B:16 C:18 D:20 答案:B 评析: 本题的考查点是给变量赋值。 用户输入的3和4分别赋给了a和b,在if语句进行判断时,因为表达 式的值为真,所以b的值将赋给s,s*s=16,最后的打印结果为16。 知识点:知识点/基本语句/表达式语句,空语句,复合语句 20、设a、b和c都是int型变量,且a=3、b=4、c=5,则下面的表达式中, 值为0的表达式是______。 A:'a'&&'b' B:a&=b C:a||+c&&b-c D:!((a&b)&&!c||1) 答案:D 评析: 本题的考查点是几种运算符的使用。 该题需要弄清楚以下几点: 1、几种运算符的使用方法; 2、C语言中运算符的结合方向(结合性); 3、C语言中运算符的优先级。 根据以上规则进行表达式拆分,运算后即可得出正确答案。 知识点:知识点/数据类型及其运算/C运算符的种类、运算优先级 和结合性 21、设a=5、b=6、c=7、d=8、m=2、n=2,执行 (m=a&b)&&(n=c&d) 后n的值为______。 A:1 B:2 C:3 D:4 答案:B 评析: 本题的考查点是逻辑与运算。 在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必 须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。本 题中,(m=a&b)的值为0,求出整个表达式的值为0,不需执行(n=c&d), 所以n仍为2。 知识点:知识点/数据类型及其运算/C运算符的种类、运算优先级 和结合性 22、设ch是char型变量,其值为A,且有下面的表达式 ch=(ch&='A'&&ch&='Z')?(ch+32):ch 上面表达式的值是______。 A:A B:a C:Z D:z 答案:B 评析: 本题的考查点是条件运算符。 条件表达式的一般形式为:表达式1?表达式2:表达式3,条件运算 符的执行顺序:先求解表达式1,若非0则求解表达式2,此时表达式2的 值就作为整个表达式的值,若表达式1的值为0,则求解表达式3,此时 表达式3的值就作为整个表达式的值。本题中,表达式1的值为1,所以 整个表达式的值为表达式(ch+32)的值,即为a。 知识点:知识点/数据类型及其运算/C运算符的种类、运算优先级和 结合性 23、设int a=12,则执行完语句a+=a-=a*a后,a的值是______。 A:552 B:264 C:144 D:-264 答案:D 评析: 本题的考查点是赋值表达式的求解。 第一步:a*a=144 ;(此时a=12) 第二步:a-=144相当于a=a-144,a=a-144=-132; (此时a=-132) 第三步:a+=a相当于a=a+a,a=a+a=-264; 所以该表达式最后的值应当为-264。 故本题答案为D。 知识点:知识点/数据类型及其运算/C表达式类型和求值规则 24、设有如下枚举类型定义 enum language {Basic=3,Assembly=6,Ada=100,COBOL,Fortran}; 枚举量Fortran的值为______。 A:4 B:7 C:102 D:103 答案:C 评析: 本题考查的是数据类型。 这个枚举中共有5个元素,前三个已有明确的赋值,而COBOL和 Fortran没有明确的赋值,枚举的语法规定当枚举元素没有赋值时,其 值为其前一个元素的值加一,所以COBOL的值为101,故Fortran的值应 为102。 知识点:知识点/数据类型及其运算/C的数据类型及其定义方法 25、设有以下语句,其中不是对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) ) 答案:D 评析: 本题的考查点是通过指针引用数组元素。 观察程序可知,a实际上就是数组a的首地址,所以&*(a+i)&表示的 就是数组a中的第i个元素的值,进而,我们可以知道 *(*(a+i) ) 必然 不是对a数组元素的正确引用。 知识点:知识点/指针/指针数组,指向指针的指针,MAIN函数的命 令行参数 26、设有以下语句 char a=3,b=6,c; c=a^b&&2; 则c的二进制值是______。 A: B: C: D: 答案:A 评析: 本题的考查点是位运算。 &&&&是C语言中规定的左移运算符,例如,a=a&&2,这个语句即是 将a的二进制数左移两位,左移一位相当于该数乘以2,左移两位相当于 该数乘以2的2次方; ^是异或运算符, 所以, c的二进制值应为。 知识点:知识点/位运算/简单的位运算 27、设有语句int a=3; 则执行了语句a+=a-=a*a;后,变量a的值是 ______。 A:3 B:0 C:9 D:-12 答案:D 评析: 本题的考查点是赋值表达式的求解。 第一步:a*a=9 ;(此时a=3) 第二步:a-=9相当于a=a-9,a=a-9=-6; (此时a=-6) 第三步:a+=a相当于a=a+a,a=a+a=-12; 所以该表达式最后的值应当为-12。 知识点:知识点/数据类型及其运算/C表达式类型和求值规则 28、下面程序 main() { int x=100, a=10, b=20, ok1=5, ok2=0; if(a&b) if(b!=15) if(!ok1) x=1; else if(ok2) x=10; x=-1; printf(&%d\n&,x); } 的输出是______。 A:-1 B:0 C:1 D:不确定的值 答案:A 评析: 本题的考查点是判断语句的循环嵌套。 第一个判断值为真,过渡到下一个判断,第二个判断为真,过渡到 第三个判断......如此循环,在打印输出语句的前一行,程序给变量x 赋了值,为-1,所以,无论前期如何变化,最后的x值依然为-1。 知识点:知识点/循环结构程序设计/循环的嵌套 29、下面程序 main() { int x=32; printf(&%d\n&,x=x&&1); } 的输出是______。 A:100 B:160 C:120 D:64 答案:D 评析: 本题的考查点是位运算。 &&是C语言中规定的左移运算符,例如,a=a&&2,这个语句即是将a 的二进制数左移两位,左移一位相当于该数乘于2,左移两位相当于该 数乘以2的2次方。所以,x&&1=32*2=64。 知识点:知识点/位运算/简单的位运算 30、下面程序 main() { int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a; printf(&%d\n&,*(p+2) ); } 的输出是______。 A:3 B:4 C:1 D:2 答案:A 评析: 本题的考查点是通过指针引用数组元素。 *p=a语句是使指针p指向数组a的第一个数组元素,因此*(p+2)即 是数组a的第3个元素的值,即a[2]。 知识点:知识点/指针/指针数组,指向指针的指针,MAIN函数的命令 行参数 31、下面程序 main() { int x=10,y=3; printf(&%d\n&,y=x/y); } 的输出是______。 A:0 B:1 C:3 D:不确定的值 答案:C 评析: 本题的考查点是除法运算。 x/y的结果约为3.33333,但是由于打印要求为整型,所以自动转换 为整型(相当于截取整数位),打印结果为3。 知识点:知识点/数据类型及其运算/C的数据类型及其定义方法 32、下面程序 void prtv(int *x) { printf(&%d\n&,++*x); } main() { int a=25; prtv(&a); } 的输出是______。 A:23 B:24 C:25 D:26 答案:D 评析: 本题的考查点是指针变量作为函数参数。 观察程序,可以发现,函数prtv()的作用是将地址等于x的内存单 元中值加1,因为我们在主函数中是将变量a的地址作为实参传递给了 prtv()函数,所以,函数prtv()将地址等于变量a的地址的那个内存单 元中值加一,打印结果自然就是25+1=26了。 知识点:知识点/指针/指针数组,指向指针的指针,MAIN函数的命 令行参数 33、下面的程序 main() { int x=3; do{ printf(&%d\n&,x-=2); }while(!(--x) ); } ______。 A:输出的是1 B:输出的是1和-2 C:输出的是3和0 D:是死循环 答案:B 评析: 本题的考查点是do-while 语句。 在第一次循环时,先计算表达式x-=2,所以输出1,--x为0,判断 表达式的值为非零,返回重新执行该语句; 在第二次循环时,表达式x-=2,即-2,所以输出-2,--x为-3,判 断表达式的值为零,循环结束。 知识点:知识点/循环结构程序设计/WHILE和DO WHILE循环结构 34、下面的程序中______错误(每行程序前面的数字是行号)。 1 #include&stdio.h& 2 main() 3 { 4 float a[3]={0.0}; 5 6 for(i=0;i&3;i++) scanf(&%d&,a[i]); 7 for(i=1;i&3;i++)a[0]=a[0]+a[i]; 8 printf(&%f\n&,a[0]); 9 } A:没 B:第4行 C:第6行 D:第8行 答案:C 评析: 本题的考查点是函数scanf()的格式输入。 根据函数scanf()的语法可知,在函数中的参数表列部分,应当是 欲赋值变量的内存地址,象第六行这样,将数组元素直接放在参数表列 中是无法达到给数组元素赋值的目的。 知识点:知识点/基本语句/数据的输入与输出,输入输出函数的调 用 35、下面函数 int fun1(char*x) { char *y=x; while(*y++); return(y-x-1); } 的功能是______。 A:求字符串的长度 B:比较两个字符串的大小 C:将字符串x复制到字符串y D:将字符串x连接到字符串y后面 答案:A 评析: 本题的考查点是while()循环语句。 这个函数的功能是求字符串的长度,需要注意的是,在返回长度时 一定记住要减一,否则计算出的串长度将会多一。 知识点:知识点/循环结构程序设计/WHILE和DO WHILE循环结构 36、以下程序的输出结果是______。 #include&stdio.h& main() { int i=10,j=10; printf(&%d,%d\n&,++i,j--); } A:11,10 B:9,10 C:010,9 D:10,9 答案:A 评析: 本题的考查点是变量的自增、自减运算。 ++i是先对i进行加1运算,再使用i的值;j--是先使用j值,再对j 进行减1运算。所以,程序的打印结果应当为&11,10&。 知识点:知识点/数据类型及其运算/C运算符的种类、运算优先级和结 合性 37、以下的for循环: for(x=0,y=0;(y!=123)&&(x&4);x++); A:是无限循环 B:循环次数不定 C:执行4次 D:执行3次 答案:C 评析: 本题的考查点是for语句循环条件的判断。 循环条件是表达式(y!=123)&&(x&4),因为y值始终为0,所以表达 式左边一定恒为1,当x&4时,循环可以运行,当x=4时,循环终止,所 以这个循环一共可以执行4次。 知识点:知识点/循环结构程序设计/FOR循环结构 38、有以下程序: #include &stdio.h& union pw { char ch[2]; }a; main() { a.ch[0]=13; a.ch[1]=0; printf(&%d\n&,a.i); } 程序的输出结果是(注意:ch[0]在低字节,ch[1]在高字节)______。 A:13 B:14 C:208 D:209 答案:A 评析: 本题的考查点是共用体类型数据的特点。 根据共用体的定义可知:共用体a的成员i和成员ch[2]是共用着同 一段内存空间,所以,当程序给a.ch[0]赋值后,实际上,共用体成员i 的值也确定了,为13,所以打印输出的结果应当为13。 知识点:知识点/结构体(即&结构&)与共用体(即&联合&)/结构体和 共用体类型数据的定义方法和引用方法 39、有以下程序 main() { while((c=getchar() )!='\n') { switch(c-'2') { case 0: case 1: putchar(c+4); case 2:putchar(c+4); case 3:putchar(c+3); default:putchar(c+2); } } } 从第一列开始输入以下数据,L代表一个回车符。 2473L 程序的输出结果是______。 A:668977 B:668966 C: D:6688766 答案:A 评析: 本题的考查点是switch()语句。 getchar()函数是从键盘接受一个字符输入;当用户键入的字符不 是回车符时,会进入一个多分支选择语句,根据表达式c-'2'的值进行 分支选择;putchar()是在屏幕上打印一个字符,最后的结果应当为 668977。 知识点:知识点/选择结构程序设计/用SWITCH语句实现多分支选择结 构 40、执行下面程序片段的结果是______。 int x=23; do { printf(&%2d&,x--); } while(!x); A:打印出321 B:打印出23 C:不打印任何内容 D:陷入死循环 答案:B 评析: 本题的考查点是do-while循环语句的判断。 x--是自减运算,先使用x的值,后进行自减运算,所以打印出来的 结果应当为23。 知识点:知识点/循环结构程序设计/WHILE和DO WHILE循环结构 41、执行下面的程序段 int x=35; char z='A'; int B; B=((x&15)&&(z&'a') ); 后,B的值为______。 A:0 B:1 C:2 D:3 答案:B 评析: 本题的考查点是逻辑与及位与运算。 从整个表达式来看是个逻辑表达式,而与运算符&&&&的右边的子表 达式中由于z的值为&A&,而A的ASCII码的值小于a的ASCII码值,所以这 个子表达式的值为真,即1;在与运算符&&&&的左边的子表达式是个基 于位运算的子表达式,将x的值与15做位与运算,表达式值不为零,所 以两个子表达式的与值应当为1。 知识点:知识点/位运算/位运算符的含义及使用 42、表达式:10!=9的值是______。 A:true B:非零值 C:0 D:1答案:D 评析: 本题的考查点是关系运算符!=。 在这种运算中,表达式的值只有两种:1或0,表达式10!=9的值应 当是1。 知识点:知识点/数据类型及其运算/C表达式类型和求值规则 43、若有说明:int i,j=7,*p=&i;则与i=j;等价的语句是______。 A:i=*p; B:*p=*&j; C:i=&j; D:i=**p; 答案:B 评析: 本题的考查点是指针变量的引用。 p的地址本身和i的地址一样,所以*p代表i中的数值,而&j是j的地 址,*&j就是j中的数值,所以,*p=*&j和i=j是等价的。 知识点:知识点/指针/指针与指针变量的概念,指针与地址运算符 44、以下程序的输出结果是______。 main() { char *s=&&; int v[4]={0,0,0,0},k,i; for (k=0;s[k];k++) { switch(s[k]) { case '1':i=0; case '2':i=1; case '3':i=2; case '4':i=3; } v[i]++; } for(k=0; k&4;k++) printf(&%d &,v[k]); } A:4 2 1 1 B:0 0 0 8 C:4 6 7 8 D:8 8 8 8 答案:B 评析: 本题的考查点是switch语句的应用。 在每次执行switch后面括号内的表达式s[k]时,要先取当前s[k]的 值与case后的字符常量进行比较,找到与之匹配的分支后,即转去执行 该分支中的语句。switch语句中,某分支执行完毕,若未遇到break语 句,则接着执行剩余的其它分支,直到遇到break语句。此题中,因为 没有break语句,所以总会执行到i=3,即总是v[3]在递加。 知识点:知识点/选择结构程序设计/用SWITCH语句实现多分支选择 结构 45、有如下程序 main() { int n = 9; while(n&6) { n--; printf(&%d&,n); } } 该程序的输出结果是______。 A:987 B:876 C:8765 D:9876答案:B 评析: 本题考查点是While语句循环次数的问题。 符合n&6的n只有7,8,9;所以循环次数为3。选项C、D可以排除。又 因n在输出之前要执行n--,所以输出结果只能是876。 知识点:知识点/循环结构程序设计/WHILE和DO WHILE循环结构 46、设有说明语句: char a = '\72'; 则变量a ______。 A:包含1个字符 B:包含2个字符 C:包含3个字符 D:说明不合法 答案:A 评析: 本题考查点是转义字符的应用。 转义字符常量'\xx'可以把'\'后面的数字转换为对应的ASCII字 符,'\72'表示的是ASCII码等于72的那个字符,即为&H&,所以在字符变 量中存储的只是&H&这一个字符。 知识点:知识点/数据类型及其运算/不同类型数据间的转换与运算 47、若变量已正确定义并赋值,下面符合C语言的表达式是______。 A:a:=b+1 B:a=b=c+2 C:int 18.5%3 D:a=a+7=c+b 答案:B 评析: 选项A和C显然错误;对于表达式a=a+7=c+b(答案D),是先 执行赋值表达式a+7=c+b,再把这个表达式的值赋给a,显然,表达式 a+7=c+b非法,因为赋值表达式的左值不能为常量或表达式。 知识点:知识点/基本语句/表达式语句,空语句,复合语句 48、若已定义x和y为double类型,则表达式x=1,y=x+3/2的值是______。 A:1 B:2 C:2.0 D:2.5 答案:C 评析: 这是一个逗号表达式,它的值应为表达式y=x+3/2的值,而 前一个表达式已给x赋值1, 在没有进行类型转换的情况下, 3/2的值为1, 所以x+3/2的值应为2.0。 知识点:知识点/基本语句/表达式语句,空语句,复合语句 49、若变量a、i已正确定义,且i已正确赋值,合法的语句是______。 A:a==1 B:++i; C:a=a++=5 D:a=int(i); 答案:B 评析: 选项D显然是错的, 而选项A没有分号结束, 不是C语句; a++=5 违反了赋值表达式左值必须为一个变量 (不能是常量或表达式) 的规定. 知识点:知识点/基本语句/表达式语句,空语句,复合语句 50、有如下程序 main() { int y=3,x=3,z=1; printf(&%d %d\n&,(++x,y++),z+2); } 运行该程序的输出结果是______。 A:3 4 B:4 2 C:4 3 D:3 3 答案:D 评析: 逗号表达式(++x,y++)的值应该是y++的值,由于y++是先引 用后自增,所以y++的值是3。 知识点:知识点/基本语句/数据的输入与输出,输入输出函数的调用 51、有如下程序 main() { int x=1,a=0,b=0; switch(x){ case 0: b++; case 1: a++; case 2: a++;b++; } printf(&a=%d,b=%d\n&,a,b); } 该程序的输出结果是______。 A:a=2,b=1 B:a=1,b=1 C:a=1,b=0 D:a=2,b=2 答案:A 评析: 在这个switch语句中,因为x的值为1,所以执行case 1:后 面的a++,这样a = 1。但又由于其下没有break语句,所以其后面的语 句(a++;b++)也将被执行,这样一来,a = 2,b = 1。 知识点:知识点/选择结构程序设计/用SWITCH语句实现多分支选择结 构 52、有如下程序 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.000000 答案:C 评析: 本题考查的是IF…ELSE语句的使用。x=2.0,符合第二个IF 语句的条件x&10.0,所以执行y=1.0/x语句,即y=1.0/2.0=0.500000。 知识点:知识点/选择结构程序设计/用IF语句实现选择结构 53、有如下程序 main() { int a = 2,b =- 1,c = 2; if(a&b) if(b&0) c=0; else c++; printf(&%d\n&,c); } 该程序的输出结果是______。 A:0 B:1 C:2 D:3 答案:C 评析: 由于条件(a & b)并不满足,所以if(a & b)后面的语句并没 有被执行,c仍然等于2。 知识点:知识点/选择结构程序设计/用IF语句实现选择结构 54、有如下程序 main() { int i, for(i=1;i&=3;sum++) sum +=i; printf(&%d\n&,sum); } 该程序的执行结果是______。 A:6 B:3 C:死循环 D:0 答案:C 评析: 在循环过程中,i的值一直没有被改变,所以这是一个死循 环。 知识点:知识点/循环结构程序设计/FOR循环结构 55、有如下程序 main() { int n=9; while(n&6) {n--;printf(&%d&,n);} } 该程序段的输出结果是______。 A:987 B:876 C:8765 D:9876 答案:B 评析: 符合n&6的n只有7,8,9;所以循环次数为3。C,D可以排除。 又:n在输出之前要执行n--,所以输出结果只能是876。 知识点:知识点/循环结构程序设计/WHILE和DO WHILE循环结构 56、设有说明语句:char a='\72';则变量a______。 A:包含1个字符 B:包含2个字符 C:包含3个字符 D:说明不合法 答案:A 评析: 转义字符常量'\xx'可以把'\'后面的数字转换为对应的 ASCII字符,'\72'就是'H'。 知识点:知识点/基本语句/表达式语句,空语句,复合语句 57、有如下程序段 int *p,a=10,b=1; p=&a; a=*p+b; 执行该程序段后,a的值为______。 A:12 B:11 C:10 D:编译出错 答案:B 评析: 执行p = &a;后,p指向整数a,*p即p的目标变量,也就是a; 所以a = *p + b等价于a = a+b,可知a的值最终为11。 知识点:知识点/指针/指针与指针变量的概念,指针与地址运算符 58、对于基类型相同的两个指针变量之间,不能进行的运算是______。 A:& B:= C:+ D:答案:C 评析: 指针之间不能进行加运算。 知识点:知识点/指针/指针与指针变量的概念,指针与地址运算符 59、有如下程序 #define N 2 #define M N+1 #define NUM 2*M+1 main() { for(i=1;i&=NUM;i++)printf(&%d\n&,i); } 该程序中的for循环执行的次数是______。 A:5 B:6 C:7 D:8 答案:B 评析: 在C语言中,宏定义在编译时将被直接替换,所以NUM最后会 被替换成2*N+1+1,即2*2+1+1,值为6。因此,for循环执行的次数为6。 知识点:知识点/循环结构程序设计/FOR循环结构 60、有如下程序段 int a=14,b=15,x; char c='A'; x=(a && b) && (c&'B'); 执行该程序段后,x的值为______。 A:true B:false C:0 D:1 答案:D 评析: a&&b的值为true, c&'B'的值也为true, 所以 (a&&b) && (c&'B') 的值为true。但x是int型变量,所以 (a&&b) && (c&'B')的值最后要从 bool型转换为int型赋给x。这样x的值应为1。 知识点:知识点/数据类型及其运算/不同类型数据间的转换与运算 61、有如下说明 int a[10] = {1,2,3,4,5,6,7,8,9,10},*p = 则数值为9的表达式是______。 A:*p+9 B:*(p+8) C:*p+=9 D:p+8 答案:B 评析: p是指针, p+8是地址值, D是错的; *p是p的目标变量, 即a[0], 值为1,所以*p+9的值是10,而*p += 9值是重新给a[0]赋了值(1+9); 所以A和C也是错的。 p+8是地址值, 指向a[8],

我要回帖

更多关于 java从键盘输入数组 的文章

 

随机推荐