leii

实验十三 善于利用指针(1)

 

一、实验目的和要求:

  1. 掌握有关指针的概念,会定义和使用指针变量。
  2. 掌握指针和函数的关系:指针作为函数的参数、函数返回指针值、指向函数的指针。
  3. 掌握指针和数组的关系:通过指针引用数组元素、指针数组和带参main函数等。
  4. 掌握字符串的指针和指向字符串的指针变量。

 

二、实验内容:

  1. 用指针实现输入三个整数按有小到大的顺序输出
  2. 用指针实现输入10个整数,将其中最小者与第一个数对换,最大者与最后一个数对换。
  3. 用指针实现:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前m个数写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。
  4. n个人围成一圈,顺序排号。从第一个开始报数(13报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位.

 

三、实验步骤与结果

1. 用指针实现输入三个整数按有小到大的顺序输出

1)设计思路

 

2)程序源码(加注释)

#include <stdio.h>

// 输入3个正整数,按由大到小的顺序输出,要求使用指针实现。

 

int main()

{

    int num1, num2, num3;

    printf("输入三个整数:\n");

    scanf("%d%d%d", &num1, &num2, &num3);

    // printf("%d,%d,%d\n", num1, num2, num3);

    int *p1, *p2, *p3, temp;

    p1 = &num1;

    p2 = &num2;

    p3 = &num3;

    if (*p1 < *p2)

    {

        temp = *p1;

        *p1 = *p2;

        *p2 = temp;

    }

 

    if (*p2 < *p3)

    {

        temp = *p2;

        *p2 = *p3;

        *p3 = temp;

    }

 

    if (*p1 < *p2)

    {

        temp = *p1;

        *p1 = *p2;

        *p2 = temp;

    }

    printf("大到小:%d,%d,%d\n", num1, num2, num3);

    return 0;

}

 

3)运行结果与分析

 

2 用指针实现输入10个整数,将其中最小者与第一个数对换,最大者与最后一个数对换

1)设计思路

 

2)程序源码(加注释)

#include <stdio.h>

void input(int *s, int n);   //定义输入函数

void sort(int *s, int n);    //定义排序函数

void print(int *s, int n);   //定义输出函数

int main()

{

    int n[10], *p=n;

    input(p, 10);            //调用输入函数

    sort(p, 10);             //调用排序函数

    print(p, 10);            //调用输出函数

    return 0;

}

//输入函数

void input(int *s, int n)

{

    int *m;

    for (m=s, printf("请输入十个数字: "); m<s+n; scanf("%d", m++));

}

//排序函数

void sort(int *s, int n)

{

    int *i, *j, *min, *max, t;

    for (i=s, min=i; i<s+n; i++)

        for (j=i+1; j<s+n; *min>*j ? min=j++ : j++);

    t=*min, *min=*s, *s=t;

    for (i=s+1, max=i; i<s+n; i++)

        for (j=i+1; j<s+n; *max<*j ? max=j++ : j++);

    t=*max, *max=*(s+n-1), *(s+n-1)=t;

}

//输出函数

void print(int *s, int n)

{

    int *i;

    for (i=s, printf("排序后的数字为: "); i<s+n; printf("%d ", *i++));

    printf("\n");

}

 

(3)运行结果与分析

 

3 用指针实现:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前m个数写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数

1)设计思路

 

2)程序源码(加注释)

#include <stdio.h>

int main()

{

void move(int [20],int,int);

int number[20],n,m,i;

printf("输入几个数?");

scanf("%d",&n);

printf("请输入 %d 个数字:\n",n);

for(i=0;i<n;i++)

scanf("%d",&number[i]);

printf("你想要移动哪个位置的数字?");

scanf("%d",&m);

move(number,n,m);

printf("现在它们的顺序是:\n");

for(i=0;i<n;i++)

printf("%d ",number[i]);

printf("\n");

return 0;

}

 

void move(int array[20],int n,int m)

{

int *p,array_end;

array_end=*(array+n-1);

for(p=array+n-1;p>array;p--)

*p=*(p-1);

*array=array_end;

m--;

if(m>0)

move(array,n,m);

}

 

3)运行结果与分析

 

 

4 n个人围成一圈,顺序排号。从第一个开始报数(13报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位

1)设计思路

 

2)程序源码(加注释)

#include<stdio.h>

void pick(int *p,int n)

{

int i,sum,cnt=0;

for(i=0;i<n;i++)

*(p+i)=1;

i=0;

sum=n;

while(sum>1)

{

if(*(p+i)==1)

{

cnt++;

if(cnt%3==0)

{

*(p+i)=0;

cnt=0;

sum--;

}

}

i++;

i=i%n;//转完一圈后重新开始

}

for(i=0;i<n;i++)

if(*(p+i)==1)

printf("最后还有%d:",i+1);

}

int main()

{

    int n,a[100];

int *p=a;

printf("开始一共多少人:\n");

scanf("%d",&n);

pick(p,n);

return 0;

}

 

3)运行结果与分析

 

 

 

四、实验总结与心得

 

总结:

前面的构建好思路,整个程序框架能更快解题;

学习的时候一定要自己理解,巧妙记忆;

不断利用基础的结构设计;

利用自己知道的题型逐步设计程序;

审题是关键,对题意理解了,借助自己所学的知识,进行合理设计,然后整理程序。

心得:

自己一定要记住一些模型,才能更快的编辑程序。

分类:

技术点:

相关文章:

  • 2021-12-05
  • 2021-08-13
  • 2022-03-03
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-18
  • 2021-11-21
  • 2021-08-20
  • 2022-12-23
  • 2021-09-25
相关资源
相似解决方案