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

时间:2021-09-16 00:22:47

------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培训、期待与您交流! -------