您的位置:首页 > 编程语言 > C语言/C++

C语言基础测试题

2015-04-12 16:29 375 查看

C语言基础测试题

———- android培训java培训、期待与您交流! ———-

C语言基础测试题
题目1

题目2

题目3

题目4

题目5

题目6

题目7

题目8

题目9

题目10

本套题目只有10题算是让我想了好一阵子,第5题一般,剩下的都比较简单。好我们来看题:

题目1

1、 设有定义int a[]={1,3,5,7,9},*p=a;结果为7的表达式是(A)。

A) *(p+3)

B) *(p+4)

C) *p+3

D) *p+4

解析:

第一道题选A,p是指针p+3表示从int型的数组a的首地址偏移了3个int位,

也就是从下标0值1处偏移到下标3值7处

题目2

2、 以下对C程序的描述中正确的是(C)。

A) C程序总是从第一个定义的函数开始执行。

B) C程序总是从最后一个定义的函数开始执行。

C) C程序总是从main()函数开始执行。

D) C程序中的main()函数必须放在程序的开始部分。

解析: C程序总是从main()函数开始执行的。

题目3

3、 以下程序运行后的打印结果是 _20,0_(需要写上分析思路)

#include <stdio.h>
int main()
{
int x=10, y=20, t=0;
if (x==y) t=x; x=y; y=t;
printf("%d,%d\n",x,y);
return 0;
}


解析:

1、执行到if(x == y)时发现并不满足条件所以t=x;这条语句没有执行

2、接着执行x=y将y的值20赋值给了x

3、接着执行y=t将t的值0赋值给了y

所以此时打印该x y的值即为20,0

题目4

4、 语句“while(!x)…”等价于(C)。

A) while(x==1)

B) while(x!=1)

C) while(x==0)

D) while(x!=0)

解析: !x 等价于 x == 0

题目5

5、 从键盘输入一大堆字符串,统计A、B、C、D的出现次数,最后出现次数由高到低输出字母和出现次数。(C语言)

#include <stdio.h>
#include <string.h>

void my_sort(int * p, int len);

typedef struct mycount{
char c;
int count;
}my_count_t;

int main(int argc, const char * argv[]) {

// 声明变量并初始化
my_count_t mydata[4];
memset(mydata, 0, sizeof(mydata));
char tmp = 0;

// 接收字符串并统计
printf("请输入字符串,每输入一个enter表示之前的是一个字符串,当键入惊叹号“!”并键入enter表示你已经完成输入\n");
do{
scanf("%c", &tmp);
switch(tmp)
{
case 'A':
mydata[0].count++;
break;
case 'B':
mydata[1].count++;
break;
case 'C':
mydata[2].count++;
break;
case 'D':
mydata[3].count++;
break;
case '\n':
tmp = ' ';
}

}while(tmp != '!');

for(int i=0; i<4; i++)
{
mydata[i].c = 'A'+i;
}

// 冒泡排序
for(int i=0; i<4-1; i++)
{
for(int j=0; j<4-1-i; j++)
{
if(mydata[j].count < mydata[j+1].count)
{
my_count_t tmp;
memset(&tmp, 0,sizeof(tmp));
memcpy(&tmp, &mydata[j], sizeof(my_count_t));
memcpy(&mydata[j], &mydata[j+1], sizeof(my_count_t));
memcpy(&mydata[j+1], &tmp, sizeof(my_count_t));
}
}
}
printf("---------------显示输出-----------------\n");
// 结果输出
for(int i=0; i<4; i++)
{
printf("%c 出现的次数为 %d\n", mydata[i].c, mydata[i].count);
}

return 0;
}


解析: 首先,从题目要求看 从键盘输入一大堆字符串统计A、B、C、D的出现次数,最后出现次数由高到低输出字母和出现次数。

我们先来分析知识点我们需要统计字符串中的ABCD出现的次数,也就是说需要用字符串来接收用户的输入,然后在对字符A 、B、C、D和对应的计数器做出映射关系,并根据计数的值从大到小排序并输出结果即可

好有了初步构想之后我们就可以动手编写代码了

首先是接收字符串数据并统计

但是仔细深思后发现其实本题目只关心最后字符ABCD的相关统计并没有对字符串多要求什么,也就是说我们完全可以用单个字符通过while循环的方式来取代字符串这样我们创建的程序会少占用一些内存,也能在控制台让输入者以为自己在输入字符串,

其次是找出字符和ABCD之间的映射关系,有两种方式一种是2位数组,一种是自己定义结构体类型,因为结构体类型更能明确数据类型的意义所以本题我采取了定义结构体的方式。

最后就是排序了因为只有4个需要比较的数据所以我就用了代码量比较小的冒泡排序。

好架构有了细节大家可以参看上面我给出的代码了

题目6

6、 输入两个数,打印(printf)这两个数的和、差、积、商、以及余数。(C语言编程题)

#include <stdio.h>

int main(int argc, const char * argv[]) {
int num1 = 0, num2=0;

printf("请您输入两个数,以空格作为分隔,并以enter键作为结束\n");
printf("例如:num1 num2\n");

//从键盘接收两个数
scanf("%d %d", &num1, &num2);

printf("这两个数的和是 %d\n", num1+num2);
printf("这两个数的差是 %d\n", num1-num2);
printf("这两个数的积是 %d\n", num1*num2);
printf("这两个数的商是 %d\n", num1/num2);
printf("这两个数的余数是 %d\n", num1%num2);

return 0;
}


题目7

7、 计算1~100中所有7的倍数的个数(C语言编程题)

#include <stdio.h>

int main(int argc, const char * argv[]) {
int i = 0;
int count = 0;

for(i=1; i<100; i++)
{
if(i%7 == 0)
{
count++;
}
}
printf("1~100中所有7的倍数的个数是:%d个\n", count);

return 0;
}


题目8

8、 编写一个int string_len(char *s),返回字符串s的字符长度(不包括\0) (C语言编程题)

#include <stdio.h>

int string_len(char *s);

int main(int argc, const char * argv[]) {
//声明变量并初始化
char *string_tmp = "Better late than never!";
int length = 0;

length = string_len(string_tmp);
printf("该字符串的长度是:%d\n", length);
return 0;
}

int string_len(char *s)
{
int len = 0;
while(*s++ != '\0')
{
len++;
}

return len;
}


题目9

9、 有八个人坐在一起,问第8个人多少岁?他说比第7个人大3岁。问第7个人多少岁?他说比第6个人大3岁。问第6个人多少岁?他说比第5个人大3岁。问第5个人多少岁?他说比第4个人大3岁,以此类推,最后问第1个人多少岁?他说是10岁。请问第8个人多大?(C语言)

#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {

//变量声明
int people1_age = 0;
int age[8];
memset(&age, 0, sizeof(age));

//定义第一个人是10岁
people1_age = 10;
//将第一个人的岁数赋值给数组age的age[0];
age[0] = people1_age;
for(int i=0; i <= 8; i++)
{
age[i+1]= age[i]+3;
}

printf("第8个人的岁数是:%d\n", age[7]);

return 0;
}


题目10

10、 耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。(C语言)

#include <stdio.h>
#include <string.h>

void find_traitor(int count);
int main(int argc, const char * argv[]) {
//变量声明并初始化
int number_of_peoples = 0;

// 定义有多少个门徒
number_of_peoples = 15;
find_traitor(number_of_peoples);
return 0;
}

void find_traitor(int count)
{
//声明变量
int leave = 0;
int flag = 0;
int peoples_id[1000];
memset(peoples_id, 0, sizeof(peoples_id));

int *p = peoples_id;
for(int i=0; i<count; i++)
{
*(p+i) = i+1;
}
//test for peoples_id
//    for(int i=0; i<count; i++)
//    {
//        printf("%d \n", peoples_id[i]);
//    }
//当i为0的时候实际上已经相当于被点了一次名了
flag = 1;
//当有count-1个人离开证明已经剩下最后一个人了
while(leave < (count-1))
{
int i = 0;
while(i < count)
{
//如果点人时发现该人状态为0,那么就继续查看下一位
if(*(p+i) == 0)
{
i++;
continue;
}
if(flag == 3)
{
//test for flag
//printf("i == %d, *(p+i) == %d\n", i, *(p+i));
//每当点到3就将这个人清去,我这里用0表示该人的状态为leave
*(p+i) = 0;
flag = 0;
leave++;
}
flag++;
i++;
}
}

//while(*p++ == 0);
while(*p == 0)p++;

printf("出卖耶稣的叛徒是原来的第 %d 个人\n", *p);
}


解析:这道题算事逻辑上有些难度的题目(如果你不是专门搞算法的话),首先告诉大家一个思维误区就是 凡是报到“3”就退出圈子 这句话就是当时我费了很长时间的原因,也是对他没有转换的特别好导致的,一开始我总是想着定义一个长度的数组用来存15数字最为标号,每轮每当报道3时就将这个位置的人“移除”当时我一直想通过从新用一个新的数组来接收,但这种做法有很多的不确定性是不好把握的,当我想到给每个人设置为两种状态的时候这道题目就变的豁然开朗起来,所有难点便迎刃而解,我是这么想的:

当一开始的时候我把这n(这里n = 15)个人的id也就是用数字依次为每个人标注出身份号,然后定义一个flag来纪录报数的当前状态,用leave表示当前已经离开的人。每当报数到三的时候就将当前id的人状态设置为0表示该人已经被移除当再次标记flag的时候遇到值为0的就跳过然后当人数只剩下一个人时那个人就是叛徒

依照这个思路就可实现代码了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: