模块化思想:创建一个数组, 实现函数init()初始化数组、 实现empty()清空数组、 实现reverse()函数完成数组元素的逆置。 要求:自己设计函数的参数,返回值。

来源:互联网 发布:java enum的创建 编辑:程序博客网 时间:2024/05/19 22:24

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">(一)思考思路</span>

1:一个复杂功能的程序,如果将所有的功能都写在主函数内,这样的程序的可读性太差,而且在理解的过程中很容易出现问题,所以将一些复杂功能,分块写入子函数,利用函数调用来实现模块功能是一个程序员必备的能力

2:函数调用:

   主函数调用子函数包括这几部分:

   1):子函数的类型(int  void等),依据函数功能来使用函数类型,比如说 调用一个数组,想对其数据进行逆置,那么我们不用返回值,那么就用void就好啦,当需要子函数给主函数返回值的时候 就用int

   2):调用的方式: 传址 ,传值

         一些功能性的子函数(比如 将x,y的数值对换,数组的逆置等等)利用传值办法是无法实现对实参的改变的,通俗的将形参就是对实参的一份拷贝,我们对copy的数据进行任何加工,对于原数据是没有任何办法的!比如说 现在有一个空水缸1,找一个copy的空水缸2(大小  容积等等的要素一模一样),无论我们对水缸2进行什么操作,对于水缸1都是没有意义的

         于是我们引入指针这个概念,什么是指针,指针就是地址,我们通过指针找到实参,就可以对实参进行操作,通俗的将  在一个宾馆里,每一个房间都有一个标号(103,104等),前台通过这个标号通知里面的住户一系列的消息,指示用户做事情,这就是传址的用法

  3):子函数如果要被主函数使用,那么在主函数必须对子函数进行声明,并且在需要实现子函数功能的地方对子函数进行传递实参,如

        int main()

{

         void copy(int x,int y);     函数的声明

         ............................

         copy(a,b);                      传递实参

}

3:注意事项(见代码)

(二)代码实现

#include <stdio.h>#include <string.h>void initialize(int *x,int n){int i=0;for(i=0;i<n;i++)scanf("%d",x+i);for(i=0;i<n;i++)printf("%d ",*(x+i));printf("\n");}void reverse(int arr, int *x,int n){int i=0,sqm=(n-1)/2;int temp=0;int *l=NULL;    <span style="color:#ff0000;">//对于空指针,一般是将NULL赋予指针</span>
l=x+n-1;    for(i=0;i<=sqm;x++,l--,i++){temp=*x;*x=*l;*l=temp;}
<pre name="code" class="cpp" style="font-size: 24px; font-weight: bold;">      <span style="color:#ff0000;">     //   千万注意,此处x指向的arr[5]的存储空间</span>
x=arr; for(i=0;i<n;i++)printf("%d ",*(x+i));printf("\n");}void empty(int *x,int n){ int i=0; for(i=0;i<n;i++) { *(x+i)=0;//千万不能写成*x;那么在后面的for循环中每次

<span style="color:#ff0000;">执行的都是将arr[0]=0</span>     printf("%d ",*(x+i)); }printf("\n");}int main(){int n = 8, i = 0;int arr[8];int *p=NULL;p=arr;initialize(p,8);reverse(arr,p,8);empty(p,8);    system("pause");return 0;}




0 0
原创粉丝点击