指针类编程题

来源:互联网 发布:sublime text mac破解 编辑:程序博客网 时间:2024/05/17 08:47

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;}