您的当前位置:首页正文

c语言实验8-2

2023-05-24 来源:客趣旅游网


常熟理工学院

《C语言程序设计》实验指导与报告书

______学年 第____ 学期

专 业: ___________________________________________ 学 号: ___________________________________________ 姓 名: ___________________________________________ 实验地点:___________________________________________ 指导教师:___________________________________________

计算机科学与工程学院

2014

1

实验11 指针程序设计(2)

11.1 实验目的

1.掌握函数的返回值为指针的编程方法。 2.掌握字符串的常用操作函数 3.掌握动态内存分配的方法

11.2 示例程序

【实验11.1】本程序的功能是验证:任意一个十进制正整数与其反序数相加后得到一个新的正整数,重复该步骤最终可得到一个回文数。

程序代码:

#include int invert(long,long *); int main() {

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 #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 #include char *fun(char *s) {

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; iif(isdigit(s[i])) { else { }

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 #include int tran(char p,long *a) { long n;

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; ifor (j=i-1; j>=0&&temp<*(p+j); j--)

*(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;kprintf(\"%8ld\return 0; }

/* 调用函数,排序 */

/* 调用函数,返回数值的个数 */ /* 将大于temp的元素循环后移 */ /* 直接插入排序 */

/* 将数值存入a数组 */

/* 移动指针 */

11.6 自己练习

1.编写程序,将字符串str中其ASCII码值最大的或最小的字母删除(若有多个最大的或最小的,均要删除),输出删除前后的字符串。

2.编写程序,已有s1和s2两个字符串,判断字符串s2是否是字符串s1的子串,若是输出“yes”,否则输出“no”。

5

因篇幅问题不能全部显示,请点此查看更多更全内容