黑马程序员_C语言基础_构造类型(数组,结构体,枚举)

本文详细介绍了C语言中的构造类型,包括数组的分类、初始化、引用,特别是二维数组的处理方法;接着讲解了字符数组的初始化、字符串处理函数的使用;此外还探讨了结构体的定义及初始化,以及枚举类型的应用。
摘要由CSDN通过智能技术生成

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 

    C语言中把构造类型分为三种:数组,结构体,枚举,下面就对它们一一学习。

1、数组

     就是把相同数据类型的元素顺序排列,把有限个相同类型的变量用一个名字命名,然后用编号代表所处的位置的集合,这个名字称为数组名,编号称为下标。

    数组按类型划分包括数值数组,字符数组,指针数组,结构体数组等;

    数组按维度划分包括一维数组、二维数组、多维数组。

    数组在内存中占用总字节数用sizeof(数组名);

    数组长度=数组总长度/数组任何一个元素字节数,即len=sizeof(数组名)/size(数据类型)。

    重点介绍二维数组的定义使用、引用。

2、二维数组

形式:二维数组:数组类型    数组名[常量表达式1][常量表达式1]

A 初始化

1.完全初始化

int a[3][2]={{1,2},{3,4},{5,6}};  int a[][2]={{1,2},{3,4},{5,6}}; 可以省略数组第一常量,第二常量不能省略

2.定义的同时部分初始化

int a[3][2]={{1,2}};int a[3][2]={1};那么其他的元素系统默认为0

3.先定义然后再初始化

int  a[3][2];

a[0]={1,2};a[1]={3,2};a[3]={4,2};//初始化的是每一行

a[0][0]=1;a[0][1]=2;a[1][0]=3;a[1][1]=1;a[2][0]=1;a[2][2]=6;//初始化的是每一个元素

D 二维数组行,列的计算

二维数组占用的总字节数:每行占用字节数之和或所有元素个数*元素类型(行*列*sizeof(数组类型))

行数=总字节数/每一行占用的总字节数,即len=sizeof(a)/sizeof(a[0]);

列数=行的总字节数/每个元素占用的总字节数,即len=sizeof(a[0])/sizeof(int);

对二维数组使用最多的就是通过它的遍历实现一些功能。

例:求每门课的平均分和三门课的平均分,5个人三门课

int main(int argc, char *argv[])
{
	   //求每门课的平均分和三门课的平均分,5个人三门课
		int sum;
		float total = 0.0f;
		int score[5][3] = { { 80, 30, 59 }, { 95, 45, 67 }, { 97, 45, 67 }, { 92, 83, 67 }, { 78, 59, 89 } };
		//遍历
		for (int i = 0; i < 3; i++){
			//每统计一门课的成绩和之后,统计下一门课要清零
			sum = 0;
			for (int j = 0; i < 5; j++){
				sum += score[j][i];//每一列的值
			}
			printf("第%d门课的平均分:%.2f\n", i + 1, sum / 5.0f);
			total += (sum / 5.0f);//(sum/5.0f)每一门可的平均分
		}
		//总平均分
		printf("总平均分:%.2f\n", total / 3);
	return 0;
}

还需要注意的是:二维数组元素作为函数的参数传递时,相当于变量的值传递;

数组名作为函数参数传递时,相当于传递的是数组的首地址。

还要注意在传递过程中,要保证数组类型和长度要一致,不过形参可以省略不写第一维度。

3、字符数组

形式:char 数组名{常量表达式}

A 初始化

1.完全初始化

char ch[3]={'a','b','c','d'};char ch[]={'a','b','c','d'};char ch[3]={'a'};char ch[3]={[2]='c'};

2.定义的同时部分初始化

char ch[3]={'a'};那么其他的元素系统默认为'\0'

3.先定义然后再初始化

char ch[3];

ch[0]='a';ch[1]='a';ch[2]='r';

要注意的是:1.char ch[10];scanf("%s",ch);若在中间输入过程中输入了空格,则空格以后输入的字符也不被接收,只接收空格以前的字符。

2.输入的字符串长度还要小于数组的长度,因为字符串数组最后默认还有一个结束符'\0'。

B 字符串处理函数

使用字符串函数要加入头文件#include<string.h>

1.strlen()计算字符串的长度,不包含'\0'

2.puts()字符串输出函数

puts(字符数组名);

注意:它可以自动转行,可以是数组的首地址,也可以是元素的地址,必须是字符串数组,不可以格式化输出。

3.gets()字符串输入函数

gets(字符数组名);可以接收空格

4.strcat()联接两个字符串,使之成为一个字符串。

注意:是在第一个字符串后面联接第一个字符串;第一个字符串的长度要足够大,至少能够保存两个字符串。

5.strcpy()拷贝函数

注意:是第二个字符串从第一个字符串的头开始覆盖;第一个字符串的长度要足够大

6.strcmp()比较函数

注意:比较的是ascii码值,它是有返回值的,若第一个字符串大于第二个,则返回1;若第一个字符串小于第二个,则返回1;若第一个字符串等于第二个,则返回0;

例:实现单词首字母大写,并统计单词个数

int main(int argc, char *argv[])
{
	   //定义变量
		char str[100];
		int words = 0;
		int count = 0;
		//输入并保存
		printf("请输入一个字符串:\n");
		gets(str);
		//循环取出每一个字符,遇到\0结束
		for (int i = 0; str[i] != '\0'; i++)
		{
			if (str[i] == ' ')//把是不是单词标记改下
				words = 0;//表示一个单词
			else if (words == 0)
			{//当前循环,字符是空格,下次循环一定是单词 
				count++;
				str[i] = str[i] - 32;
				words = 1;//单词标志变为不是单词
			}
		}
		printf("单词个数%d,字符串%s", count, str);
		puts(str);
	return 0;
}
4、结构体

形式:struct 结构名{

               成员列表

           };

A 定义的三种方式

1.先定义结构体,子定义结构变量

struct 结构名{

               成员列表

           };

struct 结构名  结构变量;

2.定义结构体的同时,定义结构变量

struct 结构名{

               成员列表

           } 结构变量

3.使用匿名结构体变量

struct {

               成员列表

           } 结构变量

B初始化

1.先定义变量在初始化

struct Student{

               int age;

               char *name;

           }

struct Student stu;

stu.age=10;

stu.age="zhanggong";

2.边定义边初始化

struct Student stu={10,“zhanggong”};

3.定义结构体同时,还可以指定元素初始化

struct Student stu={name=“zhanggong”};

例:计算学生平均成绩和不及格人数,以及打印输出80-100分学生成绩和姓名

int main(int argc, const char *argv[]){
	   //结构体
		struct stu
		{
			int num;
			char *name;
			char sex;
			float score;
		};
		struct stu boy[5] =
		{
			{ 101, "liming", 'F', 45 },
			{ 102, "zhanghong", 'M', 62.5 },
			{ 103, "hefeng", 'F', 92.5 },
			{ 104, "chengling", 'M', 87 },
			{ 105, "wangming", 'M', 58 },
		};
		float sum = 0.0f;
		int count = 0;
		//循环
		for (int i = 0; i < 5; i++)
		{
			sum += boy[i].score;
			//判断成绩小于60的人数
			if (boy[i].score<60){
				count++;
			}
			//输出成绩在80到100人的姓名和成绩
			else if (boy[i].score <= 80 && boy[i].score <= 100)
			{
				printf("姓名=%s,成绩=%.2f\n", boy[i].name, boy[i].score);
			}
	
		}
		printf("平均值:%.2f\n", sum / 5);
		printf("不及格人数:%d\n", count);
	return 0;
}

5.枚举

形式:enum 枚举类型名{枚举值表};

eg: enum icolor{red,blue,black,yellow};

注意:枚举值表打印输出的时候是系统默认第一个值是从0开始依次往后编号的,要想改变某个值,则需要强制命名,如:enum icolor{red,blue=3,black,yellow};则打印输出black的时候不是2了,而是4。


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值