认识一维数组
//No.1 数组的定义语法
//类型 数组名[数组长度]
int num[3];
float fNum[3];
double dNum[3];
char cNum[3];
//类型: 学过的数据类型
//数组名: 随便起的
//数组长度: 根据具体需求决定数组长度
数组的长相(在内存上的长相)
//No.1 创建数组的时候赋值,数组长度和元素个数相同
int array[3]={1,2,3}; //{}不能省略,arary[0]=1 array[1]=2 array[2]=3
//No.2 元素个数和长度不同,默认初始化为0
int array2[3]={1}; //arary2[0]=1 array2[1]=0 array2[2]=0
//No.3 当初始化的元素完整,数组长度可以省略
int array3[]={1,2,3}; //自动推断数组长度为3
//No.4 不存在数组长度为0的数组
//int array4[]; 错误的写法
//No.5 不能先创建数组再使用{}方式初始化
//int array[4];
//array[4]={1,2,3,4}; 错误的写法
数组的访问
-
数组名[下标] -
一般操作数组都是用循环操作(无论输入还是打印)
#include <stdio.h>
int main()
{
int array[3] = { 1,2,3 };
//数组的打印
int result = 0;
for (int i = 0; i < 3; i++)
{
printf("%d\t", array[i]);
result += array[i]; //数组求和II
}
printf("\n");
int sum = array[0] + array[1] + array[2]; //数组求和I
printf("sum:%d\n", sum);
printf("sum:%d\n", result);
//手动输入数据初始化数组
for (int i = 0; i < 3; i++)
{
scanf_s("%d", &array[i]);
}
for (int i = 0; i < 3; i++)
{
printf("%d\t", array[i]);
}
printf("\n");
int num[4] = { 1 };
for (int i = 0; i < 4; i++)
{
printf("%d\t", num[i]);
}
//其他类型的数组操作都是一样
double dNum[3] = { 1.33,2.33 };
for (int i = 0; i < 3; i++)
{
scanf_s("%lf", &dNum[i]);
}
for (int i = 0; i < 3; i++)
{
printf("%.3lf\t", dNum[i]);
}
return 0;
}
/*输出*/
1 2 3
sum:6
sum:6
3 4 6
3 4 6
1 0 0 0 1.22 3.44 6.6
1.220 3.440 6.600
一维数组常规操作
#include <stdio.h>
int main()
{
int array[100]; //数组能存储的最大元素个数是100
int curSize = 0; //当前元素个数是0
int data = 0;
//无序插入
int data = 3;
array[curSize++] = data;
//无序插入后做调整--->有序插入
while (1)
{
printf("input data:");
scanf_s("%d", &data);
array[curSize++] = data; //array[0]=1 curSize=1
//做调整--->从小到大排序
//把元素直接放在数组后面,把插入的元素和前面的元素比较,比较到第一个位置结束: <的情况要交换元素的位置
//在数组里面做下标-1操作或者+1操作,需要考虑下标合理性->临界值
for (int pos = curSize - 1; pos > 0; pos--)
{
if (array[pos] < array[pos - 1]) //相邻的元素做比较 | 做持续性的调整
{
int temp = array[pos];
array[pos] = array[pos - 1]; //0-1: -1下标
array[pos - 1] = temp;
}
else //>的情况不需要交换
{
break;
}
}
int user = 0;
while (getchar() != '\n');
user = getchar(); //清空缓冲区
if (user == 'n' || user == 'N') //输入n和N退出 输入状态
break;
}
for (int i = 0; i < curSize; i++)
{
printf("%d\t", array[i]);
}
printf("\n");
return 0;
}
/*输出*/
input data:8
y
input data:9
y
input data:55
n
8 9 55
#include <stdio.h>
int main()
{
//查找和删除
int array[10] = { 10,20,30,40,50,60,70,80,90,100 };
int curSize = 10;
//数组的删除叫做伪删除--->只是做位置的调整,不能真正把元素删除->把后面的元素往前挪,记录当前curSize--
int data = 60; //要找的数据
//数组的查找-->如果数组中的值==要删除的元素->找到了要删除的下标
int pos = -1; //查找下标一般用-1,数组下标会是0-->如果第一个元素就是要查找的元素,返回0无法确定有没有找到 所以查找下标一般用0
for (int i = 0; i < curSize; i++)
{
if (array[i] == data)
{
pos = i; //记录找到元素下标
break;
}
}
if (pos == -1)
{
printf("没有找到相关元素,无法删除!");
}
else //找到了做移位操作->调整数组
{
//在数组里面做下标-1操作或者+1操作,需要考虑下标合理性
for (int k = pos; k < curSize-1; k++) //k=9
{
array[k] = array[k + 1]; //array[10] 把数组后面的元素往前挪,记录数组长度的curSize--
}
curSize--; //数组真正的删除
}
for (int i = 0; i < curSize; i++)
{
printf("%d\t", array[i]);
}
printf("\n");
return 0;
}
/*输出*/
10 20 30 40 50 70 80 90 100
#include <stdio.h>
int main()
{
//查找和修改
int array[10] = { 10,20,30,40,50,60,70,80,90,100 };
int curSize = 10; //记录当前数组中元素个数
int data = 60;
int pos = -1;
for (int i = 0; i < curSize; i++)
{
if (array[i] == data)
{
pos = i;
break;
}
}
if (pos == -1)
{
printf("没有找到无法修改!\n");
}
else //修改数据
{
printf("请输入新的值:");
scanf_s("%d", &array[pos]);
}
for (int i = 0; i < curSize; i++)
{
printf("%d\t", array[i]);
}
return 0;
}
/*输出*/
请输入新的值:34
10 20 30 40 50 34 70 80 90 100
第一次冒泡找到第一大的,第二次冒泡找第二大的,找第二大的可以减少一次比较次数,因为第一大的已经出来了,没必要拿第二大的和第一大的去比较:找第几大的元素(n>1)减少n-1次比较次数
#include <stdio.h>
int main()
{
//冒泡排序
int array[10] = { 60,70,80,90,100,10,20,30,40,50 };
int curSize = 10;
//排序
//int count = 0;
for (int i = 0; i < curSize; i++) //每个元素都需要一个机会冒泡->描述每一个元素的冒泡
{
for (int j = 0; j < curSize-1-i/*不优化直接< curSzie-1*/; j++) //描述每个元素冒泡过程 -i: i代表第几个元素的冒泡操作
{
//从小到大排序
if (array[j] > array[j + 1]) //不满足规则交换
{
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
//count++; //记录比较次数
}
}
}
for (int i = 0; i < curSize; i++)
{
printf("%d\t", array[i]);
}
return 0;
}
//选择排序+插入排序+计数排序+桶排序+快排+堆排序+希尔排序+归并排序
/*输出*/
10 20 30 40 50 60 70 80 90 100
字符数组和字符串
-
字符数组和数字类数组处理方案相同 -
字符串: 存在一个不可见字符 ' \0 ' -
字符串的打印: %s去做打印
//No.1 字符数组
char array[] = { 'A','B','C' }; //自动推断数组长度为3
for (int i = 0; i < 3; i++) //字符数组必须要用for循环做打印|不能用"%s"的方式打印
{
putchar(array[i]);
}
putchar('\n');
//No.2 字符数组操作字符串
//字符串有一个不可见字符'\0'
char str[] = "ILoveyou"; //自动长度是:9
char inputstr[] = { 'A','B','C','D','\0','A','B','C' };
//%s对应的是地址
printf("%s\n", &inputstr[0]); //ABCD &inputstr[0]到'\0'结束
printf("%s\n", &inputstr[2]); //CD &inputstr[2]到'\0'结束
printf("%s\n", &array[0]); //ABC烫烫烫烫烫烫烫烫烫烫烫烫烫烫?
//字符数组和字符串的区别:字符数组没有'\0',不知道打印到什么时候结束,把后面的无用内存都打印出来了
// 0 1 2 3 4 5 6 7
//{ 'A','B','C','D','\0','A','B','C' }
// 数组名代表第一个元素的地址
char output[] = "ILoveyou";
printf("%s\n", output); //&output[0]
int key = 0;
scanf_s("%d", &key);
while (getchar() != '\n'); //字符串做输入前做了输入,可能会存在跳过现象,可以清除缓冲区
char username[10];
printf("请输入用户名:");
//scanf不需要加长度,增强版要加长度
//scanf输入不接受带空格的输入
scanf_s("%s", username,10);
printf("name:%s\n", username);
//解决scanf输入不接受带空格的输入的问题: 字符串输入函数 gets:输入+puts:打印
char passw[20];
//所有的字符串处理用的都是数组名
printf("输入密码:");
while (getchar() != '\n'); //存在跳过现象需要清空缓冲区
gets_s(passw, 20); //20指的是passw的长度,vs对这个函数进行了改进gets(passw)--->把输入的元素放到数组中
puts(passw); //输出自带换行
printf("-----\n");
/*输出*/
ABC
ABCD
D
ABC烫烫烫烫烫烫烫烫烫烫烫烫烫烫?
ILoveyou
e
请输入用户名:I Love //只接收I 空格后面的接收不了--->空格会截取字符串
name:I
输入密码:HH LL //用gets做输入可以接收空格
HH LL
-----
字符串处理函数
-
包含字符串处理头文件 #include<string.h> -
strcat:连接 -
strcpy:拷贝? ---> 注意:第一个字符串的长度要 ≥ 第二个字符串的长度,把后面的字符串 strFirst 拷贝到前面的字符串 strSecond 中去 -
strcmp:比较 ---> 字符串不能直接比较,需要调用函数去比较 -
strlen:统计可见长度
#include <stdio.h>
#include <string.h>
int main()
{
//string.h --->字符串处理头文件
char strFirst[] = "ILoveyou";
int lenght = strlen(strFirst); //可见长度不包含\0
printf("可见长度:%d\n", lenght);
char strSecond[10];
strcpy_s(strSecond, 10, strFirst); //原版:strcpy(strSecond, strFirst); 把"ILoveYou"拷贝到strSecond中去 增强版加入第一个字符串的尺寸
puts(strSecond);
char strThird[100] = { "666" };
strcat_s(strThird, 100, strSecond); //原版:strcat(strThird, strSecond); 把strSecond连接到strThird后面
puts(strThird);
//比较
//比较结果
char first[] = "abc";
char second[] = "bca";
char third[] = "abc";
int result=strcmp(first, second); //传入两个数组名,返回值是整数
// a b
//a-b>0 a>b 1
//a-b<0 a<b -1
//a-b==0 a==b 0
printf("==:%d\n", strcmp(first, third));
printf("<:%d\n", strcmp(first, second));
printf(">:%d\n", strcmp(first, "aaa"));
//比较规则
//自左往右比,如果相同就去找下一个,一旦找到不同的字符,比较结果就出来了,根据ASCII码比较字符,与字符串的长度无关
//"abc" "bc" 'a'<'b' 所以:"abc"<"bc";
//"aabc" "aaa" 'b'>'a' 所以 "aabc">"aaa";
//"aab" "aa" 'b'>'\0' 所以 "aab">"aa";
//一般字符串用的循环是while循环
char string[] = "ILoveyou";
//strlen函数的实现
int count = 0;
while (string[count] != '\0') //求字符串的可见长度通过字符串的结束标记去判断
{
count++; //不等于'\0' count一直做++运算
}
printf("size:%d\n", count);
return 0;
}
/*输出*/
可见长度:8
ILoveyou
666ILoveyou //把ILoveyou连接到666后面
==:0
<:-1
>:1
size:8
|