收藏 分销(赏)

计算机软件基础(-)课后习题参考答案doc.doc

上传人:精**** 文档编号:2552297 上传时间:2024-05-31 格式:DOC 页数:34 大小:96KB 下载积分:12 金币
下载 相关 举报
计算机软件基础(-)课后习题参考答案doc.doc_第1页
第1页 / 共34页
计算机软件基础(-)课后习题参考答案doc.doc_第2页
第2页 / 共34页


点击查看更多>>
资源描述
第一章 一、简答题 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
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服