1、二维数组
1.1 概念
本质:元素为一堆数组的数组(数组的数组)
数组的特点:(1)数据类型相同 (2)地址连续
1.2 定义
数组:存储类型 数据类型 数组名[元素个数]
二维数组:存储类型 数据类型 数组名[行数][列数];
行数:表示有几个一维数组
列数:一维数组中有多少个元素
int a[2][3]://定义了一个长度为2的二维数组,该数组有两个元素,每一个元素又是一个长度为3的int型数组;该二维数组的大小为24字节
1.3 初始化
1.3.1 部分初始化
int a[2][3] = {1,2,3};
int a[2][3] = {0};//清零
1.3.2 全部初始化
(1)降维给二维数组赋初值,即按行初始化。每一组的初始值都用{}括起来。
int a[2][3] = {{1,2,3},{4,5,6}};//按降维给a数组元素全部初始化
int a[3][3] = {{1},{4}};//只初始化了部分数组元素,其他元素为0.第一行为 1 0 0,第二行4 0 0.
(2)按线性存储的形式给二维数组赋初值。
int a[2][3] = {1,2,3,4,5,6};//线性存储全部初始化
int a[3][3] = {1,2};//只初始化了部分数组元素,其他元素为0。第一行为 1 2 0,第二行为 0 0 0.
(3)可以省略左边下标范围的方式,给二维数组赋初值。
int a[2][] = {1,2,3,4};//error 列数是不能省略的
int a[][3] = {1,2,3,4};
注意:二维数组的行数是可以省略的,由所赋值决定,但是列数不能省略
1.4 数组的访问
1.5 数组的输入输出
案例
#include <stdio.h>
#define N 8
int main(void)
{
int a[N][N]={0};
int i,j=0;
for(i=0;i<N;i++)
{
for(j=0;j<=i;j++)
{
if(j==0||j==i)
{
a[i][j]=1;
}
else
{
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
printf("%d\t",a[i][j]);
}
printf("\n");
}
return 0;
}
2、二维字符数组
定义一个长度为6的字符数组,数组中的每个元素都是char型的
char str[6] = "hello";
char str[6] = {'h','e','l','l','o'};
//输入
scanf("%s",str);
//输出
printf("%s",str);
输入输出
3、函数
3.1 概念
一个独立的概念模块
3.2为什么要使用函数
3.2.1 使程序模块化
3.2.2 提高代码的复用率
3.3 函数的分类
3.3.1 库函数
(1)引入头文件
#include <stdio.h> #include <string.h>
(2)调用函数
printf();
注意:a、入参的个数,数据类型 b、返回值(可以没有,如果有的话有且仅有一个)
函数名(实际参数列表)//函数定义的是形式参数,我们传入的为实际参数
3.3.2 自定义函数
3.3.2.1 函数定义
存储类型 数据类型 函数名(形式参数列表)
{
函数体;
返回值;
}
存储类型:auto(局部变量,栈)、static(局部和全局)、extern、register;
数据类型:函数返回值的类型(如果不写,默认为int);
函数名:见名知意;
形式参数列表:要实现功能所需要的值,需要调用者传入;
函数体:具体功能的实现;
返回值:可以没有返回值,有返回值的话有且仅有一个;
3.3.2.2 调用函数
函数名(实际参数列表);
注意:
1、需要将实参的值传递给形参,实参的个数和数据类型必须和形参的一致
2、实参的值可以是变量、常量,也可以是表达式,必须是一个确定的数
3、实参和形参是两块独立的内存空间
4、传参实际上是将实参的值拷贝给形参
5、形参是局部变量,在函数调用开始的时候定义,函数调用结束时释放空间
调用时
调用结束
3.3.3 函数声明
如果不是在main函数之前定义的,就需要添加函数声明
声明:将函数头拷贝过来然后加上分号
没加声明之前
加上声明之后
注意:声明的作用帮助语法进行检查
作业
1、实现字符串的排序
2、编写一子函数,实现简易计算器
1、实现字符串的排序
#include <stdio.h>
#include <string.h>
#define N 5
int main()
{
char arr[N][N] = {0};
int i, j, k = 0;
char tmp[N] = {'\0'};
printf("请输入%d个字符数组", N);
for(i = 0; i < N; i++)
{
scanf("%s", arr[i]);
}
for(i = 1; i < N; i++)
{
for(j = 0; j < N-i; j++)
{
k = strcmp(arr[j], arr[j+1]);
if(k>0)
{
strcpy(tmp, arr[j]);
strcpy(arr[j], arr[j+1]);
strcpy(arr[j+1], tmp);
}
}
}
printf("---------------------------\n");
for(i = 0; i < N; i++)
{
printf("%s\n", arr[i]);
}
return 0;
}
2、编写一子函数,实现简易计算器
#include <stdio.h>
#include <string.h>
void menu();
int add(int m, int n);
int subtract(int m, int n);
int multiply(int m, int n);
double except(int m, int n);
int main()
{
int x, y, tmp=0;
printf("输入两个整数");
scanf("%d",&x);
scanf("%d",&y);
menu();
scanf("%d",&tmp);
switch(tmp)
{
case 1:printf("%d\n",add(x, y));
break;
case 2:printf("%d\n",subtract(x, y));
break;
case 3:printf("%d\n",multiply(x, y));
break;
case 4:printf("%.2lf\n",except(x, y));
break;
}
return 0;
}
void menu()
{
printf("选择计算方式\n");
printf("1、加法\n");
printf("2、减法\n");
printf("3、乘法\n");
printf("4、除法\n");
}
int add(int m, int n)
{
int num = m + n;
return num;
}
int subtract(int m, int n)
{
int num = m - n;
return num;
}
int multiply(int m, int n)
{
int num = m * n;
return num;
}
double except(int m, int n)
{
double num =(double) m / n;
return num;
}