常熟理工学院
《C语言程序设计》实验指导与报告书
______学年 第____ 学期
专 业: ___________________________________________ 学 号: ___________________________________________ 姓 名: ___________________________________________ 实验地点:___________________________________________ 指导教师:___________________________________________
计算机科学与工程学院
2014
1
实验11 指针程序设计(2)
11.1 实验目的
1.掌握函数的返回值为指针的编程方法。 2.掌握字符串的常用操作函数 3.掌握动态内存分配的方法
11.2 示例程序
【实验11.1】本程序的功能是验证:任意一个十进制正整数与其反序数相加后得到一个新的正整数,重复该步骤最终可得到一个回文数。
程序代码:
#include long x,a,*pa=&a; printf(\"\\nplease input a number:\"); scanf(\"%ld\ { } printf(\"\\n%ld is Palindrome number.\return 0; } int invert(long x,long *invertx) { long m=x,sum=0; while(m) { sum*=10; sum+=m%10; m/=10; } *invertx=sum; if(x==*invertx) return 1; else return 0; } /* 不是回文数返回0 */ /* 判断是否回文数 */ /* 是回文数返回1 */ /* 得到反序数 */ /* 输入一个十进制正整数 */ /* 调用函数判断是否满足条件 */ /* 正整数与反序数相加 */ while(!invert(x,pa)) x+=*pa; /* 声明函数 */ printf(\"\\nnumber is %ld, invert is %ld, sum is %ld\ 说明: 1.运行该程序,分析运行结果。 2.函数invert()接受一个正整数,求其反序数。如果正整数与其反序数相等,则是回文数返回1;若不相等,则不是回文数返回0,同时将反序数传回main()函数,求其与正整数 2 的和,继续调用函数invert()。 11.3 阅读程序 【实验11.2】本程序的功能是:在字符串s1中查找字符串s2,用字符串s3替换所有找见的s2,如果s1中没有s2,则输出“not found.”。 程序代码: #include int find_replace(char *s1,char *s2,char *s3) { int i, j, k=0, flag=0; char t[80]; if(*s1=='\\0'||*s2=='\\0') return flag; for(i=0; s1[i]!='\\0'; i++) { for(j=i, k=0; s1[j]==s2[k]; j++, k++); if(s2[k]=='\\0') { strcpy(t, &s1[j]); strcpy(&s1[i], s3); i=i+strlen(s3); strcpy(&s1[i], t); flag=1; } } return flag; } int main() { char s1[80]=\"This is a book.\ puts(s1); if(find_replace(s1,s2,s3)) puts(s1); else printf(\"not found\"); return 0; } /* /* /* /* */ */ */ */ /* */ /* */ 说明: 1.函数find_replace()有三个形参,s1指向原串,s2指向要找的串,s3指向用于替换的串。变量flag为是否找到的标志,0未找到,1找到。在s1中循环查找s2,找到后用s3进行替换,并置标志flag为1。 2.main()函数中调用函数find_replace(),若已替换,则输出替换后的字符串,若未找到,则输出“not found.”。 11.4 完善程序 3 【实验11.3】下面程序的功能是:将给定字符串中的所有数字字符顺序前移,其他字符顺序后移。例如,s所指字符串为:avd123fmh5##93edf,处理后新字符串为:123593avdfmh##edf。请完善程序。 程序代码: #include int i, j, k, n; char *p, *t; n=strlen(s)+1; t=(char*)malloc(n*sizeof(char)); p=(char*)malloc(n*sizeof(char)); j=0; k=0; for(i=0; i for(i=0; i<________; i++) p[j+i]= t[i]; p[j+k]= '\\0'; return ________; } int main() { char s[80]; printf(\"Please input: \"); scanf(\"%s\ printf(\"\\nThe result is: %s\\n\ return 0; } t[k]=s[i]; k++; } p[________]=s[i]; j++;} 说明: 1.函数fun()中使用动态内存分配方法,分配了两块存储区,分别由指针t与p指向其首地址。p存储区存放数字,t存储区存放字符,然后将t存储区的字符复制到p存储区,函数的返回值为指针p。 2.最后在字符串的尾部放入字符串结束符'\\0'。 11.5 改错程序 【实验11.4】本程序的功能是:将字符串str中的所有数字分离出来保存到一个数组中,然后将数组排序后输出。请改正程序中的错误,并调试。 注意:改错时不允许增加及删除语句,只允许修改或移动语句的位置。 【含有错误的程序代码】 #include 4 int i=0,j=0; while(*p) if(isdigit(*p)) /* 判断是否为数字 */ { n=0; while(isdigit(*p)) { n=n*10+*p-'0'; /* 转换为数值 */ p++; } a[j]=n; } else p++; return j; } void insertSort(long *p) { int i, j;long temp; for (i=1; i *(p+j+1)=*(p+j); *(p+j+1)=temp; /* 插入 */ } } int main() { char str[80];long a[10];int n,k; gets(str); n=tran(str,a); printf(\"\\nThe num of integer:%d\\n\ insertSort(a,n); for(k=0;k /* 调用函数,排序 */ /* 调用函数,返回数值的个数 */ /* 将大于temp的元素循环后移 */ /* 直接插入排序 */ /* 将数值存入a数组 */ /* 移动指针 */ 11.6 自己练习 1.编写程序,将字符串str中其ASCII码值最大的或最小的字母删除(若有多个最大的或最小的,均要删除),输出删除前后的字符串。 2.编写程序,已有s1和s2两个字符串,判断字符串s2是否是字符串s1的子串,若是输出“yes”,否则输出“no”。 5 因篇幅问题不能全部显示,请点此查看更多更全内容