C第七天
2015-03-05 10:49
127 查看
第七课 函数
一、函数的概念
int max = 0, i;
for (i = 0; i < 10; i++)
if (i != max && scores[i] > scores[max])
max = i;
scores[max]就是最高分
函数就是一系列语句的组合,用以实现一些相对独立且具有一定通用性的功能。
y = f(x)
y = kx+b
二、函数的定义
1.语法
返回类型 函数名 (形参表) {
函数体语句;
}
int main (void) {
// ...
return 0;
}
三、函数的声明
声明语法:
返回类型 函数名 (形参表);
1.函数在使用前最好进行声明,如果没有给出函数的显示声明,则编译器会采用如下隐式声明:
int func ();
返回int,且参数表任意。
2.如果函数返回类型不是int,或者希望编译器对函数调用的参数匹配性做检查,那么就要显示地对函数进行声明。
3.函数声明中的参数表,空括号“()”表示可以接受任意参数,而void,表示不接受任何参数。
4.如果函数的定义在函数调用之前,定义本身即是声明。
四、函数的调用
调用语法:
函数名(实参表);
1.有参数的函数在定义时使用的参数叫形参,当调用该函数时需要传入的参数叫实参。将实参传递给形参的过程,相当于将实参的值赋值给形参变量。从内存的角度看,实参属于调用者的栈区,形参属于被调用者的栈区。
2.当以数组名作为实参调用函数时,实际传给形参的是该实参数组的首地址(而非实参数组的副本),因此在函数中对形参数组的修改也就是对实参数组的修改。
在函数中对形参数组不用通过sizeof(arr)/sizeof(arr[0])获得该数组的长度。如果函数有必要了解数组中有效数据的个数,应该通过另一个附加参数传入该函数。
3.return可以用于退出函数,exit()用于退出整个程序,只有在main函数中,二者才相当。
五、递归与递推
1.递归就是函数自己调用自己。
n! = n*(n-1)(n-2)...1
n!=n*(n-1)!
使用递归的时机:需要进行的操作就是正在进行的操作。
注意:递归一定要有终止条件,否则就会形成无限递归。
2.递推就是一种迭代算法。
a(n+1) = a(n) + d;
费氏数列:f(n) = f(n-2) + f(n-1), f(1)=f(2) = 1
1 1 2 3 5 8 13 ...
第12项的值?
递归函数可以简化算法,但是效率不高。如果不是十分必要的话,尽可能避免使用递归。
汉诺塔问题:递归。
A B C
N
第一步:通过某种操作将N-1个盘子借助C移到B上。
第二步:将A上第N个盘子移到C。
第三步:通过某种操作将B上的N-1个盘子借助于A移到C上。
循环递归:func_a -> func_b _> func_c -> func_a
交叉递归:func_a -> func_b _> func_a
自递归:func_a -> func_a
练习:实现求立方根函数
double cbrt (double x);
立方根迭代公式:
Rn+1=(2*Rn+X/Rn^2)/3, R1=X, |Rn+1-Rn|<EPS
double fabs (double x);
10*10
int add (int a, int b) {
return a + b;
}
int sub (int a, int b) {
return a - b;
}
int mul (int a, int b) {
return a * b;
}
int div (int a, int b) {
return a / b;
}
int mod (int a, int b) {
return a % b;
}
#include <stdio.h>
#include <math.h>
double cbrt (double x) {
double r1, r2 = x;
do {
r1 = r2;
r2 = (2*r1+x/(r1*r1))/3;
} while (fabs (r2 - r1) > 1E-6);
return r2;
}
int main (void) {
printf ("输入一个数:");
double x;
scanf ("%lf", &x);
printf ("%lf的立方根:%lf\n", x, cbrt (x));
return 0;
}
#include <stdio.h>
int gui (int n) {
if (n < 3)
return 1;
return gui (n-1) + gui (n-2);
}
int tui (int n) {
int x = 1, y = 1, i;
for (i = 3; i <= n; i++) {
y = x + y;
x = y - x;
}
return y;
}
int main (void) {
//printf ("%d\n", gui (45));
printf ("%d\n", tui (45));
return 0;
}
#include <stdio.h>
// 函数声明
int add (int a, int b);
int sub (int, int);
void print (int);
/* 定义同时声明 */
int mul (int a, int b) {
return a * b;
}
int main (void) {
int x = 100, y = 200;
int z = add (x, y); // 函数调用
printf ("%d\n", z);
z = sub (x, y);
print (z);
print (sub (y, x));
z = mul (x, y);
return 0;
}
// 函数定义
int add (int a, int b) {
int c = a + b;
return c;
}
int sub (int a, int b) {
return a - b;
}
void print (int a) {
if (a < 0)
return;
printf ("%d\n", a);
}
#include <stdio.h>
int jiecheng (int n) {
printf ("n=%d\n", n);
if (n == 1)
return n;
return n * jiecheng (n - 1);
}
int main (void) {
int res = jiecheng (5);
printf ("%d\n", res);
return 0;
}
#include <stdio.h>
void han (int n, char f, char b, char t) {
if (n) {
han (n-1, f, t, b);
printf ("%d: %c -> %c\n", n, f, t);
han (n-1, b, f, t);
}
}
int main (void) {
han (3, 'A', 'B', 'C');
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
#include <sys/ioctl.h>
#define H 10
#define W 10
void init (char c[][W]) {
srand (time (NULL));
int i, j;
for (i = 0; i < H; i++)
for (j = 0; j < W; j++)
c[i][j] = rand () % 2 ? '*' : ' ';
}
void show (char c[][W], int g) {
int i, j, k = 0;
for (i = 0; i < H; i++) {
for (j = 0; j < W; j++) {
printf ("%c ", c[i][j]);
if (c[i][j] == '*')
k++;
}
printf ("\n");
}
printf ("第%d代,有%d个活细胞。\n", g, k);
}
int getch (void) {
struct termios old;
ioctl (STDIN_FILENO, TCGETS, &old);
struct termios new = old;
new.c_lflag &= ~(ECHO | ICANON);
ioctl (STDIN_FILENO, TCSETS, &new);
int ch = getchar ();
ioctl (STDIN_FILENO, TCSETS, &old);
return ch;
}
void quit (void) {
printf ("按<Q>键退出,其它键继续...");
int ch = getch ();
printf ("\n");
if (ch == 'q' || ch == 'Q')
exit (0);
}
void breed (char c[][W]) {
int i, j;
for (i = 0; i < H; i++)
for (j = 0; j < W; j++) {
int u = i - 1, d = i + 1, l = j - 1, r = j + 1, k = 0;
if (u >= 0 && c[u][j] == '*')
k++;
if (d < H && c[d][j] == '*')
k++;
if (l >= 0 && c[i][l] == '*')
k++;
if (r < W && c[i][r] == '*')
k++;
if (u >= 0 && l >= 0 && c[u][l] == '*')
k++;
if (u >= 0 && r < W && c[u][r] == '*')
k++;
if (d < H && l >= 0 && c[d][l] == '*')
k++;
if (d < H && r < W && c[d][r] == '*')
k++;
if (k == 3)
c[i][j] = '*';
else if (k != 2)
c[i][j] = ' ';
}
}
int main (void) {
char c[H][W];
init (c);
int g;
for (g = 1; ; g++) {
show (c, g);
quit ();
breed (c);
}
return 0;
}
#include <stdio.h>
// 输入数据
void input (float scores[], int sts) {
int i;
for (i = 0; i < sts; i++) {
printf ("第%d个学生:", i+1);
scanf ("%f", &scores[i]);
}
}
// 计算总分
float total (float scores[], int sts) {
float total = 0;
int i;
for (i = 0; i < sts; i++)
total += scores[i];
return total;
}
// 计算最高分
float max (float scores[], int sts) {
int max = 0, i;
for (i = 0; i < sts; i++)
if (i != max && scores[i] > scores[max])
max = i;
return scores[max];
}
int main (void) {
printf ("学生人数:");
int sts;
scanf ("%d", &sts);
float scores[sts];
input (scores, sts);
float t = total (scores, sts);
float m = max (scores, sts);
printf ("总分:%g,平均分:%g,最高分:%g\n", t, t / sts, m);
return 0;
}
#include <stdio.h>
void swap (int a, int b)
{
int c = a;
a = b;
b = c;
printf ("swap: %d,%d\n", a, b);
// 200,100
}
void swap2 (int arr[])
{
printf ("%d\n", sizeof (arr) / sizeof (arr[0]));
int c = arr[0];
arr[0] = arr[1];
arr[1] = c;
printf ("swap2: %d,%d\n",
arr[0], arr[1]); // 200,100
}
void print (int arr[], int len) {
int i;
for (i = 0; i < len; i++)
printf ("%d ", arr[i]);
printf ("\n");
}
void printm (int mtx[][4], int row) {
int i, j;
for (i = 0; i < row; i++) {
for (j = 0; j < sizeof (mtx[0]) / sizeof (mtx[0][0]); j++)
printf ("%4d", mtx[i][j]);
printf ("\n");
}
}
int main (void) {
int a = 100, b = 200;
swap (a, b);
printf ("main: %d,%d\n", a, b);
// 100,200
int arr[2] = {100, 200};
swap2 (arr);
printf ("main: %d,%d\n", arr[0], arr[1]); // 200,100
int array[] = {10,20,30,40,50};
print (array, sizeof (array) / sizeof (array[0]));
int mtx[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
printm (mtx, sizeof (mtx) / sizeof (mtx[0]));
return 0;
}
一、函数的概念
int max = 0, i;
for (i = 0; i < 10; i++)
if (i != max && scores[i] > scores[max])
max = i;
scores[max]就是最高分
函数就是一系列语句的组合,用以实现一些相对独立且具有一定通用性的功能。
y = f(x)
y = kx+b
二、函数的定义
1.语法
返回类型 函数名 (形参表) {
函数体语句;
}
int main (void) {
// ...
return 0;
}
三、函数的声明
声明语法:
返回类型 函数名 (形参表);
1.函数在使用前最好进行声明,如果没有给出函数的显示声明,则编译器会采用如下隐式声明:
int func ();
返回int,且参数表任意。
2.如果函数返回类型不是int,或者希望编译器对函数调用的参数匹配性做检查,那么就要显示地对函数进行声明。
3.函数声明中的参数表,空括号“()”表示可以接受任意参数,而void,表示不接受任何参数。
4.如果函数的定义在函数调用之前,定义本身即是声明。
四、函数的调用
调用语法:
函数名(实参表);
1.有参数的函数在定义时使用的参数叫形参,当调用该函数时需要传入的参数叫实参。将实参传递给形参的过程,相当于将实参的值赋值给形参变量。从内存的角度看,实参属于调用者的栈区,形参属于被调用者的栈区。
2.当以数组名作为实参调用函数时,实际传给形参的是该实参数组的首地址(而非实参数组的副本),因此在函数中对形参数组的修改也就是对实参数组的修改。
在函数中对形参数组不用通过sizeof(arr)/sizeof(arr[0])获得该数组的长度。如果函数有必要了解数组中有效数据的个数,应该通过另一个附加参数传入该函数。
3.return可以用于退出函数,exit()用于退出整个程序,只有在main函数中,二者才相当。
五、递归与递推
1.递归就是函数自己调用自己。
n! = n*(n-1)(n-2)...1
n!=n*(n-1)!
使用递归的时机:需要进行的操作就是正在进行的操作。
注意:递归一定要有终止条件,否则就会形成无限递归。
2.递推就是一种迭代算法。
a(n+1) = a(n) + d;
费氏数列:f(n) = f(n-2) + f(n-1), f(1)=f(2) = 1
1 1 2 3 5 8 13 ...
第12项的值?
递归函数可以简化算法,但是效率不高。如果不是十分必要的话,尽可能避免使用递归。
汉诺塔问题:递归。
A B C
N
第一步:通过某种操作将N-1个盘子借助C移到B上。
第二步:将A上第N个盘子移到C。
第三步:通过某种操作将B上的N-1个盘子借助于A移到C上。
循环递归:func_a -> func_b _> func_c -> func_a
交叉递归:func_a -> func_b _> func_a
自递归:func_a -> func_a
练习:实现求立方根函数
double cbrt (double x);
立方根迭代公式:
Rn+1=(2*Rn+X/Rn^2)/3, R1=X, |Rn+1-Rn|<EPS
double fabs (double x);
10*10
int add (int a, int b) {
return a + b;
}
int sub (int a, int b) {
return a - b;
}
int mul (int a, int b) {
return a * b;
}
int div (int a, int b) {
return a / b;
}
int mod (int a, int b) {
return a % b;
}
#include <stdio.h>
#include <math.h>
double cbrt (double x) {
double r1, r2 = x;
do {
r1 = r2;
r2 = (2*r1+x/(r1*r1))/3;
} while (fabs (r2 - r1) > 1E-6);
return r2;
}
int main (void) {
printf ("输入一个数:");
double x;
scanf ("%lf", &x);
printf ("%lf的立方根:%lf\n", x, cbrt (x));
return 0;
}
#include <stdio.h>
int gui (int n) {
if (n < 3)
return 1;
return gui (n-1) + gui (n-2);
}
int tui (int n) {
int x = 1, y = 1, i;
for (i = 3; i <= n; i++) {
y = x + y;
x = y - x;
}
return y;
}
int main (void) {
//printf ("%d\n", gui (45));
printf ("%d\n", tui (45));
return 0;
}
#include <stdio.h>
// 函数声明
int add (int a, int b);
int sub (int, int);
void print (int);
/* 定义同时声明 */
int mul (int a, int b) {
return a * b;
}
int main (void) {
int x = 100, y = 200;
int z = add (x, y); // 函数调用
printf ("%d\n", z);
z = sub (x, y);
print (z);
print (sub (y, x));
z = mul (x, y);
return 0;
}
// 函数定义
int add (int a, int b) {
int c = a + b;
return c;
}
int sub (int a, int b) {
return a - b;
}
void print (int a) {
if (a < 0)
return;
printf ("%d\n", a);
}
#include <stdio.h>
int jiecheng (int n) {
printf ("n=%d\n", n);
if (n == 1)
return n;
return n * jiecheng (n - 1);
}
int main (void) {
int res = jiecheng (5);
printf ("%d\n", res);
return 0;
}
#include <stdio.h>
void han (int n, char f, char b, char t) {
if (n) {
han (n-1, f, t, b);
printf ("%d: %c -> %c\n", n, f, t);
han (n-1, b, f, t);
}
}
int main (void) {
han (3, 'A', 'B', 'C');
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
#include <sys/ioctl.h>
#define H 10
#define W 10
void init (char c[][W]) {
srand (time (NULL));
int i, j;
for (i = 0; i < H; i++)
for (j = 0; j < W; j++)
c[i][j] = rand () % 2 ? '*' : ' ';
}
void show (char c[][W], int g) {
int i, j, k = 0;
for (i = 0; i < H; i++) {
for (j = 0; j < W; j++) {
printf ("%c ", c[i][j]);
if (c[i][j] == '*')
k++;
}
printf ("\n");
}
printf ("第%d代,有%d个活细胞。\n", g, k);
}
int getch (void) {
struct termios old;
ioctl (STDIN_FILENO, TCGETS, &old);
struct termios new = old;
new.c_lflag &= ~(ECHO | ICANON);
ioctl (STDIN_FILENO, TCSETS, &new);
int ch = getchar ();
ioctl (STDIN_FILENO, TCSETS, &old);
return ch;
}
void quit (void) {
printf ("按<Q>键退出,其它键继续...");
int ch = getch ();
printf ("\n");
if (ch == 'q' || ch == 'Q')
exit (0);
}
void breed (char c[][W]) {
int i, j;
for (i = 0; i < H; i++)
for (j = 0; j < W; j++) {
int u = i - 1, d = i + 1, l = j - 1, r = j + 1, k = 0;
if (u >= 0 && c[u][j] == '*')
k++;
if (d < H && c[d][j] == '*')
k++;
if (l >= 0 && c[i][l] == '*')
k++;
if (r < W && c[i][r] == '*')
k++;
if (u >= 0 && l >= 0 && c[u][l] == '*')
k++;
if (u >= 0 && r < W && c[u][r] == '*')
k++;
if (d < H && l >= 0 && c[d][l] == '*')
k++;
if (d < H && r < W && c[d][r] == '*')
k++;
if (k == 3)
c[i][j] = '*';
else if (k != 2)
c[i][j] = ' ';
}
}
int main (void) {
char c[H][W];
init (c);
int g;
for (g = 1; ; g++) {
show (c, g);
quit ();
breed (c);
}
return 0;
}
#include <stdio.h>
// 输入数据
void input (float scores[], int sts) {
int i;
for (i = 0; i < sts; i++) {
printf ("第%d个学生:", i+1);
scanf ("%f", &scores[i]);
}
}
// 计算总分
float total (float scores[], int sts) {
float total = 0;
int i;
for (i = 0; i < sts; i++)
total += scores[i];
return total;
}
// 计算最高分
float max (float scores[], int sts) {
int max = 0, i;
for (i = 0; i < sts; i++)
if (i != max && scores[i] > scores[max])
max = i;
return scores[max];
}
int main (void) {
printf ("学生人数:");
int sts;
scanf ("%d", &sts);
float scores[sts];
input (scores, sts);
float t = total (scores, sts);
float m = max (scores, sts);
printf ("总分:%g,平均分:%g,最高分:%g\n", t, t / sts, m);
return 0;
}
#include <stdio.h>
void swap (int a, int b)
{
int c = a;
a = b;
b = c;
printf ("swap: %d,%d\n", a, b);
// 200,100
}
void swap2 (int arr[])
{
printf ("%d\n", sizeof (arr) / sizeof (arr[0]));
int c = arr[0];
arr[0] = arr[1];
arr[1] = c;
printf ("swap2: %d,%d\n",
arr[0], arr[1]); // 200,100
}
void print (int arr[], int len) {
int i;
for (i = 0; i < len; i++)
printf ("%d ", arr[i]);
printf ("\n");
}
void printm (int mtx[][4], int row) {
int i, j;
for (i = 0; i < row; i++) {
for (j = 0; j < sizeof (mtx[0]) / sizeof (mtx[0][0]); j++)
printf ("%4d", mtx[i][j]);
printf ("\n");
}
}
int main (void) {
int a = 100, b = 200;
swap (a, b);
printf ("main: %d,%d\n", a, b);
// 100,200
int arr[2] = {100, 200};
swap2 (arr);
printf ("main: %d,%d\n", arr[0], arr[1]); // 200,100
int array[] = {10,20,30,40,50};
print (array, sizeof (array) / sizeof (array[0]));
int mtx[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
printm (mtx, sizeof (mtx) / sizeof (mtx[0]));
return 0;
}
相关文章推荐
- C语言学习第七天—结构体
- “吃神么,买神么”的第一个Sprint计划(第七天)
- [JQ权威指南]第七天:使用val()方法设置和获取元素的值
- 第七天Object类和异常
- java 第七天 排序
- java入门第七天 数组开个头 创建数组的几种方式和注意事项
- linux笔记 第七天 文件查找find命令、文件特殊权限、while和until循环
- 南大软院大神养成计划第七天
- 第三个Sprint冲刺第七天(燃尽图)
- #Objective - C - UI-design - 第七天 -UIKit框架-UIKit-导航控制器-UINavigationController
- 第七天学习笔记 ---计算机中进制转换问题
- 2016年03月15日__阶段测试__第七天
- iOS彩票项目--第七天,初次读取json数据、KVC转模型技巧、运行时字典转模型以及初步对显示网页的操作并且跟踪标签
- 团队冲刺第七天
- 冲刺——第七天
- Javascript复习第七天 简陋的五子棋
- 《校园封神榜》第二阶段个人工作总结——第七天
- 第二阶段团队项目冲刺第七天
- 集训第七天
- linux基础学习-第七天(正则表达式及grep)