资源描述
第一章
一、简答题
1.参考书上第五页图1-7
2.因为C语言是强类型语言,语法规定必须先定义后使用,只有先定义,系统才能为其分配存储空间。
3.参考书上第二页
二、填空题
1. 算法
2. .C , .obj , .exe
3. 提出问题,构造模型,选择方法,编写程序,上机调试
4. 1
5. sin(35.0*3.14159/180) + x * cos(60.0*3.14159/180)
6. 6
7. 0
三、改错题
1. 参考书上第二页,算法与程序的区别
2. 只能定义为一种类型
3. 必须先定义,后使用
4. 可以随时修改
5. 只有char型变量才只存储一个字节
6. a还是实型变量
7. b中的值不丢失
8. i的类型不变
四、单选
1-5 BDCDC 6-10 DCBBD 11-15 CBADC 16-18 AAA
第二章
一、简答
1. 参考书上23页
2. while先判断,后执行,do while先执行,后判断,循环体至少执行一次
3. 参考书上29页
4. continue,结束本次循环
break,结束循环
区别在于,continue只结束本次循环重新进行下次循环,而break结束整个循环
二、填空题
1. 顺序结构,选择结构,循环结构
2. if else 和switch
3. 语句1语句2 , 语句2
4. 零
5. break , continue
6.1 , 0
7. 条件运算符, 双目
三、单选
1-5 ABDCC 6-10 DBBDA 11-15 CBCDA 16-20 ACAAD 21-25 CDCBB 26-29 BCCA
四、程序分析题
1. end 1end
2. num%10 max = t
3. j%3
4. 10, 12
五、编程题
1.
#include <stdio.h>
int main(){
char str[100] ;
gets(str) ;
int n1 , n2 , n3 , n4 , i ;
n1 = n2 = n3 = n4 = 0 ;
for(i = 0 ; str[i] != '\0' ; ++i) {
if(str[i] >= 'A' && str[i] <= 'Z')
++n1 ;
else if(str[i] >= 'a' && str[i] <= 'z')
++n2 ;
else if(str[i] >= '0' && str[i] <= '9')
++n3 ;
else
++n4 ;
}
printf("大写字母:%d\n" , n1) ;
printf("小写字母:%d\n" , n2) ;
printf("数字字符:%d\n" , n3 ) ;
printf("其他字符:%d\n" , n4) ;
return 0;
}
2.
#include <stdio.h>
#include <stdlib.h>
int main(){
int array[4] , min , max , i ;
for(i = 0 ; i < 4 ; ++i)
scanf("%d" , &array[i]) ;
min = max = array[0] ;
for(i = 1 ; i < 4 ; ++i) {
if(array[i] < min)
min = array[i] ;
else if(array[i] > max)
max = array[i] ;
}
printf("min = %d , max = %d\n" , min , max) ;
return 0;
}
3.
#include <stdio.h>
int main(){
float money , lixi ;
int year ;
scanf("%f %d" , &money , &year) ;
switch(year) {
case 1 :
lixi = money * 0.63 / 100 ;
break ;
case 2 :
lixi = money * 0.66 / 100 ;
break ;
case 3 :
lixi = money * 0.69 / 100 ;
break ;
case 5 :
lixi = money * 0.75 / 100 ;
break ;
case 8 :
lixi = money * 0.84 / 100 ;
break ;
default :
printf("输入错误\n") ;
return -1 ;
}
printf("%f\n" , money + lixi) ;
return 0;
}
4.
#include <stdio.h>
int main(){
int x , y ;
scanf("%d" , &x) ;
if(x > 100)
y = x + 8 ;
else if(x < -10)
y = -x + 8 ;
else
y = 0 ;
printf("%d\n" , y) ;
return 0;
}
5.
#include <stdio.h>
int main(){
int i , j , k , m = 3 ;
for(k = 5 ; k < 12 ; k += 2 , --m) {
for(i = 0 ; i < m ; ++i)
printf(" ") ;
for(j = 0 ; j < k ; ++j)
printf("*") ;
printf("\n") ;
}
return 0;
}
6.
#include <stdio.h>
int main(){
printf(" *****\n") ;
printf(" * *\n") ;
printf(" * *\n") ;
printf("*************\n") ;
return 0;
}
第三章
一、简答
1. a:数组名,a[0] :数组第0号元素, &a[1]数组第1号元素的地址
2. 不同,”a”是字符串,末尾有一个’\0’
3. 2 * 3 * 2 = 12个字节
二、填空题
1. 0
2. 按行存放
3. 1014
4.str[14]
5. ‘\0’
三、改错
1. 是0
2. 只能是常量
3. 一定相同
4. 不会给错误信息
5. 没有提供字符串类型
6. 不等价,”ok”末尾有一个’\0’
四、单选
1-5 DBCAC 6-10 CDDCB 11-13 CDC
五、程序分析题
1. AzyD
2. 123
3. 45
4. 4some string * test
5. 统计输入字符串中空格的个数 3 , 1
6. max < a[row][col] min > max min == max
7. a a sum/n x[i] < ave
8. a[i][j] != a[j][i] 1
9. j += 2 a[i] > a[j]
10. 1 2 4 5 6 0 0 0 0 0
1 2 3 4 5 6 0 0 0 0
六、编程题
1.
#include <stdio.h>
int main(int argc , char *argv[]) {
int a[11] , i , n ;
printf("请输入十个递增排列的数列:") ;
for(i = 0 ; i < 10 ; ++i)
scanf("%d" , &a[i]) ;
printf("请输入要插入的数:") ;
scanf("%d" , &n) ;
for(i = 9 ; i >= 0 && a[i] > n ; --i) {
a[i+1] = a[i] ;
}
a[i+1] = n ;
printf("插入后数列为:") ;
for(i= 0 ; i < 11 ; ++i)
printf("%d " , a[i]) ;
printf("\n") ;
return 0 ;
}
2.
#include <stdio.h>
#include <string.h>
int main(int argc , char *argv[]) {
char a[100] , b[100] , min , i ;
scanf("%s %s" , a , b) ;
min = 0 ;
for(i = 1 ; a[i] != '\0' ; ++i) {
if(a[min] > a[i])
min = i ;
}
strcat(b , a + min + 1) ;
a[min + 1] = '\0' ;
strcat(a , b) ;
printf("%s\n" , a) ;
return 0 ;
}
3.
#include <stdio.h>
int main(int argc , char *argv[]) {
char s1[100] , char s2[100] ;
int i ;
gets(s1) ;
gets(s2) ;
char *string1 = s1 , *string2 = s2 ;
do{
i = (int)*string1 -(int)*string2;
}while(*string1++ && *string2++ && (!i) );
for(i = 0 ; s1[i] != '\0' && s2[i] != '\0' && s1[i] == s2[i] ; ++i) ;
printf("%d\n" , i) ;
return 0 ;
}
4.
#include <stdio.h>
int main(int argc , char *argv[]) {
char s[100] ;
int i ;
gets(s) ;
for(i = 0 ; s[i] != '\0' ; ++i) {
if(i == 0 || (s[i-1] == ' ' && s[i] >= 'a' && s[i] <= 'z'))
s[i] -= 32 ;
}
puts(s) ;
return 0 ;
}
5.
#include <stdio.h>
int main(int argc , char *argv[]) {
char s1[100] , s2[100] ;
int end , i ;
gets(s1) ;
gets(s2) ;
for(end = 0 ; s1[end] != '\0' ; ++end) ;
for(i = 0 ; s2[i] != '\0' ; ++i)
s1[end++] = s2[i] ;
s1[end] = '\0' ;
puts(s1) ;
return 0 ;
}
第四章
一、简答题
1. 参考书上68页,69页,72页
2. 函数的返回值,函数的形参
3. 实参与形参之间是值传递的关系
二、填空题
1. 库 用户自定义
2. 3
3. gets()
4. strlen()
5. strcpy()
6. 全局 局部
7. 有返回值 无返回值
8. return
9. void
10. 前
11. 调用
三、改错
1. 表示不同的变量
2. 按照调用的先后顺序执行
3. 各自有自己的存储单元
4. 可以没有形参
5. 分配在动态存储区
6. 以该函数定义的返回值为准
7. 嵌套调用指函数调用函数
四、单选
1-5 BDACC 6-10 DAACC 11-13 BCC
五、程序分析题
1. j str[j-1]
2. 本题程序是错的,第五行,for(I = m + 1 ; i++)这里少东西,所以跳过
3. i < n x = fun(4)
4. 1: a = 1 , b = 1
2: a = 2 , b = 2
3: a = 3 , b= 3
六、编程题
1.
int fun(int year) {
if( year % 400 == 0|| (year % 4 == 0 && year % 100))
return 1 ;
else
return 0 ;
}
2.
#include <stdio.h>
#include <math.h>
void fun1(int a , int b , int c) {
float t = sqrt(b * b - 4 * a * c) ;
printf("x1 = %f , x2 = %f\n" , (-b + t) / 2.0 * a , (-b -t) / 2.0 *a) ;
}
void fun2(int a , int b , int c) {
printf("x1 = x2 = %f\n" , -b/ 2.0 * a) ;
}
void fun3(int a , int b , int c) {
printf("该方程没有实根") ;
}
int main(int argc , char *argv[]) {
int a , b , c ;
scanf("%d %d %d" , &a , &b , &c) ;
if(b * b - 4 * a *c > 0)
fun1(a , b , c) ;
else if(b * b - 4 * a * c == 0)
fun2(a , b , c) ;
else
fun3(a , b , c) ;
return 0 ;
}
3.
#include <stdio.h>
#include <math.h>
int fun(int a[] , int n) {
int i , j = 0 ;
for(i = 1 ; i < n ; ++i)
if(i % 3 == 0 && i % 7 == 0)
a[j++] = i ;
return j ;
}
int main(int argc , char *argv[]) {
int a[100] , n , m , i ;
scanf("%d" , &n) ;
m = fun(a , n) ;
for(i = 0 ; i < m ; ++i)
printf("%f " , sqrt(a[i])) ;
return 0 ;
}
第五章
一、简答
1. 不一定,这要看指针的类型,比如 int * p ,则p + 1 就增加两个字节
2. 定义指针时表示定义的变量是指针类型,引用指针时,表示指针指针指向的变量
3. p + n , p – n ,其中n是int类型
二、填空题
1. 地址
2. & *
3. 指针
4. *p
5. 1006
6. malloc
7. a+i *(a+i)
8. 3
9. ‘b’ ‘\0’
三、改错题
1. 只能存放同类型的变量的地址,比如int *只能存放int型变量的地址
2. 这个说法是正确的,没有错误
3. 不是,指的是指针所指向的变量的类型
4. 只能是同类型的指针或者&a这样的地址值
5. 是可以改变的
四、单选
1-5 CDDAA 6-10 BCDDD
五、程序分析题
1. *x t
2. r + b[u] *x
3. 10
4. CDG
5. 80,-20
6. 5
7. 55
1711717
六、编程题
1.
#include <stdio.h>
int main(int argc , char *argv[]) {
char s[100] ;
int i ;
gets(s) ;
for(i = 0 ; s[i] != '\0' ; ++i) ;
printf("%d\n" , i) ;
return 0 ;
}
2.
#include <stdio.h>
int fun(char *s , char c) {
int count = 0 ;
for( ; *s != '\0' ; ++s)
if(*s == c)
++count ;
return count ;
}
int main(int argc , char *argv[]) {
char s[100] , c ;
gets(s) ;
c = getchar() ;
printf("%s %c\n" , s , c ) ;
printf("%d\n" , fun(s , c)) ;
return 0 ;
}
3.
#include <stdio.h>
int main(int argc , char *argv[]) {
char s[100] ;
int i , n1 , n2 , n3 , n4 , n5 ;
n1 = n2 = n3 = n4 = n5 = 0 ;
gets(s) ;
for(i = 0 ; s[i] != '\0' ; ++i) {
if(s[i] >= 'A' && s[i] <= 'Z')
++n1 ;
else if(s[i] >= 'a' && s[i] <= 'z')
++n2 ;
else if(' ' == s[i])
++n3 ;
else if(s[i] >= '0' && s[i] <= '9')
++n4 ;
else
++n5 ;
}
printf("大写字母:%d\n" , n1) ;
printf("小写字母:%d\n" , n2) ;
printf("空格:%d\n" , n3) ;
printf("数字:%d\n" , n4) ;
printf("其他字符:%d\n" , n5) ;
return 0 ;
}
第六章
一、简答题
1
比如定义
struct Student {
char name[100] ;
int age ;
}stu ;
则stu.name , stu.age 即可引用结构体成员
2. 不是必须为所有的成员赋初值,因为语法上没有强制要求。
二、填空题
1. 21 &a[0] p->x a[1]
2. 1 3
3. “ab” “cd”
三、改错题
1. 可以同名
2. 可以含有
3. 不可以
四、单选题
BACBDD
五、程序分析题
1. Zhao
2. 10 x
3. 200 y
4、-> .
5、 36 40 20
6、max = person[i].age min = person[i].age
六、编程题
1.
#include <stdio.h>
struct Score {
float s1 ;
float s2 ;
} ;
int main() {
struct Score stu ;
scanf("%f %f" , &stu.s1 , &stu.s2) ;
printf("%f\n" , (stu.s1 + stu.s2)/2.0) ;
return 0 ;
}
2.
#include <stdio.h>
struct Student {
char stuNo[50] ; //学号
float s1 ; //期中成绩
float s2 ; //期末成绩
} ;
int main() {
struct Student stu[10] ;
int i ;
for(i = 0 ; i < 10 ; ++i)
scanf("%s %f %f" , stu[i].stuNo , &stu[i].s1 , &stu[i].s2) ;
for(i = 0 ; i < 10 ; ++i) {
printf("学号:%s\n" , stu[i].stuNo) ;
printf("期中成绩:%f\n" , stu[i].s1) ;
printf("期末成绩:%f\n" , stu[i].s2) ;
printf("平均成绩:%f\n" , (stu[i].s1 + stu[i].s2)/2.0) ;
}
return 0 ;
}
第七章
一、简答题
1. D代表数据节点的集合,R是D上的关系
2. 逻辑结构是数据之间的外在关系,物理结构是数据在计算机内的存储表示
3. 参考第二页
4. 不是,还于算法的设计有关,一个好的算法可以降低时间复杂度
5. O(n) , O(lgn) , O(nlgn) , O(n的平方+1) , O(n3 – n2) , O(n5) , O(2的n次方)
二、填空题
1、逻辑 物理 逻辑
2、 时间复杂度 空间复杂度
3、 线性表 二叉树 图
4、 线性
5、 树型
6、 1 1 1 多 多 多
7、 O(n的平方)
8、O(n) O(n)
三、改错题
1、 无关
2、 有关
3、 无关
4、 不是,是外在的关系,与存储结构无关
四、单选
CCBCC 6题A选项改为n(n-1)
第八章
一、简答题
1、参考132页、135页、136页
2、 参考139页
3、 参考139页
4、 选择顺序存储结构,因为顺序表是随机存取,访问任意一个元素的时间复杂度为O(1) ;
5、选择链式存储,因为链表插入删除的开销小
6、循环单链表,循环双链表
7、单链表无法删除
循环单链表可以删除,时间复杂度为O(n)
循环双链表可以删除,时间复杂度为O(1)
二、填空题
1、 顺序存储 链式存储
2、 O(n)
3、O(n) O(1)
4、q->next = p->next p->next = q
5、 p->next s->data t
6、p->next = head->next head->next = p
7、 p->next->next
8、head->next = NULL
9、 p->prior s->next = p s
10、 O(1)
三、改错题
1、 一定相邻
2、 该说法是正确的
3、该说法是正确的
4、需要移动节点
5、不会发生溢出现象
6、 链表
四、单选
AABBA BCAB 10题为CDAB CB
五、程序分析
1、 删除单链表
2、 p->next != q->prior p = p->next q = q->prior
3、 count = 0 p = p->next
六、程序设计题
1.
#include <stdio.h>
#define MAX 100
struct Link {
int data[MAX] ;
int n ;
};
int findMin(struct Link * p) {
int min = 0 , i ;
for(i = 1 ; i < p->n ; ++i)
if(p->data[min] > p->data[i])
min = i ;
return min ;
}
int main() {
int i ;
struct Link L ;
scanf("%d" , &L.n) ;
for(i = 0 ; i < L.n ; ++i)
scanf("%d" , &L.data[i]) ;
for(i = 0 ; i < L.n ; ++i)
printf("%d " , L.data[i]) ;
printf("最小值是: %d\n" , L.data[findMin(&L)]) ;
return 0 ;
}
2.
#include <stdio.h>
#define MAX 100
struct Link {
int data[MAX] ;
int n ;
};
void insert(struct Link *p , int iValue) {
int i = p->n - 1 ;
while(p->data[i] > iValue) {
p->data[i+1] = p->data[i] ;
--i ;
}
p->data[i+1] = iValue ;
++p->n ;
}
int main(int argc , char *argv) {
struct Link L ;
int i , insertValue ;
scanf("%d" , &L.n) ;
for(i = 0 ; i < L.n ; ++i)
scanf("%d" , &L.data[i]) ;
scanf("%d" , &insertValue) ;
insert(&L , insertValue) ;
for(i = 0 ; i < L.n ; ++i)
printf("%d " , L.data[i]) ;
return 0 ;
}
3.
#define MAX 100
struct Link {
int data[MAX] ;
int n ;
};
void deleteLink(struct Link *p) {
int i , j , k ;
for(i = 0 ; i < p->n ; ++i) {
for(j = i + 1 ; p->data[j] == p->data[i] && j < p->n ; ++j) ;
if(j != i + 1) {
int temp = j - i - 1 ;
for(k = i + 1 ; j < p->n ; ++j , ++k)
p->data[k] = p->data[j] ;
p->n -= temp ;
}
}
}s
4.
struct Node {
int data ;
struct Node *next ;
};
int getLen(struct Node *p) {
int n = 0 ;
while(p != NULL) {
++n ;
p = p->next ;
}
return n ;
}
5.
struct Node {
int data ;
struct Node *next ;
};
void setNum(struct Node *p , int n1 , int n2) {
while(p != NULL) {
if(p->data = n1)
p->data = n2 ;
p = p->next ;
}
}
6.
struct Node {
int data ;
struct Node *next ;
};
struct Node * delNode(struct Node *list , int n) {
int flag = 1 , i = 1 ;
struct Node * p = list , *q = list->next ;
if(n == 1) {
list = list->next ;
free(p) ;
return list ;
}
while(q != NULL) {
++i ;
if(i == n) {
p->next = q->next ;
free(q) ;
q = p->next ;
return list ;
}
q = q->next ;
p = p->next ;
}
return list ;
}
7.
struct Node {
int data ;
struct Node *next ;
};
struct Node * fun(struct Node *list) {
struct Node * p = list , *q = list->next , * min , *pMin ;
int temp ;
min = list ;
while(q != NULL) {
if(q->data < min->data) {
min = q ;
pMin = p ;
}
p = p->next ;
q = q->next ;
}
if(min != list) {
pMin->next = min->next ; //删除最小节点
//将最小节点插入到list节点之后
min ->next = list->next ;
list->next = min ;
//交换list节点和min节点的值
temp = list->data ;
list->data = min->data ;
min->data = temp ;
}
return list ;
}
8.
struct Node {
int data ;
struct Node *next ;
};
struct Node * fun(struct Node *list) {
struct Node * p = list , *list2 = NULL , *q ;
struct Node *rear = (struct Node *) malloc(sizeof(struct Node)) ; //循环链表的尾指针
rear->next = rear ;
while(1) {
q = p->next ; //保存下一个节点的地址
//头插法插入p
p->next = rear->next ;
rear->next = p ;
p = q ;
if(p == list)
break ;
}
return rear ;
}
第九章
一、简答题
1、 不同:栈是先进后出,队列是先进先出
相同:都是线性结构,都有顺序实现和链式实现两种
2、不能得到4 3 5 6 1 2的出栈序列,原因如下
1. 1 2 3 4依次进栈
2. 4 3 出栈
3. 5入栈
4. 5出栈
5. 6入栈
6. 6出栈
此时栈中元素为1,2。所以若1一定在2之后出栈。
同样的分析方法,可知,1 3 5 4 2 6的出栈序列是可以的。
3、共占5 * 6 × 4 = 120个字节
按行排序时,起始地址为1000 + 2*6 + 5 =1017
按列排序时,起始地址为 1000 + 5 * 5 + 2 = 1027
二、填空题
1、判栈满 添加元素
2、 判栈空 删除元素
3、 -1 m-1
4、空栈 空队
5、n-1
6、 1212
7、
三、改错题
1、这个说法是正确的
2、有存取限制
3、这个说法是正确的
4、 这个说法是正确的
5、练栈也是线性结构
四、单选
CBAC 5题的题意不清 BDCCA ABC
五、程序设计题
1.
#include <stdio.h>
#define MAX 100
struct Stack {
int data[MAX] ;
int top ;
};
int pop(struct Stack * s) {
if(s->top != -1)
return s->data[s->top--] ;
else {
printf("Error") ;
return -1 ;
}
}
int push(struct Stack *s , int n) {
if(MAX -1 != s->top)
return s->data[++s->top] = n ;
else {
printf("Error") ;
return -1 ;
}
}
int main() {
struct Stack s ;
int i ;
s.top = -1 ;
for(i = 0 ; i < 10 ; ++i)
push(&s , i) ;
for(i = 0 ; i < 10 ; ++i)
printf("%d " , pop(&s)) ;
return 0 ;
}
2.
#include <stdio.h>
#define MAX 100
struct Stack {
int data[MAX] ;
int top ;
};
//栈的出栈
int pop(struct Stack * s) {
if(s->top != -1)
return
展开阅读全文