(一)例题
例1:找出一个二维数组中的鞍点
即:该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。
#include <stdio.h> int main(void) { //int a[3][3] = {1,2,9,4,5,10,8,9,8}; int a[3][3] = {1,2,3,4,5,6,7,8,9}; int i = 0; int j = 0; int k = 0; int l = 0; int m = 0; int flag = 0; //先打印输出一下矩阵 for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { printf("%d ",a[i][j]); } putchar('\n'); } for (i = 0; i < 3; ++i) { int max = a[i][0];//先定第一列的值为最大值 for (j = 1; j < 3; ++j) { if (a[i][j] > max)//如果有比第一列的值大的值 { max = a[i][j];//就把它放到max中 k = j;//将这个值的列下标放到k中 } } for (m = 0; m < 3; m++)//开始找每一列的最小值 { if (a[m][k] < max)//如果有比它小的值就跳出循环 { break; } } if (m == 3)//m==3代表全部循环完都没有找到比它更小的值,这就是有鞍点 { flag = 1; printf("found = (%d,%d) = %d\n",i,k,a[i][k]); } } if (flag == 0)//没有循环完就结束循环,m就会小于3, { 代表在列中找到了比max还小的值,这就没有鞍点了 printf("not found!\n"); } return 0; }
例2:输出“魔方阵”(奇数矩阵)
#include <stdio.h> #include <strings.h> int main(void) { int n; printf("Input a num:"); scanf("%d",&n); int a[n][n]; //printf("sizeof(a) = %ld\n",sizeof(a)); bzero(a,sizeof(a)); int i = 0; int j = 0; int k = 1; int x,y; a[0][n/2] = 1; i = 0; j = n/2; for (k = 2; k <= n*n; ++k) { x = i; y = j; ++j; if (j > n-1) { j = 0; } --i; if (i < 0) { i = n-1; } if (a[i][j] != 0) { i = x; j = y; ++i; if (i > n-1) { i = 0; } } a[i][j] = k; } for (i = 0; i < n; ++i) { for (j = 0; j < n; ++j) { printf("%d ",a[i][j]); } putchar('\n'); } return 0; }
(二)二维字符型数组
二维字符型数组可以批量的处理字符串。
char s[3][4]; //3行4列
(1)初始化:全部初始化、部分初始化(未初始化部分为0)
按行进行初始化:
eg: char s[3][10] = {{"hello"}, {"world"}, {"English"}};
char s[3][10] = {"hello", "world", "English"};
(2)输入字符串:
gets(s[0]); //s[0] 就是第0行 这个一维字符型数组的数组名
例:从键盘输入5个字符串,找出最大的字符串
#include <stdio.h> int mian(void) { char s[5][10]; char max[10]; printf("Input 5 str:"); int i,ret=0; for(i=0; i<5; ++i) { gets(s[i]); } strcpy(max,s[0]); for (i=1; i<5;i++) { ret = strcmp(s[i],max); if(ret>0) strcpy(max,s[i]); } printf("max str = %s\n",max); return 0; }
(三)函数
思想:从上到下,逐步求解的过程。(将大问题拆分成小问题)
1.函数定义:
类型标识符 函数名 (形式参数)
{
函数体代码
}
(1)类型标识符:数据类型----表示函数要带出的结果的类型
注意:数组类型不能做函数返回结果的类型。
返回结果的类型需注意:
a.如果函数不需要带出什么结果,此时返回结果的类型说明符就一般设计为void ,
如果类型为void,一般不写return。如果要写------ return ;
b.如果 返回结果的类型 与 类型说明符不一致,以 类似说明符 为准。
(最终结果的类型,都会转为类型说明符表示的类型 )
c.类型说明符如果不写,就默认是 int 类型。
(2)函数名 :标识符 ,命名规则符合 标识符命名规则 。
(3)形式参数:表示该函数需要用到的数据 。
形参的写法:
数据类型 形参变量名1, 数据类型 形参变量名2 ...
注意:
a.形参变量,必须都明确指定类型。不能写成: int a,b
b.实参 和 形参 对应关系 :类型匹配、个数相同、顺序一一对应
c.函数传参:传递的是 实际参数的 数值。(值传递)
d.如果不需要接收实际参数,形参一般设计为void(表示空类型)
(4)函数体代码:实现函数具体功能的那部分代码。
(5)函数定义的位置:
①main函数之前
②main函数之后 :需要在使用(函数调用)前,作函数声明。函数头+分号 就是函数声明
定义函数的具体步骤:
1.先确定函数名2.考虑函数需要用到哪些数据 ---- 形参
3.处理数据---- 函数体的具体实现
4.考虑需不要带出结果 --- (返回值对应)类型说明符
return 语句:return (表达式); //return 表示从函数中返回,意味着函数执行结束
2.函数调用:
函数调用表示使用 功能。
语法形式:
函数名(实际参数)
例:判断是否是素数?
#include <stdio.h> int isPrime(int n) { int i = 0; int ret = 1; for (i = 2; i < n; ++i) { if (n%i == 0) { ret = 0; break; } } return ret; } int main(void) { int n; scanf("%d",&n); if (isPrime(n) == 0) { printf("no\n"); }else { printf("yes\n"); } return 0; }