------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[])4、结构体
{
//定义变量
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;
}
形式: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”};
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培训、期待与您交流! -------