实验10指针做函数参数编程训练

合集下载

C语言实验十指针及其应用.

C语言实验十指针及其应用.

实验十指针及其应用1.已知一个整型数组x[4],它的各元素分别为3、11、8和22.使用指针表示法编程序,求该数组各元素之积。

#include <stdio.h>main(){int x[4]={3,11,8,22},*p,sum=1;for(p=x;p<x+4;p++)sum*=*p;printf("该数组各元素之积为: %d\n",sum);}2.编写程序:输入10个整数至一数组,将其中最小的数与第一个对调,把最大的数与最后一个对调(要求输出对调前后的数组)(1)利用函数调用:#include <stdio.h>void input(int*p,int n){int *pt=p;for(;pt<p+n;pt++)scanf("%d",pt);}void output(int *p,int n){int *pt=p;for(;pt<p+n;pt++)printf("%3d",*pt);printf("\n");}void team(int *p,int n){int *p1,*p2,*c,*d,temp,max,min;p1=p; p2=p+(n-1);max=min=*p1;for(;p1<p+n;p1++){if((*p1)>max) {max=*p1; d=p1;}else if((*p1)<min) {min=*p1; c=p1;} }p1=p;temp=*p1; *p1=*c; *c=temp;temp=*p2; *p2=*d; *d=temp;}main(){int a[10],*pa=a;printf("输入十个数: ");input(pa,10);printf("输出对调前的数组: ");output(pa,10);team(pa,10);printf("输出对调后的数组: ");output(pa,10);}(2)非函数调用法;#include <stdio.h>main(){int a[10],*pa,*p1,*p2,*c,*d,t,max,min;printf("输入十个数: ");for(pa=a;pa<a+10;pa++)scanf("%d",pa);printf("\n输出对调前的数组: ");for(pa=a;pa<a+10;pa++)printf("%3d",*pa);p1=a; p2=a+9;max=min=*p1;for(;p1<a+10;p1++){if((*p1)>max) {max=*p1; c=p1;}else if((*p1)<min) {min=*p1; d=p1;} }p1=a;t=*p2; *p2=*c; *c=t;t=*p1; *p1=*d; *d=t;printf("\n输出对调后的数组: ");for(pa=a;pa<a+10;pa++)printf("%3d",*pa);printf("\n");}3,编写程序:复制一个含有数字字符的字符串到字符数组X中,要求在复制时删除其中的数字字符,之后输出X数组。

指针变量作为函数参数_C语言程序设计案例教程_[共2页]

指针变量作为函数参数_C语言程序设计案例教程_[共2页]
printf("\na=%d,b=%d\n",a,b); printf("max=%d,min=%d\n",*p1, *p2); }
解析:当输入时:5,7↙ 输出:a=5,b=7 max=7,min=5
10.2.3 指针变量作为函数参数
函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将 一个变量的地址传送指 针
图 10.8
图 10.9
接着执行 swap 函数的函数体,使*p1 和*p2 的值互换,也就是使 a 和 b 的值互换(见图 10.10)。
函数调用结束后,p1 和 p2 不复存在(已释放)如图 10.11 所示。
int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a;pointer_2=&b; if(a<b) swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); }
对程序的说明: swap 是用户定义的函数,它的作用是交换两个变量(a 和 b)的值。swap 函数的形参 p1、p2 是指针变量。程序运行时,先执行 void main 函数,输入 a 和 b 的值。然后将 a 和 b 的地址分别赋给指针变量 pointer_1 和 pointer_2,使 pointer_1 指向 a,pointer_2 指向 b,如 图 10.8 所示。 接着执行 if 语句,由于 a<b,因此执行 swap 函数。注意实参 pointer_1 和 pointer_2 是指 针变量,在函数调用时,将实参变量的值传递给形参变量。采取的依然是“值传递”方式。 因此,虚实结合后形参 p1 的值为&a,p2 的值为&b。这时 p1 和 pointer_1 指向变量 a,p2 和 pointer_2 指向变量 b,如图 10.9 所示。

实验10指针进阶

实验10指针进阶

实验10 指针进阶实验内容程序一计算最长的字符串长度:输入n (n<10)个字符串,输出其中最长字符串的有效长度。

要求自定义函数Int max_len ( char *s[],int n),用于计算有n个元素的指针数组s中最长的字符串的长度。

(作业3)#include <stdio.h>#include <string.h>#include <stdlib.h>int max_len(char *s[],int n);int max_len (char *s[],int n){int max=0;int i=0;int len=0;for(i=0;i<n;i++){len=strlen(s[i]);if(len>max){max=len;}}return max;}int main(){int i,n=0,max;char a[15],*p[20];scanf("%s",a);getchar();while(a[0]!='#'){p[n] = (char*) malloc (sizeof(char)*(strlen(a)+1));strcpy(p[n],a);n++;scanf("%s",a);}max=max_len(p,n);printf("%d\n",max);return 0;}程序二指定位置输出字符串:输入一个字符串后再输人两个字符,输出此字符串中从与第1个字符匹配的位置开始到与第2个字符匹配的位置结束的所有字符。

例如,输入字符串“ program”与2个字符“r”和“g”后,输出“rog”。

要求自定义函数char * match(char*S, char ch1, char ch2)返回结果字符串的首地址。

(作业5)#include <stdio.h>#include <string.h>char c[100];char*match (char*s,char ch1,char ch2) {int i=0;int j=0;int n;n=strlen(s);while(s[i]!='\0'){if(s[i]==ch1){while(s[i]!=ch2){c[j]=s[i];j++;i++;if(j>n)break;}c[j]=s[i];break;}i++;}if(c[j]!=ch2) return NULL;elsereturn c;}int main(){char s[100];char ch1;char ch2;scanf("%s%*c",&s);ch1=getchar();getchar();ch2=getchar();if(match(s,ch1,ch2)!=NULL) printf("%s\n",match(s,ch1,ch2)); else printf("Not found!\n");return 0;}程序三查找子串:输入两个字符串s和t,在字符串s中查找子串t,输出起始位置,若不存在,则输出-1。

指针编程练习题

指针编程练习题

指针编程练习题指针是一种特殊的数据类型,在C语言中有着重要的作用。

通过指针,我们可以直接访问和操作内存中的数据。

为了熟悉和掌握指针的使用,下面将给出一些指针编程练习题供大家参考。

1. 交换两个变量的值请编写一个程序,使用指针来交换两个整数变量的值。

要求在程序中定义两个整数变量a和b,通过指针交换它们的值,并打印交换后的结果。

示例输入:a = 10,b = 20示例输出:交换前:a = 10, b = 20交换后:a = 20, b = 102. 求数组元素的和请编写一个程序,使用指针来计算一个整型数组中所有元素的和。

要求在程序中定义一个整型数组array,并使用指针访问数组中的元素,计算它们的和,并打印结果。

示例输入:array = {1, 2, 3, 4, 5}示例输出:数组元素的和为:153. 查找数组中的最大值和最小值请编写一个程序,使用指针来查找一个整型数组中的最大值和最小值。

要求在程序中定义一个整型数组array,并使用指针访问数组中的元素,找到数组中的最大值和最小值,并打印结果。

示例输入:array = {7, 4, 9, 2, 5}示例输出:最大值为:9最小值为:24. 字符串长度计算请编写一个程序,使用指针来计算一个字符串的长度。

要求在程序中定义一个字符数组string,并使用指针访问字符数组中的元素,计算字符串的长度,并打印结果。

示例输入:string = "Hello, World!"示例输出:字符串长度为:135. 动态内存分配请编写一个程序,使用指针来动态分配内存空间,并进行数据的读写操作。

要求在程序中使用malloc函数动态分配内存空间,读取用户输入的整数值并存储到动态分配的内存中,然后使用指针访问该内存中的数据,并打印结果。

示例输入:请输入一个整数: 10示例输出:读取到的整数为: 10以上是几个指针编程练习题的示例,通过练习这些题目,可以提高对指针的理解和使用技巧。

实验十 指 针

实验十  指 针

} /*注意:swap( )能否写成下面的形式呢? void swap(int *p1,int *p2) {int *p; *p=*p1; *p1=*p2; *p2=*p; } */ /*swap( )能否写成下面的形式呢? void swap(int x,int y) {int t; t=x;x=y;y=t; } */ 例4: 体会指针变量操纵数组元素 main() { int a[6]={1,2,3,4,5,6} int *p; p=a; *(p+3)=*(p+3)+10; printf(“%d,%d\n”,*p,*(p+3)); } 例5: 体会数组作为函数形参的调用机理将数组a中的n个数逆序存放。 void invert(int x[],int n) /* 形式参数采用数组名 */ {int i,temp; for(i=0;i<=(n-1)/2;i++) {temp=x[i];x[i]=x[n-1-i];x[n-1-i]=temp; } } main( ) { int a[10]={1,3,5,7,9,11,13,15,17,19}, i; for(i=0;i<10;i++) printf(“%5d”,a[i]); invert(a,10); /* 实际参数为数组名 */ for(i=0;i<10;i++)
function[2]=fun3; function[3]=fun4; for(I=0;I<4;i++) printf(“fun no.%d->%d\n”,i+1,execute(a,b,function[i])); } execute(int x,int y,int *fun()) { return(*fun)(x,y);} fun1(int x, int y) { return(x+y);} fun2(int x,int y) { return(x-y);} fun3(int x,int y) { return(x*y);} fun4(int x,int y) { return(x/y);} 3、程序 main(int argc,char *argv[]) { while(argc-->1) printf(“%s\n”,*++argv); 的文件名为echo.h,编译后可执行程序名为echo.exe(用DOS时),运行 时输入下面命令行:echo BASIC FORTRAN COBOL PASCL 分析输出结果。

实验十 指针(1).

实验十  指针(1).

实验十指针实验目的1.熟练掌握指针的定义和使用2.掌握指针数组处理字符串3.熟练掌握指针作为函数参数,包括数组名作为函数的参数4.熟练使用字符串处理函数strcmp、strcpy、strlen、strcat。

实验内容1.调试,将5个字符串从小到大排序后输出。

源程序(有错误的程序)#include#includevoid fsort(char cname[][6],int n{ int k,j;char tmp[6];for(k=1;k 调试时设置断点 */for(j=0;jif(cname[j]>cname[j+1]{ t=cname[j];cname[j]=cname[j+1];cname[j+1]=t;}}void main({ int i;char cname[5][6]={“wang”,”li”,”zhang”,”jin”,”xian”}; fsort(cname,5;for(i=0;i<5;i++printf(“%s \n”,cname[i];} /*调试时设置断点*/运行结果(改正后程序的运行结果)JinLiWangXianZhang#include "stdafx.h"#include#includevoid fsort(char cname[][6],int n{ int k,j;char t[6];for(k=1;kfor(j=0;jif(*cname[j]>*cname[j+1]{strcpy(t,cname[j];strcpy(cname[j],cname[j+1];strcpy(cname[j+1],t;}}void main({ int i;char cname[5][6]={"wang","li","zhang","jin","xian"};fsort(cname,5;for(i=0;i<5;i++printf("%s\n",cname[i];}2.编程,输入n(3 个数,输出这 n 个数中的最小值及其下标。

指针数组做函数参数

指针数组做函数参数

指针数组做函数参数
指针数组,即一个数组中存放了多个指针,每个指针指向不同的变量或数组。

在函数参数中,指针数组可以传递多个指针,方便地进行一些操作。

例如,我们可以定义一个int类型的指针数组,用于存储多个整数:
int *arr[5];
其中,arr是一个指针数组,包含5个指针,每个指针指向一个int类型的变量。

在函数参数中使用指针数组,可以通过以下几种方式:
1.使用指针数组作为函数参数
void func(int *arr[]) {
// do something
}
2.使用指针数组的首地址作为函数参数
void func(int **arr) {
// do something
}
3.使用数组名作为函数参数
void func(int arr[][5]) {
// do something
}
这些方式在使用时需要注意指针的类型和指针数组的长度。

在函数中可以通过指针数组来访问数组中的元素,从而进行一些操作。

指针数组作为函数参数的优点在于可以方便地传递多个指针,同时也可以动态地修改数组中的元素。

但同时也需要注意指针的类型和指针数组的长度,以确保程序的正确性。

总之,指针数组作为函数参数具有很大的灵活性和实用性,在C/C++程序设计中应用广泛。

指针变量做函数形参_C语言程序设计_[共3页]

指针变量做函数形参_C语言程序设计_[共3页]
运行情况:
58,79↙ a=58,b=79 a=79,b=58
程序中定义函数 swap( )来实现交换两个变量的值,swap( )函数的两个形参 p1 和 p2 为指针变 量。main( )函数中的“void swap(int *, int *);”的作用是声明被调函数,“int *”表示的是该形参是 一个指向整型数据的指针变量。
第 7 章 指针
程序中变量 m 和 n 的值并未交换,交换的是指针变量 p1 与 p2 的值。p1 初时指向 m,后来 指向 n;p2 初时指向 n,后来指向 m。所以第 2 个输出函数实际上是先输出*p1 即 n 的值,后输 出*p2 即 m 的值,实现了从小到大输出的要求。由于在数据输入之前,已经将指针n,因此,上述程序中的输入函数 scanf( )可以改写为:
scanf("%d,%d",p1,p2);
因为,p1 与 p2 表示的就是变量 m 与 n 的地址。但是要注意不可以写成如下形式:
scanf("%d,%d",&p1,&p2);
7.3 指针变量做函数形参
函数一章中讲到基本类型的变量做函数形参,发生函数调用时实参是确定的数据值。函数的 形参还可以是指针变量,函数调用时实参应该是变量的地址或指向变量的指针变量。发生函数调 用时实参向形参的传递遵循单向值传递规则,传递的内容是实参表示的地址值。这种传递的实质 是将实参的指针值传递给形参指针变量,使得实参指针和形参指针变量指向了主调函数中的同一 个变量。尽管在函数调用中不能改变实参指针的值,但可以在被调函数中通过改变形参指针变量 所指向的变量来改变实参指针所指向变量的值,因为实参指针和形参指针变量指向的是同一个变 量。因此,指针变量做函数形参为被调用函数改变主调函数中的数据提供了手段,增加了函数之 间进行信息传递的渠道,并且克服了函数通过 return 语句只能返回一个数据的局限性。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验10指针做函数参数编程训练实验目的:1.掌握指针的定义及使用;2.体会使用指针的作用;3.掌握指针做函数参数的作用;4.掌握指针做函数参数的基本步骤;实验题目:1.输入某年某月某日,计算并输出它是这一年的第几天。

/*函数功能:对给定的某年某月某日,计算它是这一年第几天函数参数:整型变量year,month,day,分别代表年,月,日函数返回值:这一年的第几天*/int DayofYear(int year,int month,int day);2.输入某一年的第几天,计算并输出它是这一年的第几月第几日。

/*函数功能:对给定的某一年的第几天,计算它是这一年的第几月第几日函数入口参数:整型变量year,存储年整型变量yearDay,存储这一年的第几天函数出口参数:整型指针pMonth,指向存储这一年第几月的整型变量整型指针pDay,指向存储第几日的整型变量函数返回值:无*/void MonthDay(int year,int yearDay,int *pMonth,int *pDay);3.输出如下菜单,用switch语句实现根据用户输入的选择执行相应的操作。

1.year/month/day->yearDay2.yearDay->year/month/day3.ExitPlease enter your choice:参考程序及注释:#include <stdio.h>#include <stdlib.h>int DayofYear(int year, int month, int day);void MonthDay(int year, int yearDay, int *pMonth, int *pDay);void Menu(void);int dayTab[2][13] = {{0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}};int main(){int year, month, day, yearDay;char c;Menu(); /* 调用Menu函数显示一个固定式菜单 */c = getchar(); /* 输入选择 */switch (c) /* 判断选择的是何种操作 */{case '1':printf("Please enter year, month, day:");scanf("%d,%d,%d", &year, &month, &day);yearDay = DayofYear(year, month, day);printf("yearDay = %d\n", yearDay);break;case '2':printf("Please enter year, yearDay:");scanf("%d,%d", &year, &yearDay);MonthDay(year, yearDay, &month, &day);printf("month = %d, day = %d\n", month, day);break;case '3':exit(0); /* 退出程序的运行 */default:printf("Input error!");}return 0;}/* 函数功能:对给定的某年某月某日,计算并返回它是这一年的第几天 */int DayofYear(int year, int month, int day){int i, leap;/* 若year为闰年,即leap值为1,则用第1行元素dayTab[1][i]计算;否则leap值为0,用第0行dayTab[0][i]计算 */leap = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);for (i=1; i<month; i++){day = day + dayTab[leap][i];}return day; /* 返回计算出的day的值 */}/* 函数功能:对给定的某一年的第几天,计算它是这一年的第几月第几日 */ void MonthDay(int year, int yearDay, int *pMonth, int *pDay){int i, leap;leap = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);for (i=1; yearDay>dayTab[leap][i]; i++){yearDay = yearDay - dayTab[leap][i];}*pMonth = i; /* 将计算出的月份值赋值给pMonth所指向的变量 */ *pDay = yearDay; /* 将计算出的日号赋值给pDay所指向的变量 */}/* 函数功能:显示菜单 */void Menu(void){printf("1. year/month/day -> yearDay\n");printf("2. yearDay -> year/month/day\n");printf("3. Exit\n");printf("Please enter your choice:");}实验11 字符串与指针编程练习实验目的:1.熟悉字符串的输入及输出2.掌握字符指针做函数参数的方法3.掌握数组做函数参数的方法实验题目:1.编写一函数实现字符串的反序输出,函数原型如下:void invert(char *s);即将字符串s反序。

解题思路:用循环将串s的首尾字符对调,直到中间位置结束。

如:串“ABCDE\0”,将A与E对调(交换),B与D对调,循环次数是串的实际长度的一半。

2.在主函数main中输入一串字符串,并调用invert函数将此字符串反序,然后再将反序后的字符串输出。

3.编写一函数将字符串s中的字符c删除void charDel(char *s,char c);解题思路:假设s为“aebefe\0”串中的e字符删除,判断当前s指针是否指向e字符,若指向e字符,则将e字符后面的befe\0字符向前移动一位,然后移动s指针,重复这一过程。

4.编写函数void replace(char *s,char c1,char c2)实现将s所指向的字符串中所有字符c1用c2替换,字符串,字符c1和c2均在主函数中输入,将原始字符串和替换后的字符串显示在屏幕上。

解题思路:如果当前s指针指向的是c1字符,则把c2赋值给s指针所指向的地址空间,然后移动指针s,重复上述过程。

参考代码:#include "stdio.h"#include "string.h"void replace(char *s,char c1,char c2);void charDel(char *s,char c);void invert(char *s);int main(){char str[]="acbd";invert(str);puts(str);}void invert(char *s){int strLenth;char *i,*j,*mid,temp;//j和i所指向字符是相互交换的字符strLenth=strlen(s);mid=s+strLenth/2;//交换的次数应为字符串总长度除以2j=s+strLenth-1;//令j指向字符串的末尾,\0字符的前一个字符for(i=s;i<mid;i++)//i=s令i指针指向字符串的首部,i++令i指针指向下一个字符{temp=*i;*i=*j;*j=temp;//交换对应的字符j--;//字符串末尾指向前移}}void charDel(char *s,char c){char *p,*q;while(*s!='\0'){if(*s==c){p=s;q=s+1;while(*p++=*q++);//要删除的字符后面的字符串整体向前移动一位,也可以用下面的这段代码/*while(*p!='\0'){*p=*q;p++;q++;}*q='\0';*/}s++;}}void replace(char *s,char c1,char c2){while(*s!='\0'){if(*s==c1){*s=c2;s++;}}}(注:专业文档是经验性极强的领域,无法思考和涵盖全面,素材和资料部分来自网络,供参考。

可复制、编制,期待你的好评与关注)。

相关文档
最新文档