《c语言程序设计新视角》第八章文件小结
课件谭浩强C++程序设计第8章(带特殊条款)
课件谭浩强C++程序设计第8章(带特殊条款)课件:谭浩强《C++程序设计》第8章概述:第8章主要介绍了C++中的继承和多态性。
继承是面向对象编程中的一种重要特性,它允许我们创建一个新的类(称为派生类),该类继承另一个类(称为基类)的属性和方法。
多态性则允许我们使用一个接口来定义多种不同类型的对象的行为。
本章将详细介绍这两个概念,并通过实例来演示它们的应用。
一、继承的概念与定义1.继承的基本概念继承是面向对象编程中的一种机制,允许我们创建一个新的类(派生类),该类继承另一个类(基类)的属性和方法。
派生类可以添加新的属性和方法,也可以覆盖基类的方法。
2.继承的定义在C++中,继承通过使用冒号和访问权限关键字(如public、protected和private)来定义。
例如,如果我们要创建一个派生类Student,它继承自基类Person,可以如下定义:cppclassPerson{public:stringname;intage;};classStudent:publicPerson{public:stringstudentId;};二、继承的访问权限1.公共继承(public)当一个类使用public关键字进行继承时,基类的public成员在派生类中仍然是public,protected成员在派生类中仍然是protected。
2.保护继承(protected)当一个类使用protected关键字进行继承时,基类的public和protected成员在派生类中都变为protected。
3.私有继承(private)当一个类使用private关键字进行继承时,基类的public和protected成员在派生类中都变为private。
三、继承中的构造函数和析构函数1.构造函数的继承在派生类中,构造函数会调用基类的构造函数,然后执行派生类自己的构造函数。
如果基类有默认构造函数,则可以省略基类构造函数的调用。
c语言-C程序设计(第四版)谭浩强_课后习题答案第8章
C程序设计(第四版)谭浩强_课后习题答案第8章第8章善于利用指针2208.1指针是什么2208.2指针变量2228.2.1使用指针变量的例子2228.2.2怎样定义指针变量2238.2.3怎样引用指针变量2248.2.4指针变量作为函数参数2268.3通过指针引用数组2308.3.1数组元素的指针2308.3.2在引用数组元素时指针的运算2318.3.3通过指针引用数组元素2338.3.4用数组名作函数参数2378.3.5通过指针引用多维数组2458.4通过指针引用字符串2558.4.1字符串的引用方式2558.4.2字符指针作函数参数2598.4.3使用字符指针变量和字符数组的比较2638.5指向函数的指针2668.5.1什么是函数指针2668.5.2用函数指针变量调用函数2668.5.3怎样定义和使用指向函数的指针变量2688.5.4用指向函数的指针作函数参数2708.6返回指针值的函数2748.7指针数组和多重指针2778.7.1什么是指针数组2778.7.2指向指针数据的指针2808.7.3指针数组作main函数的形参2828.8动态内存分配与指向它的指针变量2858.8.1什么是内存的动态分配2858.8.2怎样建立内存的动态分配2858.8.3void指针类型2878.9有关指针的小结288习题2918-1#include <stdio.h>int main(){ void swap(int *p1,int *p2);int n1,n2,n3;int *p1,*p2,*p3;printf("input three integer n1,n2,n3:");scanf("%d,%d,%d",&n1,&n2,&n3);p1=&n1;p2=&n2;p3=&n3;if(n1>n2) swap(p1,p2);if(n1>n3) swap(p1,p3);if(n2>n3) swap(p2,p3);printf("Now,the order is:%d,%d,%d\n",n1,n2,n3); return 0;}void swap(int *p1,int *p2){int p;p=*p1; *p1=*p2; *p2=p;}#include <stdio.h>#include <string.h>int main(){void swap(char *,char *);char str1[20],str2[20],str3[20];printf("input three line:\n");gets(str1);gets(str2);gets(str3);if(strcmp(str1,str2)>0) swap(str1,str2);if(strcmp(str1,str3)>0) swap(str1,str3);if(strcmp(str2,str3)>0) swap(str2,str3);printf("Now,the order is:\n");printf("%s\n%s\n%s\n",str1,str2,str3);return 0;}void swap(char *p1,char *p2){char p[20];strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);}8-3#include <stdio.h>int main(){ void input(int *);void max_min_value(int *);void output(int *);int number[10];input(number);max_min_value(number);output(number);return 0;}void input(int *number){int i;printf("input 10 numbers:");for (i=0;i<10;i++)scanf("%d",&number[i]);}void max_min_value(int *number){ int *max,*min,*p,temp;max=min=number;for (p=number+1;p<number+10;p++)if (*p>*max) max=p;else if (*p<*min) min=p;temp=number[0];number[0]=*min;*min=temp;if(max==number) max=min;temp=number[9];number[9]=*max;*max=temp; }void output(int *number){int *p;printf("Now,they are: ");for (p=number;p<number+10;p++)printf("%d ",*p);printf("\n");}8-4#include <stdio.h>int main(){void move(int [20],int,int);int number[20],n,m,i;printf("how many numbers?");scanf("%d",&n);printf("input %d numbers:\n",n);for (i=0;i<n;i++)scanf("%d",&number[i]);printf("how many place you want move?"); scanf("%d",&m);move(number,n,m);printf("Now,they are:\n");for (i=0;i<n;i++)printf("%d ",number[i]);printf("\n");return 0;}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);}8-5#include <stdio.h>int main(){int i,k,m,n,num[50],*p;printf("\ninput number of person: n="); scanf("%d",&n);p=num;for (i=0;i<n;i++)*(p+i)=i+1;i=0;k=0;m=0;while (m<n-1){if (*(p+i)!=0) k++;if (k==3){*(p+i)=0;k=0;m++;}i++;if (i==n) i=0;}while(*p==0) p++;printf("The last one is NO.%d\n",*p); return 0;}8-6#include <stdio.h>int main(){int length(char *p);int len;char str[20];printf("input string: ");scanf("%s",str);len=length(str);printf("The length of string is %d.\n",len); return 0;}int length(char *p){int n;n=0;while (*p!='\0'){n++;p++;}return(n);}8-7#include <stdio.h>#include <string.h>int main(){void copystr(char *,char *,int);int m;char str1[20],str2[20];printf("input string:");gets(str1);printf("which character that begin to copy?"); scanf("%d",&m);if (strlen(str1)<m)printf("input error!");else{copystr(str1,str2,m);printf("result:%s\n",str2);}return 0;}void copystr(char *p1,char *p2,int m){int n;n=0;while (n<m-1){n++;p1++;}while (*p1!='\0'){*p2=*p1;p1++;p2++;}*p2='\0';}8-8#include <stdio.h>int main(){int upper=0,lower=0,digit=0,space=0,other=0,i=0; char *p,s[20];printf("input string: ");while ((s[i]=getchar())!='\n') i++;p=&s[0];while (*p!='\n'){if (('A'<=*p) && (*p<='Z'))++upper;else if (('a'<=*p) && (*p<='z'))++lower;else if (*p==' ')++space;else if ((*p<='9') && (*p>='0'))++digit;else++other;p++;}printf("upper case:%d lower case:%d",upper,lower);printf(" space:%d digit:%d other:%d\n",space,digit,other); return 0;}8-9#include <stdio.h>int main(){void move(int *pointer);int a[3][3],*p,i;printf("input matrix:\n");for (i=0;i<3;i++)scanf("%d %d %d",&a[i][0],&a[i][1],&a[i][2]);p=&a[0][0];move(p);printf("Now,matrix:\n");for (i=0;i<3;i++)printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);return 0;}void move(int *pointer){int i,j,t;for (i=0;i<3;i++)for (j=i;j<3;j++){t=*(pointer+3*i+j);*(pointer+3*i+j)=*(pointer+3*j+i);*(pointer+3*j+i)=t;}}8-10-1#include <stdio.h>int main(){void change(int *p);int a[5][5],*p,i,j;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];change(p);printf("Now,matrix:\n");for (i=0;i<5;i++){for (j=0;j<5;j++)printf("%d ",a[i][j]);printf("\n");}return 0;}void change(int *p){int i,j,temp;int *pmax,*pmin;pmax=p;pmin=p;for (i=0;i<5;i++)for (j=i;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++)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++)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++)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;}8-10-2#include <stdio.h>int main(){void change(int *p);int a[5][5],*p,i,j;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];change(p);printf("Now,matrix:\n");for (i=0;i<5;i++){for (j=0;j<5;j++)printf("%d ",a[i][j]);printf("\n");}return 0;}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=i;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;//将a[0][1]的地址赋给pmin,从该位置开始找最小的元素for (i=0;i<5;i++) //找第二最小值的地址赋给pminfor (j=0;j<5;j++){if(i==0 && j==0) continue;if (*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++) //找第三最小值的地址赋给pminfor (j=0;j<5;j++){if((i==0 && j==0) ||(i==0 && j==4)) continue;if(*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++) // 找第四最小值的地址赋给pminfor (j=0;j<5;j++){if ((i==0 && j==0) ||(i==0 && j==4)||(i==4 && j==0)) continue;if (*pmin>*(p+5*i+j)) pmin=p+5*i+j;}temp=*pmin; //将第四最小值与右下角元素互换*pmin=*(p+24);*(p+24)=temp;}8-11-1#include <stdio.h>#include <string.h>int main(){void sort(char s[][6]);int i;char str[10][6];printf("input 10 strings:\n");for (i=0;i<10;i++)scanf("%s",str[i]);sort(str);printf("Now,the sequence is:\n"); for (i=0;i<10;i++)printf("%s\n",str[i]);return 0;}void sort(char s[10][6]){int i,j;char *p,temp[10];p=temp;for (i=0;i<9;i++)for (j=0;j<9-i;j++)if (strcmp(s[j],s[j+1])>0){strcpy(p,s[j]);strcpy(s[j],s[+j+1]);strcpy(s[j+1],p);}}8-11-2#include <stdio.h>#include <string.h>int main(){void sort(char (*p)[6]);int i;char str[10][6];char (*p)[6];printf("input 10 strings:\n");for (i=0;i<10;i++)scanf("%s",str[i]);p=str;sort(p);printf("Now,the sequence is:\n"); for (i=0;i<10;i++)printf("%s\n",str[i]);return 0;}void sort(char (*s)[6]){int i,j;char temp[6],*t=temp;for (i=0;i<9;i++)for (j=0;j<9-i;j++)if (strcmp(s[j],s[j+1])>0){strcpy(t,s[j]);strcpy(s[j],s[+j+1]);strcpy(s[j+1],t);}}8-12#include <stdio.h>#include <string.h>int main(){void sort(char *[]);int i;char *p[10],str[10][20];for (i=0;i<10;i++)p[i]=str[i];printf("input 10 strings:\n");for (i=0;i<10;i++)scanf("%s",p[i]);sort(p);printf("Now,the sequence is:\n"); for (i=0;i<10;i++)printf("%s\n",p[i]);return 0;}void sort(char *s[]){int i,j;char *temp;for (i=0;i<9;i++)for (j=0;j<9-i;j++)if (strcmp(*(s+j),*(s+j+1))>0){temp=*(s+j);*(s+j)=*(s+j+1);*(s+j+1)=temp;}}8-13#include<stdio.h>#include<math.h>int main(){float integral(float(*)(float),float,float,int);//对integarl函数的声明float fsin(float); //对fsin函数的声明float fcos(float); //对fcos函数的声明float fexp(float); //对fexp函数的声明float a1,b1,a2,b2,a3,b3,c,(*p)(float);int n=20;printf("input a1,b1:");scanf("%f,%f",&a1,&b1);printf("input a2,b2:");scanf("%f,%f",&a2,&b2);printf("input a3,b3:");scanf("%f,%f",&a3,&b3);p=fsin;c=integral(p,a1,b1,n);printf("The integral of sin(x) is:%f\n",c);p=fcos;c=integral(p,a2,b2,n);printf("The integral of cos(x) is:%f\n",c);p=fexp;c=integral(p,a3,b3,n);printf("The integral of exp(x) is:%f\n",c);return 0;}float integral(float(*p)(float),float a,float b,int n){int i;float x,h,s;h=(b-a)/n;x=a;s=0;for(i=1;i<=n;i++){x=x+h;s=s+(*p)(x)*h;}return(s);}float fsin(float x){return sin(x);}float fcos(float x){return cos(x);}float fexp(float x){return exp(x);}8-14#include <stdio.h>int main(){void sort (char *p,int m);int i,n;char *p,num[20];printf("input n:");scanf("%d",&n);printf("please input these numbers:\n");for (i=0;i<n;i++)scanf("%d",&num[i]);p=&num[0];sort(p,n);printf("Now,the sequence is:\n");for (i=0;i<n;i++)printf("%d ",num[i]);printf("\n");return 0;}void sort (char *p,int m) // 将n个数逆序排列函数{int i;char temp, *p1,*p2;for (i=0;i<m/2;i++){p1=p+i;p2=p+(m-1-i);temp=*p1;*p1=*p2;*p2=temp;}}8-15#include <stdio.h>int main(){void avsco(float *,float *);void avcour1(char (*)[10],float *);void fali2(char course[5][10],int num[],float *pscore,float aver[4]); void good(char course[5][10],int num[4],float *pscore,float aver[4]); int i,j,*pnum,num[4];float score[4][5],aver[4],*pscore,*paver;char course[5][10],(*pcourse)[10];printf("input course:\n");pcourse=course;for (i=0;i<5;i++)scanf("%s",course[i]);printf("input NO. and scores:\n");printf("NO.");for (i=0;i<5;i++)printf(",%s",course[i]);printf("\n");pscore=&score[0][0];pnum=&num[0];for (i=0;i<4;i++){scanf("%d",pnum+i);for (j=0;j<5;j++)scanf("%f",pscore+5*i+j);}paver=&aver[0];printf("\n\n");avsco(pscore,paver); // 求出每个学生的平均成绩avcour1(pcourse,pscore); // 求出第一门课的平均成绩printf("\n\n");fali2(pcourse,pnum,pscore,paver); // 找出2门课不及格的学生printf("\n\n");good(pcourse,pnum,pscore,paver); // 找出成绩好的学生return 0;}void avsco(float *pscore,float *paver) // 求每个学生的平均成绩的函数{int i,j;float sum,average;for (i=0;i<4;i++){sum=0.0;for (j=0;j<5;j++)sum=sum+(*(pscore+5*i+j)); //累计每个学生的各科成绩average=sum/5; //计算平均成绩*(paver+i)=average;}}void avcour1(char (*pcourse)[10],float *pscore) // 求第一课程的平均成绩的函数{int i;float sum,average1;sum=0.0;for (i=0;i<4;i++)sum=sum+(*(pscore+5*i)); //累计每个学生的得分average1=sum/4; //计算平均成绩printf("course 1:%s average score:%7.2f\n",*pcourse,average1);}void fali2(char course[5][10],int num[],float *pscore,float aver[4])// 找两门以上课程不及格的学生的函数{int i,j,k,labe1;printf(" ==========Student who is fail in two courses======= \n"); printf("NO. ");for (i=0;i<5;i++)printf("%11s",course[i]);printf(" average\n");for (i=0;i<4;i++){labe1=0;for (j=0;j<5;j++)if (*(pscore+5*i+j)<60.0) labe1++;if (labe1>=2){printf("%d",num[i]);for (k=0;k<5;k++)printf("%11.2f",*(pscore+5*i+k));printf("%11.2f\n",aver[i]);}}}void good(char course[5][10],int num[4],float *pscore,float aver[4]) // 找成绩优秀学生(各门85以上或平均90分以上)的函数{int i,j,k,n;printf(" ======Students whose score is good======\n");printf("NO. ");for (i=0;i<5;i++)printf("%11s",course[i]);printf(" average\n");for (i=0;i<4;i++){n=0;for (j=0;j<5;j++)if (*(pscore+5*i+j)>85.0) n++;if ((n==5)||(aver[i]>=90)){printf("%d",num[i]);for (k=0;k<5;k++)printf("%11.2f",*(pscore+5*i+k));printf("%11.2f\n",aver[i]);}}}8-16#include <stdio.h>int main(){char str[50],*pstr;int i,j,k,m,e10,digit,ndigit,a[10],*pa;printf("input a string:\n");gets(str);pstr=&str[0]; /*字符指针pstr置于数组str 首地址*/pa=&a[0]; /*指针pa置于a数组首地址*/ndigit=0; /*ndigit代表有多少个整数*/i=0; /*代表字符串中的第几个字符*/j=0;while(*(pstr+i)!='\0'){if((*(pstr+i)>='0') && (*(pstr+i)<='9'))j++;else{if (j>0){digit=*(pstr+i-1)-48; /*将个数位赋予digit*/k=1;while (k<j) /*将含有两位以上数的其它位的数值累计于digit*/{e10=1;for (m=1;m<=k;m++)e10=e10*10; /*e10代表该位数所应乘的因子*/digit=digit+(*(pstr+i-1-k)-48)*e10; /*将该位数的数值\累加于digit*/k++; /*位数K自增*/}*pa=digit; /*将数值赋予数组a*/ndigit++;pa++; /*指针pa指向a数组下一元素*/j=0;}}i++;}if (j>0) /*以数字结尾字符串的最后一个数据*/ {digit=*(pstr+i-1)-48; /*将个数位赋予digit*/k=1;while (k<j) /* 将含有两位以上数的其它位的数值累加于digit*/{e10=1;for (m=1;m<=k;m++)e10=e10*10; /*e10代表位数所应乘的因子*/digit=digit+(*(pstr+i-1-k)-48)*e10; /*将该位数的数值累加于digit*/k++; /*位数K自增*/}*pa=digit; /*将数值赋予数组a*/ndigit++;j=0;}printf("There are %d numbers in this line, they are:\n",ndigit);j=0;pa=&a[0];for (j=0;j<ndigit;j++) /*打印数据*/printf("%d ",*(pa+j));printf("\n");return 0;}8-17#include<stdio.h>int main(){int strcmp(char *p1,char *p2);int m;char str1[20],str2[20],*p1,*p2;printf("input two strings:\n");scanf("%s",str1);scanf("%s",str2);p1=&str1[0];p2=&str2[0];m=strcmp(p1,p2);printf("result:%d,\n",m);return 0;}int strcmp(char *p1,char *p2) //两个字符串比较函数{int i;i=0;while(*(p1+i)==*(p2+i))if (*(p1+i++)=='\0') return(0); //相等时返回结果0return(*(p1+i)-*(p2+i)); //不等时返回结果为第一个不等字符ASCII码的差值}8-18#include <stdio.h>int main(){char *month_name[13]={"illegal month","January","February","March","April", "May","June","july","August","September","October", "November","December"};int n;printf("input month:\n");scanf("%d",&n);if ((n<=12) && (n>=1))printf("It is %s.\n",*(month_name+n));elseprintf("It is wrong.\n");return 0;}8-19-1#include <stdio.h>#define NEWSIZE 1000 //指定开辟存区的最大容量char newbuf[NEWSIZE]; //定义字符数组newbufchar *newp=newbuf; //定义指针变量newp,指向可存区的始端char *new(int n) //定义开辟存区的函数new,开辟存储区后返回指针{if (newp+n<=newbuf+NEWSIZE) // 开辟区未超过newbuf数组的大小{newp+=n; // newp指向存储区的末尾return(newp-n); // 返回一个指针,它指向存区的开始位置}elsereturn(NULL); // 当存区不够分配时,返回一个空指针}8-19-2#include <stdio.h>#define NEWSIZE 1000char newbuf[NEWSIZE];char *newp=newbuf;void free(char *p) //释放存区函数{if (p>=newbuf && p< newbuf + NEWSIZE)newp=p;}8-20#define LINEMAX 20 /*定义字符串的最大长度*/int main(){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]);}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;}}}return 0;}8-21#include<stdio.h>int main(){void sort(int **p,int n);int i,n,data[20],**p,*pstr[20];printf("input n:\n");scanf("%d",&n);for (i=0;i<n;i++)pstr[i]=&data[i]; //将第i个整数的地址赋予指针数组pstr 的第i个元素printf("input %d integer numbers:",n);for (i=0;i<n;i++)scanf("%d",pstr[i]);p=pstr;sort(p,n);printf("Now,the sequence is:\n");for (i=0;i<n;i++)printf("%d ",*pstr[i]);printf("\n");return 0;}void sort(int **p,int n){int i,j,*temp;for (i=0;i<n-1;i++){for (j=i+1;j<n;j++){if (**(p+i)>**(p+j)) //比较后交换整数地址{temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;}}}}。
11803_谭浩强《C程序设计》课件第8章PPT课件
如何处理文件读写错误?
2024/1/27
04
在进行文件读写操作时,需要判断返回值是否成功,如果 失败则需要使用perror()等函数输出错误信息。
05
如何实现文件的追加写入?
06
在使用fopen()函数打开文件时,使用追加模式"a"或"a+" 可以实现文件的追加写入。
29
拓展延伸:高级文件操作技术探讨
文本文件的读写操作
使用fscanf()、fprintf()等函数进行文 本文件的读写操作。
2024/1/27
文本文件的打开与关闭
使用fopen()函数打开文本文件,使 用fclose()函数关闭文本文件。
文本文件的定位与修改
使用fseek()、ftell()等函数进行文本 文件的定位与修改。
24
二进制文件操作实例
学习要求
认真听讲,理解文件操作的基本概念 和原理;多动手实践,通过编写程序 加深对文件操作的理解和掌握;注意 细节和规范,养成良好的编程习惯。
6
02
文件类型与指针
2024/1/27
7
标准文件类型
2024/1/27
文本文件
存储字符数据,每个字符对应一个ASCII码,Байду номын сангаас于阅读和编辑。
二进制文件
存储二进制数据,适用于非字符数据或需要高效存储和读取的场 景。
write
将指定的数据块写入到指定的文件描述符中(低级I/O函数)。
2024/1/27
14
04
随机访问文件内容
2024/1/27
15
文件定位函数
01
fseek()
用于设置文件位置指针,可以实 现在文件中的任意位置进行读写 操作。
C语言各章小结
石家庄铁道大学C语言总结院系土木工程学院专业土木工程姓名董敬月学号 20090385 班级土0901-11C语言是一门有用的学科,是每个大学生应该学习的课程。
我很有幸能够跟随老师学习这门课程,半个学期的时间,我学到了很多,对C语言有了很多的了解。
作为初学者,我觉得这么课程不是那么容易,可能是没有太大的天赋,但是我相信天道酬勤,努力就有收获。
所以我尽量跟上老师的步调,努力学好这门课程,为以后学习、工作做好铺垫。
C语言是一门编程入门语言, 因为,无论是哪种编程语言,其原理、本质是相通的、类似的,而C语言在各种编程语言中又是最基础的。
有了C语言的基础,学习其他高级语言就会变得比较简单,更多是在学习、熟悉语言开发的环境,而不是语言本身。
学习C语言,就好像重新学习一门外语一样,但是它比重新学习一门外语又要简单很多。
下面是我对每章内容的小结。
第一章概述1.程序设计反映了利用计算机解决实际问题的全过程,具体要经过以下四个基本步骤:分析问题,确定数学模型或方法;设计算法,画出流程图;选择编程工具,按算法编写程序;调试程序,分析输出结果。
2. 为解决一个问题而采取的方法和步骤,就陈伟算法。
算法是程序设计的核心。
算法具有5个特性:有穷性、确定性、有效性、要有数据输入、要有结果输出。
算法的评价标准包括:正确性、可读性、通用性、高效率。
算法效率的度量分为时间度量和空间度量。
描述算法有多种不同的工具,常用的有:流程图、结构化流程图和伪代码等。
实用结构化流程图能帮助培养良好的程序设计风格,提倡用结构化流程图表示算法。
3.程序有三种基本结构,分别为顺序结构,选择结构和循环结构。
三种基本程序结构具有共同特点:只有一个入口、只有一个出口、结构中无死语句,即结构中的每一部分都有机会被执行;结构中无死循环。
结构化定力表面那个,任何一个芜杂问题的程序,都可以用以上三种基本结构组成。
4.结构化程序设计采用自顶向下、逐步求精和模块化的分析方法,从而有效地将一个较复杂的程序费解成许多易于控制和处理的子程序,便于开发和维护。
C语言课件第八章
例 有参函数 int max(int x,int y) { int z;
z=x>y?x:y; return(z); }
传统风格:
函数类型 函数名(形参表) 形参类型说明
{ 说明部分 语句部分
}
例 有参函数(传统风格) int max(x,y) int x,y; { int z;
z=x>y?x:y; return(z); }
{ int temp; temp=x; x=y; y=temp;
或
return;
}
功能:使程序控制从被调用函数返回到调用函数中, 同时把返回值带给调用函数
说明:
函数中可有多个return语句
若无return语句,遇}时,自动返回调用函数,返回的是一
个不确定的值
若函数类型与return语句中表达式值的类型不一致,按前
float fac(int k) { float t=1; int i;
件中所调用的函数进行了声明,则在各函数中不必再说明。 ▪ 若函数返值是char或int型,系统自动按int型处理
void main() { float add(float a,float b);
float a,b,c; scanf("%f,%f",&a,&b); c=add(a,b); printf("sum is %f",c); } float add(float x, float y) { float z; z=x+y; return(z); }
例 空函数 dummy( ) {}
函数体为空
▪ 8.2.2 有参函数定义 的一般格式
函数返回值类 型
缺省int型 无返回值void
C语言程序设计与应用 第8章
8.1.2变量的存储类别 8.1.2
§(1) 存储类别的概念 §变量的存储类别决定了变量的存储位置和存 储方式。变量的存储位置有两个:内存的数 据区和寄存器(参见寄存器存储类别)。 §内存中供用户使用的存储区,如表8-1所示。 变量的存储方式也有两种:静态和动态。 §在程序运行时,变量的存储方式如表8-2所示。
第 八 章 综 合 设 计 与 应 用
/*静态局部变量*/
C 语 言 程 序 设 计
运行结果如图8-4所示。
第 八 章 综 合 设 计 与 应 用
C 语 言 程 序 设 计
8.2指针与数组 8.2指针与数组
§8.2.1一维数组与指针
pointer,anArr anArr pointer+1,anArr+1 1 *(pointer +0), anArr[0] 2 pointer+2,anArr+2 3 4 5 6 7 8 pointer+8,anArr+8 9 *(pointer +8), anArr[8] *(pointer +i), anArr[i]
综合设计与应用 第八章 综合设计与应用
C 语 言 程 序 设 计
8.1变量的作用域与存储类别 8.1变量的作用域与存储类别
§变量可被识别、能够起作用的范围称为变量 的作用域。 §C语言标准根据变量在源程序中可能出现的 位置,将源程序划分成四个不同的区域,分 别是:文件域、函数域、块域和函数原型域。
第 八 章 综 合 设 计 与 应 用
C 语 言 程 序 设 计
(2) calloc()函数
§原 型:void * calloc( unsigned n, unsigned size ); §头文件:#include <stdlib.h> §参 数:size――表示分配存储空间的字节 数;n――有多少个size §功 能:在内存的动态区存储中分配n个长度 为size的连续空间 §说 明:若成功,返回指向分配区域起始地 址的指针(类型为void);若失败,返回空指针 NULL
C语言程序设计实用教程陈方第8章
8.4
检错与处理
1.用法 int ferror(文件指针);
8.4.1 ferror()函数
2.功能 如果函数返回值为0,表示未出错;如果返回一个非0值,表示出错。 8.4.2 clearerr()函数 1.用法 void clearerr(文件指针);
2.功能 将文件错误标志(即ferror()函数的值)和文件结束标志(即feof() 函数的值)置为0。
1.读文件的一个字符 —— fgetc()函数和feof()函数
(1)库函数fgetc() ① 用法:int fgetc(文件指针);
② 功能:从“文件指针”所指向的文件中,读入一个字符,同时将读写位置 指针向前移动1个字节(即指向下一个字符)。该函数无出错返回值。
(2)关于符号常量EOF和feof()函数
#include "stdio.h" main( ) { FILE *fp; char ch;
第8章 文件
if ((fp=fopen("word","w"))==NULL) { printf("can not open this file\n"); exit(0); } ch=getchar(); /*打开文件成功,输入字符,并存储到指定文件中*/ /*关闭已打开的所有文件,程序结束运行*/ /*如果打开文件失败*/
第8章 文件
8.3 文件的定位
文件中有一个读写位置指针,指向当前的读写位置。每次读写1个(或1组) 数据后,系统自动将位置指针移动到下一个读写位置上。如果想改变系统这种读 写规律,可使用有关文件定位的函数。 8.3.1 位置指针复位函数rewind() 1.用法 int rewind(文件指针);
C语言教程8文件
磁盘
2011-1-20 《C与C++程序设计教程》-第八章
返回
8
8.2.2 文件的打开与关闭
系统自动打开和关闭的五个标准设备文件 标准设备文件: 标准设备文件
打开文件fopen
函数首部: 文件号 文件指针 标准文件 *fopen(char *filename,char *mode) 0FILE stdin 标准输入(键盘) 功能:按指定方式打开文件。 含义 1 标准输出(显示器) 文件使用方式 stdout 例:文件打开与测试。 要打开的文件名 返值:正常打开,为指向文件结构体的指针;打开 “r/rb”FILE *fp; (只读) stderr 2 标准错误(显示器) 为输入打开一个文本/二进制文件 失败,为NULL。 if(( fp=fopen(“filename”,“rb+”))==NULL) “w/wb” (只写) stdaux 为输出打开或建立一个文本/二进制文件 3 标准辅助(辅助设备端口) {(追加) printf(“cannot open this file\n”); “a/ab”4 向文本/二进制文件尾追加数据 stdprn 标准打印(打印机) exit(0); “r+/rb+” (读写) *fp; 为读/写打开一个文本/二进制文件 例} FILE “w+/wb+”fp= fopen (“c:\test”,”rb+”); (读写) 为读/写建立一个文本/二进制文件
缓冲文件系统:
不关闭文件可能会丢失数据
磁盘文件
输入文件缓冲区 程序数据区 a
输出文件缓冲区
fclose
返回
10
2011-1-20
《C与C++程序设计教程》-第八章
c程序设计教程刘瑞新第8章异常处理、程序调试和文件操作新
通过try…catch语句所捕获到的异常,都是当遇到错误时系 统自己报错引发异常,并主动通知运行环境的。但是有时还可能 需要在编写代码人为控制什么时候发生异常,以及发生了怎样的 异常。Visual Studio提供的throw关键字就是专门用于人为引 发异常的。通常将这种人为引发异常的方式称为“抛出异常”。 其语法格式为:
当已经知道某行语句存在问题时,使用断点查找错误是个有效的 方法,但通常程序出错的具体位置并不容易确定,只能够猜测到在 某个范围内可能存在问题,这就需要在此范围内跟踪程序的执行结 果,一段段甚至一条条地执行语句,同时在调试窗口(如,局部变 量窗口)中观察内部数据的变化情况,从而确定问题所在。这种调 试方式称为程序的“分步执行”或称为程序的“跟踪”。常用的分 步执行有“逐过程”和“逐语句”两种。
2020/3/24
6
8.2 应用程序调试
8.2.1 常用调试窗口
1. 输出窗口 2. 命令窗口 3. 监视窗口 4. 局部变量窗口
2020/3/24
7
8.2 应用程序调试
8.2.2 程序断点和分步执行
1. 程序断点
为了排除程序中的错误,往往需要程序执行到某条语句时暂停下 来,以便查看程序的运行状态、变量的取值、属性的内容、当前执 行的过程甚至修改程序代码。让程序暂停下来的一种简单方法就是 设置断点。
获和处理异常的代码分为两个部分。其语法格式为: try{ //程序语句;} catch[(异常类名 异常变量名)] { //捕获程序语句引发的异常,执行异常处理程序 } finally{ //无论是否出现异常都会执行的语句}
2020/3/24
2
8.1 异常处理
8.1.2 抛出异常和常用异常类
1. 抛出异常
C 语言程序设计章 (8)
– 基类只有无参数构造函数 • 在基类具有无参构造函数,派生类又没有定义构造函数的时候,系统会自动 调用基类的无参构造函数来构造派生类对象中的基类成分。
派生类 子类
C++语言程序设计
9
8.1 继承的概念
• “派生”(Derive)可以理解为继承的另外一种说法。
– “类D继承了类B”可以表述为“类B派生出类D”。 – 若类B派生出类D1、D2…,也可以说B是D1、D2…的泛化
(Generalization),称B为D1、D2…的基类,称D1、D2为B的派生 类。
何成员。
20
8.2 定义基类和派生类
• 私有继承和保护继承的区别
孙类成员函数无法访问
父类
public: protected:
private:
private
子类
private: private private
private protected public
孙类
private: private private
protected:
继承方式决定继承
?
private:
成员的访问权限
?
C++语言程序设计
18
8.2 定义基类和派生类
1. 公有继承
公有继承的派生类定义形式: class 派生类名:public 基类名 {
派生类新成员定义;
};
基类
public: protected: private:
派生类对象
C++程序设计教程--读书笔记 第八章 类
第八章类一、知识点1、成员函数在定义时不需要日期类参数,而普通函数却必须有,这是因为,成员函数在调用时因为捆绑了对象,其实已经含有对象参数了。
(P277)2、C++ 类定义体的花括号对的后面一定得有分号。
--java学多了你会老是忘记。
(P278)3、只要是在类定义中包含的成员函数,就有默认声明内联的性质,也就是说,该成员函数出于被编译自动安排到最佳运行性能的状态。
因此,为了获取最佳性能,就应在类编程设计时,尽量把成员函数写入类定义中。
(P278)4、如果对象是以对象指针间接访问的形式操作的,则对象与成员函数之间就用双字符的箭头“->”,即形式:(P279)objectName->memberFunctionName(parameters);或者将对象指针的间访形式用括号括起来,再加点操作符“.”加成员函数。
即形式:(*objectPointer).memberFunctionName(parameters);5、能够成为常成员函数的,应尽量写成常成员函数形式。
常成员函数的声明和定义在形式上必须一致,即在函数形参表的右括号后面加上const。
例如:class Data{int year, month, day;public:bool isLeapYear()const;};inline bool Data::isLeapYear()const{return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);}在常成员函数中,任何改变对象值的操作,都将被编译器认定为错误。
(P280)6、C++操作符重载的限制:(P284)(1)、不能创建新的操作符,如…@‟、…**‟。
(2)、C++还规定双目操作符"::"、"."、".*"不能重载。
此外,"?:",以及sizeof 和typeof 也不允许重载。
C语言程序设计新视角章 (9)
31
文件的路径 用户在磁盘上寻找文件时,所历经的文件夹线路叫路径。 路径分为绝对路径和相对路径。绝对路径是完整的描述文件 位置的路径,它是从盘符开始的路径。相对路径是相对于目 标位置的路径,是指在当前的目录下开始的路径。 能唯一标识某个磁盘文件的字符串形式为: 盘符:\路径\文件名.扩展名
32
例1:我们要找c:\windows\system\config文件, 如果当前在c:\winodws\,则相对路径表示为 system\config,绝对路径表示为 c:\windows\system\config。
结构所代表的打开文件的一些属性
20
int _file;
//用于获取文件描述,可使用
fileno函数获得此文件的句柄
int _charbuf;
//单字节的缓冲,如果
为单字节缓冲,_base将无效
int _bufsiz;
//缓冲区大小
char* _tmpfname;
//临时文件名
} FILE;
21
有了FILE类型后,每当打开一个文件时,操作系统自动 为该文件建立一个FILE类型的结构体数据,并返回指向它的 指针,系统将被打开文件及缓冲区的各种信息都存入这个 FILE型数据区域中,程序通过上述指针获得文件信息及访问 文件,如图8.2所示。
35
【例8-1】 文件的例子1。
1
/*对data.txt文件写入10条记录*/
2
#include <stdio.h>
3
int main()
4
{
5
FILE *fp; /*FILE为文件类型*/
6
ቤተ መጻሕፍቲ ባይዱ
int i;
c语言程序设计(第8章)
age(2)
c=age(4)+2;
c=age(3)+2;
c=age(2)+2;
c=age(1)+2;
return c;
c=18
return c;
c=16
return c;
c=14
return c;
c=12
【例三】在屏幕上显示杨辉三角形 例三】
1 1 1 1 1 1 4 3 2 3 1 1 1 分析: 若起始行为第1行 则: 第x行有x个值 对第x行第y列(不计左侧空格时) 其值可用以下递归函数表示: 1 (y=1 或 y=x) c(x,y)= c(x-1,y-1)+c(x-1,y)
三、函数的调用
3、函数的嵌套调用 float f(float x) { … } P155例8.6 main() { … f1=f(x1); f2=f(x2); … x=root(x1,x2); … }
float xpoint(float x1,float x2) { y=… 调用f(x1)、f(x2) } float root(float x1,float x2);
{
y1=f(x1) x=xpoint(x1,x2) y=f(x)
}
例8.6嵌套调用关系(简化)
三、函数的调用
3、函数的嵌套调用 P155 例8.6嵌套调用关系(示意图)
例8.6模块划划分情况 main( ) 根据输入的x1,x2判断 是否有根 若有,调用求根函数 root( ) 输出结果 root(x1,x2 ) 根据所给x1,x2值 求近似根 xpoint( ) 根据所给x1,x2值 计算弦与x轴的交点
四、函数的递归调用
2、递归算法
类似于数学证明中的反推法,从后一结果与前一结果的关 系中寻找其规律性。 归纳法可以分为: 递推法 从初值出发,归纳出新值与旧值间直到最后值为止存 在的关系。 要求通过分析得到: 初值+递推公式 编程:通过循环控制结构实现(循环的终值是最后值) 递归法 从结果出发,归纳出后一结果与前一结果直到初值为 止存在的关系。 要求通过分析得到: 初值+递归函数 编程:设计一个函数(递归函数),这个函数不断使用下 一级值调用自身,直到结果已知处——选择控制结构。