【知识点:定义并初始化】
【1】 数组定义并初始化的写法!
#include
int main() {
int a[40] = { 1, 1}, i;//定义并初始化
//定义这个长度为40的整形数组,并初始化为2个1
//按照顺序依次给a[0]和a[1]
for (i = 2; i <= 39; i++) {
a[i] = a[i - 2] + a[i - 1];
}
for (i = 0; i <= 39; i++) {
printf("%d\n", a[i]);
}
return 0;
}
【2】 注意,一维数组定义并初始化的时候,哪怕只有一个数值初始化也必须加{}
【3】 注意,初始化的值是按照顺序依次给数组元素
【4】 特征:代码验证一下
一维数组定义并初始化后,系统默认给其他数组元素赋值为0。
【5】 对比,定义和初始化分开呢?
#include
int main() {
int a[40], i;
//定义一个长度为40的整型数组
a[0] = 1;
a[1] = 1;
//分开单独初始化写法
for (i = 0; i <= 39; i++) {
printf("%d\n", a[i]);
}
return 0;
}
系统给其他数组元素随机给值
【给的未知的值:系统给其他38个数值是啥不知道】
总结一下:
【1】 一维数组:目的取代多个自变量提出的。
【2】 必须先定义再使用!
【3】 定义形式:数据类型名 数组名[长度]
【4】 数组元素:数组名[下标] 下标:位置:第几?,记得是从0开始编号处理
【5】 例如:int a[40]
特征1:一个一维数组中所有的数组元素的数据类型必须是一样的!
【换句话讲:一个一维数组中绝对不可以出现不同类型的数据!】
特征2:每个数组元素的存储空间都是一样大!
特征3:c语言一共有3个标准【C89 C99 C11】规定一维数组定义的时候表示数组[长度]
必须是整型常量!int a[40] 黄色部分绝对不可以是自变量!int a[n];
int n=10;
int a[n];
特征4:一维数组中所有数组元素在内存中是连续存储的!
特征5:任何一维数组都满足:一维数组的数组名 等价 该数组首元素的地址
#include
int main() {
int a[40], i;
//分开单独初始化
printf("%d\n", &a[0]);
//输出a[0]的首地址
printf("%d\n", a);
return 0;
}
1、 应用:坐标,excel中的工作表,数独,
经典老游戏的界面也是典型二维数组:俄罗斯方块,贪吃蛇,超级玛丽,推箱子,魂斗罗,坦克大战等
2、 必须满足先定义再使用!
格式:数据类型名 数组名[行数][列数]
例如:输入一个寝室6个人本学期7门科目的成绩,计算出每个人的总分和平均分,最后全部输出
3、 数组元素如下
#define _CRT_SECURE_NO_WARNINGS
#include
int main() {
double cj[6][10];//6个人7个科目
int i, j;
for (i = 0; i <= 5; i++) {
printf("输入学号:");
scanf("%lf", &cj[i][0]);
printf("输入程序设计技术:");
scanf("%lf", &cj[i][1]);
printf("输入高数:");
scanf("%lf", &cj[i][2]);
printf("输入离散数学:");
scanf("%lf", &cj[i][3]);
printf("输入英语:");
scanf("%lf", &cj[i][4]);
printf("输入体育:");
scanf("%lf", &cj[i][5]);
printf("输入计算机导论:");
scanf("%lf", &cj[i][6]);
printf("输入思政:");
scanf("%lf", &cj[i][7]);
//求总分
cj[i][8] = 0;
for (j = 1; j <= 7; j++)
cj[i][8] = cj[i][8] + cj[i][j];
//平均分
cj[i][9] = cj[i][8] / 7;
}
//输出全部成绩
printf("%-13s", "学号");
printf("%-13s", "程序设计与技术");
printf("%-13s", "离散数学");
printf("%-13s", "高数");
printf("%-13s", "英语");
printf("%-13s", "体育");
printf("%-13s", "计算机导论");
printf("%-13s", "思政");
printf("%-13s", "总分");
printf("%-13s", "平均分");
printf("\n");
for (i = 0; i <= 5; i++) {
printf("%-13.01lf", cj[i][0]);
printf("%-13.01lf", cj[i][1]);
printf("%-13.01lf", cj[i][2]);
printf("%-13.01lf", cj[i][3]);
printf("%-13.01lf", cj[i][4]);
printf("%-13.01lf", cj[i][5]);
printf("%-13.01lf", cj[i][6]);
printf("%-13.01lf", cj[i][7]);
printf("%-13.01lf", cj[i][8]);
printf("%-13.01lf", cj[i][9]);
printf("\n");
}
return 0;
}
参考一维数组的定义和数组元素
int b[4];
数组元素
b[0] b[1] b[2] b[3]
左边黄色是不变的一维数组名,右边是变化的下标
二维数组第0行:
a[0][0] a[0][1] a[0][2] a[0][3]
左边是a[0],不变,可以当做是首行四个元素所构成的一维数组的数组名a[0]
二维数组第1行:
a[1][0] a[1][1] a[1][2] a[1][3]
左边是a[1],不变,可以当做是首行四个元素所构成的一维数组的数组名a[1]
二维数组第2行:
a[2][0] a[2][1] a[2][2] a[2][3]
左边是a[2],不变,可以当做是首行四个元素所构成的一维数组的数组名a[2]
所以:二维数组是由多个一维数组组成!【1行就是一个一维数组】
#include
int main() {
//二维数组定义并初始化
int a[3][3] = { {10,20,30},{40,50,60},{70,80,90} };
int i, j;
for (i = 0; i <= 2; i++) {
for (j = 0; j <= 2; j++) {
printf("%4d", a[i][j]);
}
printf("\n");
}
return 0;
}
所以:二维数组本质上是一维数组!
【本质体现在:内存中,计算机内存是一个线型的存储结构,一字排开】
【二维数组:只是逻辑上,输出上是二维的】
【换个角度说:二维数组在内存中是按行依次存储的!】
一、 char开头
例如定义一个一维字符数组
char a[100];
例如定义一个二维字符数组
char b[3][100];
二、 字符数组可以用来存储多个字符的对象
多个字符所组成的对象称之为字符串。
字符串书写的时候必须加一对””
#include
int main() {
printf("%s","xxxxx");
return 0;
}
三、 字符串的应用
例如 用户名 [email protected]
密码
验证码
程序中菜单功能名字
身份证号码
家庭住址等
四、 一维字符数组:只能用来存放一串字符
二维字符数组:可以用来存放多个字符串
#include
int main() {
char nation[10] = { 'C','H','I','N','A' };
int i;
for (i = 0; i <= 4; i++) {
printf("%c", nation[i]);
}
}
换个写法
#include
int main() {
char nation[10];
nation[0] = 'C';
nation[1] = 'H';
nation[2] = 'I';
nation[3] = 'N';
nation[4] = 'A';
int i;
for (i = 0; i <= 9; i++) {
printf("%c", nation[i]);
}
}
后面5个输出不是全0,未知的值来理解!
#include
int main() {
char nation[10] = { "China"};
int i;
for (i = 0; i <= 4; i++) {
printf("%c", nation[i]);
}
}
六、 自己输入
#define _CRT_SECURE_NO_WARNINGS
#include
int main() {
char nation[10];
int i;
printf("输出");
for (i = 0; i <= 9; i++) {
scanf("%c", &nation[i]);
}
printf("输出");
for (i = 0; i <= 9; i++) {
printf("%c", nation[i]);
}
}
输入回车不是输入的结束的意思
你输入最后5个回车键全部作为字符依次存储到
nation[5]到nation[9]中
能否做到像平时使用的软件一样,输入回车键就结束!
可以的 注意回车键 在C语言中的表示 \n
#define _CRT_SECURE_NO_WARNINGS
#include
int main() {
char nation[10];
int i;
printf("输出");
for (i = 0; i <= 9; i++) {
scanf("%c", &nation[i]);
if (nation[i] == '\n')
break;
}
printf("输出");
for (i = 0; i <= 9; i++) {
if (nation[i] != '\n') {
printf("%c", nation[i]);
}
else {
break;
}
}
}
#define _CRT_SECURE_NO_WARNINGS
#include
int main() {
char nation[10];
printf("输入:");
scanf("%s", nation);//nation等价于&nation[0]
printf("输出:");
printf("%s", nation);
}
说明:scanf(“%s”,nation);
%s做输入字符串之后的时候只要遇见了 空格 或者 TAB 或者 回车键就直接表示一个字符串输入结束!
例如 输入China
要注意nation数组中如何存储上述字符串
nation[0]=’C’
nation[1]=’h’
nation[2]=’i’
nation[3]=’n’
nation[4]=’a’
nation[5]=’\0’ \0 表示一个字符串的结束标志
nation[6]=’\0’ \0 表示一个字符串的结束标志
nation[7]=’\0’ \0 表示一个字符串的结束标志
nation[8]=’\0’ \0 表示一个字符串的结束标志
nation[9]=’\0’ \0 表示一个字符串的结束标志
如果想代码短,想空格等不影响输入字符串
C语言的解决方案:使用字符串专用的输入与输出函数
gets 字符串输入函数
puts 字符串输出函数
#define _CRT_SECURE_NO_WARNINGS
#include
int main() {
char nation[10];
printf("输入:");
gets_s(nation);
printf("输出:");
puts(nation);
}
对比输出 puts明显多了一行。
China最后依次存储的是\0
puts函数的一个规定:
puts函数做输出的时候把字符串末尾的\0拿出来,再变成\n做输出
存储空间中China的末尾还是存储的是\0
#define _CRT_SECURE_NO_WARNINGS
#include
int main() {
char nation[3][10] = { {"中国"},{"韩国"},{"新加坡"} };
printf("%s\n", nation[0]);
printf("%s\n", nation[1]);
printf("%s\n", nation[2]);
}
#define _CRT_SECURE_NO_WARNINGS
#include
int main() {
char nation[3][10] = { {"中国"},{"韩国"},{"新加坡"} };
int i;
for (i = 0; i <= 2; i++) {
printf("%s\n", nation[i]);//一维数组名
}
}
上述操作全部是多个字符串的输出
关于多个字符串的输入
#define _CRT_SECURE_NO_WARNINGS
#include
int main() {
char nation[3][20];
int i;
printf("输入3个国家的名字:\n");
for (i = 0; i <= 2; i++) {
gets_s(nation[i]);
}
printf("输出3个国家的名字:\n");
puts(nation[i]);
}