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. ", 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 i = 1; //第一层
int main()
{
printf("%d ", i);
int i = 2; //第二层
{
printf("%d ", i);
int i = 2; //第二层
printf("%d
", i);
{
printf("%d ", i);
{
printf("%d ", i);
int i = 3; //第三层
printf("%d ", i);
printf("%d ", i);
}
printf("%d ", i);
return 0;
}
printf("%d ", i);
return 0;
}
1
2
2
3
2
2
2
3
2
Process returned 0 (0x0) execution time : 2.615 s
Press any key to continue.
Press any key to continue.
#include <stdio.h> int main() { int i = 3; printf("%d ", i); if ( i == 3) { i = i + 1; int i = 6; printf("%d ",i); i = i +1; } if (i == 3) // 注意这里的 i = 4; { printf("%d ",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. ", 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. ", 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(" "); } 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 ", 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 ", 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! "); } else if (guess < answer) { printf("Too small! "); } else { printf("Correct! "); } } 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(" "); 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 ", 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 ", 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(" "); 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 ", maxv(a, 3)); 9 int b[5] = {7, 8, 9, 2, 4}; 10 printf("Max: %d ", 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)