指针类编程题

1.编写一函数,完成一个字符串的拷贝,要求用字符指针实现。在主函数中输入任意字符串,并显示原字符串,调用该函数之后输出拷贝后的字符串。

#include<stdio.h>
#include<string.h>

void my_copy(char *p,char *q)
{
    while(*p != '\0')
    {
            *q = *p;
            q++;
            p++;
    }
    *q = '\0';
}
int main(int argc, const char *argv[])
{
    char str1[100],str2[100];
    gets(str1);
    puts(str1);
    my_copy(str1,str2);
    puts(str2);
    return 0;
}

2.编写一函数,求一个字符串的长度,要求用字符指针实现。在主函数中输入字符串,调用该函数输出其长度。

#include<stdio.h>
#include<string.h>

int my_strlen(char *p)
{
    int tot=0;
    while(*p != '\0')
    {
        tot++;
        p++;
    }
    return tot+1; //包含 '\0'
}

int main(int argc, const char *argv[])
{
    char str[100];
    gets(str);
    printf("tot:%d\n",my_strlen(str));
    return 0;
}

3.从键盘上输入10个数据到一维数组中,然后找出数组中的最大值和该值所在的元素下标。

#include<stdio.h>

int  max(int *p)
{
    int max;
    int i,j;
    int index;
    for(i=0;i<9;i++)
    {
        max = *(p+i);
        index = i;
        for(j=1;j<10;j++)
        {
            if(max < *(p+j))
            {
                max = *(p+j);
                index = j;
            }
        }
    }
    return index;
}

int  min(int *p)
{
    int min;
    int i,j;
    int index;
    for(i=0;i<10;i++)
    {
        min = *(p+i);
        index = i;
        for(j=1;j<10;j++)
        {
            if(min > *(p+j))
            {
                min = *(p+j);
                index = j;
            }
        }
    }
    return index;
}

int main(int argc, const char *argv[])
{
    int a[10];
    int i;
    for(i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
    }
    printf("max下标:%d,min下标:%d\n",max(a),min(a));
    return 0;
}

4.从键盘上输入10个整数存放到一维数组中,将其中最小的数与第一个数对换,最大的数与最后一个数对换。要求进行数据交换的处理过程编写成一个函数,函数中对数据的处理要用指针方法实现。输入数据为:35,20,94,-23,39,-56,100,87,49,12.

#include<stdio.h>

void  max(int *p)
{
    int max,temp;
    int i,j;
    int index;
    for(i=0;i<9;i++)
    {
        max = *(p+i);
        index = i;
        for(j=1;j<10;j++)
        {
            if(max < *(p+j))
            {
                max = *(p+j);
                index = j;
            }
        }
    }
    temp = *(p + index);
    *(p + index) = *(p + 9);
    *(p + 9) = temp;
}
void  min(int *p)
{
    int min,temp;
    int i,j;
    int index;
    for(i=0;i<10;i++)
    {
        min = *(p+i);
        index = i;
        for(j=1;j<10;j++)
        {
            if(min > *(p+j))
            {
                min = *(p+j);
                index = j;
            }
        }
    }
    temp = *(p + index);
    *(p + index) = *(p + 0);
    *(p + 0) = temp;
}

int main(int argc, const char *argv[])
{
    int a[10];
    int i;
    for(i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
    }
    min(a);
    max(a);
    for(i=0;i<10;i++)
    {
        printf("%d\t",a[i]);
    }
    printf("\n");
    return 0;
}

5.编写一个函数(参数用指针)将一个3×3矩阵转置。

#include<stdio.h>

void zhuanzhi(int (*p)[3],int (*q)[3])
{
    int i,j,k;
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            for(k=0;k<3;k++)
            {
                *(*(q+i)+k) = *(*(p +k) + i);
            }
        }
    }
}

int main(int argc, const char *argv[])
{
    int a[3][3],b[3][3];
    int i,j;
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    zhuanzhi(a,b);
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("%d ",b[i][j]);
        }
    }
    printf("\n");
    return 0;
}

6.利用指向行的指针变量求5×3数组各行元素之和

#include<stdio.h>

void my_tot(int (*p)[3])
{
    int tot;
    int i,j;
    for(i=0;i<5;i++)
    {
        tot = 0;
        for(j=0;j<3;j++)
        {
            tot += *(*(p+i) + j);
        }
        printf("第%d行元素之和为:%d\n",i+1,tot);
    }
}

int main(int argc, const char *argv[])
{
    int a[5][3];
    int i,j;
    for(i=0;i<5;i++)
    {
        for(j=0;j<3;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    //printf("tot:%d\n",my_tot(a));
    my_tot(a);
    return 0;
}

7.从键盘上输入10个整数存放到一维数组中,用函数实现将10个整数按输入时的顺序逆序排列,函数中对数据的处理要用指针方法实现。

#include<stdio.h>

void my_nixu(int *head,int *tail)
{
    char temp;
    while(head < tail)
    {
        temp = *head;
        *head = *tail;
        *tail = temp;
        head ++;
        tail --;
    }
}
int main(int argc, const char *argv[])
{
    int a[10];
    int i;
    int *head,*tail;
    for(i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
    }
    head = &a[0];
    tail = &a[9];
    my_nixu(head,tail);
    for(i=0;i<10;i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
    return 0;
}

8.用指针法编程,从键盘上输入多个字符串(每个串不超过5个字符且没有空格),用”*”作为输入结束的标记。从所输入的若干字符串中,找出一个最大的串,并输出该串。要求串的输入以及最大串的查找通过调用编写的函数实现。

#include<stdio.h>
#include<string.h>

int main(int argc, const char *argv[])
{
    //通过调用系统库函数来写的
    char s[6];
    char max[6];
    gets(s);
    strcpy(max,s);
    while(1)
    {
        gets(s);
        if(strncmp(s,"*****",5) == 0)
            break;
        if(strcmp(max,s) < 0)
            strcpy(max,s);
    }
    printf("%s\n",max);
    return 0;
}

9、编写一个函数,函数的功能是移动字符串中的内容。移动的规则如下:把第1到第m个字符,平移到字符串的最后;再把第m+1到最后的字符移动到字符串的前部。例如,字符串中原由的内容为:ABCDEFGHIJK,m的值为3,则移动后,字符串中的内容应该是DEFGHIJKABC。在主函数中输入一个长度不大于20的字符串和平移的值m,调用函数完成字符串的平移。要求用指针方法处理字符串。

#include<stdio.h>
#include<string.h>
void fun(char *head,char *tail,char *p,int m,int n)
{
    int i;
    for(i = 0;i < n-m-1 ;i ++)   //去掉 '\0' 的位置
    {
        *p = *(tail+i);
        p++;
    }
    for(i = 0;i < m;i++)
    {
        *p = *(head + i);
        p++;
    }
    *p = '\0';
}
int main(int argc, const char *argv[])
{
    char str1[20],str2[40];
    int m,n;
    char *head,*tail;
    gets(str1);
    n = strlen(str1);
    scanf("%d",&m);
    head = str1 + 0;
    tail = str1 + m;
    fun(head,tail,str2,m,n);
    puts(str2);
    return 0;
}

10、输入一个长度不大于30的字符串,将此字符串中从第m个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出。要求用指针方法处理字符串。

#include<stdio.h>
#include<string.h>

void my_copy(char *p,char *q,int m,int n)
{
    int i;
    for(i = m - 1;i < n;i ++)
    {
        *q = *(p + i);
        q++;
    }
    *q = '\0';
}

int main(int argc, const char *argv[])
{
    char str1[30],str2[30];
    int m,n ;
    gets(str1);
    scanf("%d",&m);
    n = strlen(str1);
    my_copy(str1,str2,m,n);
    puts(str2);
    return 0;
}
  • 18
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值