利用数组处理批量数据
use-arrays-to-process-batch-data
1.数组
使一组有序数据的集合.
2.用一个数组名和下标来唯一地确定数组中的元素
3.数组中的每一个元素都属于同一个数据类型
怎样定义和引用一维数组
类型符 数组名[常量表达式]
怎么引用一维数组元素
数组名[下标]
对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出.
#include<stdio.h>
int main()
{
int i, a[10];
for (i = 0; i <= 9; i++)
{
a[i] = i;
}
for (i = 9; i >= 0; i--)
{
printf("%d ", a[i]);
}
return 0;
}
一维数组的初始化
1)在定义数组时对全部数组元素赋予初值.
2)可以只给数组中的一部分元素赋值(只给前n个元素赋值,其余的元素自动赋值为0)
3)如果想使一个数组中全部元素值为0,可以写成
int a[10]={0};
4)在对全部元素赋值时,如果数据的个数已经确定,因此可以不指定数组长度.
用数组来处理求Fibonacci数列问题
#include<stdio.h>
int main()
{
int i;
int f[20] = {1, 1};
for (i = 2; i < 20; i++)
{
f[i] = f[i - 2] + f[i - 1];
}
for (i = 0; i < 20; i++)
{
if (i % 5 == 0)
printf("\n");
printf("%12d", f[i]);
}
printf("\n");
return 0;
}
有10个地区的面积,要求对它们按由小到大的顺序排列(冒泡排序)
#include<stdio.h>
int main()
{
int a[10];
int i, j, t;
printf("input 10 numbers:\n");
for (i = 0; i < 10; i++)
scanf("%d", &a[i]);
printf("\n");
for (j = 0; j < 9; j++)
{
for (i = 0; i < 9 - j; i++)
{
if (a[i] > a[i + 1])
{
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
}
}
printf("the sorted number:\n");
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
怎样定义和引用二维数组
二维数组常称为矩阵.
怎么定义二维数组
float pay[3][6]
类型说明符 数组名[常量表达式][常量表达式]
二维数组中元素排列的顺序是按行存放的,即在内存中先顺序存放第1行的元素,接着再存放第2行的元素.所以第1维的下标变化最慢,最右边的下标变化最快
二维数组的初始化
$花括号显示异常
1)分行给二维数组赋初值
int a[3][4]=({1,2,3,4},{5,6,7,8},{9,10,11,12})
2)可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值.
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}
3)可以对部分元素赋初值
int a[3][4]=({1},{5},{9})
1 0 0 0
5 0 0 0
9 0 0 0
也可以不赋初值
int a[3][4]=({1},{},{9})
4)如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第1维的长度可以不指定,但第2维的长度不能省.
如:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
等价于
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
在定义时也可以只对部分元素赋初值而省略第1维的长度,但应分行赋值.
int a[][4]=({0,0,3},{},{0,10});
将一个二维数组行和列的元素互换,存到另一个二维数组里面.
例如:
1 4
a=[1 2 3] b = [ 2 5 ]
4 5 6 3 6
#include<stdio.h>
int main()
{
int a[2][3] = {{1, 2, 3},
{4, 5, 6}};
int b[3][2], i, j;
printf("array a:\n");
for (i = 0; i <= 1; i++)
{
for (j = 0; j <= 2; j++)
{
printf("%5d", a[i][j]);
b[j][i] = a[i][j];
}
printf("\n");
}
printf("array b:\n");
for (i = 0; i <= 2; ++i)
{
for (j = 0; j <= 1; ++j)
{
printf("%5d", b[i][j]);
}
printf("\n");
}
return 0;
}
字符数组
用来存放字符数据的数组时字符数组.
例如:
char c[10];
c[0] = 'I';
c[1] = ' ';
c[2] = 'a';
c[3] = 'm';
c[4] = ' ';
c[5] = 'K';
由于字符型数据是以整数形式(ASCII代码)存放的,因此也可以用整型数组来存放字符数据.
int c[10];
c[1] = 'a';//合法,但浪费存储空间
字符数组的初始化
如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即’\0’).如:
char c[10] = {'c', ' ', 'p', 'p'};
如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度
char c[] = {'c', ' ', 'p', 'p'};
也可以定义二维字符数组
char diamond[5][5] = {{' ', ' ', '*'}, {' ', '*', ' ', '*'},{'*', ' ', ' ', ' ', '*'},{ ' ', '*', ' ', '*' },{ ' ', ' ', '*' }};
怎样引用字符数组中的元素
输出一个已知的字符串
#include<stdio.h>
int main()
{
char c[15] = {'I', ' ', 'a', 'm', ' ', 'a', ' ', 's', 't', 'u', 'd', 'e', 'n', 't'};
int i;
for (i = 0; i < 15; i++)
printf("%c", c[i]);
printf("\n");
return 0;
}
输出一个菱形图
#include<stdio.h>
int main()
{
char diamond[5][5] = {{' ', ' ', '*'}, {' ', '*', ' ', '*'},
{'*', ' ', ' ', ' ', '*'},{ ' ', '*', ' ', '*' },{ ' ', ' ', '*' }};
int i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
printf("%c", diamond[i][j]);
printf("\n");
}
return 0;
}
字符串和字符串你结束标志
遇到字符’\0’时,表示字符串结束,把它前面的字符组成一个字符串.
C系统在用字符数组存储字符串常量时会自动加一个’\0’作为结束符.遇到’\0’会停止输出
例如:
char c[] = {"I am happy"};
char c[] = "I am happy";//花括号可以省略
//可以写成:
char c[] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y','\0'};
此时数组c的长度不是10而是11,因为字符串常量的最后由系统加上一个’\0'.
字符数组的输入输出
1)逐个字符输入输出,用格式符"%c"输入或输出一个字符.
2)将整个字符串一次输入或输出.用"%s"格式符,意思是对字符串(string)的输入输出.
例如:
char c[] = {"China"};
printf("%s\n", c);
1.如果一个字符数组中包含一个以上’\0’,则遇到第一个’\0’时输出就结束.
2.可以用scanf函数输入一个字符串,如:
scanf("%s",c);
3.数组中未被赋值的元素的值自动置’\0'
4.系统会把空格字符作为输入的字符串之间的分隔符
5.scanf函数中的输入项如果是字符数组名,不要再加地址符&,因为在C语言中数组名代表该数组第一个元素的地址(或者说数组的起始地址)
下面的写法是不正确的:
scanf("%s",&str); //str前面不应加&
实际上是这样执行的:
按字符数组名c找到其数组第一个元素的地址,然后逐个输出其中的字符,直到遇’\0’为止.
使用字符串处理函数
puts函数——输出字符串的函数
puts (字符数组)
其作用是将一个字符串(以’\0’结束的字符序列)输出到终端.
在用puts输出时的字符串结束标志’\0’换成’\n’,即输出完字符串后换行.
gets函数——输入字符串的函数
gets (字符数组)
其作用是从终端输入一个字符串到字符数组,并且得到一个函数值.该函数值是字符数组的起始地址.
将输入的字符串送给字符数组(字符数组得到的是输入的字符串+’\0’),返回的函数值是字符数组str的第一个元素的地址.
strcat函数——字符串连接函数
strcat(字符数组1,字符数组2)
其作用是把两个字符数组的字符串连接起来,把字符串2连接到字符串1后面,结果放在字符数组1中.函数调用得到函数值是字符数组1的地址.
1.字符数组1必须足够大
2.连接前两个字符串后面都有’\0’,连接时将字符串1后面的’\0’取消,只在新字符串后面保留.
strcpy和strncpy函数——字符串复制函数
strcpy(字符数组1,字符串2)
作用是将字符串2复制到字符串1中去.
“字符数组1"必须写成数组名形式,“字符串2"可以是字符数组名,也可以是一个字符串常量
如果在复制前未对str1数组初始化或赋值,则str1的各字节的内容是无法预知的.
不能使用赋值语句将一个字符串常量或字符数组直接给一个字符数组,字符数组是一个地址常量,它不能改变值.
可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去.
strncpy(str1,str2,2);
strcmp函数—-字符串比较函数
strcmp(字符串1,字符串2)
将两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直至出现不同的字符或遇到’\0’为止.
1)若全部字符相同,则认为两个字符串相同
2)若出现不相同的字符,则以第1对不相同的字符的比较结果为准.
如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。
strlen函数——测字符串长度的函数
strlen(字符数组)
char c[10] = {"China"};
printf("%d", strlen(c));
//结果是5
strlwr函数——转换为小写的函数
strlwr(字符串)
strupr函数——转换为大写的函数
strupr(字符串)
输入一行字符统计其中有多少个单词,单词间用空格分隔开
#include<stdio.h>
int main()
{
char string[81];
int i, num = 0, word = 0;
char c;
gets(string);
for (i = 0; (c = string[i]) != '\0'; i++)
if (c == ' ')word = 0;
else if (word == 0)
{
word = 1;
num++;
}
printf("There are %d words in the lines.\n", num);
return 0;
}
有3个字符串要求找到其中“最大”者
#include<stdio.h>
#include<string.h>
int main()
{
char str[3][20];//定义二维数组
char string[20];//定义一维数组,作为交换字符串时的临时字符数组
int i;
for (i = 0; i < 3; i++)
gets(str[i]);//读入3个字符串
if (strcmp(str[0], str[1]) > 0)
strcpy(string, str[0]);
else
strcpy(string, str[1]);
if (strcmp(str[2], string) > 0)
strcpy(string, str[2]);
printf("\nthe largest string is:\n%s\n", string);
return 0;
}