C语言学习(3)第三章 数组

本文详细介绍了C语言中的数组,包括数组的概念、分类、定义、初始化和元素引用方法。内容涵盖一维、二维和多维数组,以及数组初始化的各种方式。通过实例解析了数组元素的引用,并提供了数组应用的实践练习。

第三章 数组

3.1数组的概念

数组是若干个相同类型的变量在内存中有序存储的集合。一个数组中所有元素的类型是相同的,要么全是int,要么全是字符串

int a[10];

定义了一个整形的数组a,a是数组的名字,a数组中有10个元素,每个元素的类型是int,并且在内存中有序存储

这十个元素分别是a[0],a[1]……a[9],他们在内存中顺序存储,数组的下标从0开始。

3.2数组的分类

3.2.1按元素的类型分类

1、字符数组

数组中每个元素都是字符型的变量,例如:char s[10];

2、短整型数组

例如:short int a[10];对其中的变量赋值:a[8] = 4;

3、整形数组

例如:int a[10];

4、长整型数组

例如:long int a[5];

5、浮点型数组

例如:float f[5]; double d[6];

6、指针数组

例如:char* a[10]; int* b[2];

7、结构体数组

例如:struct stu boy[10]; 数组名是boy,每个元素都是struct stu类型的结构体变量。

3.2.2按维数分类

1、一维数组

例如 int a[10]; a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

2、二维数组

例如 int a[2][30];可看成有两行一维数组组成。类似于矩阵。

3、多维数组

例如 int a[4]a[2][10];可看成由两个二维数组组成。

3.3数组的定义

3.3.1一维数组的定义

格式:数据类型 数组名 [元素个数]

元素个数可以在定义数组的时候不给出,也可以根据初始化的元素个数来确定数组的大小

例如:int a[5];     char b[3];

#include <stdio.h>

int main()

{

int a[4];//整形int占用4个字节,故a数组占用的内存空间大小是16个字节

int b[] = { 1,4,6,8,2 };//b数组的元素个数是5,并且每个元素都是整形int,b数组占用的内存空间大小是20个字节

printf("sizeof(a) = %d\n", sizeof(a));

printf("sizeof(b) = %d\n", sizeof(b));

return 0;

}

3.3.2二维数组的定义

格式:数据类型 数组名 [行的个数][列的个数]

例如:int a[2][3];这里定义了一个2行3列的数组,共有6个元素,数组中每个元素都是int整形的,故占用的内存空间大小是24个字节。

按矩阵的方式:a[0][0],a[0][1],a[0][2]

  a[1][0],a[1][1],a[1][2]

存储的顺序是先从左到右存储第一行,再跟着后面从左到右存储第二行,故a[1][0]跟在a[0][2]后面。

在定义时可以不给出行数,但必须给出列数,此时二维数组的大小根据初始化的行数来确定。

#include <stdio.h>

int main()

{

int a[3][4];//a数组是一个3行4列的二维数组,共有12个元素,每个元素都是int整形。

int b[][3] = { //数组是一个3列的二维数组,没有给出行数,由初始化的行数确定。

{1,2,3},

{2,3,},

{4,5,},

{7,8,9},

{1,5,8},

{2,4,6}    //6行3列,也可以初始化一部分,但这一行只能从左往右按顺序初始化,不能中间少,{2, ,3}这样是错误的

};

printf("sizeof(a) = %d\n", sizeof(a));

printf("sizeof(b) = %d\n", sizeof(b));

return 0;

}

//sizeof(a) = 48

//sizeof(b) = 72

3.3.3多维数组的定义

int a[2][3][4];

int b[2][3][4]][5];……

3.4数组的初始化

在定义数组的同时给数组的元素赋值

3.4.1一维数组的初始化

1、全部初始化

int a[5] = {1,4,5,7,9};

2、部分初始化

int b[5] = {1,4,2};//只初始化了前面2个元素,后面的元素自动赋0。注意:不能中间的不赋值,即{1,4, ,2}这样是错误的

int main()

{

int a[5] = { 1,4,2 };

int i;

for (i = 0; i < 5; i++)

{

printf("a[%d] = %d,",i, a[i]);

}

return 0;

}

//a[0] = 1,a[1] = 4,a[2] = 2,a[3] = 0,a[4] = 0,

3.4.2二维数组的初始化

1、全部初始化

int a[2][3] = {{1,3,5},{2,4,6}};//内层大括号分别表示第一行的元素,第二行的元素,用逗号分隔

2、按行初始化

int a[2][3] = {{1,3},{2,4,6}};//没有初始化的元素自动赋0

#include <stdio.h>

int main()

{

int a[2][4] = { {1,4,2},{2,6} };

int i, j;

for(i = 0; i < 2; i++)

{

for (j = 0; j < 4; j++)

{

printf("a[%d][%d] = %d ", i, j, a[i][j]);

}

printf("\n");

}

return 0;

}

//a[0][0] = 1 a[0][1] = 4 a[0][2] = 2 a[0][3] = 0

//a[1][0] = 2 a[1][1] = 6 a[1][2] = 0 a[1][3] = 0

3、逐个初始化

int a[2][4] = {1,4,5,2,8,6,3,6};存放的顺序是按下标从小到大按顺序把元素排满第1行,再排满第二行。也可以只初始化一部分,但同样不能中间的不赋值就给后面的元素赋值。

int main()

{

int a[2][4] = { 1,4,5,2,8,6,3,6 };

int b[2][4] = { 1,4,2 };

int i, j;

for (i = 0; i < 2; i++)

{

for (j = 0; j < 4; j++)

{

printf("a[%d][%d] = %d ", i, j, a[i][j]);

}

printf("\n");

}

for (i = 0; i < 2; i++)

{

for (j = 0; j < 4; j++)

{

printf("b[%d][%d] = %d ", i, j, b[i][j]);

}

printf("\n");

}

return 0;

}

//a[0][0] = 1 a[0][1] = 4 a[0][2] = 5 a[0][3] = 2

//a[1][0] = 8 a[1][1] = 6 a[1][2] = 3 a[1][3] = 6

//b[0][0] = 1 b[0][1] = 4 b[0][2] = 2 b[0][3] = 0

//b[1][0] = 0 b[1][1] = 0 b[1][2] = 0 b[1][3] = 0

3.5数组元素的引用方法

3.5.1 一维数组元素的引用方法

数组名 [下标];

注意:下标表示元素在数组中的位置,下标是从0开始的,如果读取下标超出有效范围的,结果不可预知了,此时编译器会提示,但不会报错。

int main()

{

int a[5] = {0}, i;

for (i = 0; i < 7; i++)

{

printf("a[%d] = %d ", i, a[i]);

}

return 0;

}

//a[0] = 0 a[1] = 0 a[2] = 0 a[3] = 0 a[4] = 0 a[5] = -858993460 a[6] = 1755430365

3.5.2 二维数组元素的引用方法

数组名[行下标][列下标];

3.5.3 字符数组

1、一维

char c1[] = {'h',' ','l','l','o'};//5个元素,一个元素一个元素地初始化

char c2[] = "h llo";//6个元素,分别是h、 (空格)、l、l、o、\0(字符串结束标志)

可见:用字符串的方式赋值会比逐个赋值多占1个字节,在末尾处用于存放字符串结束标志\0,在这种情况下打印字符串不用考虑元素个数了,会自动停止打印。

printf("%s\n", c1); //h llo烫烫烫腆??鶝

没有自动停止打印,出现了错误的数据。

printf("%s\n", c2); //h llo

自动停止打印了。

int main()

{

char str[15];

printf("输入一个字符串:\n");

scanf_s("%s", str, 15);

printf("str:%s\n", str);

return 0;

}

2、二维

char c3[][5]={

{'a','b','c','d','e'},

{'f','g','h','i','j'}

};

char c4[][6]={"hello","world"};

第三章练习

1、任意给出一个年、月、日,判断是这一年的第几天

闰年算法:能被4整除且不能被100整除,或者能被400整除

例如:2012 5 10是这一年的第131天

#include<stdio.h>

int main()

{

char ping[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

int i,year,month,day,sum = 0 ;

printf("请输入年 月 日,用空格隔开\n");

scanf_s("%d %d %d", &year, &month, &day);

for ( i = 0; i < month - 1; i++)  //计算这月之前总天数

{

sum += ping[i];

}

if ((year % 4 == 0 && year % 100 != 0 || year % 400 == 0)&&(month > 2))  //判断这年是否是闰年,并且判断过没过2月份

{

sum += 1; //如果是,那么加1天

}

sum += day;  //加上本月当前的天数

printf("%d年%d月%d日是这一年的第%d天\n", year, month, day, sum);

return 0;

}

2、打字游戏

(1)随机函数

srand((unsigned)time(NULL)); //以当前时间为准,设置随机种子,每次开始游戏后调用一次即可

ch = rand(); //rand()函数每次调用一次,产生一个随机数字

(2)获得键值函数

ch = _getch();//无需按下回车,可直接获得键盘上按下的数值

(3)时间函数

start_time = time(NULL);

end_time = time(NULL);

(4)清空屏幕

system("cls");

#include<stdio.h>

#include<time.h>

#include<conio.h>

#include<random>


void help(void)

{

printf("\n*******************************************");

printf("\n*输入过程中无法退出!**********************");

printf("\n*请按所给的字母敲击键盘********************");

printf("\n*按任意键开始测试,按下首字母时开始计时!**");

printf("\n*输入出错以 _ 表示*************************");

printf("\n*******************************************\n\n");

}


int main()

{

char ch;

char str[51] = "";//产生50个测试用字母

int i;

int count = 0;

time_t start_time, end_time;

while (1)

{

system("cls"); //每次游戏启动前清空屏幕

help();  //打印帮助信息

ch = _getch();   //获取键盘按下的数值,

srand((unsigned int)time(NULL)); //产生一个种子

for (i = 0; i < 50; i++)

{

str[i] = rand() % 26 + 'a';  //rand 产生的随机数对26取余,会得到一个0-25的随机数,加上'a'的ASCII码,就可以得到26个英文字母

}

str[50] = '\0'; //最后一位补字符串结束标志\0,自动停止打印

printf("%s\n", str); //打印测试用字符串

count = 0;  //计数器清零

for (i = 0; i < 50; i++) //每次输入一个字符,立即与对应的测试字符比对,如果正确则打印出来,如果错误则打印_

{

ch = _getch();

if (i == 0)

{

start_time = time(NULL);

}

if (ch == str[i]) //如果正确,则计数器自增1,并打印对应的字符

{

count++;

printf("%c", ch);

}

else //如果错误,直接打印下划线_

{

printf("_");

}

}

end_time = time(NULL);  

printf("\n\n");

printf("正确的个数为:%d个\n", count);

printf("正确率:%d %c\n", count * 100 / 50,'%');

printf("总计用时:%lld秒\n", (long int) end_time - start_time);

while (1)  //结束后执行如下死循环,循环比对键盘输入的字符

{

ch = _getch();

if (ch == ' ') //如果按下空格键,则继续游戏,即返回主循环

{

break;

}

else if (ch == 27)// 如果按下了ESC键(对应的ASCII码是27),则退出游戏

{

return 0;  //结束return 0 所在的函数,即主函数

}

}

}

return 0;

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值