pxxfxxxxx

导航

函式

12.0 回传值的资料型态  函式名称参数的资料型态 参与名称 , ...){       /*程式码片段*/    return 回传值;}

函式内不能再定义其他函式

在函式码顺序中,呼叫函式前要先宣告或定义函式

 

 练习:两个数中最大的(函式)

#include <stdio.h>
int max2(int, int);


int main()
{
    int a,b;
    printf("Please enter the first integer: ");
    scanf("%d", &a);
    printf("Please enter the second integer: ");
    scanf("%d", &b);
    printf("The maxinum is %d.\n", max2(a,b));
    return 0;

}


int max2 (int a,int b)
{
    int max;
    if (a >= b)
    {
        max = a;
    }else {
        max = b;

    }
    return max;
}


Please enter the first integer: 7
Please enter the second integer: 8
The maxinum is 8.

Process returned 0 (0x0)   execution time : 2.883 s
Press any key to continue.

 变数名称的宣告舆区块

在同一组区块{}里同名称变数只能有一个

int main() {
    int i;
    {
        int i;
    }
    return 0;

}

同名的全域变数和函式只能有一个

全域和区域变数可以同名

 

变数名称的可视范围满足两个条件:1,在程式码中位于该变数名称宣告以后    

2, 该变数是全域变数  或者  被包含在该变数名称宣告的区块 {} 内

 

#include <stdio.h>
int i = 1;  //第一层
int main()
{
    printf("%d\n", i);
    int i = 2; //第二层
    printf("%d\n", i);
    {
        printf("%d\n", i);
    int i = 3;  //第三层
        printf("%d\n", i);
    }
    printf("%d\n", i);
    return 0;
}
 
1
2
2
3
2
Process returned 0 (0x0)   execution time : 2.615 s
Press any key to continue.

 

#include <stdio.h>


int main()
{
    int i = 3;
    printf("%d\n", i);
    if ( i == 3)
    {
        i = i + 1;
        int i = 6;
        printf("%d\n",i);
        i = i +1;
    }
    if (i == 3) // 注意这里的 i = 4;
    {
        printf("%d\n",i);
        
    }
    return 0;
    
}

 12.5练习三个数那个最大(函式的使用)

#include <stdio.h>
int max3(int,int,int);


int main() {
    int a,b,c;
    printf("Please enter three integers: ");
    scanf("%d%d%d", &a, &b, &c);
    printf("The maxinum is %d.\n", max3(a,b,c));
    return 0;
}

int max3(int a, int b, int c)
{
    int max = a;
    if (b > max) {
        max = b;
    }
    if (c > max) {
            max = c;
    }
    return max;
}

Please enter three integers: 567 233 634
The maxinum is 634.

Process returned 0 (0x0)   execution time : 20.803 s
Press any key to continue.

 练习:这种方式的思想是在原来的基础上增加,依照过去累积的成果继续发展新的东西。

#include <stdio.h>
int max2(int,int);
int max3(int,int,int);


int main() {
    int a,b,c;
    printf("Please enter three integers: ");
    scanf("%d%d%d", &a, &b, &c);
    printf("The maxinum is %d.\n", max3(a,b,c));
    return 0;
}

int max3(int a, int b, int c) {
    return max2(max2(a,b), c);
}


int max2(int a, int b)
{
    if (a >= b)
    {
        return a;

    }else {
        return b;
    }
}

Please enter three integers: 3 5 4
The maxinum is 5.

Process returned 0 (0x0)   execution time : 10.111 s
Press any key to continue.

 12.6用文字绘制三角形的练习(使用函式)

 

#include <stdio.h>
void print_stars(int i);


int main()
{
    int N;
    printf("N = ");
    scanf("%d", &N);

    int i;
    for (i = 1; i <= N; ++i)
    {
        print_stars(i);//int k = print_stars(i);这样写是错误的,因为它不回传任何值
        printf("\n");

    }
    return 0;
}


void print_stars(int i) // void 作为回传值型态时,表示该函式不回传任何值
{
    int j;
    for (j =1; j<= i; ++j)
    {
        printf("*");
    }
    return; // 当回传值型态是 void 时,return 可以省略
}


N = 7
*
**
***
****
*****
******
*******

Process returned 0 (0x0)   execution time : 10.220 s
Press any key to continue.

  12.7 随机产生五个乱数(函式的使用)

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    srand(time(0));
    int i;
    for (i = 1; i <= 5; i++)
    {
        printf("%d\n", rand());
    }
    return 0;
}


每次输出都是不同的五个数

 12.8 掷骰子(函式乱码的调用)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    srand (time(0));
    int i;
    for (i = 1; i <= 5; ++i) {
        int dice = rand() % 6 + 1;
        printf("%d\n", dice);
    }
    return 0;

 } // 每次都输出五个随机的数


 运用函式猜数字的练习

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()  {
    srand(time(0));
    int answer = rand() % 100;
    int guess;

    do {
        printf("Please enter your guess: ");
        scanf("%d", &guess);
        if  (guess > answer) {
            printf("Too large!\n");

        } else if (guess < answer) {
            printf("Too small!\n");
        } else {
            printf("Correct!\n");
        }
    } while (guess != answer);
    return 0;

}

Please enter your guess: 62
Too small!
Please enter your guess: 63
Too small!
Please enter your guess: 64
Too small!
Please enter your guess: 65
Too small!
Please enter your guess: 67
Too small!
Please enter your guess: 89
Too large!
Please enter your guess: 70
Too small!
Please enter your guess: 71
Too small!
Please enter your guess: 76
Too small!
Please enter your guess: 77
Too small!
Please enter your guess: 78
Too small!
Please enter your guess: 80
Too large!
Please enter your guess: 79
Correct!

Process returned 0 (0x0)   execution time : 90.357 s
Press any key to continue.

 19.1 在函式间传递阵列

没有使用函式的情况

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 
 5 int main() {
 6     srand(time(0));
 7     int v[10], i;
 8     for (i = 0; i < 10; i++) {
 9         v[i] = rand() % 100;
10 
11     }
12     for (i = 0; i < 10; i++) {
13         printf(" %d", v[i]);
14     }
15     printf("\n");
16 
17     int max = v[0];  ///最大值从第一个取
18     for (i = 0; i < 10; i++) {
19         if (v[i] > max) {
20             max = v[i];
21         }
22     }
23     printf("Max: %d\n", max);
24 
25     return 0;
26 
27 
28 }
29 
30  79 70 44 24 13 56 95 56 0 84
31 Max: 95
32 
33 Process returned 0 (0x0)   execution time : 10.031 s
34 Press any key to continue.

使用函式后

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 
 5 void arrayRand(int[10]);
 6 void arrayPrint(int[10]);
 7 int arrayMax(int[10]);
 8 
 9 int main() {
10     srand(time(0));
11     int v[10];
12     arrayRand(v);
13     arrayPrint(v);
14     printf("Max: %d\n", arrayMax(v));
15     return 0;
16 
17 
18 }
19 void arrayRand(int v[10]) {
20     int i;
21     for (i = 0; i < 10; i++) {
22         v[i] = rand() % 100;
23 
24     }
25 }
26 int arrayMax(int v[10]) {
27     int i,max = v[0];  ///最大值从第一个取
28     for (i = 0; i < 10; i++) {
29         if (v[i] > max) {
30             max = v[i];
31         }
32     }
33     return max;
34 }
35 
36 void arrayPrint(int v[10]) {
37     int i;
38     for (i = 0; i < 10; i++) {
39         printf(" %d", v[i]);
40     }
41     printf("\n");
42 
43 }
44 
45  64 0 29 64 81 96 26 68 76 45
46 Max: 96
47 
48 Process returned 0 (0x0)   execution time : 11.376 s
49 Press any key to continue.

总结:在函式间传送阵列

当函式参数为阵列型态时,与一般资料型态行为不一样

  • 一般资料型态会将引数复制一份后传入函式,但是阵列型态却不会复制一份阵列(复制的是阵列元素第一个的记忆体位址

当函式回传值时是阵列型态,这是不合法的

  • 为了做出等效于函式回传的效果,我们可以将阵列作为引数传入。当阵列作为引数传入时,阵列内容修改会套用到这个传入的阵列本身

为了与一般资料型态行为相符,C语言导入了指针来处理各种阵列复制与存取行为(指标用来存记忆体位址

 

 19.7 在函式间传递阵列原理

 1 #include <stdio.h>
 2 
 3 int maxv(int[], int N);
 4 
 5 int main()
 6 {
 7     int a[3] = {2, 3, 5};
 8     printf("Max: %d\n ", maxv(a, 3));
 9     int b[5] = {7, 8, 9, 2, 4};
10     printf("Max: %d\n ", maxv(b, 5));
11     return 0;
12 }
13 
14 int maxv(int v[], int N) { // 这里的v[]表示一个指标,存的是起止位址,如:20000
15     int max = v[0], i;
16     for (i = 0; i < N; i++) {
17         if (v[i] > max) {
18             max = v[i];
19         }
20 
21     }
22     return max;
23 }
24 
25 Max: 5
26  Max: 9
27 
28 Process returned 0 (0x0)   execution time : 1.183 s
29 Press any key to continue.

v[i] 的起始位址 =  第一个元素的起始位址 +  i*sizeof(int)

posted on 2019-04-22 20:23  pxxfxxxxx  阅读(256)  评论(0编辑  收藏  举报