一、判断题
二、选择题
三、函数题
6-1 统计个位数
6-2 求整数组中最大值
★6-3 整理奇偶数增强篇 - 双指针
6-4统计字符串中数字符的个数
6-5 求n×n方阵主副对角线的总和
6-6 十进制转换二进制
6-7 在带头结点的单链表尾插入一个新元素 - 数据结构
四、编程题
★7-1 找鞍点
7-2找出总分最高的学生 - 结构体
7-3求数列之和[A]
一、判断题
1-1 十进制数2019对应的二进制表示为0111 1100 0011。 ()
应该是0111 1110 0011
1-2 磁盘驱动器和磁带机从信息输入输出的角度来看,也可视为输出设备( )
1-3 #include <stdio.h>编译预处理命令 。 ( )
1-4 宏定义没有类型问题,宏名没有类型,参数也没有类型。 ( )
1-5 一个数组由一个连续的内存单元组成,指针变量是该连续内存单元的第一个地址。 ( )
1-6 使用结构指针时,->被称为指向运算符。 ( )
1-7 C 程序中的注释相当于空白字符。 ( )
1-8 若数据规模为n,泡沫排序的时间复杂性是O(n2)。 ( )
void bubbleSort(int a[]) { for(int i=0;i<a.length-1;i ) //控制比较轮次,一共 n-1 趟 for(int j=0;j<a.length-1-i;j ) //控制两个旁边元素的比较 if(a[j] > a[j 1]) { int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
1-9 Non recursive programs are generally faster than equivalent recursive programs. However, recursive programs are in general much simpler and easier to understand.
( )
非递归程序通常比等效的递归程序快。 然而,递归程序通常要简单得多,也更容易理解。
1-10 In most restaurants, we follow one principle called "First come, first served". This principle can be implemented by a stack. ( )
在大多数餐馆,我们都遵循一个叫做“先到先得”的原则。这个原理可以通过堆栈来实现。
错 栈是先进后出
二、选择题
2-1 下列各种进制的数中最小的数是 ( )
A.二进制数(11010111)B
B.八进制数(332)O
C.十六进制数(8B)H
D.十进制数(130)D
全部转化为10进制
A 215 B 218 C 139 D 130
2-2 常说一台微机的内存容量为2G,指的是( )
A.2G字节
B.2G比特
C.2G字长
D.2G字
2-3 ______不是操作系统关心的主要问题. ( )
A.管理计算机裸机
B.设计,提供用户程序与计算机硬件系统的界面
C.管理计算机系统资源
D.高级程序设计语言的编译器
2-4 内存中每个基本单位,都被赋予一个唯一的序号,称为______ ( )
A.地址
B.字节
C.字段
D.容量
2-5 数字字符"8"的ASCII码的十进制是56,那么数字字符"1"的ASCII码的十进制是______
A.54
B.58
C.60
D.49
2-6 以下关于线性表的叙述中正确的是 ( )
A.每个元素都有一个前趋和后继元素
B.线性表中至少有一个元素
C.线性表中元素的排列次序必须是由小到大或由大到小
D.除第一个和最后一个元素外,其余每个元素都有一个且仅有一个前趋和后继元素
2-7 在单链表中,将 s 所指新结点插入到 p 所指结点之后,其语句应该为 ▁▁▁▁▁ 。
A.p->next = s; s->next = p->next;
B.s->next = p->next; p->next = s;
C.s->next = p->next; p->next = s->next;
D.p->next = s->next; s->next = p->next;
2-8 已知二维数组 A 按方式存储,每个元素占用 1 个存储单元。若元素 A[0][0] 的存储地址是 100,A[3][3] 的存储地址是 220,则元素 A[5][5] 的存储地址是: ( )
A.295
B.300
C.301
D.306
按行优先 设每行有n个元素 由A[0][0]和A[3][3]的存储地址可知A[3][3]是二维数组A中的第121个元素 则n×3+4=121 (4是0 1 2 3)则n=39 则A[5][5]=5×39+5+100=300 (5是0 1 2 3 4)
2-9 Given the popping sequence of a stack as { 1, 2, 3, 4, 5, 6 }. Among the following, the impossible pushing sequence is: ( )
A.3 2 1 6 5 4
B.6 5 1 2 3 4
C.6 5 4 1 2 3
D.4 6 5 1 3 2
2-10 The following list is a series of operations for a stack: ( )
- push 1
- push 2
- push 3
- pop
- pop
- push 4
- push 5
- pop
- push 6
- push 7
- pop
- pop
- pop
- push 8
- pop
- push 9
- pop
- pop
Which is the correct pop-up sequence?
A.1 2 3 4 5 6 7 8 9
B.9 8 7 6 5 4 3 2 1
C.3 2 5 7 6 4 8 9 1
D.3 2 5 7 4 6 9 8 1
2-11 队列的“先进先出”特性是指( ) 。
A.最早插入队列中的元素总是最后被删除
B.当同时进行插入、删除操作时,总是插入操作优先
C.每当有删除操作时,总是要先做一次插入操作
D.每次从队列中删除的总是最早插入的元素
2-12 微型计算机采用总线结构连接CPU.内存和外设,总线由三部分组成,它包括_____
A.控制总线.地址总线和运算总线
B.地址总线.逻辑总线和信号总线
C.数据总线.地址总线和控制总线
D.数据总线.传输总线和通信总线
2-13 摩尔定律是指_______。
B.芯片集成晶体管的能力每两年增长一倍,其计算能力也增长一倍
C.芯片集成晶体管的能力每18个月增长一倍,其计算能力也增长一倍
D.芯片集成晶体管的能力每6个月增长一倍,其计算能力也增长一倍
2-14 算法的时间复杂度取决于( )
A.问题的规模
B.计算环境
C.程序的执行时间
D.计算机cpu
2-15 将十六进制数586转换成16位的二进制数,应该是_____。
A.0000 0101 1000 0110
B.0110 1000 0101 0000
C.0101 1000 0110 0000
D.0000 0110 1000 0101
0101 1000 0110 0000 (每一位8 4 2 1法)
2-16 哪一种语言被称为低级语言? ( )
A.C++
B.汇编语言
C.Java
D.Python
2-17 第一代电子计算机采用的电子元器件是( )
A.晶体管
B.电子管
C.集成电路
D.大规模集成电路
1.代采用电子管
2.代采用晶体管
3.代采用中小规模集成电路
4.代采用超大规模集成电路
2-18 对算法的正确描述是____。
A.解决一个问题只有一种算法
B.对于所有问题都能找到实际可行的算法
C.算法包含语句越少,算法越先进
D.解决一个问题可以有多种算法
2-19 最近我国研制成功的具有自己知识产权的微处理器的名称是( )。
A.奔芯
B.长城芯
C.龙芯
D.新芯
2-20 微型计算机的性能主要取决于( )。
A.内存
B.主板
C.中央处理器
D.硬盘
三、函数题
6-1 统计个位数字
本题要求实现一个函数,可统计任一整数中某个位数出现的次数。例如-21252中,2出现了3次,则该函数应该返回3。
int Count_Digit ( const int N, const int D );
其中
N
和D
都是用户传入的参数。N
的值不超过int
的范围;D
是[0, 9]区间内的个位数。函数须返回N
中D
出现的次数。#include <stdio.h> int Count_Digit ( const int N, const int D ); int main() { int N, D; scanf("%d %d", &N, &D); printf("%d\n", Count_Digit(N, D)); return 0; } /* 你的代码将被嵌在这里 */
-21252 2
3
int Count_Digit ( const int N, const int D )
{
int x,cnt=0;
int n=N; //这里替换是因为 上面是const int 即N是不能改变的量
if(n<0) n*=-1; //这里负数要变成正数
do
{
x=n%10;
if(x==D) cnt++;
n/=10;
}while(n); //这里用do while 是为了包含N=0 D=0的情况
return cnt;
}
用指针作函数参数,求一维整数数组中的最大元素。
int findMax(int *p,int n);
p为指向数组的指针,n 为数组元素个数。函数值为数组元素的最大值。
#include <stdio.h> void ArrayRead(int *p,int n) //向数组中输入数据 { for(int i=0;i<n;i++) scanf("%d",&p[i]); } /* 你编写的函数放在这里 */ int main() { int n; scanf("%d",&n); //输入数组元素个数 int a[n]; //声明一个具有n个元素的数组a ArrayRead(a,n); //给数a组输入数据 printf("Max = %d\n",findMax(a,n)); return 0; }
10 27 58 41 25 28 98 16 65 87 62
Max = 98
int findMax(int *p,int n) //这个指针p指向主函数传来的a数组
{
int max=p[0];
for(int i=1;i<n;i++)
if(max<p[i])
max=p[i];
return max;
}
★
本题要求实现一个函数,将数组中的奇数元素排在前半段,偶数排在后半段。
此方法采用从前往后找偶数,再从后往前找奇数的方法,找到后两者交换。
如1,2,3,4,7,6,5经过函数整理后变成1,5,3,7,4,6,2。其中2和5进行了交换,4和7进行了交换。
void oddeven(int a[],int n);
其中 n 为数据元素个数。
#include <stdio.h> #define N 20 void oddeven(int a[],int n); int main() { int a[N],i,n; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); oddeven(a,n); for(i=0;i<n;i++) printf("%d ",a[i]); return 0; } /* 请在这里填写答案 */
7 1 2 3 4 7 6 5
1 5 3 7 4 6 2
void oddeven(int a[],int n)
{
int t,l=0,r=n-1; //l是左指针 r是右指针
while(l<r)
{
while(a[l]%2!=0) l++; //遇到偶数停止
while(a[r]%2==0) r--; //遇到奇数停止
if(l<r)
{
t=a[l];
a[l]=a[r];
a[r]=t;
}
}
}
6-4 统计字符串中数字字符的个数
编写函数,统计字符串中数字字符的个数。字符串的长度不超过1000。函数的接口定义如下:
int DigitalStatistics(char *p);
p是指向字符串的指针。函数的返回值是统计结果。
#include <stdio.h> #include <string.h> /* 你编写的函数放在这里 */ int main() { char str[10001]; gets(str); printf("Digital = %d\n",DigitalStatistics(str)); return 0; }
123tygxui70xA
Digital = 5
int DigitalStatistics(char *p)
{
int digital=0;
for(int i=0;p[i]!='\0';i++)
{
if(p[i]>='0'&&p[i]<='9')
digital++;
}
return digital;
}
6-5 求n×n方阵主副对角线元素之和
给定一个n×n的方阵(1⩽n⩽10),本题要求计算该方阵主对角线和副对角线所有元素之和。主对角线为从方阵的左上角至右下角的连线,副对角线为从方阵的右上到左下角的连线。
编写函数按照题意计算元素之和。
int sumMatrix(int (*a)[N],int n);
指针
a
指向了一个10×10的方阵,n
为a指向的矩阵的阶数#include<stdio.h> #define N 10 void createMatrix(int (*a)[N],int n) { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { scanf("%d",&a[i][j]); } } } /* 请在这里填写答案 */ int main() { int a[N][N]; createMatrix(a); printf("%d\n",sumMatrix(a)); return 0; }
在第一行给出方阵的阶数n,随后给出n行数,每行n个数,表示方阵中的元素。
输出求和结果
10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
110
int sumMatrix(int (*a)[N],int n)
{
int sum=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i==j||i+j==n-1)
sum+=a[i][j];
}
return sum;
}
6-6 十进制转换二进制
本题要求实现一个函数,将非负整数n转换为二进制后输出。
void dectobin( int n );
#include <stdio.h> void dectobin( int n ); int main() { int n; scanf("%d", &n); dectobin(n); return 0; } /* 你的代码将被嵌在这里 */
10
1010
void dectobin( int n )
{
int sum=0,t=1;
while(n)
{
sum+=n%2*t;
t*=10;
n/=2;
}
printf("%d",sum);
}
本题要求实现一个函数,在带头结点的单链表表尾处插入一个新元素e。
void insert ( LinkList L,ElemType e);
L是单链表的头指针,e是插入的数据元素。
#include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; LinkList Create(); void print(LinkList L); void insert ( LinkList L,ElemType e); int main() { int e; LinkList L = Create(); print(L); printf("\n"); scanf("%d",&e); insert(L,e); print(L); return 0; } LinkList Create() { LinkList L,p,s; ElemType e; L = (LinkList)malloc(sizeof(LNode)); p=L; scanf("%d",&e); while(e!=-1) { s = (LinkList)malloc(sizeof(LNode)); s->data=e; p->next = s; p=s; scanf("%d",&e); } p->next=NULL; return L; } void print(LinkList L) { LinkList p; p=L->next; while (p) { printf("%d ", p->data); p =p->next; } } /* 请在这里填写答案 */
1 2 3 4 5 6 -1 100
1 2 3 4 5 6 1 2 3 4 5 6 100
void insert ( LinkList L,ElemType e)
{
LinkList p,q;
q = (LinkList)malloc(sizeof(LNode));
q->data = e;
q->next = NULL;
p = L;
while(p ->next!= NULL)
p = p->next;
p->next = q;
}
四、编程题
★7-1 找鞍点
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
4 1 7 4 1 4 8 3 6 1 6 1 2 0 7 8 9
2 1
2 1 7 4 1
NONE
#include <stdio.h>
int main()
{
int i,j,k,n,a[100][100];
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
int max=a[i][j],min=a[i][j];
for(k=0;k<n;k++)
{
if(max<a[i][k]) max=a[i][k];
if(min>a[k][j]) min=a[k][j];
}
if(max==a[i][j]&&min==a[i][j])
{
printf("%d %d",i,j);
return 0;
}
}
printf("NONE");
}
7-2 找出总分最高的学生 - 结构体
给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2 成绩3”,中间以空格分隔。
在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。
5 00001 huanglan 78 83 75 00002 wanghai 76 80 77 00003 shenqiang 87 83 76 10001 zhangfeng 92 88 78 21987 zhangmeng 80 82 75
zhangfeng 10001 258
#include <stdio.h>
struct student
{
char sn[10];
char name[20];
int s1,s2,s3;
int sum;
};
int main()
{
struct student stu[100];
int N,i;
scanf("%d",&N);
for(i=0;i<N;i++)
{
stu[i].sum=0;
scanf("%s %s %d %d %d",&stu[i].sn,&stu[i].name,&stu[i].s1,&stu[i].s2,&stu[i].s3);
stu[i].sum = stu[i].s1+stu[i].s2+stu[i].s3;
}
int max=stu[0].sum;
int k=0;
for(i=1;i<N;i++)
{
if(max<stu[i].sum)
{
max=stu[i].sum;
k=i;
}
}
printf("%s %s %d",stu[k].name,stu[k].sn,stu[k].sum);
}
7-3 求数列之和[A]
给定一个数字A (1⩽A⩽9)以及一个非负整数N (0⩽N⩽15),编程计算sum=A+AA+AAA+⋯+AA⋯A(N个A), 例如当A=2,N=3时,S=2+22+222=246。
在一行内输入数字A与非负整数N。数与数之间用空格间隔。
按照
S = xxx
的格式输出其N项之和S的值。2 3
在这里给出相应的输出。例如:
S = 246
#include <stdio.h>
#include <math.h>
int main()
{
int N,A;
double sum=0,S=0;
scanf("%d %d",&A,&N);
for(int i=0;i<N;i++)
{
sum+=A*pow(10,i);
S+=sum;
}
printf("S = %.0f",S);
}