计算机基础知识
1、若计算机有 32 根地址总线,则其存储器的最大存储容量可达(C )。
A、32MB B、32GB C、4GB D、8G
结题思路:232先从bit位开始计算,首先1024即210等于1kb,类似的计算出1MB需要220,1GB需要230bit,那么232=230*4 - >4GB
2、下列数据表达的数值与十进制 77 不相等的是(B )。
A、0x4D B、0x4B C、0115 D、1001101
本题纯计算,第一、二个代表的是十六进制数,既然同是十六进制位数,那么答案一定出现这两个之间。第一个值:4 * 16 + 13 *1 = 77 ,那么直接选B
3、以下选项中不属于字符常量的是( B)。
A、’C’ B、”C” C、’\x0C’ D、’\072’
这道题直接先看符号,只有一个不同选不同的。(题感法)
先说一下字符常量的表示:只能用单引号且有转义字符 \ 时才能写入多个字符,双引号表示的字符串。
程序题
1、如有下列程序,输入数据:12345 678后,程序输出的结果是B。
#include<stdio.h>
int main( )
{
int x;
double y;
scanf(“%3d%f”,&x,&y);
printf(“%d,%f\n”,x,y);
return 0;
}
A、12345,678.000000 B、123,45.000000
C、123,不确定的随机数 D、345,678.000000
这道题考察的是对于scanf输入方法的使用,%3d表示的是限制了输入的数据的长度不超过3,
所以第一个输入的数据是123,输出也是一样。
第二个不同的是它接受的是浮点数,浮点数即是小数,首先我们要知道scanf在遇到空格时会对上一个输入过程进行终止,其次是上一次的数据还未输入完成,仅仅只输入了三个,所以对于下一个输入剩余数字,但是在3后面出现了空格所以终止了输入,第二个输出也是浮点类型,所以选带小数的。
2、若 d 是 double 型变量,表达式”d=1,d=5,d++”的值是==( C)==。
A、1.0 B、2.0 C、5.0 D、6.0
本题的表达式是从左边往右计算当计算到d++时,先不计算所以还是5
扩展:d++先赋值再运算,++d先计算再赋值。
3、阅读下面的程序
#include<stdio.h>
void main()
{
char ch;
scanf("%3c",&ch);
printf("%c",ch);
}
如果从键盘上输入
abc<回车>
则程序的运行结果是 A
A) a B) b C) c D) 程序语法出
这里考察的是printf中的输出数据类型%c,它指定的是输出字符,字符只能有一个,所以不论它输入多少,都只返回第一个。
4、以下不能对二维数组 a 进行正确初始化的语句是C。
A、int a[2][3]={0};
B、int a[][3]={{1,2}, {0}};
C、int a[2][3]={{1,2}, {3,4}, {5,6}};_//这个数组是两行三列的数组。它表示的是三行两列。_
D、int a[][3]={1,2,3,4,5,6};
5、表达式C的值不是 1。
A、4<0?0:1 B、5>=1
C、!EOF D、!NULL
A选项是三目运算符:计算的逻辑是先判断<两边是否为正,正则赋值问号后的值,否则赋值冒号后面的值,所以A项为1
B项一眼就能看出来是对的,所以是1
C项EOF是打开文件时的一个标志,它代表的、是-1,非 -1 可以是0,所以直接错。选择C项。
D项NULL的值是0,非0则是1。
6、设 p1 和 p2 是指向同一个字符串的指针变量,c 为字符变量,则以下不能正确执行赋值语句的是 B。
A、c=*p1+*p2 B、p2=c-5
C、p1=p2 D、c=*p1*(*p2)
这里考察的指针的知识,对于指针指向的是一个地址,指针通过地址获取数据。
例如:int * p = a 它表示的是一个整形指针指向a这个地址。那么从这可以看出 *p 就是a这个地址中存放的数。所以对数进行运算可以,但是地址不行。所以选择B项。
7、执行下面的程序段后,变量 ab 的值是(A)
int *var,ab=100;
var=&ab;
*var+=10;
var+=10;
A.110 B. 100 C. 0 D.120
这道题用来巩固上一问,首先var这个指针指向了ab这个地址,所以此时对指针的运算将影响到原来的地址,
*var是值,var是地址,所以只能对值进行计算,所以只有第三行的代码对当前指针指向的地址的值进行了运算使得ab加上了10变成了110,而第四行是改变了指针指向的地址,对值没有影响。
8、将两个字符串 s1 和 s2 连接起来,正确的函数是(B )
A. strcpy(s1,s2) B. strcat(s1,s2) C. strcmp(s1,s2) D. strlen(s1,s2)
A项的函数方法是覆盖拷贝,是将第二个数据覆盖第一个数据。
B项是字符串的连接,将第二个连接到第一个字符串之后。
C项是字符串长度的比较方法,如果第一个大于第二个则放回大于0的数,等于则0,小于则返回小于0的数。
D是判断字符串长度,只能传一个参数,所以D直接排除。
9、以下不能正确对字符串初始化的语句是(C )
A. char str[]={"good!"}; B. char *str="good";
C.char str[5]="good!"; D. char str[6]={'g','o','o','d','!','\0'};
用数组存入字符串时,数组长度永远要大于(不能等于)字符串元素的个数,因为要留一个空位给 ‘\0’
10、函数 f 定义如下,执行语句“sum=f(5)+f(3);”后,sum 的值应为C。
int f(int m)
{
static int i=0; int s=0;
for(;i<=m;i++) s+=i;
return s;
}
这里考察的是static静态变量的使用,在它申明后只能被赋值一次,所以经过for循环后 i 的值一直是5,所以只有f(5)成功执行。而第二个因为刚开始 i 的值等于5,大于3所以直接返回。最后计算结果为15.
A、 21 B、 16 C、 15 D、8
宏定义
写出下面结果6,7
#include<stdio.h>
#define P 2
#define POWER(x) P*x*x
int main()
{
int x=1,y=2;
printf("%d,%d",POWER(x+y), POWER(y+x));
return 0;
}
本题注意不要先算POWER()中的值,先将它放入宏定义内
2 * 1 + 2 * 1 + 2 这是第一个计算的表达式结果为6
2 * 2 +1 * 2 + 1 这是第二个计算的表达式结果为7
举一反三
#include<stdio.h>
#define SUB(X,Y) (X)*Y
int main()
{
int a=3,b=4;
printf("%d\n",SUB(a+b,b++));
return 0;
}
这里猜一下结果是多少?
A. 28 B. 19 C.23 D.35
答案是A你算对了吗。这里和上面不同的是宏定义中X外面加入了小括号,所以这里是先计算a+b的值再进行后续运算。而第二个传入的参数b++是先将b原来的值带入宏中计算,之后再赋值,所以这里的表达式是(3+4)* 4 = 28。
编程题
第一题:
(1) 定义函数 int fun(int a[], int m); 实现查找小于或者等于 m 的所有素数并放在数组中,函数返回所求出的素数的个数。
(2) 定义主函数,主函数中首先定义一个数组 array;接着从键盘输入任意一个整数 m (<1000),然后调用函数 fun 输入数组和整数 m,并将查找出的素数和素数个数打印出来。
#include <stdio.h>
#include <string.h>
#define N 1000
int fun(int a[],int m){
int i,t;
int j=0;
for(i=2;i<m;i++){
if(i%2!=0){
a[j]=i;
j++;
}
}
for(t=0;t<j;t++){
printf("%5d",a[t]);
}
printf("\n");
printf("%d",j);
}
int main(){
int m;
int a[N];
scanf("%d",&m);
fun(a,m);
return 0;
}
第二题
(1) 定义函数int BubbleSort(int a[],int n),用冒泡法将数组元素按照从大到小的顺序排序。(4分)。
(2) 定义输入函数void Input(int a[],int n); 实现从键盘输入数组a中的n个元素(3分)。
(3) 定义输入函数void Print(int a[],int n); 实现输出数组a中的n个元素(3分)。
(4) 定义主函数,主函数中首先定义一个含15个元素的数组;接着调用Input函数输入10 个数组元素;在主函数中调用BubbleSort函数对数组的元素进行排序,并将排序的结果使用Print函数打印输出(5分)。
#include <stdio.h>
#include <string.h>
//冒泡排序
int BubbleSort(int a[],int n){
int t;
int i,j;
for(i=9;i>=0;i--){
for(j=0;j<i;j++){
if(a[j]<a[j+1]){
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
}
//数组的输入
void Input(int a[],int n){
int i;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
}
//数组的打印
void Print(int a[],int n){
int i;
for(i=0;i<n;i++){
printf("%d",a[i]);
}
}
int main(){
int a[15];
Input(a,10);
BubbleSort(a,10);
Print(a,10);
return 0;
}
第三题
在考生文件夹下,给定程序 pingyou.c 的功能是:学习优良奖的条件如下:所考 5 门课的总成绩在 450 分(含)以上;或者每门课都在 88 分(含)以上。 输入某学生 5 门课的考试成绩,输出是否够学习优良奖的条件。
#include<stdio.h>
int main()
{
int a[5];
int i,j,count,sum;
for(i=0;i<5;i++)
scanf("%d",&a[i]);
for(j=0;j<5;j++)
{
if(a[j]>=88)
{
count++;
}
sum+=a[j];
}
if(count==5 || sum >=450)
{
printf("优秀");
}
else
{
printf("不够优秀");
}
return 0;
}
第四题
输入一个 3×4 的二维整数矩阵,要求实现两个功能:(1)实现矩阵的转置;(2)遍历矩阵,输出矩阵中最大的数及其下标。
#include <stdio.h>
#include <string.h>
int main(){
int a[3][4];
int b[4][3];
int i,j;
//输入
for(i=0;i<3;i++){
for(j=0;j<4;j++){
scanf("%d",&a[i][j]);
}
}
//转置前
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("%d",a[i][j]);
}
printf("\n");
}
//开始转置
for(i=0;i<4;i++){
for(j=0;j<3;j++){
b[i][j]=a[j][i];
}
}
for(i=0;i<4;i++){
for(j=0;j<3;j++){
printf("%d",b[i][j]);
}
printf("\n");
}
//遍历元素寻找最大值,并输出下标
int max;
max=b[0][0];
for(i=0;i<4;i++){
for(j=0;j<3;j++){
if(b[i][j]>max){
max=b[i][j];
}
}
printf("\n");
}
for(i=0;i<4;i++){
for(j=0;j<3;j++){
if(b[i][j]==max){
printf("%d %d %d",max,i,j);
}
}
}
return 0;
}
第五题
5、 编写一个结构体类型的程序,定义一个结构体变量 struct student,其包含学号,姓名,三门课的成绩,成绩用数组保存,要求输入 10 个结构体变量学生的学号、姓名、3 门课程的成绩,求出总分最高的学生并输出。
#include <stdio.h>
struct student
{
char num[20];
char name[10];
int score[3];
int sum;
}st[10];
int main()
{
int i,j,sum,max;
for(i=0;i<10;i++)
{
printf("学号:");
scanf("%d",&st[i].num);
printf("\n姓名:");
scanf("%s",&st[i].name);
printf("\n语文:");
scanf("%d",&st[i].score[0]);
printf("\n数学:");
scanf("%d",&st[i].score[1]);
printf("\n英语:");
scanf("%d",&st[i].score[2]);
}
max=st[0].sum;
for(i=0;i<10;i++)
{
st[i].sum=st[i].score[0]+st[i].score[1]+st[i].score[2];
if(max<st[i].sum)
max=st[i].sum;
j=i;
}
printf("%d , %s ",max,st[j].name);
return 0;
}
第六题
6、 斐波那契数列(Fibonacci sequence),又称“黄金分割”数列,比如这样一个数列:1,1,
2,3,5,8,13,21,34,55,89… …数列从第 3 项开始,每一项都等于前两项之和。试用递归函数来实现斐波那契数列的求解。
#include <stdio.h>
#define N 1000
int fs(int n);
int main()
{
int n;
scanf("%d",&n);
printf("%d",fs(n));
return 0;
}
int fs(int n)
{
if(n==1)
{
return 1;
}
if(n==0)
{
return 0;
}
else
{
return fs(n-1)+fs(n-2);
}
}