《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”;

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
CSU 大一上 C语言实验报告 (1)教材第2章编程题第2题:编写计算球体体积的程序。 说明:本题声明适当变量,用户键入数据,运算并输出结果,较简单。 (2)教材第2章编程题第8题:编写程序计算第一、第二、第三月还贷后剩余贷款金额。 说明:本题要求用户输入总额、利率、每月还贷净额,输出每月剩余,对输入输出、类型定义考查。 (3)教材第3章编程题第2题:编写程序实现对用户输入的产品信息进行格式化。 说明:本题考查格式化输入输出、转义字符的运用。 (4)教材第4章编程题第4题:编写程序实现将输入的整数按八进制输出。 说明:本题重在考查简单的运算符和表达式运用。 (5)用户输入一个三位数,输出各位数字之和。 说明:本题重在考查如何从一个整数中取出每一个数字。 (6)教材第5章编程题第5题:编写程序计算用户输入所得额的税金。 说明:本题考查简单的选择结构。 (7)教材第5章编程题第11题:编写程序实现将用户输入的两位数转化为英文。 说明:本题考查switch语句的应用。 (8)教材第6章编程题第8题:编写程序显示单月日历,用户指定这个月的天数和该月起始日是星期几。 说明:本题考查循环结构和选择结构的综合应用,判断是否一个星期最后一天,换行符。 (9)教材第6章编程题第11题:编程序实现利用无穷级数法估计e的值。 说明:本题考查根据公式设计循环结构并实现。 (10)因子之和等于其本身的数称为完数,如28的因子为1、2、4、7、14,而28=1+2+4+7+14,因此28为完数。编程序找出2~5000中的完数。 说明:本题利用变量i在2~5000中变化,判断其是否是完数。 (11)教材第7章编程题第12题:编程计算从左至右求值的表达式的值。 说明:本题考查对运算符和操作数的判断。 (12)教材第7章编程题第14题:编程序用牛顿计算法计算浮点数平方根。 说明:本题考查对循环结构的掌握,对表达式的合理运用,对基本类型的理解。 (13)教材第8章编程题第14题:编写程序颠倒句子中单词的顺序。 说明:本题考查对字符数组的处理,对一些循环选择结构的理解。 (14)教材第8章编程题第15题:编写程序实现凯撒密码加密。 说明:本题考查对字符数组的掌握,对字符处理的理解。 (15)编程序实现将用户输入的数字字符串转化为整数输出。 说明:本题考察对字符、整数关系的掌握与理解,对循环结构的熟练运用。 (16)教材第9章编程题第1题:编写选择排序的函数,并递归调用。 说明:本题利用函数简化程序、使得结构更清晰、熟练掌握。 (17)教材第9章编程题第7题:编写计算xn的函数。 说明:本题考查函数定义、调用,并初步考察递归运用。 (18)教材第10章编程题第6题:编写程序实现逆波兰运算。 说明:本题考查对程序每部分的理解、掌握,外部、内部变量,主函数,小函数的编写与应用。初步了解栈的一些实现函数。 (19)编程序找出2~5000中满足条件的数x:x是素数且x的每位数字是素数、每位数字之和是素数,如23、223、2333等。 说明:本题考查函数方法与循环选择结构的综合运用。 (20)教材第11章编程题第3题:用指针变量编写简化一个分数的函数。 说明:本题用来解决函数无法传回传递的实际参数,指针变量。 (21)教材第12章编程题第2题:编写函数读入用户输入的一条消息,检测是否是回文,分别用数组、指针来解决。 说明:本题可以体会到数组与指针的特点,利用指针的便利。 (22)利用指针编写程序,实现从键盘键入字符串,将此字符串从m个字符开始的n个字符复制成另一个字符串。 说明:本题用指针指向字符串,进行跟踪和复制操作。 (23)教材第13章编程题第5题:编写程序实现对输入命令行参数求和。 说明:本题加深对命令行参数的理解、考查知识的综合应用。 (24)教材第16章编程题第5题:用结构变量解决搜索离用户输入时间最近的航班信息,并输出。 说明:本题考查结构与数组的结合运用,有助于理解结构。首先,定义一个存储起飞、到达时间的结构,再定义一个该类型的数组,循环搜索即可。 (25)教材第17章编程题第5题:用指针数组存储键入的字符串,对数组排序。 说明:本题应用动态分配内存、数组排序,考查综合能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

了一li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值