一 数组的定义
int parr['A']; //'A'-->65
二 数组的初始化
一维数组
int array[4]; printf("数组名:%p\n", array); printf("数组名:%p\n", &array[0]); 数组名是第一个元素的地址 数组只能在定义时初始化
二维数组
int a[3][]= 定义二维数组必须指定二维长度
不能超过数组下标范围
二维数组传参
void print_array(int arr[][3], int row, int cols)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < cols; j++)
{
printf("%d\t", arr[i][j]);
}
printf("\n");
}
str[i]代表的第i行的首地址
printf("%s", str[i]);
二维数组的常规操作
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main()
{
//1.通过下标的一致性做表格做表格数据处理
//这种写法做编程不会用,更多用的结构体
char name[3][10] = { "小芳","小妹","小帅" };
double score[3][4] = { 88,89,88,34,45,67,99,99,98,56,78,99 };
int row = 3;
int cols = 4;
printf("姓名\t数学\t英语\t体育\t思想\n");
for (int i = 0; i < row; i++)
{
printf("%s\t", name[i]);
for (int j = 0; j < cols; j++)
{
printf("%.1lf\t", score[i][j]);
}
printf("\n");
}
//衍生出一些表格操作
double rowSum[3] = { 0 };
double colsSum[4] = { 0 };
for (int i = 0; i < row; i++)
{
for (int j = 0; j < cols; j++)
{
rowSum[i] += score[i][j];
//rowSum[0] += score[0][0];
//rowSum[0] += score[0][1];
//rowSum[0] += score[0][2];
//rowSum[0] += score[0][3];
}
}
//求列的和
for (int j = 0; j < cols; j++)
{
for (int i = 0; i < row; i++)
{
colsSum[j]+= score[i][j];
}
}
printf("姓名\t数学\t英语\t体育\t思想\t总分\n");
for (int i = 0; i < row; i++)
{
printf("%s\t", name[i]);
for (int j = 0; j < cols; j++)
{
printf("%.1lf\t", score[i][j]);
}
printf("%.1lf\n",rowSum[i]);
}
printf("总分\t");
double sum = 0.;
for (int i = 0; i < cols; i++)
{
sum += colsSum[i];
printf("%.1lf\t", colsSum[i]);
}
printf("%.1lf\n",sum);
//2.做地图
//特定数组字表示特定含义
int map[9][9] =
{
1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,
1,1,0,0,1,0,0,1,1,
1,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,1,
1,1,0,0,0,0,0,1,1,
1,1,1,0,0,0,1,1,1,
1,1,1,1,0,1,1,1,1,
1,1,1,1,1,1,1,1,1
};
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
switch (map[i][j])
{
case 0:
printf("心");
break;
case 1:
printf(" ");
break;
}
}
printf("\n");
}
return 0;
}
三维数组
三 数组的使用
输入和打印
1
for (int i = 0; i < 3; i++)
{
scanf_s("%d", &sum[i]); //sum[0] sum[1] sum[2]
}
for (int i = 0; i < 3; i++)
{
printf("%d\t", sum[i]);
}
printf("\n");
2
printf("双精度数组:\n");
double dnum[3] = { 1.1,2.3,4.4 };
for (int i = 0; i < 3; i++)
{
printf("%.2lf\t", dnum[i]);
}
3
printf("\n字符数组:\n");
char cnum[4] = { 'A','B','C','D' };
for (int i = 0; i < 3; i++)
{
//printf("%c",cnum[i]);
putchar(cnum[i]);
}
printf("\n");
求和
//求和
int money[4] = { 100,200,300,400 };
int sum = 0;
for (int i = 0; i < 4; i++)
{
sum += money[i];
}
printf("和:%d\n", sum);
插入
//插入
//用户输入数据,输入到-1结束
printf("input num:");
int data[100] = { 0 };
int curSize = 0; //记录当前数组中有多少元素
while (true)
{
int key = 0;
scanf_s("%d", &key);
if (key == -1)
break;
data[curSize++] = key;
}
printf("your data:");
for (int i = 0; i < curSize; i++)
{
printf("%d\t", data[i]);
}
//调整数组,保持数组的有序性插入
for (int i = curSize - 1; i > 0; i--)
{
//细节,数组下标做了i+n 或者i-n操作
//考虑临界值
if (data[i] < data[i - 1])
{
//交换
int temp = data[i];
data[i] = data[i - 1];
data[i - 1] = temp;
}
else
{
break;
}
}
查找
//查找
int pos = -1; //因为数组有0下标
printf("\ninput searchData:");
int posData = 0;
scanf_s("%d", &posData);
for (int i = 0; i < curSize; i++)
{
if (data[i] == posData)
{
pos = i;
break;
}
}
printf("查找元素的数组下标:%d\n", pos);
//修改,找到指定元素的下标,直接修改
//data[pos] = 124;
删除
//数组删除
//伪删除(计数变量的改变)
//删除操作一定考虑是否找到
if (pos != -1)
{
//假设curSize=4
//覆盖删除的元素
for (int i = pos; i < curSize-1; i++)
{
//i=3 i+1=4
data[i] = data[i + 1];
}
//真正的删除
curSize--;
}
printf("删除元素:%d后的结果:\n", posData);
for (int i = 0; i < curSize; i++)
{
printf("%d\t", data[i]);
}
printf("\n");
冒泡排序
//冒泡排序
int arr[10] = { 0,1,2,3,4,9,8,7,6,5 };
int length = 10;
for (int i = 0; i < length; i++)
{
for (int j = 0; j < length -1-i; j++)
{
if (arr[j] > arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
printf("冒泡排序结果:\n");
for (int i = 0; i < length; i++)
{
printf("%d\t", arr[i]);
}
四 算法---有序数组的特殊操作
二分查找
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
int length = 10;
//二分查找法
int left = 0;
int right = length - 1;
int pos = -1;
int posData = 2;
while (left < right)
{
int mid = (left + right) / 2;
if (arr[mid] == posData)
{
pos = mid;
break;
}
else if (arr[mid] > posData)
{
right = mid-1;
}
else
{
left = mid + 1;
}
}
printf("pos:%d\n", pos);
归并算法
//归并算法
int one[4] = { 1,3,5,7 };
int two[3] = { 2,4,6 };
int result[10];
int count = 0;
int lengthOne = 4;
int lengthTwo = 3;
int i = 0;
int j = 0;
while (i < lengthOne && j < lengthTwo)
{
if (one[i] < two[j])
{
result[count++] = one[i++];
}
else
{
result[count++] = two[j++];
}
}
while (i < lengthOne)
{
result[count++] = one[i++];
}
while (j < lengthTwo)
{
result[count++] = two[i++];
}
for (int i = 0; i < count; i++)
{
printf("%d\t", result[i]);
}
找素数
五 字符串与字符数组
六 字符数组操作字符串
%s的工作方式,从首地址开始打印到\0; 1.字符打印 char str1[] = { 'A',' ','B','\0','D','E' }; printf("%s\n", str1); printf("%s\n", &str1[0]); printf("%s\n", &str1[2]); 2.可以直接用字符串给字符数组做初始化 char str2[] = "ILoveyou"; //知道数组长度是多少? 9 printf("数组长度:%zd\n", sizeof(str2) / sizeof(char)); 3.没有\0的串打印会怎么样 //ABC烫烫烫烫烫烫烫烫烫烫烫烫贪鰪*? 没有字符串结束标记 char str3[] = { 'A','B','C' }; printf("%s\n", str3); 4.字符串常用操作 4.1 字符串输入输出 char inputstr[100]; //scanf("%s",inputstr); int number = 0; printf("输入一个整数:\n"); scanf_s("%d", &number); printf("请输入一个字符串:"); //scanf函数只接受空格之前的内容 scanf_s("%s", inputstr, 100); printf("input:%s\n", inputstr); printf("------\n"); //gets函数可以接受带空格的数据 printf("请输入一个字符串:"); while (getchar() != '\n'); //清楚缓冲区 解决字符输入跳过现象 gets_s(inputstr, 100); //字符串输入函数 printf("input:%s\n", inputstr); printf("------\n"); puts(inputstr); //字符串输出函数 puts("自带换行"); 4.2字符串常用操作 //求一个字符串可见长度 char str[] = "ILoveyou"; //通常操作字符串用的while循环 int count = 0; while (str[count] != '\0') { count++; } printf("可见长度:%d\n", count); 4.3 字符串数组覆盖 char one[10] = "sdf23234"; char two[10] = "0000"; int i = 0; while (two[i] != '\0') { one[i] = two[i]; i++; } one[i] = '\0'; //一定要处理 printf("one=%s\n",one);