一批具有同名的同属性的数据(element)就组成了一个数组(array),数组是具有相同类型的数据组成的序列,是有序集合。数组中每个数据成为数组元素或下标变量。
- 数组是一组有序数据的集合
数组中各数据的排列是有一定规律的,下标(subscript)代表数据在数组中的序号。 - 用一个数组名和下标来唯一地确定数组中的元素
- 数组中的每个元素都属于同一个数据类型
使用注意
- 数组不能相互赋值或初始化
- 不能使用数组类型作为函数的参数或返回值
- 数组类型做右值使用时,自动转换成指向数组首元素的指针。
- 在函数原型中如果参数写成数组的形式,则该参数实际上是指针类型。
一维数组
例:求平均分不使用数组
#include <stdio.h>
int main(void)
{
int grade = 0;
unsigned int count = 3;
long sum = 0L;
float average = 0.0f;
for(unsigned int i=0; i<count; ++i){
printf("enter a grade: ");
scanf("%d", &grade);
sum += grade;
}
average = (float)sum/count;
printf("\naverage of the grades entered is: %f\n",average);
return 0;
}
一维数组定义:类型符 数组名[常量表达式]
int arr[];
int a[10]; // 定义一个整型数组,数组名为a,数组拥有10个整型元素。
数组引用:数组名[下标]
例:对元素赋值后逆序输出
#include <stdio.h>
int main()
{
int i;
int arr[10];
for(i=0; i<10; i++){
arr[i] = i;
}
int length = sizeof(arr)/sizeof(int);
for(i=length-1; i>=0; i--){
printf("%d\n", arr[i]);
}
return 0;
}
一维数组初始化
int arr[10] = {0,1,2,3,4,5};// 定义数组时对全部数组元素赋初值
int arr[] = {1,2,3,4};//数组元素个数确定可不指定数组长度
例:求数组中最大值
#include <stdio.h>
int main()
{
int len = 10;
int arr[len];
int i,max;
printf("input %d number:\n",len);
for(i=0; i<len; i++){
scanf("%d", &arr[i]);
}
max = arr[0];
for(i=1; i<len; i++){
if(arr[i] > max){
max = arr[i];
}
}
printf("the max number is %d\n", max);
return 0;
}
例:使用数组处理Fibonacci数列
#include <stdio.h>
int main()
{
int i;
int arr[20] = {1,1};
for(i=2; i<20; i++){
arr[i] = arr[i-2] + arr[i-1];
}
for(i=0; i<20; i++){
if(0 == i%5){
printf("\n");
}
printf("%12d", arr[i]);
}
printf("\n");
return 0;
}
例:冒泡排序,将相邻两个数个数比较,将小的调到前头。
思路:相邻两数比较,前大后小则交换。
#include <stdio.h>
int main()
{
int len = 10;
int arr[len];
int i,j,tmp;
printf("input %d numbers:\n",len);
for(i=0; i<len; i++){
scanf("%d", &arr[i]);//动态赋值
}
printf("\n");
for(j=0; j<len-1; j++){//需要进行len-1次扫描
for(i=0; i<len-1-j; i++){//每次扫描到arr[len-j-1],和arr[len-j-1]进行比较
if(arr[i] > arr[i+1]){
tmp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = tmp;
}
}
}
printf("the sorted numbers:\n");
for(i=0; i<len; i++){
printf("%12d", arr[i]);
}
printf("\n");
return 0;
}
例:统计随机数,生成0~9的随机数,统计每个数字出现次数并打印,检查数字的随机性。
#include <stdio.h>
#include <stdlib.h>
#define MAX_RAND 20
int arr[MAX_RAND];
void generate_random(int upper_bound)
{
int i;
for(i=0; i<MAX_RAND; i++){
arr[i] = rand()%upper_bound;
}
}
void print_random()
{
int i;
for(i=0; i<MAX_RAND; i++){
printf("%4d", arr[i]);
}
printf("\n");
}
int count(int value)
{
int i, count=0;
for(i=0; i<MAX_RAND; i++){
if(arr[i] == value){
++count;
}
}
return count;
}
int main(void)
{
int i, size=10;
generate_random(size);
print_random();
for(i=0; i<size; i++){
printf("%d\t%d\n", i, count(i));
}
return 0;
}
二维数组
二维数组称为矩阵(matrix),把二维数组写成行(column)和列(row)的排列形式。
二维数组定义的形式:类型说明符 数组名[常量表达式][常量表达式]
int a[3][4] = {1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3};
int a[3][4] = {{1,1,1,1}, {2,2,2,2}, {3,3,3,3}};
例:小组中5人,每人3门成绩,求全组分科的平均成绩和总平均成绩。
#include <stdio.h>
int main()
{
int arr[5][3] = {{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};
int i,j;
int sum = 0;
int avg[3];
int average;
for(i=0; i<3; i++){
for(j=0; j<5; j++){
sum = sum + arr[j][i];
}
avg[i] = sum/5;
sum = 0;
}
average = (avg[0]+avg[1]+avg[2])/3;
printf("%d %d %d %d\n",avg[0],avg[1],avg[2],average);
return 0;
}
例:将二维数组的矩阵,行列互换。
#include <stdio.h>
int main()
{
int arr[2][3] = {{1,2,3}, {4,5,6}};
int ary[3][2];
int i,j;
printf("array arr:\n");
for(i=0; i<2; i++){
for(j=0; j<3; j++){
printf("%5d", arr[i][j]);
ary[j][i] = arr[i][j];
}
printf("\n");
}
printf("array ary:\n");
for(i=0; i<3; i++){
for(j=0; j<2; j++){
printf("%5d", ary[i][j]);
}
printf("\n");
}
return 0;
}
例:求二维矩阵中最大元素的值以及所在的行号和列号
思考在打擂台时怎样确定最后的优胜者
#include <stdio.h>
int main()
{
int a[3][4] = {{1,2,3,4}, {5,6,7,8}, {-1,-2,-3,-4}};
int max;
int i,j;
int row,col;
max = a[0][0];
for(i=0; i<3; i++){
for(j=0; j<4; j++){
if(a[i][j] > max){
max = a[i][j];
row = i;
col = j;
}
}
}
printf("max is %d\nrow is %d\ncolumn is %d\n", max, row, col);
return 0;
}
例:从键盘键入9个整数,对照九宫格形式,输入三行三列保存在二维数组中,按数组原来位置输出第一行和第一列的所有元素。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char * argv[])
{
int i,j,arr[3][3];
for(i=0; i<3; i++){
for(j=0; j<3; j++){
printf("input arr[%d][%d] number:\n",i,j);
scanf("%d", &arr[i][j]);
}
}
for(i=0; i<3; i++){
for(j=0; j<3; j++){
if(1==i || 1==j){
printf("%-6d", arr[i][j]);
}else{
printf("%-6c",' ');//打印空格
}
}
printf("\n");
}
return 0;
}
字符数组
字符型数据是以字符的ASCII代码存储在存储单元中,一般占一个字节,由于ASCII代码也属于整数形式,因此在C99标准中,把字符类型归纳为整型类型中的一种。
字符数组初始化,若初值个数大于数组长度则出现语法,若初值个数小于数组长度则其余元素自动定义为空字符即'\0'。
char c[10] = {'I',' ','a','m',' ','h','a','p','p','y'};
char c = “I am happy”;
printf("%s", c);
字符串处理函数
- puts(str) 输出字符串
- gets(str) 输入字符串
- strcat(str1,str2...) 字符串连接
- strcpy(str1, str2...) 字符串复制
- strcmp(str1, str2...) 字符串比较
- strlen(str) 获取字符串长度
- strlwr(str) 转换为小写
- strupr(str) 转换为大写
例:输入一行字符统计其中单词个数,单词之间使用空格分隔。
#include <stdio.h>
int main()
{
char str[81];
int i;
char c;
int num = 0;
int word = 0;
printf("input a line words:\n");
gets(str);
for(i=0; (c=str[i])!='\0'; i++){
if(c==' '){
word = 0;
}else if(word==0){
word = 1;
num++;
}
}
printf("there are %d words in this line.\n", num);
return 0;
}
例:获取多个字符串中最大者
#include <stdio.h>
#include <string.h>
int main()
{
char str[3][20];
char string[20];
int i;
printf("input 3 word:\n");
for(i=0; i<3; i++){
gets(str[i]);
}
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("the largest string is: %s\n", string);
return 0;
}
二分法
利用数组进行二分法查找数据,又叫折半查找法。适用情况是在一批“有序”数据中查找某数。
例:数组中按由小到大排列,从键盘输入某数,判断是否在数组中,若存在则输出所在序号。
#include <stdio.h>
#include <stdlib.h>
#define MAX_RAND 20
int arr[MAX_RAND];
void make_rand(int upper_bound)
{
for(unsigned int i=0; i<MAX_RAND; ++i){
arr[i] = rand()%upper_bound;
}
}
void print_rand(){
for(unsigned int i=0; i<MAX_RAND; ++i){
printf("%6u", arr[i]);
}
printf("\n");
}
void sort_rand(){
int tmp;
for(unsigned int i=0; i<MAX_RAND-1; ++i){
for(unsigned int j=0; j<MAX_RAND-1-i; ++j){
if(arr[j] > arr[j+1]){
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
int main(void)
{
make_rand(100);
sort_rand();
print_rand();
return 0;
}