- 简答题
下面内容只能利用指针知识完成
1、编写程序:完成函数void my_power(double x,int y,double *mypow)的定义,该函数的功能是:求xy(即x的y次方)存入指针变量mypow所指向的存贮单元中,并编写主程序,验证my_power()的有效性。
//
//功能描述 :求幂
//返回值 :void
//编写日期 :2018年11月24日
//
#include "stdio.h"
#include "math.h"
void my_power(double x,int y,double *mypow)
{
*mypow=pow(x,y);
}
void main()
{
int y;
double x,mypow;
printf("请输入x和y\n");
scanf("%lf%d",&x,&y);
my_power(x,y,&mypow);
printf("%lf^%d=%lf\n",x,y,mypow);
}
2、编写程序:完成函数int absmin(int *a,int n)的定义,它能实现求指针a所指向的前n个整数中绝对值最小的数,并将它返回给主调函数;并编写程序,验证absmin()的有效性。
//
//功能描述 :求绝对值最小的数
//返回值 :void
//编写日期 :2018年11月26日
//
#include "stdio.h"
#include "math.h"
void input (int *a,int *n)
{
int i;
printf("请输入需要输入多少个数\n");
scanf("%d",n);
printf("请输入你的数组\n");
for (i=0;i<*n;i++)
{
scanf("%d",a+i);
}
}
int absmin(int *a,int n)
{
int min=0,i;
for (i=0;i<n;i++)
{
if (abs(*(a+min))>abs(*(a+i)))
min=i;
}
return *(a+min);
}
void main()
{
int a[1000],n;
input (a,&n);
printf("绝对值最小的数为%d\n",absmin(a,n));
}
3、编写程序:从键盘任意输入一个字符串,输出该字符串。然后,将该字符串逆序存放后再输出,要求用字符指针完成。(提示:逆序存放的函数接口:void invstr(char *s))
//
//功能描述 :字符串逆序存放后再输出
//返回值 :void
//编写日期 :2018年11月27日
//
#include "stdio.h"
#include "string.h"
void invstr(char *s)
{
int l,r,i;
char t;
l=strlen(s);
r=l/2;
for (i=0;i<r;i++)
{
t=*(s+i),*(s+i)=(*(s+l-1-i)),*(s+l-1-i)=t;
}
}
void main()
{
char s[200];
printf("请输入字符串\n");
gets(s);
invstr(s);
printf("逆序后为\n");
puts(s);
}
4、利用指针编程,用指针方法编写一函数,实现两个字符串的比较。编程点拨:即自己编写一个strcmp函数:strcmp(s1,s2),如果s1= s2,返回值为0,如果s1≠s2,返回它们二者第一个不同字符的ASCII码差值(如"BOY"与"BAD",第二个字母不同,"O"与"A"之差为79-65=14)。如果要s1>s2,则输出正值,如果s1<s2,则输出负值。
相关知识:①两个字符串的比较的规则;②常用字符串处理函数实现的算法。
//
//功能描述 :字符串的比较
//返回值 :void
//编写日期 :2018年11月27日
//
#include "stdio.h"
int strcmp(char *a,char *b)
{
int i=0;
while ((*(a+i))==(*(b+i)))
{
if (*(a+i)=='/0')
return 0;
}
return (*(a+i))-(*(b+i));
}
void main()
{
int s;
char a[200],b[200];
printf("请输入字符串一\n");
gets(a);
printf("请输入字符串二\n");
gets(b);
s=strcmp(a,b);
printf("%d\n",s);
}
5、利用指针编程,输入一行文字,找出其中大写字母、小写字母、空格、数字及其它字符各有多少。
相关知识:①指针处理字符串;②通过指针访问字符串中的字符;③大小写字母、空格、数字的判断方法。
//
//功能描述 :字符串统计
//返回值 :void
//编写日期 :2018年11月27日
//
#include "stdio.h"
void tongji(char *s,int *a,int *b,int *c,int *d,int *e)
{
int i;
for (i=0;*(s+i);i++)
if (*(s+i)==' ')
(*a)++;
else if (*(s+i)>='a'&&*(s+i)<='z')
(*b)++;
else if (*(s+i)>='A'&&*(s+i)<='Z')
(*c)++;
else if (*(s+i)>='0'&&*(s+i)<='9')
(*d)++;
else
(*e)++;
}
void main()
{
char s[200];
int a=0,b=0,c=0,d=0,e=0;
printf("请输入你的字符串\n");
gets(s);
tongji(s,&a,&b,&c,&d,&e);
printf("空格有%d个 小写字母有%d个 大写字母有%d个 数字有%d个 其他字符有%d个",a,b,c,d,e);
}
7、利用指针作函数的形参,实现:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
//
//功能描述 :按原来的规律将它插入数组中
//返回值 :void
//编写日期 :2018年11月27日
//
#include "stdio.h"
void charu(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");
printf("请输入需要插入的数\n");
scanf("%d",&d);
charu(a,d);
printf("插入后为\n");
for (k=0;k<=10;k++)
{
printf("%-5d",*(a+k));
}
printf("\n");
}
8、利用指针作函数的形参,实现:现在一个数组存放10个整型数据(可以有相同),要求用户输入一个数,然后把数组中与其输入相同的数删除。
///
//功能描述 :输入一个需要删除的数,删除后输出
//返回值 :void
//编写日期 :2018年11月28日
#include "stdio.h"
void shan(int *a,int f)
{
int i;
for (i=0;i<=9;i++)
{
if(f==(*(a+i)))
break;
}
for (;i<9;i++)
{
*(a+i)=(*(a+i+1));
}
}
void main()
{
int a[10]={1,8,9,12,56,89,200,560,890,900},i,f;
for (i=0;i<=9;i++)
{
printf("%d ",*(a+i));
}
printf("请输入一个需要删除的数\n");
scanf("%d",&f);
shan(a,f);
for (i=0;i<=8;i++)
{
printf("%-5d",*(a+i));
}
printf("\n");
}
9.利用指针作函数的形参,实现:输入10个不相等整数存入数组中,找出其中最小的两个数并输出。
//
//功能描述 :输入10个不相等整数存入数组中找出其中最小的两个数并输出
//返回值 :void
//编写日期 :2018年11月28日
#include "stdio.h"
void min(int *a,int *min1,int *min2)
{
int i;
*min1=0,*min2=0;
for (i=1;i<=9;i++)
{
if(*(a+*min1)>(*(a+i)))
{
*min1=i;
}
}
for (i=1;i<=9;i++)
{
if((*(a+*min2)>=(*(a+i)))&&(*min1!=i))
{
*min2=i;
}
}
}
void main()
{
int a[10],i,min1,min2;
printf("请输入十个数字\n");
for (i=0;i<=9;i++)
{
scanf("%d",a+i);
}
min(a,&min1,&min2);
printf("第一小的数为%d 第二小的数为%d\n",*(a+min1),*(a+min2));
}
10.利用指针作函数的形参,实现:将一个数组中的值按逆序重新存放,例如原先的顺序为8,6,5,4,1,要求逆序存放为1,4,5,6,8,并输出这些数值。(要求只能定义一个数组完成)
//
//功能描述 :逆序重新存放
//返回值 :void
//编写日期 :2018年11月28日
#include "stdio.h"
void nixu(int *a,int n)
{
int r,i,c;
r=n/2;
for (i=0;i<=r-1;i++)
{
c=(*(a+i));
*(a+i)=(*(a+n-1-i));
*(a+n-1-i)=c;
}
}
void main()
{
int a[100],i,n;
printf("请输入需要输入的数字的个数\n");
scanf("%d",&n);
printf("请输入你的数\n");
for (i=0;i<=n-1;i++)
{
scanf("%d",a+i);
}
nixu(a,n);
printf("逆序存放后为\n");
for (i=0;i<=n-1;i++)
{
printf("%-5d ",*(a+i));
}
printf("\n");
}
11.利用指针作函数的形参,实现:输入一行字符,统计其中单词的个数,单词之间用空格隔开。
//
//功能描述 :统计单词个数
//返回值 :void
//编写日期 :2018年12月01日
#include "stdio.h"
void tongji(int *a,char *b)
{
int i;
for (i=0;*(b+i);i++)
{
if (*(b+i)==' ')
continue;
if ((*(b+i)>='a'&&*(b+i)<='z')||(*(b+i)>='A'&&*(b+i)<='Z'))
{
if (*(b+i-1)==' '||i==0)
{
(*a)++;
}
}
}
}
void main()
{
char b[10000];
int a=0;
printf("请输入你的句子\n");
gets(b);
tongji(&a,b);
printf("一共有%d个单词\n",a);
}
12、有一个班3个学生,各学4门课,计算总平均分数,以及第n个学生的成绩。
//
//功能描述 :计算总平均分数,以及第n个学生的成绩
//返回值 :void
//编写日期 :2018年12月01日
#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 cha(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);
cha(&n,b);
}
13、利用指针作函数的形参,求数组中元素的平均值
//
//功能描述 :计算数组的平均值
//返回值 :void
//编写日期 :2018年12月01日
#include "stdio.h"
void aver(double *a,int *b,int n)
{
int i,sum=0;
for (i=0;i<n;i++)
{
sum+= *(b+i);
}
*a=sum/3.0;
}
void main()
{
int i,b[100],n;
double a;
printf("请输入你需要输入几个数\n");
scanf("%d",&n);
printf("请输入%d个数\n",n);
for (i=0;i<n;i++)
{
scanf("%d",b+i);
}
aver(&a,b,n);
printf("平均值为\n");
printf("%lf\n",a);
}