嵌入式Linux编程 Android软件开发
2015年(16)
分类: C/C++
2015-04-30 00:06:19
一 一维数组的初始化
数组初始化指的在数组定义的时候,给数组赋值,如果一个数组已经定义了,接下来不能在以初始化的形式给数组赋值
初始化形式:
数据类型 数组名[数组元素个数] = {一个元素值,第二个元素的值,....};
int a[5] = {1,2,3,4,5};//a[0]=1,a[1] = 2,a[2] = 3,a[3] = 4,a[4] = 5
int a[5] = {1};//a[0] = 1,a[1] = 0,a[2] = 0,a[3] = 0,a[4] = 0
注意:如果只是对数组的前一部分成员初始化,未初始化的成员默认为0
------------------------------------------------------------------
int a[5];
a[5] = {1,2,3,4,5};//错误
------------------------------------------------------------------
数据类型 数组名[ ] = {一个元素值,第二个元素的值,....};
特点:编译器会根据初始化的数据个数,来决定数组的元素个数
int a[] = {1,2,3,4,5};//a[0] = 1,a[1] = 2,a[2] = 3,a[3] = 4,a[4]=5
------------------------------------------------------------------
int a[] = {};//错误
------------------------------------------------------------------
练习:
定义一个字符数组a,将它初始化为abcdefgh,
定义一个字符数组b, 将它初始化为xjjkabcd789,
然后,找出两个数组相同的字符,存放在字符数组c中,最后输出字符数组c
点击(此处)折叠或打开
二 字符数组和字符串
字符数组:是一个char/unsigned char的数组,一般用来存放字符
注意:字符数组只能存放字符=>错误 ,也可以用来存放整数[char/unsigned char 为小整型]
例如:
char buf[5];
---------------------------------------------------------------------------------------
字符串 : 是一组字符的集合体,它的最后一个字符一定为'\0'字符,在C语言中表式方法: "多个字符"
例如:
'a'[1byte] 和 "a"[2byte:'a' + '\0']
字符串输入和输出:'%s'
char buf[1024];
输入:
scanf("%s",buf);
注意:空格或回车键或tab键是输入的分割符
输出:
printf("用户提示信息%s\n",buf);
注意:当你以 %s 形式输出字符数组的时候,一定要确保数组中有'\0'字符,否则输出乱码
练习:解决scanf("%s")的空格字符问题?
自己实现字符串的输入
点击(此处)折叠或打开
int i = 0;
char buf[5];
//hello word回车符
for(i = 0;i < sizeof(buf)/sizeof(buf[0]);i ++)
{
scanf("%c",&buf[i]);
if(buf[i] == '\n')
break;
}
//此时数组中是否有'\0'字符?
//此时数组中:hello word\n,希望的是hello word\0
buf[i] = '\0';//buf[5] = '\0',buf 数组越界
======================================================================================================
int i = 0;
char buf[5];
//hello word回车符
for(i = 0;i < sizeof(buf)/sizeof(buf[0]) - 1;i++)//最多只能读取4个字符,还需要留一个空间存放'\0'
{
scanf("%c",&buf[i]);
if(buf[i] == '\n')
break;
}
//此时数组中是否有'\0'字符?
//此时数组中:hello word\n,希望的是hello word\0
buf[i] = '\0';//'\n' -> '\0'
任务:输入字符串到字符数组a中,当用户输入回车符结束输入,将字符数组a中的字符串拷贝到字符数组b
输出字符数组b [printf("%s\n",b);]
例如:
输入的是hello word回车
=======================================================================================================
练习:
char a[] = "hello word";//char a[] = {"hello word"};
char b[1024];
给数组b输入字符串,然后将数组a的内容拼接在b数组后面,然后输出数组b
例如:
给b输入的字符串是xyz hij ,拼接之后是:xyz hijhello word
最后统计字符数组b中字符的个数(不包括'\0')
点击(此处)折叠或打开
三 冒泡排序和选择排序
//冒泡排序
//排序的次数:n个元素需要排n-1次
//排序的过程:第一个和第二个比较,如果第一个大于第二个,则交换,后面依次进行
//每次排序结束的时候,最大数沉底
//每排一次,需要参加比较的元素就少一个[大的数据沉底,不需要参与比较]
点击(此处)折叠或打开
for(i = 0;i < sizeof(a)/sizeof(a[0]) - 1;i ++)//控制排序的次数
{
for(j = 0,flag = 0;j < sizeof(a)/sizeof(a[0]) - i - 1;j ++)//控制排序的过程
{
if(a[j] > a[j + 1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
flag = 1;
}
}
if(flag == 0)
{
printf("i = %d\n",i);
break;
}
}
----------------------------------------------------------------------------------------------
//选择排序
//假设第i(i从0开始)个元素的是最小的,并且用k记录其下标
//论证假设是否成立:
// 从第i + 1个元素开始,依次比较a[k]的值,判断它是否是最小的,如果不是则更新k的值
// ,让k记录最小元素的下标
//
//论证结束后:判断k的值是否改变(k 和i比较),不相等则表示假设不成立,然后交换a[i]和a[k]
//
点击(此处)折叠或打开
for(i = 0;i < n;i ++)
{
k = i;
for(j = i + 1;j < n;j ++)
{
if(a[k] > a[j]){
k = j;
}
}
if(k != i){
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
练习:输入一个字符串,然后将字符串中的字符从大到小排列,然后输出这个字符串
练习:输入10个整数,然后分别用冒泡排序(结果:从小到大)和选择排序(结果:从大到小)进行排序
四 二维数组
1.定义
数据类型 数组名[行数][列数];
例如:
int a[3][2];
<1>元素个数: 行数 x 列数
<2>数组大小: 元素个数 x 元素的大小 = 行数 x 列数 x 元素的大小 = sizeof(数组名)
<3>成员表示: a[0][0] => 第0行第0个元素 , a[0][1] => 第0行第一个元素 , a[0][2] =>越界
<4>最后一个元素:a[行数 -1][列数-1]
<5>在内存中存放的原则:按行优先存放
<6>数组名表示数组的起始地址
练习:
1.定义整型 三行三列的二维数组,给它输入值,然后输出对角线元素的值
2.输入行号,则输出对应行元素的值
3.输入列号,则输出对应列元素的值
点击(此处)折叠或打开
晚间练习
打印杨辉三角形前10行。(提示:定义数组a[10][10])
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
点击(此处)折叠或打开