C语言数组
概念 数组是一类相同元素的集合
1.数组是一类元素的集合
2.数组的引用可以用下标
3.数组是在内存里开辟空间的
4.数组是用来储存一组数据的
5.数组储存的数据是一个类型
定义:数组是用来储存一组数据的,是一类相同元素的集合,可以用下标引用,在内存里开辟空间的,
储存的数据是一个类型,数组的下标从0开始,最大下标是长度减1,
引用:可以用指针,指针可以通过数组名加下标或者指针加下标来实现,
数组的传递是通过指针来实现的,因为数组名代表的是数组的首地址。
元素类型:数组的元素可以是任何数据类型,包括基本类型和自定义类型。
元素存储:数组的元素在内存中是连续存储的。
初始化:数组的初始化可以在定义时指定int a[10]={0},也可以在后面逐个赋值或使用循环赋值。
使用方法 int a[10]
数组的分类
按照定义类型划分
1.短整型 short int a [10]
2.整形 int a
3.长整形 long int a
3.浮点型 double float
4.指针数组 int *p[10]
5.结构体数组 struct stu boy[10];
本质上还是数组,存储数据是结构体
按照维度划分
1.一维数组
类似于平房结构
2.二维数组
类似于一栋楼房
3.三位数组
数组的练习题
1.任意一个人输入年龄,就可以判断出他是哪个年龄段的人?
0-9 垂髫之年;10-19 志学之年;20-29 弱冠之年;
30-39 而立之年;40-49 不惑之年;50-59 知命之年;
60-69 花甲之年;70-79 古稀之年;80-89 杖朝之年;
90-99 耄耋之年。
#define _CRT_SECURE_NO_WARNINGS 1
//任意一个人输入年龄,就可以判断出他是哪个年龄段的人?
//0-9 垂髫之年;10-19 志学之年;20-29 弱冠之年;
//30-39 而立之年;40-49 不惑之年;50-59 知命之年;
//60-69 花甲之年;70-79 古稀之年;80-89 杖朝之年;
//90-99 耄耋之年。
#include<stdio.h>
#include<string.h>
int main() {
int age;
char ch='y';
char s[10][10] = {"垂髫之年","志学之年","弱冠之年", "而立之年", "不惑之年", "知命之年", "花甲之年", "古稀之年", "杖朝之年", "耄耋之年"};
//for (int i = 0; i < 10; i++)
//{
// for (int j = 0; j < 10; j++) {
// printf("%c", s[i][j]);
// }
// printf("\n");
//}
//while (1) {
// printf("请输入你的年龄:(0---99)\n");
// scanf("%d", &age);
// printf("你正处于的阶段是:");
// for (int n = 0; n < 10; n++) {
// printf("%c", s[age / 10][n]);
// }
// printf("\n");
// printf("如果想退出请按n:\n");
// getchar();
// scanf("%c", &ch);
// if (ch == 'n')
// {
// break;
// }
//}
while (ch!= 'n') {
printf("请输入你的年龄:(0---99)\n");
scanf("%d", &age);
if (age < 0 || age > 99) { // 对输入进行判断
printf("请输入正确的年龄!\n");
continue; // 输入不正确,重新输入
}
printf("你正处于的阶段是:%s\n", s[age / 10]); // 直接输出对应的字符串
printf("如果想退出请按n:\n");
getchar(); // 吃掉输入缓冲区中的换行符
scanf("%c)", &ch);
}
}
2.定义一个长度为10的int数组,
自定义一组数据,
统计数组中的总和、平均值、最大值、最小值、以及奇数和偶数的个数.
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//定义一个长度为10的int数组,
//自定义一组数据,
//统计数组中的总和、平均值、最大值、最小值、以及奇数和偶数的个数.
//int getSum(int a[],int length) {
// int sum = 0;
// for (int i = 0; i < length; i++)
// {
// sum += a[i];
// }
// return sum;
//}
//double getAverage(int sum, int length) {
// return 1.0*sum/length;
//}
//int getMax(int a[], int length) {
// int max=a[0];
// for (int i = 0; i < length; i++)
// if (a[i] > max)
// max = a[i];
// return max;
//}
//int getMin(int a[], int length) {
// int min = a[0];
// for (int i = 0; i < length; i++)
// if (a[i] <min)
// min = a[i];
// return min;
//}
//int getOddCount(int a[], int length) {
// int x = 0;
// for (int i = 0; i < length; i++)
// if (a[i] % 2 == 0)
// x++;
// return x;
//}
//int getEvenCount(int a[], int length) {
// int x = 0;
// for (int i = 0; i < length; i++)
// if (a[i] % 2 != 0)
// x++;
// return x;
//}
//int main() {
// int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// int length = sizeof(array) / sizeof(int);
// int sum = getSum(array,length);
// double average = getAverage(sum, length);
// int max = getMax(array,length);
// int min = getMin(array,length);
// int oddCount = getOddCount(array,length);
// int evenCount = getEvenCount(array,length);
//
// printf("数组中元素的总和为:%d\n" ,sum);
// printf("数组中元素的平均值为:%f\n" ,average);
// printf("数组中元素的最大值为:%d\n" , max);
// printf("数组中元素的最小值为:%d\n" , min);
// printf("数组中奇数的个数为:%d\n" ,oddCount);
// printf("数组中偶数的个数为:%d\n" , evenCount);
//
// return 0;
//}
int main() {
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int length = sizeof(array) / sizeof(int);//求数组的长度
int sum = 0, max = array[0], min = array[0], oddCount = 0, evenCount = 0;
for (int i = 0; i < length; i++) {
sum += array[i]; // 计算总和
if (array[i] > max) max = array[i]; // 计算最大值
if (array[i] < min) min = array[i]; // 计算最小值
if (array[i] % 2 == 0) evenCount++; // 计算偶数个数
else oddCount++; // 计算奇数个数
}
printf("数组中元素的总和为:%d\n", sum);
printf("数组中元素的平均值为:%f\n", 1.0 * sum / length);
printf("数组中元素的最大值为:%d\n", max);
printf("数组中元素的最小值为:%d\n", min);
printf("数组中奇数的个数为:%d\n", oddCount);
printf("数组中偶数的个数为:%d\n", evenCount);
return 0;
}
3.有一个数组:int [] arr = {8,4,2,1,23,344,12}。
猜数游戏:从键盘中任意输入一个数据,判断数组中是否包含此数。
#define _CRT_SECURE_NO_WARNINGS 1
//有一个数组:int [] arr = {8,4,2,1,23,344,12}。
//猜数游戏:从键盘中任意输入一个数据,判断数组中是否包含此数。
#include<stdio.h>
//int main() {
// int arr[] = { 8,4,2,1,23,344,12 };
// int num;
// int length = sizeof(arr) / sizeof(int);
// printf("请输入任意一个数\n");
// scanf("%d", &num);
// for (int i = 0; i < length; i++)
// {
// if (arr[i] == num) {
// printf("该数组存在该数字\n");
// break;
// }
// if(i==length-1&& arr[length - 1] != num)
// printf("该数组不存在该数字\n");
// }
// return 0;
//}
#define LENGTH 7
int isNumExist(int arr[], int num) {
for (int i = 0; i < LENGTH; i++) {
if (arr[i] == num) {
return 1;
}
}
return 0;
}
int main() {
int arr[] = { 8,4,2,1,23,344,12 };
int num;
printf("请输入一个数\n");
scanf("%d",&num);
if (isNumExist(arr, num)) {
printf("该数组存在该数字\n");
}else
printf("该数组不存在该数字\n");
return 0;
}
4.int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
要求将以上数组中的0项去掉,将不为0的值存入一个新的数组.
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
//要求将以上数组中的0项去掉,将不为0的值存入一个新的数组.
//int main() {
// int oldArr[] = { 1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5 };
// int length=16;
// int newArr[16]={0};
// int j = 0;
// for (int i = 0; i < length; i++)
// {
// if (oldArr[i] != 0)
// newArr[j++] = oldArr[i];
//
// }
// for (int i = 0; i < length; i++) {
// printf("%d \t",newArr[i]);
// }
//
// printf("\n");
// return 0;
//}
#define LENGTH 16
void removeZeros(int oldArr[], int length, int newArr[]) {
int j = 0;
for (int i = 0; i < length; i++) {
if (oldArr[i] != 0) {
newArr[j++] = oldArr[i];
}
}
}
int main() {
int oldArr[] = { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 };
int newArr[LENGTH] = { 0 };
removeZeros(oldArr, LENGTH, newArr);
printf("新数组为:\n");
for (int i = 0; i < LENGTH; i++) {
if (newArr[i] != 0) {
printf("%d ", newArr[i]);
}
}
printf("\n");
return 0;
}
5.//把一个数组的元素逆序交换, int[] a = { 5, 11, 15, 24, 36, 47, 59, 66 };
//交换元素后int[] b = { 66 ,59 ,47 ,36 ,24,15 ,11 ,5 };
#define _CRT_SECURE_NO_WARNINGS 1
//把一个数组的元素逆序交换, int[] a = { 5, 11, 15, 24, 36, 47, 59, 66 };
//交换元素后int[] b = { 66 ,59 ,47 ,36 ,24,15 ,11 ,5 };
#define LENGTH 8
#include <stdio.h>
//void changeArr(int a[],int b[], int length) {
// int j = length - 1;
// for (int i = 0; i < length; i++)
// {
// b[i] = a[j--];
// }
//}
//void printArr(int a[],int length) {
// for (int i = 0; i < length; i++)
// {
// printf("%d ", a[i]);
// }
// printf("\n ");
//}
//int main() {
// int a[]= { 5, 11, 15, 24, 36, 47, 59, 66 };
// int b[LENGTH]={0};
// printf("交换前数组:\n");
// printArr(a, LENGTH);
// changeArr(a,b , LENGTH);
// printf("交换后数组:\n");
// printArr(b, LENGTH);
// return 0;
//}
void reverseArray(int original[], int reversed[], int length) {
for (int i = 0; i < length; i++) {
reversed[i] = original[length - i - 1];
}
}
void printArray(int arr[], int length) {
for (int i = 0; i < length; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int original[LENGTH] = { 5, 11, 15, 24, 36, 47, 59, 66 };
int reversed[LENGTH] = { 0 };
printf("原数组:");
printArray(original, LENGTH);
reverseArray(original, reversed, LENGTH);
printf("逆序数组:");
printArray(reversed, LENGTH);
return 0;
}
6.小游戏 下五子棋
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#define checkerboard_length 15
//打印输出棋盘
void print(char checkerboard[15][15]) {
//输出棋盘
for (int i = 0; i < checkerboard_length; i++) {
for (int j = 0; j < checkerboard_length; j++) {
printf("%c", checkerboard[i][j]);
}
printf("\n");
}
}
//判断坐标是否越界
int checkPointCross(int x, int y) {
if (x < 0 || x > 13 || y < 0 || y > 13) {
return 0;
}
return 1;
}
//判断坐标处是否已有棋子
int checkPointExit(int x, int y, char checkerboard[15][15]) {
if (checkerboard[x - 1][y - 1] != '+') {
return 0;
}
return 1;
}
//判断输赢
int judgeWinLose(int flag, char checkerboard[15][15],char black,char white) {
if (flag) {
//判断黑棋的输赢
for (int i = 0; i < checkerboard_length; i++) {
for (int j = 0; j < checkerboard_length; j++) {
//遍历每个棋子,横向向右找五个
if (checkerboard[i][j] == black && checkerboard[i][j + 1] == black && checkerboard[i][j + 2] == black && checkerboard[i][j + 3] == black && checkerboard[i][j + 4] == black) {
return 1;
}
//遍历每个棋子,竖直向下找五个
if (checkerboard[i][j] == black && checkerboard[i + 1][j] == black && checkerboard[i + 2][j] == black && checkerboard[i + 3][j] == black && checkerboard[i + 4][j] == black) {
return 1;
}
//遍历每个棋子,斜向右下找五个
if (checkerboard[i][j] == black && checkerboard[i + 1][j + 1] == black && checkerboard[i + 2][j + 2] == black && checkerboard[i + 3][j + 3] == black && checkerboard[i + 4][j + 4] == black) {
return 1;
}
}
}
return 0;
}
else {
//判断白棋的输赢
for (int i = 0; i < checkerboard_length; i++) {
for (int j = 0; j < checkerboard_length; j++) {
//遍历每个棋子,横向向右找五个
if (checkerboard[i][j] == white && checkerboard[i][j + 1] == white && checkerboard[i][j + 2] == white && checkerboard[i][j + 3] == white && checkerboard[i][j + 4] == white) {
return 1;
}
//遍历每个棋子,竖直向下找五个
if (checkerboard[i][j] == white && checkerboard[i + 1][j] == white && checkerboard[i + 2][j] == white && checkerboard[i + 3][j] == white && checkerboard[i + 4][j] == white) {
return 1;
}
//遍历每个棋子,斜向右下找五个
if (checkerboard[i][j] == white && checkerboard[i + 1][j + 1] == white && checkerboard[i + 2][j + 2] == white && checkerboard[i + 3][j + 3] == white && checkerboard[i + 4][j + 4] == white) {
return 1;
}
}
}
return 0;
}
}
//开始下棋
void playChess( int flag, char checkerboard[15][15],char black,char white) {
while (1) {
if (flag) {
printf("黑棋下子!\n");
printf("请输入横坐标:\n");
int x,y;
scanf("%d",&x);
printf("请输入纵坐标:\n");
scanf("%d", &y);
if (checkPointCross(x, y) && checkPointExit(x, y, checkerboard)) {
checkerboard[x - 1][y - 1] = black;
//下棋之后打印棋盘
print(checkerboard);
//判断输赢
if (judgeWinLose(flag, checkerboard,black,white)) {
printf("黑棋胜!\n");
break;
}
}
else {
printf("坐标越界或坐标处已有棋子!\n");
continue;
}
flag = 0;
}
else {
printf("白棋下子!\n");
printf("请输入横坐标:\n");
int x, y;
scanf("%d",&x);
printf("请输入纵坐标:\n");
scanf("%d",&y);
if (checkPointCross(x, y) && checkPointExit(x, y, checkerboard)) {
checkerboard[x - 1][y - 1] = white;
//下棋之后打印棋盘
print(checkerboard);
//判断输赢
if (judgeWinLose(flag, checkerboard, black, white)) {
printf("白棋胜!\n");
break;
}
}
else {
printf("坐标越界或坐标处已有棋子!\n");
continue;
}
flag = 1;
}
}
}
int main() {
//初始化棋盘
//创建棋盘二维数组
char checkerboard[15][15];
//定义一个标记flag。true-黑棋,false-白棋
int flag = 1;
//定义黑棋样式
char black = '#';
//定义白棋样式
char white = '*';
//创建数组num,为棋盘进行边界行列赋值
char num[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15' };
//初始化数组
for (int i = 0; i < checkerboard_length; i++) {
for (int j = 0; j < checkerboard_length; j++) {
checkerboard[i][j] = '+';
//把棋盘最后一列的'十'替换为num数组中的元素
if (j == checkerboard_length - 1) {
checkerboard[i][j] = num[i];
}
//把棋盘最后一行的'十'替换为num数组中的元素
if (i == checkerboard_length - 1) {
checkerboard[i][j] = num[j];
}
}
}
//打印棋盘
print(checkerboard);
//开始下棋
playChess(flag, checkerboard, black, white);
return 0;
}