指针 2018年12月9日

指针 2018年12月9日
以下内容仅供娱乐,欢迎随时探讨,请多指教
1、编写程序:完成函数void my_power(double x,int y,double *mypow)的定义,该函数的功能是:求xy(即x的y次方)存入指针变量mypow所指向的存贮单元中,并编写主程序,验证my_power()的有效性。

#include <stdio.h>
void my_power(double x,int y,double *mypow)
{
	int i;
	double t=1;
	for(i=1; i<=y; i++) {
		t*=x;
	}
	printf("x的y次方=%lf\n",t);
	*mypow=t;
}
int main()
{
	int y;
	double x,mypow;
	printf("input x and y\n");
	scanf("%lf%d",&x,&y);
	my_power(x,y,&mypow);
	printf("mypow=%lf\n",mypow);
	return 0;
}

2、编写程序:完成函数int absmin(int *a,int n)的定义,它能实现求指针a所指向的前n个整数中绝对值最小的数,并将它返回给主调函数;并编写程序,验证absmin()的有效性。

#include <stdio.h>
int absmin(int *a,int n)
{
	int i;
	int t=0;
	for(i=0; i<n; i++) {
		if(*a+t == *a+i)t=i;
	}
	return *a+t;
}
int main()
{
	int a[100],n;
	printf("input n\n");
	scanf("%d",&n);
	printf("input %d numbers\n",n);
	int i;
	for(i=0; i<n; i++)
		scanf("%d",a+i);
	printf("min=%d",absmin(a,n));
	return 0;
}

3、编写程序:从键盘任意输入一个字符串,输出该字符串。然后,将该字符串逆序存放后再输出,要求用字符指针完成。(提示:逆序存放的函数接口:void invstr(char *s))

#include <stdio.h>
#include <string.h>
void invstr(char *s)
{
	int i,n;
	char temp;
	n=strlen(s);
	for(i=0; i < n/2; i++) {
		temp=*(s+i);
		*(s+i)=*(s+n-i-1);
		*(s+n-i-1)=temp;
	}
}
int main()
{
	char a[100];
	int i;
	printf("input your strings\n");
	gets(a);
	invstr(a);
	printf("then is:\n");
	puts(a);
	return 0;
}

4、利用指针编程,用指针方法编写一函数,实现两个字符串的比较。编程点拨:即自己编写一个strcmp函数:strcmp(s1,s2),如果s1= s2,返回值为0,如果s1≠s2, 返回它们二者第一个不同字符的ASCII码差值(如"BOY"与"BAD", 第二个字母不同,"O"与"A"之差为79-65=14)。如果要s1>s2,则输出正值,如果s1<s2,则输出负值。
相关知识:①两个字符串的比较的规则;②常用字符串处理函数实现的算法。

#include <stdio.h>
#include <string.h>
#include <math.h>
int mystrcmp(char *s1,char *s2)
{
	int a=strlen(s1),b=strlen(s2);
	int i,t;
	for(i=0; i<a; i++) {
		if(*(s1+i) != *(s2+i))t=*(s1+i)-*(s2+i);
	}
	if(a>b)return abs(t);
	if(a<b)return -abs(t);
	if(a == b)return fabs(t);
}
int main()
{
	char s1[100],s2[100];
	printf("input two strings\n");
	gets(s1);
	gets(s2);
	printf("mystrcmp=%d\n",mystrcmp(s1,s2));
	return 0;
}

5、利用指针编程,输入一行文字,找出其中大写字母、小写字母、空格、数字及其它字符各有多少。
相关知识:①指针处理字符串;②通过指针访问字符串中的字符;③大小写字母、空格、数字的判断方法。

#include<stdio.h>
int main()
{
	char a[30];
	char *p;
	int i=0,j=0,m=0,n=0,k=0;
	p=a;//a不可以更改 
	printf("请输入一段文字:\n");
	gets(a);
	while(*p!='\0') {
		//当字符不为结束符时,执行操作
		if(*p>='A'&&*p<='Z')
			i++;
		else if(*p>='a'&&*p<='z')
			j++;
		else if(*p>='0'&&*p<='9')
			m++;
		else if(*p==' ')
			n++;
		else
			k++;
		p++;
		//执行完一轮后,将指针的地址指向下一个字符,继续检查
	}
	printf("大写字母:%d\n小写字母:%d\n数字:%d\n空格:%d\n其他字符:%d\n"
			,i,j,m,n,k);
	return 0;
}

6、在这里插入图片描述


7、利用指针作函数的形参,实现:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

#include "stdio.h"
void insert(int *a,int d)
{
	int i=0,j;
	while(d>*(a+i)) {
		i++;
		if(i==10)
			break;
	}
	for(j=10; j>=i+1; j--) {
		*(a+j)=*(a+j-1);
	}
	*(a+i)=d;
}
void main()
{
	int a[11]= {1,8,11,15,56,78,89,95,100,120};
	int d,k;
	printf("排好序的数为\n");
	for (k=0; k<10; k++) {
		printf("%-5d",*(a+k));
	}
	printf("\n");
	do {
		printf("请输入需要插入的数\n");
		scanf("%d",&d);
		insert(a,d);
		printf("插入后为\n");
		for (k=0; k<=10; k++) {
			printf("%-5d",*(a+k));
		}
		printf("\n");
	} while(1);
}

8、利用指针作函数的形参,实现:现在一个数组存放10个整型数据(可以有相同),要求用户输入一个数,然后把数组中与其输入相同的数删除。

#include<stdio.h>
void del(int *a, int nun, int *n)
{
	int i,j,t=(*n);
	for(i*0; i < (*n); i++) {
		if(*(a+i) == nun) {
			for(j=i; j < (*n)-1; j++)
				*(a+j)=*(a+j+1);
			(*n)--;
		}
	}
}
void main()
{
	int a[110];
	int n,i,nun;
	printf("input n\n");
	scanf("%d",&n);
	printf("input %d nunbers\n",n);
	for(i=0; i<n; i++)
		scanf("%d",a+i);
	printf("input num\n");
	scanf("%d",&nun);
	del(a,nun,&n);
	printf("then is:\n");
	for(i=0;i<n;i++)
	printf("%d ",*(a+i));
	printf("\n");
}

9,利用指针作函数的形参,实现:输入10个不相等整数存入数组中,找出其中最小的两个数并输出。

#include "stdio.h"
int main()
{
	int a[10];
	int j,i;
	for(i=0; i<10; i++) {
		printf("input %d number\n",i+1);
		scanf("%d",a+i);
	}
	for(i=0; i<10; i++) {
		for(j=0; j<10-i-1; j++)
			if(*(a+j) > *(a+j+1)) {
				int t=*(a+j);
				*(a+j)=*(a+j+1);
				*(a+j+1)=t;
			}
	}
	printf("%d\t%d\n",*a,*(a+1));
	return 0;
}

10,利用指针作函数的形参,实现:将一个数组中的值按逆序重新存放,例如原先的顺序为8,6,5,4,1,要求逆序存放为1,4,5,6,8,并输出这些数值。(要求只能定义一个数组完成)

#include"stdio.h"
void trans(int *a,int n)
{
	int*i=a,*j=a+n-1,temp,*t=a+n/2;
	for(; i<t;i++,j--) {
		temp=*i;
		*i=*j;
		*j=temp;
	}
}
void main()
{
	int a[100],n,i;
	printf("input n\n");
	scanf("%d",&n);
	printf("input %d numbers\n",n);
	for(i=0; i<n; i++)
			scanf("%d",a+i);
	printf("then is:\n");
	trans(a,n);
	for(i=0; i<n; i++)
	printf("%d\t",*(a+i)); 
	printf("\n");
	}

11, 利用指针作函数的形参,实现:输入一行字符,统计其中单词的个数,单词之间用空格隔开。

#include<stdio.h>
int myfun(char *s)
{
	int i, count=0;
	for(i=0; *(s+i)!='\0'; i++)
		if(*(s+i) != ' '&&(*(s+i+1)=='\0'||*(s+i+1)==' '))
				count++;
	return count;
}
void main()
{
	char s[100];
	printf("input a string\n");
	gets(s);
	printf("个数是:%d\n",myfun(s));
}

12、有一个班3个学生,各学4门课,计算总平均分数,以及第n个学生的成绩。

#include "stdio.h"
void aver(double *a,int (*b)[4])
{
	int i,j,sum=0;
	for (i=0; i<3; i++) {
		for (j=0; j<4; j++) {
			sum+= *(*(b+i)+j);
		}
	}
	*a=sum/3.0;
}
void search(int *n,int (*b)[4])
{
	int i;
	printf("第%d个学生的成绩为\n",*n);
	for (i=0; i<4; i++) {
		printf("%-3d",*(*(b+(*n-1))+i));
	}
	printf("\n");
}
void main()
{
	int i,j,b[3][4],n;
	double a;
	printf("请输入三个学生的四门成绩\n");
	for (i=0; i<3; i++) {
		for (j=0; j<4; j++) {
			scanf("%d",*(b+i)+j);
		}
	}
	aver(&a,b);
	printf("学生的平均成绩为\n");
	printf("%lf\n",a);
	printf("请输入你需要查询第几个学生的成绩\n");
	scanf("%d",&n);
	search(&n,b);
}

13、利用指针作函数的形参,求数组中元素的平均值

#include <stdio.h>
double myave(double *a,int n)
{
	int i;
	double sum=0;
	for(i=0; i<n; i++)
		sum+=*(a+i);
	return(sum/n);
}
int main()
{
	double a[100],average;
	int n,i;
	printf("input n\n");
	scanf("%d",&n);
	printf("input %d numbers\n",n);
	for(i=0; i<n; i++)
		scanf("%lf",a+i);
	average=myave(a,n);
	printf("average=%lf\n",average);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43310774/article/details/84890155