1、高级语言程序设计,主讲教师:贾彩燕 计算机与信息技术学院 计算机科学与技术系 ,考试,时间: 1月6日(星期三) 14:3016:30 地点: SY210,答疑,时间: 1月5日(星期二) 14:0018:00 地点: 九教北509或507,第七章 指针 习题课,主讲教师:贾彩燕 计算机与信息技术学院 计算机科学与技术系 ,补充题1:输入3个字符串,按由小到大的顺序输出。,#include #include int main() char *str1=“fotran“, *str2=“computer“, *str3=“basic“;char *tmp;if(strcmp(str1,str2)
2、0) tmp=str1;str1=str2;str2=tmp;if(strcmp(str1,str3)0) tmp=str1;str1=str3;str3=tmp;if(strcmp(str2,str3)0) tmp=str2;str2=str3;str3=tmp;puts(str1); puts(str2); puts(str3);return 0; ,补充题2:,输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。要求写三个函数 输入10个数(用指针法) 进行处理(用指针操作) 输出10个数(用指针法),#include enum N=10; void get(int
3、 *a,int n); void action(int *a,int n); void put(int *a,int n);int main() int aN;get(a, N);action(a, N);put(a, N);return 0; ,void get(int *a,int n) printf(“输入数组的值:n“);int *p=a;for(;pai)q=a+i;if(*mai)m=a+i;min=*a;*a=*q;*q=min;max=*(a+n-1);*(a+n-1)=*m;*m=max; void put(int *a,int n) int *t=a;for(;ta+n;t
4、+)printf(“%4d “,*t);putchar(n); ,补充题3:从键盘输入若干(如10)个数,写一个函数对这组数从第begin(如3)个数到第end(如7)个数之间的数进行排序,要求形参用指针,实参用指针或数组。,#include enum N=10;void selectsort(int *a, int begin, int end);int main() int aN,*p;for(p=a; p-aN; p+)scanf(“%d“, p);selectsort(a,3,7);printf(“排序后:n“);for(p=a; p-aN; p+)printf(“%4d“, *p);
5、return 0; ,void selectsort(int *a, int begin, int end) int *p, *t, *k, tmp;for(p=a+begin;pa+end;p+)k=p;for(t=p+1;t=a+end;t+)if(*t*k) k=t;tmp=*k;*k=*p;*p=tmp; ,补充题4:有一个包含n个字符的字符串,写一个函数将这个字符串中从第m个字符开始的全部字符复制成为另一个字符。并在主程序中调用该函数进行测试。,void fun(char *s,char c,int m,int n) char *p=s+m-1;for(;ps+n;p+)*p=c;
6、,4:1)字一个函数,它检查两个字符串是否由同一字符组成.,#include enum LEN=20; int issame(const char *, const char *); int main () char str1LEN, str2LEN;scanf(“%s“, str1);scanf(“%s“, str2);if (issame(str1, str2) ,int issame(const char *s1, const char *s2) int i, j, flag;for (i=0; s1i!=0; i+)flag = 0;for (j=0; s2j!=0; j+)if (s
7、1i = s2j) flag = 1;if (!flag) return 0;return 1; ,4:2)写一个函数,它判断一个字符串是否可以通过另一个字符串重排得到。,#include #include enum LEN=20; void selectsort(char *a, int end); int issame(char *s1, char *s2); int main () char str1LEN, str2LEN;scanf(“%s“, str1);scanf(“%s“, str2);if (issame(str1, str2)printf(“Yesn“);elseprint
8、f(“Notn“);return 0; ,int issame(char *s1, char *s2) int len1, len2;len1 = strlen(s1);len2 = strlen(s2);if (len1 != len2) return 0;selectsort(s1, len1);selectsort(s2, len2);if (strcmp(s1, s2)!=0)return 0;elsereturn 1; void selectsort(char a, int n) int i,j,t,k;for(i=0;iak) k=j;t=ak;ak=ai;ai=t; ,4:1)字
9、一个函数,它检查两个字符串是否由同一字符组成.2)写一个函数,它判断一个字符串是否可以通过另一个字符串重排得到。,int fun1(char *s1,char *s2) int m=0,n=0,f=1;int c1M=0,c2M=0;while(s1m!=0)m+;while(s2n!=0)n+;for(int i=0;im;i+)c1s1i=1;for(int j=0;jn;j+)c2s2j=1;for(int t=0;tM;t+)if(c1t!=c2t) f=0;return f; ,const int M=128; int fun2(char *s1,char *s2) int m=0,
10、n=0,f=1;int c1M=0,c2M=0;while(s1m!=0)m+;while(s2n!=0)n+;if(m!=n) f=0; return f;for(int i=0;im;i+)c1s1i+;for(int j=0;jn;j+)c2s2j+;for(int t=0;tM;t+)if(c1t!=c2t) f=0;return f; ,3:写一个程序,其命令行包括一个字符参数s,运行中由标准输入读入一系列正文,该程序把所有行依次输出,并在那些依次字符串s的行前面标一个星号。,int getline() int c, i = 0;while(i MAXLEN - 2 ,#includ
11、e #include enum MAXLEN=100; int getline(void); char lineMAXLEN;int main(int argc, char *argv) int n;while(n=getline()0)if(strstr(line, argv1)!=NULL)putchar(*);puts(line);elseputs(line); return 0; ,5:修改第5章猜数程序,通过命令行参数为它提供数的范围。,int main(int argc, char *argv) int m, unknown, guess;if(argc = 2) m = s2in
12、t(argv1);else printf(“input errorn“);return 0;if (m unknown) printf(“Too big!n“);else if (guess unknown) printf(“Too small!n“);else printf(“You win!“);break; while (next();printf(“Game over.n“);return 0; ,6.矩阵的加,乘、转置。,要点1: int aNN, *p p=,要点3 int aNN, *pN; pi=*(a+i); aij=*(pi+j);,8:用函数指针实现辛普生求积法。,typ
13、edef double (*MFP)(double);double numInt(MFP fp, double a, double b) long i, m = 10;double h=(b-a)/(2*m);double dif, res0, res; res = (fp(b)+fp(a)*(b-a)/2;for (dif=1.0; fabs(dif)1E-6; m*=2) res0 = res;h = (b - a) / (2*m);for (res=fp(a)+fp(b), i=1; i2*m; i+=2)res += 4*fp(a+i*h);for( i=2;i2*m;i+=2)res
14、 += 2*fp(a+i*h);res = res*h/3;dif = res - res0;return res; ,13:写程序输入并保存至多100个长度不超过80个字符的字符行。读完所有输入后,先输出长度不超过40个字符的行,再输出其它行。考虑用两种方式实现:1)两维字符数组,int getline() int c, i = 0;while(i MAXLEN - 2 ,#include #include int getline(); char line80; char mline10080;int main() int i, n, row=0;while(n=getline()=80 ,
15、13:2)用字符指针数组,将字符行保存在动态分配的存储块里。,int getline() int c, i = 0;while(i MAXLEN - 2 ,#include #include #include int getline(); char line80; char *mline100;int main() int i, n, row=0;char (*p)80;p=(char (*)80)malloc(100*80);for(i=0;i100;i+,p+)mlinei=(char *)p;while(n=getline()=80 ,17:实现一个一元多项式计算系统。多项式的项数和系数
16、保存在数组中,数组通过动态内存分配创建。,int main() int *p, *q, n;double x, value;printf(“Input xiangshi:n“);scanf(“%d“, ,double poly1(int a, int n, double x) int i=0;double sum=0;for(i=n; i=0; i-)sum=sum*x+ai;return sum; double poly2(int *p, int n, double x) int *pn=p+n;double sum=0;for(; pn=p; pn-)sum=sum*x+*pn;retur
17、n sum; ,第八章文件及第九章结构 习题答案,2. 写一个程序,其命令行有三个参数,将前两个文件的内容联接起来写入第三个文件。,#include #include int main(int argc, char *argv) FILE *ifp1, *ifp2, *ofp;char * line;line=(char *)malloc(100*sizeof(char);if(argc=3)printf(“input error!n“);exit(0);if (ifp1=fopen(argv1,“r“)=NULL | (ifp2=fopen(argv2,“r“)=NULL | (ofp=fo
18、pen(argv3,“w“)=NULL)printf(“cant open file.n“);exit(0);while(!feof(ifp1)if(fgets(line, 100, ifp1)!=NULL)fputs(line, ofp);fprintf(ofp,“n“);while(!feof(ifp2)if(fgets(line, 100, ifp2)!=NULL)fputs(line, ofp);fclose(ifp1);fclose(ifp2);fclose(ofp);return 0;,2. 写一个程序,其命令行有三个参数,将前两个文件的内容联接起来写入第三个文件。,#includ
19、e #include int main(int argc, char *argv) FILE *ifp1, *ifp2, *ofp;char * line;line=(char *)malloc(100*sizeof(char);if(argc=3)printf(“input error!n“);exit(0);if (ifp1=fopen(argv1,“r“)=NULL | (ifp2=fopen(argv2,“r“)=NULL | (ofp=fopen(argv3,“w“)=NULL)printf(“cant open file.n“);exit(0);while(!feof(ifp1)i
20、f(fgets(line, 100, ifp1)!=NULL)fputs(line, ofp);fprintf(ofp,“n“);while(!feof(ifp2)if(fgets(line, 100, ifp2)!=NULL)fputs(line, ofp);fclose(ifp1);fclose(ifp2);fclose(ofp);return 0;,补充题1.调试书中P279页8.4.1求文件中数据的平均值的程序。 假设文件中的数据形式: 23.5 18.7 99.0 21.8 73.6 文件名为:data.txt 从命令行参数获取文件名,#include double nextentr
21、y(FILE *fp) ; int main(int argc, char *argv) double total = 0.0, x;int count = 0;FILE *ifp;if (argc = 1) /* 缺参数,产生错误信息 */ printf(“Missing file name. Stop!n“);return 1;if (ifp = fopen(argv1, “r“) = NULL) printf(“Cant open: %s.Stop!n“, argv1);return 2;while (x = nextentry(ifp) != 0.0) count+;total +=
22、x;printf(“Average: %fn“, total/count);fclose(ifp);return 0; double nextentry(FILE *fp) double num;int n = fscanf(fp, “%lf“, ,补充题2:统计C程序里的关键字,完成实现相关程序,C程序从文件读,int main() int n;char wordM;KEYC *p;FILE *fp;fp = fopen(“f:/test.cpp“, “r“);if (fp = NULL) printf(“cant open filen“);return 0;while (getident(
23、fp, M,word) != -1 ) for (p=keywords, n = 0; n key) = 0) p-count+;break;for (p=keywords, n = 0; n key, p-count);return 0; ,#include #include int getident(FILE *fp, int limit, char word); enum M = 20; typedef struct char * key;int count; KEYC; KEYC keywords32 = “auto“, 0, “break“, 0, “case“, 0, “char“
24、, 0, “const“, 0, “continue“, 0, “default“, 0, “do“, 0,“double“, 0, “else“, 0, “enum“, 0, “extern“, 0,“float“, 0, “for“, 0, “goto“, 0, “if“, 0,“int“, 0, “long“, 0, “register“,0, “return“, 0, “short“, 0, “signed“, 0, “sizeof“, 0, “static“, 0,“struct“, 0, “switch“, 0, “typedef“, 0, “union“, 0,“unsigned
25、“,0, “void“, 0, “volatile“,0, “while“, 0; int getident(FILE *fp, int limit, char word) int c,i=0;while(i ,设有学生成绩处理系统,用链表表示一个班级中所有学生的成绩,每个链表点中包括学生姓名、程序设计和数学课的成绩,设链表结构如下:struct LinkNodechar Name20;double Programming;double Mathematics;struct LinkNode *pNext;请设计一个函数,该函数能输出Programming的值处于Min, Max之中的学生的姓
26、名和二门课的成绩,函数原型要求如下:void RangeQuery(struct LinkNode *pHead,double Min, double Max);其中pHead为链表的第一个结点指针,Min为成绩下界,Max为成绩上界。,07年考题,链表实现,#include #include #include #include enum MAXNUM = 3; typedef struct node NODE, *LINK; struct node/定义链接结构 char name20;double programming;double math;LINK next; ;LINK addwo
27、rdL(LINK list, char name, double prog, double mathe); void printlink(LINK l, double min, double max);LINK list = NULL;,int main() double prog=0, mathe=0;int i=0;doscanf(“%s %lf %lf“, name, ,LINK mknode(char name, double prog, double mathe) /创建一个新结点 LINK p = (LINK)malloc(sizeof(NODE);if(p != NULL) st
28、rcpy(p-name, name);p-programming=prog;p-math=mathe;p-next = NULL;return p; ,LINK addwordL(LINK list, char name, double prog, double mathe) /将新创建的结点加下链表中 LINK p;if (list = NULL) return mknode(name, prog, mathe);for(p=list; ; p=p-next) if(strcmp(p-name,name)=0) printf(“has been created noden“);break;if(p-next = NULL) p-next = mknode(name, prog, mathe);break;return list; ,void printlink(LINK p, double min, double max) /遍历打印链表结点 for(; p!=NULL; p=p-next)if(p-programmingmin ,Q & A!,