《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.mzph.cn/news/671497.shtml

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

相关文章

React+Echarts实现数据排名+自动滚动+Y轴自定义toolTip文字提示

1、效果 2、环境准备 1、react18 2、antd 4 3、代码实现 原理&#xff1a;自动滚动通过创建定时器动态更新echar的dataZoom属性startValue、endValue&#xff0c;自定义tooltip通过监听echar的鼠标移入移出事件&#xff0c;判断tooltTip元素的显隐以及位置。 1、导入所需组…

Linux安全技术与iptables防火墙

一.安全技术&#xff1a; 入侵检测系统&#xff08;Intrusion Detection Systems&#xff09;&#xff1a;特点是不阻断任何网络访问&#xff0c;量化、定位来自内外网络的威胁情况&#xff0c;主要以提供报警和事后监督为主&#xff0c;提供有针对性的指导措施和安全决策依据,…

IDEA上传Gitee出错

问题 今天想通过 IDEA 更下新 gitee 上的代码是发生了这个错误。 解决 在 IDEA 终端输入 git config --system --unset credential.helper原因 在一个大佬那里找到了原因 大概意思是-远端仓库的账号和密码错误&#xff0c;你本地有过账号密码登录记录&#xff0c;但不知道…

Leetcode—60. 排列序列【困难】

2024每日刷题&#xff08;113&#xff09; Leetcode—60. 排列序列 算法思想 实现代码 class Solution { public:string getPermutation(int n, int k) {vector<int> nums(n);// f[i] i!vector<int> f(n 1, 1); string ans;iota(nums.begin(), nums.end(), 1…

搜索与图论(一)(深搜,广搜,树与图的存储遍历,拓扑排序)

一、DFS 往深里搜&#xff0c;搜到叶子结点那里&#xff0c;回溯&#xff0c;到可以继续到叶子结点深搜的位置。 1、回溯一定要恢复现场 2、定义一个与当前递归层数有关的终止条件&#xff08;题目要求的东西&#xff09; 3、每层都用循环判断是否存在可以dfs的路 输出数字…

架构学习(五):scrapy实现自定义代理中间件

scrapy实现自定义代理中间件 前言关卡&#xff1a;实现自定义代理中间件代理中间件源码解析代理池自定义代理中间件 结束 前言 ip检测是比较常规的反爬手段&#xff0c;一般站点会限制ip的访问频率&#xff0c;或者根据ip的访问规律和频率来识别异常访问&#xff0c;从而点对点…

【数据结构】二叉树的顺序结构及实现(堆)

1.二叉树的顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结 构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储&#xff0c;需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两…

腾讯云游戏联机服务器配置价格表,4核16G/8核32G/4核32G/16核64G

2024年更新腾讯云游戏联机服务器配置价格表&#xff0c;可用于搭建幻兽帕鲁、雾锁王国等游戏服务器&#xff0c;游戏服务器配置可选4核16G12M、8核32G22M、4核32G10M、16核64G35M、4核16G14M等配置&#xff0c;可以选择轻量应用服务器和云服务器CVM内存型MA3或标准型SA2实例&am…

C++_多态

目录 1、什么是虚函数 1.1 什么是虚函数重写 1.2 虚函数的继承 1.3 协变 1.4 析构函数的重写 2、override和final 2.1 final 2.2 override 3、纯虚函数/抽象类 3.1 接口继承和实现继承 4、多态的原理 前言&#xff1a; 在C中&#xff0c;多态指的是调用同一个类的…

Windows系统安装Flink及实现MySQL之间数据同步

Apache Flink是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状态计算。Flink的设计目标是在所有常见的集群环境中运行&#xff0c;并以内存执行速度和任意规模来执行计算。它支持高吞吐、低延迟、高性能的流处理&#xff0c;并且是一个面向流处理和批处理…

re:从0开始的CSS学习之路 3. CSS三大特性

0. 写在前面 很多的学习其实并不知道在学什么&#xff0c;学一个新东西学着学着就变成了抄代码&#xff0c;背概念。把看视频学习变成了一个赶进度的任务&#xff0c;到头来只学到了一些皮毛。 文章目录 0. 写在前面1. CSS三大特性——层叠性2. CSS三大特性——优先级3. CSS三…

学习Spring的第十六天

AOP底层两种生成Proxy的方式 我来解释这两种方式 1 目标类有接口 , 调用JDK的动态代理实现 2 目标类没有接口 , 用Cglib实现 , 即生成目标类的子类 , 来实现动态代理 , 所以要求目标类不能时final修饰的 . (若有接口 , 也可用Cglib方式实现 , 需要手动配置<aop: config pr…

完全二叉树的结点个数

给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在该层最左边的若干位置。若最…

java SpringBoot2.7整合Elasticsearch(ES)7 带条件分页查询与不带条件分页查询演示讲解

上文 java SpringBoot2.7整合Elasticsearch(ES)7 进行文档增删查改 我们带着大家 整合了 Elasticsearch 对索引中的文档做了 各方面操作 然后 我们来说说 分页查询 这里 为了方便大家看 我加了五条数据进去 这里 我们仍然需要带个条件 这里 我们用name Mapper 接口 加一个这…

双非本科准备秋招(18.2)—— 图解Monitor

对象头 普通对象&#xff1a; 数组对象&#xff1a; java中对象存储结构分为对象头&#xff08;Header&#xff09;、实例数据&#xff08;Instance Date&#xff09;和对齐填充&#xff08;Padding&#xff09;。 对象头存储着Mark Word和Klass Word&#xff0c;通过Klass Wo…

复选框和单选按钮——WindowsForm系列教程

你好&#xff0c;这里是BIM的乐趣&#xff0c;我是九哥~ 很多程序的GUI中都有两个常见小部件&#xff1a;单选按钮和复选框。 这些是直观地向用户提供多种选择的方法。我敢肯定&#xff0c;你们都熟悉这些形式的输入&#xff0c;但复选框允许用户打开和关闭个别选项&#xff…

Verilog刷题笔记18

题目&#xff1a;An if statement usually creates a 2-to-1 multiplexer, selecting one input if the condition is true, and the other input if the condition is false. 解题&#xff1a; module top_module(input a,input b,input sel_b1,input sel_b2,output wire ou…

聚焦网络安全公司,看F5如何应对企业数字化挑战

应用无处不在的当下&#xff0c;从传统应用到现代应用再到边缘、多云、多中心的安全防护&#xff0c;安全已成为企业数字化转型中的首要挑战。有专家指出&#xff0c;目前网络安全市场已经是仅次于计算、存储、网络的第四大IT基础设施市场。那什么网络安全公司应该具有哪些能力…

vue3 使用defineAsyncComponent 动态加载组件

问题场景 在项目中使用静态加载组件基本能覆盖80%的场景了&#xff0c;如下图 但是我们在需要 循环生成一些的component 的时候或者在 开发ssr服务端渲染的页面 就会遇到有些组件以静态方式导入就会报错&#xff0c;导致进程失败&#xff0c;那么这时候就需要用到动态组件。那…

第8节、双电机多段直线运动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;前面章节主要介绍了bresenham直线插值运动&#xff0c;本节内容介绍让两个电机完成连续的直线运动,目标是画一个正五角星 一、五角星图介绍 五角星总共10条直线&#xff0c;10个顶点。设定左下角为原点…