C++第九章习题解答new

合集下载

二级教材《C语言程序设计》第9章

二级教材《C语言程序设计》第9章

第九章数组本章的内容比起别的章节来是最多的,不用说也是重点,其实我认为程序设计没有非重点。

任何地方不懂都是不行的。

习题答案一、选择题:题号答案解题思路9.1DD选项中,*(a+i)相当于a[i],已经是元素的值,外面再加一个*号,则出错。

9.2A首先,这四个选项的形式都是合法的。

表示的也都是地址。

但是B和C两项不能使i增值变化,因此会陷入死循环。

而D在输入数据时,第一次就赋给a[1],因此达不到目的。

只有A是对的。

9.3Ap等于数组a的首地址&a[0],p+2就是把指针向高地址位移动两个整型存储单元。

此时指向a[2]。

9.4A内循环使n数组的两个元素分别加1,循环两次后,两个元素的值都为2。

但是,要求输出的是n[2],超出数组定义的上界,所以结果是不确定的值。

9.5C。

9.6A主要是看*p++是怎么算的,由于++符和*运算符是同级并且是右结合的,所以先得p++这个表达式的值,为p再与*结合,等于*p,执行本句后,p自增1,结果a[i]中的值没有变化。

9.7Bf函数功能是一个求数组元素连乘的积并返回。

主函数把数组a的首地址和需要连乘到的元素下标号传给形参。

因此要注意的就是循环进行了4次。

9.8D这其实是求地址值(十六进制),整型数占用两个字节,因此指针每移动一个存储单元,地址就增加2,所以p+9时,地址值增加了18,十六进制为12,加上194等于1a6。

9.9Cfun函数的功能是将一数组按给定的起始和终止下标范围内的元素反向排序。

主函数中三次调用,第一次排a[0]到a[3]四个元素,第二次排a[4]到a[9],第三次再全部反向排列。

9.10C定义行中的**k表示k是一个指向指针变量的指针,很简单的,k=&p,则**k=**(&p),"约"去一个&和一个*,**k就等于*p.前一行的*(p++)相当于*p,执行后p自增1。

9.11C输入时,getchar()函数将回车符也作为一个字符读入,超出数组长度的字符在缓冲区中没有输入数组。

C语言 第九章 结构体数据类型期末测试习题与答案

C语言 第九章 结构体数据类型期末测试习题与答案
}
程序运行后的输出结果是( )。
A.SunDan 20044
B.YangSan 20041
C.SunDan 20042
D.LiSiGuo 20042
参考答案:D
3、以下程序运行的结果是_( )。
#nclude”stdio.h
main()
{
struct date
{
int year , month , day ;
D.struct color
{ int red;
int green;
int blue;
} c l;
参考答案:B
7、有以下程序:
struct stu
{
char[10];
float score[3];
};
main( )
{
struct stu s[3]={{"20021",90,95,85},
{"20022",95,80,75},
} today ;
printf(“%d\n”,sizeof(struct date));
}
A.10
B.6
C.8
D.12
参考答案:D
4、设有如下说明
typedef struct ST
{
long a;
int b;
char c[2];
} NEW;
则下面叙述中正确的是______。
A.ST是一个结构体类型
B.NEW是一个结构体类型
A.typedef struct
{ int red;
int green;
int blue;
} COLOR;
COLOR cl;
B.struct color cl

C语言习题及答案(第九章)

C语言习题及答案(第九章)

9-3编写程序,使用结构体类型,输出一年十二个月的英文名称及相应天数。

解:#include "stdio.h"struct date{char month[10] ;int daynumber ;}main(){int i ;struct datea[12]={{"January",31},{"February",29},{"March",31},{"Aprial",30},{ "May",31},{"June",30},{"july",31},{"August",31},{"September",30}, {"October",31},{"November",30},{"December",31}} ;for(i=0;i<12;i++);printf("%d 月:%s %d\n",i+1,a[i].month,a[i].daynumber) ;}思考:如何对结构体变量进行初始化?对结构体变量的引用为何要体现为分量(或成员)的引用?9-4 编写程序求空间任一点到原点的距离,点用结构体描述。

并请考虑求空间中任意两点的距离的程序。

解:#include "stdio.h"#include "math.h"struct point{float x ;float y ;float z ;} main(){double d1,d2,d ;struct point p1,p2 ;printf("请输入第一个点的坐标:");scanf("%f,%f,%f",&p1.x,&p1.y,&p1.z);printf("请输入第二个点的坐标:");scanf("%f,%f,%f",&p2.x,&p2.y,&p2.z);d1=sqrt(p1.x*p1.x+p1.y*p1.y+p1.z*p1.z);d2=sqrt(p2.x*p2.x+p2.y*p2.y+p2.z*p2.z);d=sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)+(p2.z-p1.z)*( p2.z-p1.z));printf("第一个点到原点的距离:%f\n",d1);printf("第二个点到原点的距离:%f\n",d2);printf("两点间的距离:%f\n",d);}9-5 编写输入、输出10个朋友数据的通讯录程序,每个朋友数据包括姓名、地址、邮编、电话、传呼、手机等数据。

c语言第九章题库及详解答案

c语言第九章题库及详解答案

c语言第九章题库及详解答案C语言第九章题库及详解答案一、选择题1. 在C语言中,以下哪个关键字用于定义数组?A. arrayB. listC. setD. define2. 以下哪个选项是正确的C语言数组声明?A. int myArray[];B. int myArray[10] = {};C. int myArray = 10;D. int myArray(10);3. 数组元素的默认初始化值是什么?A. 0B. 1C. -1D. 随机值4. 在C语言中,数组的索引是从哪个数字开始的?A. 0B. 1C. -1D. 105. 以下哪个函数可以用于计算数组中元素的个数?A. count()B. size()C. length()D. sizeof()二、填空题6. 在C语言中,声明一个具有10个整数元素的数组的语句是:________。

答案:int myArray[10];7. 如果数组的索引从0开始,那么数组myArray[10]的最后一个元素的索引是:________。

答案:98. 要初始化一个数组的所有元素为0,可以使用:________。

答案:int myArray[10] = {0};9. 在C语言中,可以使用________运算符来访问数组的元素。

答案:[]10. 当数组作为参数传递给函数时,实际上传递的是数组的________。

答案:首地址三、简答题11. 解释C语言中数组的内存分配方式。

答案:在C语言中,数组是连续存储在内存中的。

数组的内存分配是静态的,即在编译时分配。

数组的元素按照声明的顺序在内存中连续排列。

12. 说明数组和指针在C语言中的关系。

答案:在C语言中,数组名可以作为指针使用。

数组名代表数组的首地址。

当数组作为参数传递给函数时,数组名退化为指向数组第一个元素的指针。

四、编程题13. 编写一个C语言程序,实现对一个整数数组的排序。

答案:```c#include <stdio.h>void sortArray(int arr[], int size) {int i, j, temp;for (i = 0; i < size - 1; i++) {for (j = i + 1; j < size; j++) {if (arr[i] > arr[j]) {temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}}int main() {int myArray[] = {5, 3, 8, 2, 1};int size = sizeof(myArray) / sizeof(myArray[0]);sortArray(myArray, size);printf("Sorted array: ");for (int i = 0; i < size; i++) {printf("%d ", myArray[i]);}return 0;}```14. 编写一个C语言程序,实现查找数组中的最大值和最小值。

C语言程序设计第九-十一章习题参考答案

C语言程序设计第九-十一章习题参考答案

C语言第九章参考答案1.选择题:12345 67890 12ADCDB BCDDC BB2.填空题:(1)指针或者地址(2)110(3)①char *p; ②p=&ch; ③scanf("%c",p); ④*p='a'; ⑤printf("%c",*p);(4)10 (5)0、7 (6)ab (7)abcdcd (8) 7ㄩ1(9)void (*p)(int * ,int*); (10)r+b[k] (11) '\0' 、n++; (12)aegi 3.改错题:(1) 第一处改正:* sub=x-y第二处改正:scanf("%f%f",&x,&y);第三处改正:calc(x,y,&add,&sub);(2)第一处:char swap (char *p1,char*p2)改为void swap (char *p1,char*p2)第二处:strcpy(p,p1)改为strcpy(p,p2)(3)第一处:p1=p1+m改为p1=p1+m-1第二处:*p1=*p2改为*p2=*p1第三处:*p2="\0"改为*p2='\0'(4)第一处:char *fun(char *str,char t)改为char *fun(char *str,char *t)第二处:s=NuLL改为s=NULL;第三处:if(r==p)改为if(*r==*p)(5)第一处:fun(int **b,int n)改为fun(int (*b)[N],int n)第二处:b[j][k]=k*j 改为b[j][k]=(k+1)*(j+1)4编程题(1)/*习题9-4-1 */void move(int array[20],int n,int m) ;main(){ int number[20],n,m,i;printf("How many numbers?"); /*共有多少个数*/scanf("%d",&n);printf("Input %d numbers:\n",n); /*输入n个数*/for(i=0;i<n;i++)scanf("%d",&number[i]);printf("How many place you want to move?"); /*后移多少个位置*/scanf("%d",&m);move(number,n,m); /*调用move函数*/ printf("Now,they are:\n");for(i=0;i<n;i++)printf("%d ",number[i]);}void move(int array[20],int n,int m) /*循环后移函数*/{ int *p,array_end;array_end=*(array+n-1);for(p=array+n-1;p>array;p--)*p=*(p-1);*array=array_end;m--;if(m>0) move(array,n,m); /*递归调用,当循环次数m减至0时,停止调用*/}(2)/*习题9-4-2 */#include<stdio.h>#include<string.h>#define TOTAL 6int mseek(char*str[],char xstr[],int n){ int i;for(i=0; i<n; i++){ if(strcmp(str[i],xstr)==0)return 1;}return 0;}main(){ char*name[TOTAL]={"Lining","Linshan","Tianyuan","Zhangqiang","Haipo","Fangbing"};char xname[20];printf("enter a name:");gets(xname);if(mseek(name,xname,TOTAL))printf("Found!\n");elseprintf("Not found!\n");}(3)/*习题9-4-3 */#include <stdio.h>#include <string.h>void fun(char *str,int num[4]){ int i;for(i=0; i<4; i++) num[i]=0;while(*str!='\0'){ if(*str>='a' && *str<='z' || *str>='A' && *str<='Z')num[0]++;else if(*str==' ')num[1]++;else if(*str>='0' && *str<='9')num[2]++;elsenum[3]++;str++;}}#define N 80main(){ int string[N];int n[4],i;gets(string);fun(string,n);for(i=0; i<4; i++)printf("%d\t",n[i]);}(4)/*习题9-4-4 *//* 调试时,可这样输入数据:*//*11 12 13 14 1521 22 23 24 2531 32 33 34 3541 42 43 44 4551 52 53 54 55 */#include <stdio.h>main(){ int a[5][5],*p,i,j;void change(int *p);printf("Input matrix:\n");for(i=0;i<5;i++) /*输入矩阵*/for(j=0;j<5;j++)scanf("%d",&a[i][j]);p=&a[0][0]; /*使p指向0行0列元素*/ change(p); /*调用函数, 实现交换*/ printf("Now, matrix: \n");for(i=0;i<5;i++) /*输出已交换的矩阵*/{ for(j=0;j<5;j++)printf("%4d",a[i][j]);printf("\n");}}void change(int *p) /*交换函数*/{ int i,j,temp;int *pmax,*pmin;pmax=p;pmin=p;for(i=0;i<5;i++) /*找最大值和最小值的地址,并赋给pmax,pmin*/ for(j=0;j<5;j++){ if(*pmax<*(p+5*i+j)) pmax=p+5*i+j;if(*pmin>*(p+5*i+j)) pmin=p+5*i+j;}temp=*(p+12); /*将最大值换给中心元素*/*(p+12)=*pmax;*pmax=temp;temp=*p; /*将最小值换给左上角元素*/*p=*pmin;*pmin=temp;pmin=p+1;for(i=0;i<5;i++) /*找第二最小值的地址赋给pmin*/ for(j=0;j<5;j++)if(((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j))) pmin=p+5*i+j;temp=*pmin; /*将第二最小值换给右上角元素*/*pmin=*(p+4);*(p+4)=temp;pmin=p+1;for(i=0;i<5;i++) /*找第三最小值的地址赋给pmin*/ for(j=0;j<5;j++)if(((p+5*i+j)!=(p+4))&&((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j)))pmin=p+5*i+j; /*将第三最小值换给左下角元素*/ temp=*pmin;*pmin=*(p+20);*(p+20)=temp;pmin=p+1;for(i=0;i<5;i++) /*找第四最小值的地址赋给pmin*/ for(j=0;j<5;j++)if(((p+5*i+j)!=p)&&((p+5*i+j)!=(p+4))&&((p+5*i+j)!=(p+20))&&(*pmin>*(p+5*i+j))) pmin=p+5*i+j;temp=*pmin; /*将第四最小值换给右下角元素*/*pmin=*(p+24);*(p+24)=temp;}(5)/*习题9-4-5 *//*可以专门编写一个函数求各学生的平均分,存到aver[4]数组*/#include <stdio.h>void avcour1(float score[][5]);void fali2(int num[4],float score[4][5]);void good(int num[4],float score[4][5]);main(){int i,j,num[4];//数组num代表学号float score[4][5];printf("Input NO. and scores: \n");for(i=0;i<4;i++){ printf("NO.");scanf("%d",&num[i]);printf("scores:");for(j=0;j<5;j++)scanf("%f",&score[i][j]);}printf("\n\n");avcour1(score); /*求出第一门课的平均成绩*/ printf("\n\n");fali2(num,score); /*找出2门课不及格的学生*/printf("\n\n");good(num,score); /*找出成绩好的学生*/}void avcour1(float score[][5]) /*第一门课的平均成绩的函数*/{ int i;float sum,average1;sum=0.0;for(i=0;i<4;i++)sum=sum+score[0][i]; /*累计每个学生的得分*/ average1=sum/4; /*计算平均成绩*/printf("course 1 average score: %6.2f. \n",average1);}void fali2(int num[4],float score[4][5])/*找两门以上课程不及格的学生的函数*/{ int i,j,k,label;float sum=0;printf("= = = = = = = =Student who is fail = = = = = = = = = = = =\n");printf(" NO.");for(i=0;i<5;i++)printf("%10d",i+1);printf(" average\n");for(i=0;i<4;i++){ label=0;for(j=0;j<5;j++)if((score[i][j])<60.0) label++;if(label>=2){ printf("%5d",num[i]);for(k=0;k<5;k++){ printf("%10.2f",score[i][k]);sum+=score[i][k];}printf("%10.2f\n",sum/5);}}}void good(int num[4],float score[4][5])/*找成绩优秀的学生(各门85分以上或平均90分以上)的函数*/ { int i,j,k,n;float sum=0,aver[4];printf("= = = = = = = =Student whose score is good= = = = = = = =\n");printf(" NO.");for(i=0;i<5;i++)printf("%10d",i+1);printf(" average\n");for(i=0;i<4;i++){ n=0;sum=0;for(j=0;j<5;j++){if((score[i][j])>85.0) n++;sum+=score[i][j];}aver[i]=sum/5;if((n==5)||(aver[i]>=90)){ printf("%5d",num[i]);for(k=0;k<5;k++)printf("%10.2f",score[i][k]);printf("%10.2f\n",aver[i]);}}}(6)/*习题9-4-6*/#include <math.h>double sigma(double (*fn)(double),double l,double u){ double sum=0,d;for(d=l; d<u; d+=0.1)sum+=fn(d);return sum;}void main(){ double sum;sum=sigma(sin,0.1,1.0);printf("sum of sin from 0.1 to 1.0 is: %f\n",sum);sum=sigma(cos,0.5,3.0);printf("sum of cos from 0.5 to 3.0 is: %f\n",sum);}(7)/*习题9-4-7 */main(){ int i;char *month_name(int n);printf("input Month No.:\n");scanf("%d",&i);printf("Month No.:%2d --> %s\n",i,month_name(i)); /*调用指针函数month_name()*/ }char *month_name(int n)/*定义一个指针函数month_name(),返回一个指向字符串的指针*/{ static char *name[]={"Illegal Month","January", "February", "March", "April","May", "June", "July", "August","September", "October", "November", "December"};return((n<1||n>12)?name[0]:name[n]);}(8)/*习题9-4-8 */#include <stdio.h>#include <string.h>#define N 10main(){ void sort(char *p[]);int i;char *p[N],str[N][20];for(i=0;i<N;i++)p[i]=str[i]; /*将第i个字符串的首地址赋予指针数组p的第i个元素*/ printf("Input strings:\n");for(i=0;i<N;i++)scanf("%s",p[i]);sort(p);printf("Now, the sequence is:\n");for(i=0;i<N;i++)printf("%s\n",p[i]);}void sort(char *p[]){ int i,j;char *temp;for(i=0;i<N-1;i++)for(j=0;j<N-1-i;j++)if(strcmp(*(p+j),*(p+j+1))>0){ temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;}}(9)/*习题9-4-9 */#include <stdio.h>#define LINEMAX 20 /*定义字符串的最大长度*/main(){ void sort(char **p);int i;char **p,*pstr[5],str[5][LINEMAX];for(i=0;i<5;i++)pstr[i]=str[i]; /*将第i个字符串的首地址赋予指针数组pstr的第i 个元素*/printf("Input 5 strings:\n");for(i=0;i<5;i++)scanf("%s",pstr[i]);p=pstr;sort(p);printf("strings sorted:\n");for(i=0;i<5;i++)printf("%s\n",pstr[i]);}void sort(char **p) /*冒泡法对5个字符串排序的函数*/ { int i,j;char *temp;for(i=0;i<5;i++){ for(j=i+1;j<5;j++){ if(strcmp(*(p+i),*(p+j))>0) /*比较后交换字符串地址*/{ temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;}}}}(10)void StrOR(char xx[][80],int maxline){ int i,righto,j,s,k;char temp[80];for(i=0; i<maxline; i++)for(j=strlen(xx[i])-1; j>=0; j--){ k=0; memset(temp,0,80);if(xx[i][j]=='o'){ righto=j;for(s=righto+1; s<strlen(xx[i]); s++)temp[k++]=xx[i][s];for(s=0;s<righto;s++)if(xx[i][s]!='o') temp[k++]=xx[i][s];strcpy(xx[i],temp);}else continue;}}C语言第十章参考答案1. 选择dccda cab2..填空(1)struct studentstrcmp(str,stu[i].name)==0break;(2)p=personp-person<3old=p->age;q->name,q->age(3)p!=NULLc++p->next(4)&per[i].body.eye&per[i].body.f.height&per[i].body.f.weight3.编程题(1)#include <stdio.h>struct data{ int year;int month;int day;};main(){ struct data a;int monthnum[12]={31,28,31,30,31,30,31,31,30,31,30,31};int i,sum=0;scanf("%d%d%d",&a.year,&a.month,&a.day);for(i=0;i<a.month-1;i++)sum+=monthnum[i];sum+=a.day;if(a.year%4==0 && a.year%100!=0 ||a.year%400==0)sum+=1;printf("%d年%d月%d日is the %d day",a.year,a.month,a.day,sum); }(2)#include <stdio.h>#include <stdlib.h>struct study{ float chinese;float maths;float english;float avg;};main(){ struct study student;scanf("%f%f%f",&student.chinese,&student.maths,&student.english);student.avg=(student.chinese+student.maths+student.english)/3;printf("average score is %f\n",student.avg);}(3)#include <stdio.h>#include <stdlib.h>struct study{ int num;float chinese;float maths;float english;float avg;};main(){ struct study s[3];struct study *p;for(p=s;p<s+3;p++){ scanf("%d%f%f%f",&(p->num),&(p->chinese),&(p->maths),&(p->english));p->avg=(p->chinese+p->maths+p->english)/3;}for(p=s;p<s+3;p++)printf("%d %3.1f %3.1f %3.1f %3.1f\n",p->num,p->chinese,p->maths,p->english,p->a vg);}(4)#include <stdio.h>#include <string.h>#define N 3typedef struct{char dm[5]; /*产品代码*/char mc[11]; /* 产品名称*/int dj; /* 单价*/int sl; /* 数量*/long je; /* 金额*/} PRO;void SortDat(PRO sell[],int n){ int i,j;PRO xy;for(i=0; i<N-1; i++)for(j=i+1; j<N; j++)if(strcmp(sell[i].mc,sell[j].mc)>0||strcmp(sell[i].mc,sell[j].mc)==0&&sell[i].je>sell[j].je) { xy=sell[i];sell[i]=sell[j];sell[j]=xy;}}void main(){ PRO sell[N];int i;for(i=0; i<N; i++){scanf("%s%s",sell[i].dm,sell[i].mc); //可这样输入,如:101 aaascanf("%d%d",&sell[i].dj,&sell[i].sl); //可这样输入,如:10 20sell[i].je=sell[i].dj*sell[i].sl;}SortDat(sell,N);printf("dm\t\tmc\t\tdj\tsl\tje\n");for(i=0; i<N; i++){printf("%s\t\t%s\t\t%d\t%d\t%ld\n",sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);}}(5)#include <stdio.h>#include <stdlib.h>main(){int *pi;int i,j,t,n;printf("输入整数个数:");scanf("%d",&n);pi=(int *)malloc(n*sizeof(int));printf("输入整数:");for(i=0; i<n; i++)scanf("%d",&pi[i]);for(i=0; i<n-1; i++)for(j=i+1; j<n; j++)if(pi[i]>pi[j]){t=pi[i]; pi[i]=pi[j]; p i[j]=t;}for(i=0; i<n; i++)printf("%d ",pi[i]);printf("\n");free(pi);}#include <stdio.h>#include <stdlib.h>struct stu{ int num;char name[20];int age;struct stu *next;};void list(struct stu *head){ struct stu *p;printf("The list records are:\n");p=head;if(head!=NULL)do{ printf("%d\t%s\t%d\n",p->num,p->name,p->age);p=p->next;}while(p!=NULL);elseprintf("The list is null");}struct stu * insert(struct stu *head,struct stu *stud){ struct stu *p0,*p1,*p2;p1=head; /*p1指向链表第一个节点*/ p0=stud; /*p0指向要插入的节点*/if(head==NULL) /*原链表是空表*/{ head=p0;p0->next=NULL; /*p0作为头指针*/ }else{ while((p1!=NULL)&&(p0->num>=p1->num)){ p2=p1;p1=p1->next;} /*p1指针后移*/if(p1!=NULL){ if(head==p1) head=p0;/*插入链表开头*/else p2->next=p0; /*插入到p2节点之后*/p0->next=p1;}else{ p2->next=p0;p0->next=NULL;}/*插入到最后*/return head;}main(){ struct stu *newstu,*head;head=NULL;int num;scanf("%d",&num);while(num!=0){ newstu=(struct stu *)malloc(sizeof(struct stu));newstu->num=num;scanf("%s",newstu->name);scanf("%d",&newstu->age);head=insert(head,newstu);scanf("%d",&num);}list(head);}(7)#include <stdio.h>void partition(unsigned long int num){ union a{ unsigned short int part[2];unsigned long int w;}n,*p;p=&n;n.w=num;printf("long int=%lx\n",num);printf("low part num=%0x,high part num=%0x\n",p->part[0],p->part[1]); }main(){ unsigned long int x;x=0x23456789; //这是为了调试方便,应改为scanf函数partition(x);}C语言第十一章参考答案一、选择1.B2.A3.B4.C5.B6.C7.D8.C9.C、D 10.A 11.A 12.C 13.B二、填空1 :fopen(fname,"w")ch2:"r"fgetc(fp) 或getc(fp)3:"bi.dat"&jfp4:==NULLflag==1s[strlen(s)-1]=='\n'三、改错题1:第一处改为:long num=0;第二处改为: !feof(fp) 或!=0改为==02: 第一处改为:rewind(fp)第二处改为: fgetc(fp)!= '\n' '\0'后面加上&& feof(fp)!=1四、编程题(1)#include<stdio.h>#include <stdlib.h>#include <string.h>main(){FILE *fp;char str[100];int i=0;if((fp=fopen("myfile","w"))==NULL){ printf("Can not open the file.\n");exit(0);}printf("Input a string:\n");gets(str);while(str[i]!='!'){ if(str[i]>='a'&& str[i]<='z')str[i]=str[i]-32;fputc(str[i],fp);i++;}fclose(fp);fp=fopen("myfile","r");fgets(str,strlen(str)+1,fp);printf("%s\n",str);fclose(fp);}(2)#include<stdio.h>struct student{ char num[10];char name[8];int score[3];float ave;}stu[5];main(){int i,j,sum;FILE *fp;for(i=0;i<5;i++){ printf("\nInput score of student %d:\n",i+1);printf("NO.:");scanf("%s",stu[i].num);printf("name:");scanf("%s",stu[i].name);sum=0;for(j=0;j<3;j++){ printf("score %d:",j+1);scanf("%d",&stu[i].score[j]);sum+=stu[i].score[j];}stu[i].ave=sum/3.0;}fp=fopen("stud","w");for(i=0;i<5;i++)if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)printf("File write error\n");fclose(fp);fp=fopen("stud","r");for(i=0;i<5;i++){ fread(&stu[i],sizeof(struct student),1,fp);printf("%s,%s,%d,%d,%d,%6.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);}}(3)#include<stdio.h>#include <stdlib.h>main(){char s[80];int a;FILE *fp;if((fp=fopen("test","w"))==NULL){ printf("Cannot open file.\n");exit(1);}fscanf(stdin,"%s%d",s,&a); //相当于scanffprintf(fp,"%s %d",s,a);fclose(fp);if((fp=fopen("test","r"))==NULL){ printf("Cannot open file.\n");exit(1);}fscanf(fp,"%s %d",s,&a);fprintf(stdout,"%s %d\n",s,a); //相当于printf fclose(fp);}(4)#include<stdio.h>#include <stdlib.h>main(){FILE *fp;int i,j,n,i1;char c[100],t,ch;if((fp=fopen("A","r"))==NULL){printf("Can not open the file.\n");exit(0);}printf("\nfile A:\n");for(i=0;(ch=fgetc(fp))!=EOF;i++){c[i]=ch;putchar(c[i]);}fclose(fp);i1=i;if((fp=fopen("B","r"))==NULL){ printf("\n Can not open the file.");exit(0);}printf("\nfile B:\n");for(i=i1;(ch=fgetc(fp))!=EOF;i++){c[i]=ch;putchar(c[i]);}fclose(fp);n=i;for(i=0;i<n;i++)for(j=i+1;j<n;j++)if(c[i]>c[j]){ t=c[i];c[i]=c[j];c[j]=t;}printf("\n file C:\n");fp=fopen("c","w");for(i=0;i<n;i++){ putc(c[i],fp);putchar(c[i]);}fclose(fp);}(5)#include<stdio.h>main(){FILE *fp1,*fp2;char ch;fp1=fopen("file1.c","r");fp2=fopen("file2.c","w");ch=fgetc(fp1);while(!feof(fp1)){putchar(ch);ch=fgetc(fp1);}rewind(fp1);while(!feof(fp1))fputc(fgetc(fp1),fp2);fclose(fp1);fclose(fp2);}(6)#include<stdio.h>main(){FILE *fp; long position;fp=fopen("data.txt","w");position=ftell(fp);printf("position=%ld\n",position);fprintf(fp,"Sample data\n");position=ftell(fp);printf("position=%ld\n",position);fclose(fp);}第12章1.选择题(1)D (2)C (3)D (4)D (5)C(6)D (7)D (8)B (9)A (10).C2.填空题(1) //(2) public、private 、protected(3) 函数类型类名::函数名(形参表列) 或类型类名::函数名(参数表)(4) 内联函数(5) 构造函数(6) 类名, 创建对象时(7) 私有(8) 私有(9) 基类的构造函数成员对象的构造函数派生类本身的构造函数3.概念题(1)答:本质差别是C++是面向对象的,而C语言是面向过程的。

C语言理论教材各章后习题参考答案第九章习题

C语言理论教材各章后习题参考答案第九章习题

第九章习题参考答案一、选择题9.1 答案:B9.2 答案:C9.3 答案:D9.4 答案:B9.5 答案:D9.6 答案:C9.7 答案:C9.8 答案:D9.9 答案:B9.10 答案:D二、读程序回答问题9.11 答案:C9.12 答案:A9.13 答案:A9.14 答案:D9.15 答案:C三、程序填空9.16答案:①FILE *fp;② "Ef9-16.txt","w"或"Ef9-16.txt","w+";③ch,fp。

9.17答案:①Ef9-17.dat;② 8*sizeof(char)。

9.18 答案:①fopen; ② SEEK_END或2。

9.19 答案:①fname; ②fp。

9.20 答案:①argc!=2; ②r; ③NULL; ④row++ ; ⑤fclose(fp)。

四、编写程序9.21 从键盘输入一行字符串,将其中的小字母全部转换成大写字母,然后输出到一个磁盘文件" Ef9-21.txt"中保存。

参考源程序如下:#include <stdio.h>void main( ){FILE *fp;char str[100];int i;if ((fp=fopen("Ef9-21.txt ", "w")) == NULL) {printf ("Cannot open the file.\n");exit(0);}printf ("Input a string:");gets (str); /* 读入一行字符串 */for (i=0; str[i]&&i<100; i++) { /* 处理该行中的每一个字符 */if (str[i] >= 'a' && str[i] <= 'z') /* 若是小写字母 */str[i] -= 'a' - 'A'; /* 将小写字母转换为大写字母 */fputc (str[i], fp); /* 将转换后的字符写入文件 */}fclose (fp); /* 结束文件输入操作关闭文件 */}9.22文件Ef9-22.txt中存放了一个学生各门课程的考试分数,数据之间以逗号分割。

c语言习题第九章答案

c语言习题第九章答案

c语言习题第九章答案C语言习题第九章答案第九章是C语言学习中的一个重要章节,主要涉及指针和动态内存分配的知识。

在这一章中,我们将学习如何使用指针来操作内存,并且了解动态内存分配的概念和用法。

本文将为大家提供第九章习题的答案,帮助大家更好地理解和掌握这些知识。

1. 以下代码的输出结果是什么?```c#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int *ptr = arr;printf("%d\n", *ptr++);printf("%d\n", *ptr++);printf("%d\n", *ptr++);return 0;}```答案:输出结果为1、2、3。

解析:在这段代码中,我们定义了一个整型数组arr,并且定义了一个指针ptr,将arr的首地址赋值给ptr。

在输出语句中,我们使用了后置自增运算符,这意味着先输出ptr指向的值,然后再将指针ptr的值加1。

因此,第一个输出语句输出的是arr[0]的值1,第二个输出语句输出的是arr[1]的值2,第三个输出语句输出的是arr[2]的值3。

2. 以下代码的输出结果是什么?```c#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int *ptr = arr;printf("%d\n", *(ptr++));printf("%d\n", *(ptr++));printf("%d\n", *(ptr++));return 0;}```答案:输出结果为1、2、3。

解析:这段代码与上一题的代码非常相似,唯一的区别在于输出语句中对指针的解引用操作使用了括号。

这是因为后置自增运算符的优先级比解引用运算符高,为了保证先解引用再自增,我们需要使用括号来明确优先级。

数据结构(c语言版)题集答案——第九章_查找

数据结构(c语言版)题集答案——第九章_查找
{
*;
;
*;
} ;
{
*;
;
} ;供查找地双向循环链表类型
*( )在有序双向循环链表存储结构上地查找算法,假定每次查找都成功文档来自于网络搜索
{
;
(>>)
{
(>>) >;
;
}
(>{
(>;
;
}
;
}
分析:本题地平均查找长度与上一题相同,也是.
;
( )判断二叉树是否二叉排序树,是则返回,否则返回
{
(>) (>);
{
;
()沿分支向下查找
{
(>>[]);确定关键字所在子树
(>) ;关键字太大
>[];
}
(>[]);在叶子结点中查找
(>) ;找不到关键字
;
;
}
( )在树中插入字符串地结构见第四章文档来自于网络搜索
{
(*)(());
>;
>;建叶子结点
[];
;
(<>[([])])
{
;
>[([])];
;
}自上而下查找
(>)如果最后落到分支结点(无同义词):
(>>>)其余部分与上一题同
{
(>) >;
(>);
}
(>)
{
(>) >;
(>);
}
>;
>;
}
{
;
;
;域表示该结点地左子树地结点总数加
*,*;
} ,*;含域地平衡二叉排序树类型

C程序设计(第三版)习题答案(9、11章) 谭浩强著

C程序设计(第三版)习题答案(9、11章) 谭浩强著
printf("The best student is %s,sum=%d\n",stu[maxi].name,max);
}
printf("value=%format\t",x1);printf("value=%format\t",x2);putchar('\n');
输出结果:
value=5.000000ormat value=5.000000ormat
value=3.000000ormat value=8.000000ormat
break;
case 3:scanf("%s",s);
STRING(s);
break;
default:printf("error");
}
}
9.8main()
{int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);
main()
{int a,b;
scanf("%d,%d",&a,&b);
printf("%d",SURPLUS(a,b));
}
9.3#include"math.h"
#define S(a,b,c) ((a+b+c)/2)
#define AREA(a,b,c) (sqrt(S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(S(a,b,c)-c)))
scanf("%d",&stu.score[j]);

C++第九章习题解答new

C++第九章习题解答new

第九章流类库和输入/输出习题一.本概念与基础知识测试题9.3填空题9.1.1 在C++中“流”是表示(1)。

从流中取得数据称为(2),用符号(3)表示;向流中添加数据称为(4),用符号(5)表示。

答案:(1)数据从一个对象到另一个对象的传送(2)提取操作(3)>>(4)插入操作(5)<<9.1.2 抽象模板类(1)是所有基本流类的虚基类,它有一个保护访问限制的指针指向类(2),其作用是管理一个流的(3)。

C++流类库定义的cin,cout,cerr和clog 是(4)。

cin通过重载(5)执行输入,而cout,cerr和clog通过(6)执行输出。

答案:(1)ios(2)streambuf(3)缓冲区(4)全局流对象(5)>>(stream_extraction operator)(6)<<(stream_insertion operator)9.1.3 C++在类ios中定义了输入输出格式控制符,它是一个(1)。

该类型中的每一个量对应两个字节数据的一位,每一个位代表一种控制,如要取多种控制时可用(2)运算符来合成,放在一个(3)访问限制的(4)数中。

所以这些格式控制符必须通过类ios的(5)来访问。

答案:(1)公有的无名的枚举类型(2)或“|”(3)保护(4)一个长整型数(5)公共接口(函数)9.1.4 取代麻烦的流格式控制成员函数,可采用(1),其中有参数的,必须要求包含(2)头文件。

答案:(1)流操作子(2)iomanip.h9.1.5 通常标准设备输入指(1)。

标准设备输出指(2)。

答案:(1)键盘(2)显示屏9.1.6 EOF为(1)标志,在iostream.h中定义EOF为(2),在int get()函数中读入表明输入流结束标志(3),函数返回(4)。

答案:(1)文件结束标志(2)-1(3)^Z(Ctrl-Z)(4)EOF9.1.7 C++根据文件内容的(1)可分为两类(2)和(3),前者存取的最小信息单位为(4),后者为(5)。

数据结构(C语言版)习题及答案第九章

数据结构(C语言版)习题及答案第九章

习题一、选择题1、一组记录的排序码为(46,79,56,38,40,84),则利用堆排序的方法建立的初始堆为( B )。

A、79,46,56,38,40,80B、84,79,56,38,40,46C、84,79,56,46,40,38D、84,56,79,40,46,382、排序趟数与序列原始状态(原始排列)有关的排序方法是(ACD)方法。

A、插入排序B、选择排序C、冒泡排序D、快速排序3 、下列排序方法中,(B)是稳定的排序方法。

A、直接选择排序B、二分法插入排序C、希尔排序D、快速排序4、数据序列(8,9,10,4,5,6,20,1,2)只能是下列排序算法中( C )的两趟排序后的结果。

A、选择排序B、冒泡排序C、插入排序D、堆排序5、对序列(15,9,7,8,20,-1,4)进行排序,进行一趟排序后,数据的排列变为(4,9,-1,8,20,7,15),则采用的是(C)排序。

A、选择B、快速C、希尔D、冒泡6 、一组待排序记录的关键字为(46,79,56,38,40,84),则利用快速排序,以第一个记录为基准元素得到的一次划分结果为( C)。

A、(38,40,46,56,79,84)B、(40,38,46,79,56,84)C、(40,38,46,56,79,84)D、(40,38,46,84,56,79)7、用直接插入排序对下面四个序列进行排序(由小到大),元素比较次数最少的是( C )。

A、94,32,40,90,80,46,21,69B、32,40,21,46,69,94,90,80C、21,32,46,40,80,69,90,94D、90,69,80,46,21,32,94,408、若用冒泡排序对关键字序列(18,16,14,12,10,8)进行从小到大的排序,所需进行的关键字比较总次数是(B)。

A、10B、15C、21D、349、就排序算法所用的辅助空间而言,堆排序、快速排序和归并排序的关系( A)。

第09章的习题参考答案

第09章的习题参考答案
{
point++;
n++;
}
return n;
}
int main()
{
int length;
char *string=(char *)malloc(sizeof(char));
clrscr();
printf("Please input a string:");
j++;
k=0;
}
}
i+=1;
}
printf("\nthe left person's number is %d",i+1);/*数组是从0开始的,故编号从1开始算起时要
加1*/
scanf("%d",&position);
if(position>n||position<0) //位置不合法
{
printf("Wrong input!");
return 0;
}
printf("How many numbers do you want to reverse?");
pt1=&n1;
pt2=&n2;
pt3=&n3;
pt4=&n4;
if(n1<n2) //pt1指向最小者,pt2指向次小者,pt3指向次大者,pt4指向最大者
{
if(n2<n3)
{
if(n3>n4)
{
swap(pt3,pt4);
scanf("%d",&count);

C++课后习题答案第九章

C++课后习题答案第九章

实例化为模板类
(d) 函数的类模板参数须通过构造函数实例化
5. 建立类模板对象的实例化过程为( c )。
(a) 基类派生类
(b) 构造函数对

(c) 模板类对象
(d) 模板类模板
函数
6.在C++中,容器是一种( d )。
(a) 标准类
(b) 标准对象
(c) 标准
函数
(d) 标准类模板
9.2 阅读下列程序,写出执行结果
答案: 8.8 8
y = j; }
9.3 编程题
1.使用函数模板实现对不同类型数组求平均值的功能,并 在main()函数中分别求一个整型数组和一个单精度浮点型数组 的平均值。
解答:略。 2. 建立结点包括一个任意类型数据域和一个指针域的单向 链表类模板。在main()函数中使用该类模板建立数据域为整型 的单向链表,并把链表中的数据显示出来。 解答:
#include <iostream.h> template <typename T> class List { public:
List( T x ) { data = x; } void append( List *node ) { node->next = this; next = 0; }
List *getnext() { return next; } T getdata() {return data; } private: T data; List *next; }; void main() { int i, idata, n, fdata; cout << "输入结点的个数:"; cin >> n; cout << "输入结点的数据域:"; cin >> fdata; List <int> headnode( fdata ); List <int> *p, *last; last = &headnode; for( i=1; i<n; i++ ) { cin >> idata;

c语言第九章题库及详解答案

c语言第九章题库及详解答案

c语言第九章题库及详解答案C语言第九章题库及详解答案一、选择题1. 下列哪个选项是C语言中的关键字?- A. `int`- B. `float`- C. `double`- D. `string`答案:A2. 在C语言中,哪个运算符用于计算两个数的乘积?- A. `+`- B. `-`- C. `*`- D. `/`答案:C3. 以下哪个语句是正确的C语言数组声明?- A. `int array[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1};` - B. `int [10] array = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1};` - C. `int array[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1};`- D. 以上都是答案:D二、填空题1. 在C语言中,用于定义函数的关键字是______。

答案:void 或其他返回类型(根据函数定义)2. 以下代码段中,`printf`函数的返回类型是______。

```cint main() {printf("Hello, World!\n");return 0;}```答案:void三、简答题1. 请简述C语言中指针和引用的区别。

答案:在C语言中,指针是一个变量,它存储了另一个变量的内存地址。

指针可以被重新赋值为其他地址,并且可以通过指针来修改它所指向的变量的值。

而引用在C语言中并不存在,这是C++中的一个概念,它是一个别名,引用必须在定义时被初始化,并且不能被重新赋值为另一个变量的别名。

2. 解释C语言中的递归函数是如何工作的。

答案:递归函数是在其定义中调用自身的函数。

它通常用于解决可以被分解为相似子问题的问题。

递归函数工作时,首先检查是否有基本情况(base case),如果没有达到基本情况,它会进入递归调用,每次调用都会处理问题的一个更小的部分,直到达到基本情况,然后逐层返回结果。

《C语言程序设计》教材习题答案第9章

《C语言程序设计》教材习题答案第9章
result = funtion(max, min);
else //需要交换
result = funtion(min, max);
//结果
printf("两日期间相差的天数为:%d\n", result);
}
//比较两日期的大小
bool compear(DATE_P max, DATE_P min)
char name[10];
char sex[10];
int score[5];
int sum;
float average;
};
struct student stu[N],s;
int i,j;
for(i=0;i<N;i++)
{
stu[i].sum=0;
stu[i].average=0;
printf("please scanf num name sex score(1) score(2) score(3) score(4) score(5)\n");
5、有20个学生,每个学生的数据包括学号(num)、姓名(name)、性别(sex)、5门课程成绩(score[5])。要求编写一个程序,输入学生数据,计算并输出每个学生的总分和平均分。
#include <stdio.h>
#define N 2
void main()
{
struct student
{
int num;
{
switch(i)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:result += 31;break;//大月31天,注:12月不会出现,所以忽略不写

C语言第九章习题带答案

C语言第九章习题带答案

练习9-1答案一、选择题1.typedef unsigned long LONG的作用是( D )。

A.建立了一种新的数据类型B.定义了一个整形变量C.定义了一个长整型变量D.定义了一个新的数据类型标识符2.下面的4个运算符中,优先级最低的是( D )。

A.( ) B.. C.-> D.++3.已知:struct{int i;char c;float a;} test;则sizeof(test)的值是( D )。

A.4 B.5 C.6 D.74.当声明一个结构变量时系统分配给它的内存是( A )。

A.各成员所需内存量的总和B.结构中第一个成员所需内存量C.成员中占内存量最大者所需的容量D.结构中最后一个成员所需内存量5.以下对结构类型变量的定义中错误的是( D )。

A.typedef struct student B.struct student{ i nt num; {int num;float age; float age;} STUDENT std1; } std1;C.struct D.struct{ i nt num; {int num;float age; float age;} std1; } student;struct student std1;6.根据下面的定义,能打印出字母M的语句是( D )。

struct person{char name[9];int age;};struct person class[10]={"John", 17, "Paul", 19, "Mary", 18, "adam", 16};A.printf("%c\n", class[3].name); B.printf("%c\n", class[3].name[1]);C.printf("%c\n", class[2].name[1]); D.printf("%c\n", class[2].name[0]); 7.以下scanf函数调用语句中对结构变量成员的错误引用是( D )。

C语言程序设计(第3版)第9章补充习题及答案

C语言程序设计(第3版)第9章补充习题及答案

第9章补充习题及答案习题9.1 选择题(1)设int i,*p= &i;以下语句正确的是。

A.*p=10; B.i=p; C.i=*p; D.p = 2*p+1;(2)设char chStr[10],*pStr=chStr; 以下语句不正确的是。

A.pStr= chStr +5; B.chStr=pStr+ chStr;C.chStr [2]=pStr [4]; D.*pStr = chStr [0];(3)以下程序的执行结果是。

#include "stdio.h"void main(){ int iA[ ]={1,2,3,4,5,6};int *pInt;pInt = iA;*(pInt+3)+=2;printf("%d,%d\n",*pInt,*(pInt+3));}A.1,3 B.1,6 C.3,6 D.1,4 (4)以下fnMycomp()函数的功能是按词典顺序比较两个字符串chStr1和chStr2的大小。

如果chStr1大于chStr2,则返回正值;等于则返回0;小于则返回负值。

请选择正确的编号填空。

int fnMycomp(char *chStr1,char *chStr2){for( ; chStr1==chStr2; )if(*chStr1== '\0')return (0);return (*chStr1-*chStr2);}A.chStr1++ B.chStr2++C.chStr1++;chStr2++ D.chStr1++,chStr2++ (5)以下fnMycopy()函数的功能是将两个字符串chStr1和chStr2连接起来。

请选择正确的编号填空。

void fnMycopy(char *chStr1, char *chStr2){char *pStr=chStr1;while(*chStr1) ① ;while(*chStr2){*chStr1= ② ;chStr1++;chStr2++;}*chStr1 = '\0';③ ;}① A.chStr1-- B.chStr1++ C.chStr1D.*chStr1② A.*chStr2 B.chStr2 C.chStr2--D.*chStr2++③ A.return (chStr1) B.return (chStr2)C.return(pStr) D.return(pStr-chStr2)9.2 填空题(1)以下程序的执行结果是。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第九章流类库和输入/输出习题一.本概念与基础知识测试题9.3填空题9.1.1 在C++中“流”是表示(1)。

从流中取得数据称为(2),用符号(3)表示;向流中添加数据称为(4),用符号(5)表示。

答案:(1)数据从一个对象到另一个对象的传送(2)提取操作(3)>>(4)插入操作(5)<<9.1.2 抽象模板类(1)是所有基本流类的虚基类,它有一个保护访问限制的指针指向类(2),其作用是管理一个流的(3)。

C++流类库定义的cin,cout,cerr和clog 是(4)。

cin通过重载(5)执行输入,而cout,cerr和clog通过(6)执行输出。

答案:(1)ios(2)streambuf(3)缓冲区(4)全局流对象(5)>>(stream_extraction operator)(6)<<(stream_insertion operator)9.1.3 C++在类ios中定义了输入输出格式控制符,它是一个(1)。

该类型中的每一个量对应两个字节数据的一位,每一个位代表一种控制,如要取多种控制时可用(2)运算符来合成,放在一个(3)访问限制的(4)数中。

所以这些格式控制符必须通过类ios的(5)来访问。

答案:(1)公有的无名的枚举类型(2)或“|”(3)保护(4)一个长整型数(5)公共接口(函数)9.1.4 取代麻烦的流格式控制成员函数,可采用(1),其中有参数的,必须要求包含(2)头文件。

答案:(1)流操作子(2)iomanip.h9.1.5 通常标准设备输入指(1)。

标准设备输出指(2)。

答案:(1)键盘(2)显示屏9.1.6 EOF为(1)标志,在iostream.h中定义EOF为(2),在int get()函数中读入表明输入流结束标志(3),函数返回(4)。

答案:(1)文件结束标志(2)-1(3)^Z(Ctrl-Z)(4)EOF9.1.7 C++根据文件内容的(1)可分为两类(2)和(3),前者存取的最小信息单位为(4),后者为(5)。

答案:(1)数据格式(2)文本文件(3)二进制文件(4)字符(5)字节9.1.8 当系统需要读入数据时是从(1)文件读入,即(2)操作。

而系统要写数据时,是写到(3)文件中,即(4)操作。

答案:(1)输入(2)提取(3)输出(4)插入9.1.9 在面向对象的程序设计中,C++数据存入文件称作(1),而由文件获得数据称作(2)。

按常规前者往往放在(3)函数中,而后者放在(4)函数中。

答案:(1)把对象存入文件(2)由文件重构对象(3)析构函数(4)构造函数9.1.10 文件的读写可以是随机的,意思是(1),也可以是顺序的,意思是(2)或(3)。

答案:(1)可以从文件任何位置进行读写(2)从文件头开始(3)从尾部续上9.1.11C++把每一个文件都看成一个(1)流,并以(2)结束。

对文件读写实际上受到(3)指针的控制,输入流的指针也称为(4),每一次提取从该指针所指位置开始。

输出流的指针也称为(5),每一次插入也从该指针所指位置开始。

每次操作后自动将指针向文件尾移动。

如果能任意向前向后移动该指针,则可实现(6)。

答案:(1)有序的字节(2)文件结束符(end of file marker)(3)文件定位(4)读指针(5)写指针(6)随机读写9.3简答题9..1因cin为缓冲流,当键盘一次输入数据过多,保存在缓冲区中了,但这些数据可能是错的,希望清空它,以便下一次要求输入时,按提示正确输入,应该怎样办?答:只能读空缓冲区。

9..2流状态标志字state各位代表了什么?怎样使用?答:全0,goodbit=0x00,流正常第1位为1,eofbit=0x01,输入流结束,忽略后继提取操作;或文件结束,已无数据可取第2位为1,failbit=0x02,最近的I/O操作失败,流可恢复第3位为1,badbit=0x04,最近的I/O操作非法,流可恢复第4位为1,hardfail=0x08,I/O出现致命错误,流不可恢复,VC++6.0不支持采用成员函数进行操作:int ios::rdstate() const {return state;} //读取状态字int ios:operator!() const{return state&(badbit|failbit);} //可用操作符!()代替fail() int ios::bad(){ return state & badbit;} //返回非法操作位void ios::clear(int _i){ lock();state=_i;unlock();} //人工设置状态,可用来清状态int ios::eof() const {return state&eofbit;} //返回流(文件)结束位int ios::fail() const{return state&(badbit|failbit);} //返回操作非法和操作失败这两位int ios::good() const{return state==0;} //正常返回1,否则返回09..3为什么cin输入时,空格和回车无法读入?这时可改用哪些流成员函数?答:因为空格和回车都可以作为数据之间的分格符,当输入串时空格和回车无法读入。

可改用cin.get()和cin.getline()等流成员函数。

9..4在用cin输入结束时键入^Z,则程序对以后的输入怎样处理?如果要求恢复正常,应执行什么成员函数?答:不再理会以后的所有输入。

可执行成员函数:cin.clear(0); 使流恢复正常9..5当输出字符串数组名时,输出的是串内容,有何办法可以输出串的首地址?答:将字符指针强制转换为泛型指针可以输出字符串地址9..6文件的使用,有它的固定格式,请做简单介绍。

答:1.说明一个文件流对象,又被称为内部文件,如:fstream iofile;2.用文件流对象的成员函数打开一个磁盘文件。

打开文件的成员函数的第一个参数为要打开的磁盘文件名。

第二个参数为打开方式,有输入(in),输出(out)等,打开方式在ios基类中定义为枚举类型。

如:iofile.open(“myfile.txt”,ios::in|ios::out);1,2两步可合成如下:fstream iofile(”myfile.txt”,ios::in|ios::out);3.使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写。

4.关闭文件。

当打开一个文件进行读写后,应该显式地关闭该文件如:iofile.close();9..7在ios类中定义的文件打开方式中,公有枚举类型open_mode的各成员代表什么文件打开方式?答:in=0x01,打开文件用于输入操作(从文件读取),文件指针在文件头out=0x02,打开文件用于输出操作(写入文件)。

如文件不存在,则建立,但指定目录必须存在,否则建立文件失败。

如文件存在,未同时设app,ate,in则文件清空ate=0x04,打开文件用于输入/输出,文件指针在文件尾,但新数据可写到任何位置app=0x08,打开文件用于输出,但从尾部添加,新数据只能添加在尾部trunce=0x10,打开文件,并清空它,以建立新文件nocreate=0x20,如文件存在则打开,不存在并不创建新文件noreplace=0x40,如文件不存在则创建,如文件存在则只能设为ate及app方式binary=0x80,以二进制方式打开文件9..8文本文件可以按行也可以按字符进行拷贝,在使用中为保证完整地拷贝各要注意哪些问题?答:按字符进行拷贝首先必须设置关闭跳过空白(如:iofile.unsetf(ios::skipws)),因为提取(“>>”)运算符在缺省情况下是跳过空白(包括空格,制表,backspace和回车等)的,这样拷贝的文件会缺少一些字符。

第二,该程序应能确定文件是否拷贝结束。

按行进行拷贝,getline()回车换行符并不放在buf中,因此要加一个回车换行符。

9..9对文件流,“!”运算符完成什么功能?答:返回状态字state操作非法和操作失败这两位。

9..10二进制文件读函数read()能否知道文件是否结束?应怎样判断文件结束?答:读函数并不能知道文件是否结束,可用状态函数int ios::eof()来判断文件是否结束。

必须指出系统是根据当前操作的实际情况设置状态位,如需根据状态位来判断下一步的操作,必须在一次操作后立即去调取状态位,以判断本次操作是否有效。

9..11由二进制文件和文本文件来保存对象各有什么优点和缺点?答:使用二进制文件,可以控制字节长度,读写数据时不会出现二义性,可靠性高。

同时不知格式是无法读取的,保密性好。

文件结束后,系统不会再读(见eofbit的说明),但程序不会自动停下来,所以要判断文件中是否已没有数据。

使用文本文件来保存对象,操作简单,但谁都可以读取这些数据,无保密性。

9..12文件的随机访问为什么总是用二进制文件,而不用文本文件?答:在C++中可以由程序来实现文件指针的移动,从而实现文件的随机访问,即可读写流中任意一段内容。

一般文本文件很难准确定位,所以随机访问多用于二进制文件。

9..13怎样使用istream和ostream的成员函数来实现随机访问文件?答:在ios类中说明了一个公有枚举类型:enum seek_dir{beg=0,//文件开头cur=1,//文件指针的当前位置end=2//文件结尾};istream类中提供了如下三个成员函数:istream&istream::seekg(streampos);//指针直接定位istream&istream::seekg(streamoff, ios::seek_dir);//指针相对定位long istream::tellg();//返回当前指针位置seekg(streamoff,ios::seek_dir)应用最广,如:datafile.seekg(-20L,ios::cur);表示将文件定位指针从当前位置向文件头部方向移20个字节。

datafile.seekg(20L,ios::beg);表示将文件定位指针从文件头向文件尾方向移20个字节。

datafile.seekg(-20L,ios::end);表示将文件定位指针从文件尾向文件头方向移20个字节。

tellg()和seekg()往往配合使用。

ostream类也提供了三个成员函数管理文件定位指针,它们是:ostream&ostream::seekp(streampos);ostream&ostream::seekp(streamoff,ios::seek_dir);long ostream::tellp();定位指针只有一个但函数有两组,这两组个函数功能完全一样。

相关文档
最新文档