《C程序设计》上机实验报告(七)之指针的应用

实验内容:

1.运行程序

#include <stdio.h>

void main()

{   int a=10,*p;

    p=&a;

    printf("%d",*p);

    scanf("%d",p);

    printf("%x",p);

    printf("%x",&p);

    *p=5;

    printf("%d",a);

    (*p)++;

    printf("%d",a);

}

要求:

  1. 分析程序,写出程序的运行结果。

(2)输入并调试上述源程序。

(3)运行程序,将分析结果和实际结果对照比。若不同,找出原因。

(4)说明p和a的关系。

2.运行程序

程序的作用是将输入的两个整数按从大到小的顺序输出。

#include <stdio.h>

void main()

{

    int i1,i2,*p1,*p2,t;

    p1=&i1; 

    p2=&i2;

    printf("Enter two numbers:\n");

    scanf("%d%d",p1,p2);

    if(i1<i2)  {t=*p1;*p1=*p2;*p2=t;}

    printf("i1=%d,i2=%d\n",i1,i2);

}

要求:

(1)写出并分析程序的运行结果。

(2)输入调试上述淅程序,并进行编译、连接、运行。

(3)若将变量定义改为:

int i1,i2,*p1,*p2,*p;

交换i1、i2值的语句改为:

   if(i1<i2)  {p=p1;p1=p2;p2=p;}

结果将会怎样?为什么?

(4)若将第二条输出语句改为:

printf("Max=%d,Min=%d\n",*p1,*p2);

结果将会怎样?为什么?

3. 程序改错

程序中的函数fun的功能是:先将在字符串s中的字符按正序存放到t串中,然后把s中的字符按逆序连接到t串的后面。例如,当s上的字符串为ABCDE时,则t中的字符串应为ABCDEEDCBA。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

#include <stdio.h>

#include <conio.h>

#include <string.h>

void main()

{

    int i,s1;

    s1=strlen(s);

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

        t[i]=s[i];

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

        t[s1+i]=s[s1-i-1];

    t[s1]='\0';

}

void main()

{

    char s[100],t[100];

    clrscr();

    printf("\nPlease enter string s:");

    scanf("%s",s);

    fun(s,t);

    printf("The result is :%s\n",t);

}

要求:

(1)分析改正源程序中的错误。

(2)对源程序进行编译、连接、运行。

(3)写出程序运行的正确结果。

4.程序填空

本程序从字符串str中截取从第m个字符开始的n个字符,然后输出。

#include <stdio.h>

void main()

{

    static char str[]="goodmorning";

    char *p,*cut(char *s,int m,int n);

    p=cut(str,3,4);

    puts(p);

}

char *(char *s,int m,int n)

{

    int i;

    static char sub[10];

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

        sub[i]=1 *(s + m + i - 1);     

sub[i]=2 '\0';       

return 3 sub;             

}

要求:

(1)输入并完善源程序。

(2)对源程序进行编译、连接、运行。

(3)写出程序运行的结果。

5.利用指针编写程序

编写一个函数,求1~m之间(含m)能被7或11整除的所有整数并放在数组a中,在main函数中输出这些数和这些数的个数。

例如:若m的值为50,则程序输出:

      7  11  14  21  22  28  33  35  42  44  49 

      总数:11

程序:#include <stdio.h>

#define m 50//个数

bool hanser(int* p1)

{

  bool f = false;

  if (*p1 % 7 == 0 || *p1 % 11 == 0)

      f = true;

  return f;

}

void main()

{

  int a[m], i;

  bool f;

  int* p = a, t = 0;//t为总数

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

  {

      *(p + i) = i + 1;

      printf("%5d", *(p + i));

      if ((i + 1) % 5 == 0) printf("\n");

  }

  printf("能被7或11整除的所有整数有: \n");

  p = a;

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

  {

      f = hanser(p);

      if (f)

      {

          t++;

          printf("%5d", *p);

      }

      p++;

  }

  printf("\n");

  printf("t=%d", t);

}

6.利用指针编写程序

编写一个函数,将main函数输入的3×3矩阵转置,在main函数中输出转置的结果。

程序:void main()

{

  int a[3][3], i, j, t;

  printf("输入矩阵\n");

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

      scanf("%d %d %d", &a[i][0], &a[i][1], &a[i][2]);

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

      for (j = i; j < 3; j++)

      {

          t = *(*(a + i) + j);//数组a[i][j]= a[j][i];

          *(*(a + i) + j) = *(*(a + j) + i);

          *(*(a + j) + i) = t;

      }

  printf("转置后\n");

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

      printf("%d %d %d\n", a[i][0], a[i][1], a[i][2]);

}

7.利用指针编写程序

有n个学生围成一圈,按顺序排号。从第1个人开始报数,凡报到3的人退出圈子,问最后留下的是原来第几号的学生。  

要求及提示:

(1)n的值输入,输出最后留下的学生的顺序号

(2)用数组来存储n个学生。

(3)解题思路提示

step1:先利用数组开辟足够大的一个存储空间,指针P指向数组;

step2:输入n值,为这n个人编号;

step3:定义3个循环时所需计数变量

每次循环时的计数变量i,目的是控制指针是否指向了最后一个人,如果指向了最后一个人,则要使指向重新指向第一个人;  控制报数的变量k,目的是:按1、2、3报数时的计数变量。k为3时,将此人的编号设置为0,k重新计数;标识退出人数的变量m.目的是:记录已退出多少人,为循环结束做准备。

step4:循环继续条件:n-m>1。

程序:int main()

{

  system("color f3");

  int i, k, m, n, num[50], * p;

  printf("input the number of n:");

  scanf("%d", &n);

  p = num;

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

      *(p + i) = i + 1;

  i = 0;

  k = 0;

  m = 0;

  while (m < n - 1)

  {

      if (*(p + i) != 0)

          k++;

      if (k == 3)

      {

          *(p + i) = 0;

          k = 0;

          m++;

      }

      i++;

      if (i == n) i = 0;

  }

 

  while (*p == 0) p++;

  printf("%d", *p);

  return 0;

}

8.利用指针编写程序

编写程序,将字符串中的第m个字符开始的全部字符复制成另一个字符串。

要求:

在主函数中输入字符串及m的值,并输出复制结果。在被调用函数中完成复制。

程序:#include<stdio.h>

int main()

{

  void copy(int m, char* a, char* b);

  char a[] = "i am a studant", b[30];

  int m;

  printf("输入m:");

  scanf("%d", &m);

  printf("输入字符串:");

  scanf("%s", b);

  copy(m, a, b);

  printf("%s", a);

}

void copy(int m, char* a, char* b)

{

  int i, j;

  for (i = m - 1, j = 0; b[j] != 0; i++, j++)

  {

      a[i] = b[j];

  }

  a[i] = 0;

}

9.利用指针编写程序

设有一数列,包含10个数,已按升序排好。现要求编一程序,它能够把从指定位置开始的n个数按逆序重新排列并输出新的完整数列。

例如:原数列为2,4,6,8,10,12,14,16,18,20。若要求把从第4个数开始的5个数按

逆序重新排列,则得到新数列为2,4,6,16,14,12,10,8,18,20

要求:

进行逆序处理时使用指针方法。

程序:#define N 10

void order(int* pa, int m1, int n1)

{

  int temp, * pm1, * pend, * pminddle;

  pm1 = pa + m1 - 1;

  pend = pa + m1 + n1 - 2;

  pminddle = pa + m1 - 1 + n1 / 2;

  for (; pm1 < pminddle; pm1++, pend--)

  {

      temp = *pm1;

      *pm1 = *pend;

      *pend = temp;

  }

}

int main()

{

  int a[N];

  int m, n, i;

  printf("输入一个已排好序的数:");

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

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

  printf("输入指定位置m:");

  scanf("%d", &m);

  printf("输入重新排的个数n:");

  scanf("%d", &n);

  printf("输出原序的:");

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

  printf("%4d", a[i]);

  printf("输出重排序的:");

  order(a, m, n);

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

      printf("%4d", a[i]);

  return 0;

}

10.利用指针编写程序

编写具有如下原型的函数:

void chgStr(char *ip,char *op)

负责将ip所指向输入字符串中的各字符按照指定规则进行变换后,存放到由op指向的输出串中。即从头到尾逐字符地对ip所指向的字符串进行如下处理:

(1)若ip所指当前字符为字母,则将其改变大小写后存放到结果字符串op中。

(2)若ip所指当前字符是一个数字字符,则将其变换为另一个数字字符后存放到结果字符串op中:字符0变换为字符9,字符1变换为字符8,字符2变换为字符7,依此类推,字符9变换为0。

(3)若ip所指当前字符为其它字符,则将该字符复制到结果字符串op中。

例如:若调用时通过ip带来的字符串为“Nankai 1918-2004,x+y-5*6/37=?OK!”,则结果字符串op应为“nANKAI8081-7995,X+Y-4*3/62=?ok!”。

最后编写主函数,对chgStr()进行调用,以验证其正确性。

程序:void chgStr(char* ip, char* op)

{

    int i;

    for (i = 0; *(ip + i)!= '\0'; ++i)

    {

        if (*(ip + i) >= 65 && *(ip + i) < 65 + 26)

        {

            *(op + i) = *(ip + i) + 32;

        }

        else if (*(ip + i) >= 97 && *(ip + i) <= 97 + 26)

        {

            *(op + i) = *(ip + i) - 32;

        }

        else if (*(ip + i) >= 48 && *(ip + i) <= 57)

        {

            *(op + i) = 48 + 57 - *(ip + i);

        }

        else

        {

            *(op + i) = *(ip + i);

        }

    }

    op[i] = '\0';

}

int main()

{

    char ip[30], op[30];

    scanf("%s", ip);

    chgStr(ip, op);

    printf("%S", op);

}

程序测试及运行结果:

1.

2.

3.

4.

5.

6.

7.

8.

 

9.

10.

结果分析与讨论:

1.怎样正确使用数组的指针和指向数组的指针变量。

答:通过针引用数组元素的基本方法 (1)下标法:a [i]。 (2)指针法:* (a+i) 或 * (p+i),其中a是数组名,p是指向数组元素的指针变量,其初值p=a。因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。

数组指针的类型和数组元素的类型有关,p 指向的数组元素是 int 类型,所以 p 的类型必须也是int *

2.怎样正确使用字符型指针处理字符串问题?

答:将字符串地址赋予指针,然后用指针进行地址的交换或内容的交换,在使用字符指针时,要特别注意,是否后续会更改该字符串的值,若需要更改,不要使用char buf=“abcd”;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/456567.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java数据结构】单向 不带头 非循环 链表实现

模拟实现LinkedList&#xff1a;下一篇文章 LinkedList底层是双向、不带头结点、非循环的链表 /*** LinkedList的模拟实现*单向 不带头 非循环链表实现*/ class SingleLinkedList {class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val …

20240203在Ubuntu20.04.6下配置stable-diffusion-webui.git

20240203在Ubuntu20.04.6下配置stable-diffusion-webui.git 2024/2/3 11:55 【结论&#xff1a;在Ubuntu20.04.6下&#xff0c;生成512x512分辨率的图像&#xff0c;大概需要11秒钟&#xff01;】 前提条件&#xff0c;可以通过技术手段上外网&#xff01;^_首先你要有一张NVID…

【Spring基础】从0开始学习Spring(2)

前言 在上篇文章&#xff0c;我已经讲了Spring中最核心的知识点&#xff1a;IoC&#xff08;控制反转&#xff09;以及DI&#xff08;依赖注入&#xff09;。这篇文章&#xff0c;我将讲一下关于Spring框架中的其它比较琐碎但是又还是挺重要的知识点&#xff0c;因此&#xff…

Windows中如何使用 Anaconda 和 gempy地质建模

GemPy是一个免费开源的Python软件包&#xff0c;主要用于建立三维地质模型。以下是windows下GemPy的安装过程。 一、&#xff08;可选步骤&#xff09;N卡加速 如果使用的是英伟达的RTX显卡&#xff0c;可以去N卡官网下载cuda安装包以启用GPU加速。 首先检查显卡支持的CUDA版…

六轴机器人奇异点

1 奇异点说明 有着6个自由度的KUKA机器人具有3个不同的奇点位置。即便在给定状态和步骤顺序的情况下,也无法通过逆向变换(将笛卡尔坐标转换成极坐标值)得出唯一数值时,即可认为是一个奇点位置。这种情况下,或者当最小的笛卡尔变化也能导致非常大的轴角度变化时,即为奇点位置…

6-2、T型加减速计算简化【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本节介绍简化T型加减速计算过程&#xff0c;使其适用于单片机数据处理。简化内容包括浮点数转整型数计算、加减速对称处理、预处理计算 一、浮点数转整型数计算 根据上一节内容已知 常用的晶振大小…

C++ PE文件信息解析

尝试解析PE文件结构, 于是编写了此PE信息助手类, 暂时完成如下信息解析 1.导出表信息(Dll模块, 函数) 2.导入表信息(Dll模块, 函数) 3.资源表信息(字符串表, 版本信息, 清单信息) CPEHelper.h #pragma once// // brief: PE文件解析助手类 // copyright: Copyright 2024 Flame…

ai扩图怎么玩?分享玩法和工具!

AI扩图是近年来兴起的图片处理技术&#xff0c;它通过人工智能算法&#xff0c;将一张小图片放大并修复&#xff0c;使其呈现出高清晰度的效果。这项技术对于我们日常的图片处理工作来说&#xff0c;无疑是一大福音。本文将为你详细解析AI扩图的玩法&#xff0c;以及介绍一些实…

力扣经典题:另一棵树的子树

直接省事一点&#xff0c;炒一下100题的代码&#xff0c;分别讨论单节点以及双空节点的情况&#xff0c;然后进行递归调用 bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if(pNULL&&qNULL){return true;}if(pNULL||qNULL){return false;}if(p->val!q-…

移动Web——Bootstrap

1、Bootstrap-简介 Bootstrap是由Twitter公司开发维护的前端UI框架&#xff0c;它提供了大量编写好的CSS样式&#xff0c;允许开发者结合一定HTML结构及JavaScript&#xff0c;快速编写功能完善的网页及常见交互效果 <!DOCTYPE html> <html lang"en"> &…

should be also和should also be

will also be 是正确的 但老师和新概念的两个说法都没有错. will also be 是固定搭配.就好像will not be一样, 限定词加在be前.老师说的是陈述之类的句型 Nbe动词alson/adj/动词短语.例&#xff1a;He is also good at physic. should be also还是should also be also应该插在…

四、树立边界(Negotiating Boundaries)

2.Negotiating Boundaries 二、协商边界 Other people are the biggest obstacles of focus.A colleague wants to chat.You get a WeChat message about that party tonight.You hear the familiar ping of new emails that demand a look. 他人是保持专注的最大障碍。同事想要…