10.7.复习
文章目录
- 前言
- 一.选择题
- 1.第一题
- 2.第二题
- 3.第三题
- 4.第四题
- 5.第五题
- 二.编程题
- 1.第一题
- 2.第二题
前言
一.选择题
1.第一题
设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是( )
A: n=0;while(ch=getchar()!='\n')n++; B: n=0;while(getchar()!='\n')n++;
C: for(n=0;getchar()!='\n';n++); D: n=0;for(ch=getchar();ch!='\n';n++);
答案解析:
正确答案:D
对于for循环,其中第一项初始化表达式只执行一次,因此ch只从输入流中取一个字符,之后就再不会取字符,因此会死循环
2.第二题
运行以下程序后,如果从键盘上输入 65 14<回车> ,则输出结果为( )
int main()
{
int m, n;
printf("Enter m,n;");
scanf("%d%d", &m,&n);
while (m!=n) //1
{
while(m>n) m=m-n; //2
while(n>m) n=n-m; //3
}
printf("m=%d\n",m);
return 0;
}
A: 3 B: 2 C: 1 D: 0
答案解析:
正确答案:C
此题技巧是耐心,考查while循环和循环嵌套的理解,初值m=65,n=14;循环1判断m!=n为真,来到循环2判断m>n为真,执行m=m-n;直到m=9,n=14;循环2结束来到循环3判断n>m为真,执行n=n-m;直到m=9,n=5;循环3结束回到循环1,如此往复直
到m==n时,循环结束
3.第三题
若运行以下程序时,从键盘输入 ADescriptor<回车> ,则下面程序的运行结果是( )
#include <stdio.h>
int main()
{
char c;
int v0=0,v1=0,v2=0;
do
{
switch(c=getchar())
{
case'a':case'A':
case'e':case'E':
case'i':case'I':
case'o':case'O':
case'u':case'U':v1 += 1;
default:v0+= 1;v2+=1;
}
}while(c!='\n');
printf("v0=%d,v1=%d,v2=%d\n",v0,v1,v2);
return 0;
A: v0=7,v1=4,v2=7 B: v0=8,v1=4,V2=8 C: v0=11,v1=4,v2=11 D: v0=12,v1=4,v2=12
}
答案解析:
正确答案:D
代码switch语句中没有break,则每次找到入口进入后,顺序执行到代码块结束为止。例如当c为’A’时,从case 'A’进入,先后执行v1+=1;v0+=1;v2+=1;,而当c为’p’时,从default进入,先后执行v0+=1;v2+=1;,容易看出最终v0和v2是相等的
4.第四题
以下程序段的功能是( )
# include<stdio.h>
int main()
{
int a[] = { 4, 0, 2, 3, 1 }, i, j, t;
for (i = 1; i < 5; i++)
{
t = a[i];
j = i - 1;
while (j >= 0 && t < a[j])
{
a[j + 1] = a[j];
--j;
}
a[j + 1] = t;
}
return 0;
}
A: 对数组a进行插入排序(升序) B: 对数组a进行插入排序(升序)
C: 对数组a进行选择排序(升序) D: 对数组a进行选择排序(降序)
答案解析:
正确答案:B
这是一个升序插入排序算法,读完即懂,第i次排序时,t=a[i]作为临时变量保存这一次待插入值,j=i-1故而while循环中j是从下标i的前一项开始向下标0遍历,判断t<a[j]为真时a[j+1]=a[j],j+1在遍历之初是等于i的,也就是将下标i位置用前边较大的值覆盖,依次把前边的元素后移,直到a[j]不大于t的时候将t插入到下标j+1位置,使得前i个元素达到有序,方便第i+1次排序操作,所以第i次排序时前边i-1个元素都是有序的
5.第五题
5、执行下面的程序段,语句3的执行次数为( )
for(i = 0; i <= n-1; i++) // (1)
for(j = n; j > i; j--) // (2)
state; // (3)
A: n(n+2)/2 B: (n-1)(n+2)/2 C: n(n+1)/2 D: (n-1)(n+2)
答案解析:
正确答案:C
外循环有n次,当i=0,内循环为n次,当i=1,内循环为n-1次,当i=2时,内循环为n-2次,以此类推,总次数为n+(n-1)+(n-2)+…+2+1,就是个等差数列,等于n(n+1)/2
二.编程题
1.第一题
int* findErrorNums(int* nums, int numsSize, int * returnSize)
{
int* arr = (int*)malloc(sizeof(int) * (numsSize + 1));
int num = ((1 + numsSize) * numsSize) / 2;
int he = 0;
for (int j = 0; j < numsSize; j++)
{
he = he + nums[j];
}
for (int i = 0; i < numsSize + 1; i++)
{
arr[i] = 0;
}
int* ret = (int*)malloc(sizeof(int) * 2);
int i = 0;
for (i = 0; i < numsSize; i++)
{
arr[nums[i]] = 1;
;
}
for (i = 1; i < numsSize + 1; i++)
{
if (arr[i] == 0)
{
ret[0] = i - num + he;
ret[1] = i;
break;
}
}
free(arr);
* returnSize=2;
return ret;
}
2.第二题
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main()
{
int n;
char arr[100];
int a = 0, b = 0, c = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%s", &arr);
if (strlen(arr) < 8)
{
printf("NO\r\n");
continue;
}
if (isdigit(arr[0]) != 0)
{
printf("NO\r\n");
continue;
}
for (int j = 0; j < n; j++)
{
if (islower(arr[j]) != 0)
a++;
if (isupper(arr[j]) != 0)
b++;
if (isdigit(arr[j]) != 0)
c++;
}
if (a == sizeof(arr) || b == sizeof(arr) || c == sizeof(arr))
{
printf("NO\r\n");
continue;
}
printf("YES\r\n");
}
}