c语言 --- 一维数组
认识一维数组
如何创建一个数组
//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]; //数组求和Iprintf("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
一维数组常规操作
插入 → 有序插入
做调整 → 从小到大排序
把元素直接放在数组后面,把插入的元素和前面的元素比较,比较到第一个位置结束 < 的情况要交换元素的位置
在数组里面做下标 - 1 操作或者 + 1 操作,需要考虑下标合理性 → 临界值
#include <stdio.h>
int main()
{//数组能存储的最大元素个数是100int array[100]; //当前元素个数是0int curSize = 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 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
查找+删除(移位)
数组的删除叫做伪删除 → 只是做位置的调整,不能真正把元素删除 → 把后面的元素往前挪,记录当前 curSize - -
查找下标一般用 -1,数组下标会是0 → 如果第一个元素就是要查找的元素,返回0无法确定有没有找到,所以查找下标一般用 0
#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("没有找到相关元素,无法删除!");}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++) //每个元素都需要一个机会冒泡->描述每一个元素的冒泡{//描述每个元素冒泡过程 -i: i代表第几个元素的冒泡操作for (int j = 0; j < curSize-1-i/*不优化:< curSzie-1*/; j++) {//从小到大排序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去做打印
%s的工作原理:从首地址(第一个元素的地址) &inputstr[0] 打印到 ' \0 ' 结束,所以%s对应的是地址
//No.1 字符数组char array[] = { 'A','B','C' }; //自动推断数组长度为3for (int i = 0; i < 3; i++) //字符数组必须要用for循环做打印、不能用"%s"的方式打印{putchar(array[i]);}putchar('\n');//No.2 字符数组操作字符串//字符串有一个不可见字符'\0'char str[] = "ILoveyou"; //自动长度是:9char 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] ILoveyouint 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
2
请输入用户名:I Love //只接收I 空格后面的接收不了--->空格会截取字符串
name:I
输入密码:HH LL //用gets做输入可以接收空格
HH LL
-----
字符串处理函数
包含字符串处理头文件 #include<string.h>
strcat:连接
strcpy:拷贝 → 注意:第一个字符串的长度要 ≥ 第二个字符串的长度,把后面的字符串 strFirst 拷贝到前面的字符串 strSecond 中去
strcmp:比较 → 字符串不能直接比较,需要调用函数去比较
比较规则
自左往右比,如果相同就去找下一个,一旦找到不同的字符,比较结果就出来了,根据ASCII码比较字符,与字符串的长度无关
"abc" "bc" 'a'<'b' 所以 "abc"<"bc";
"aabc" "aaa" 'b'>'a' 所以 "aabc">"aaa";
"aab" "aa" 'b'>'\0' 所以 "aab">"aa";
strlen:统计可见长度
#include <stdio.h>
#include <string.h>
int main()
{//string.h 字符串处理头文件char strFirst[] = "ILoveyou";int lenght = strlen(strFirst); //可见长度不包含\0printf("可见长度:%d\n", lenght);char strSecond[10];//原版:strcpy(strSecond, strFirst); strcpy_s(strSecond, 10, strFirst); //把"ILoveYou"拷贝到strSecond中去 增强版加入第一个字符串的尺寸puts(strSecond);char strThird[100] = { "666" };//原版:strcat(strThird, strSecond); strcat_s(strThird, 100, 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"));//一般字符串用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
c语言 --- 一维数组相关推荐
- c语言用一维数组求字符串,c语言一维数组练习题.doc
c语言一维数组练习题 精品文档2016全新精品资料-全新公文范文-全程指导写作 –独家原创 PAGE1 / NUMPAGES1 c语言一维数组练习题 4.1内容概述 本章主要介绍了数值数组和字符数组的 ...
- C语言一维数组、二维数组、结构体的初始化
C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...
- c语言一维数组课件,第9章:c语言一维数组课件
第9章:c语言一维数组课件 随着竞争日益激烈,酒店嘴中的肥肉被大肆抢夺,各大酒店在这场竞争中几乎"溃不成军":就娱乐来讲,大城市里的娱乐场所遍地开花,酒店娱乐业的收入也是日益萎缩. ...
- c语言向自定数组_C语言一维数组的定义和引用
C语言一维数组的定义和引用 C语言支持一维数组和多维数组.如果一个数组的所有元素都不是数组,那么该数组称为一维数组. 一维数组的定义方式 在C语言中使用数组必须先进行定义.一维数组的定义方式为: 类型 ...
- C语言 | 一维数组
C语言一维数组的定义 一般形式 类型符 数组名[常量表达式] C语言使用一维数组注意事项 数组名的命名规则和变量名相同,遵循标识符命名规则. 在定义数组时,需要指定数组中元素的个数,方括号中的常量表达 ...
- 一维数组c语言,c语言一维数组_C语言一维数组入门教程
摘要 腾兴网为您分享:C语言一维数组入门教程,优衣库,小米手环,小米钱包,小度等软件知识,以及胎教宝典,一级建造师题库软件,康佳渠道,刷点卷,一加系统,音乐节拍器,liveuc视频会议,辽宁省政务服务 ...
- c语言一维数组如何存放,C语言一维数组教案
<C语言一维数组教案>由会员分享,可在线阅读,更多相关<C语言一维数组教案(6页珍藏版)>请在人人文库网上搜索. 1.学 科:计算机科学与技术课 程:C语言程序设计课 题:一维 ...
- c语言中的一维数组的定义,C语言一维数组的定义和引用
<C语言一维数组的定义和引用>由会员分享,可在线阅读,更多相关<C语言一维数组的定义和引用(5页珍藏版)>请在人人文库网上搜索. 1.C语言一维数组的定义和引用在程序设计中,为 ...
- c语言一维数组转化为二维矩阵,js将一维数组转化为二维数组
遇到的问题: 后端返回的是一组一维数组,但是需要展示的格式是二维数组,常见的场景举例:后台返回10个长度的数组,需要分成3个一组展示在banner上. 例:[1,2,3,4,5,6,7,8,9,10] ...
- c语言用一维数组存储数据,C语言一维数组入门教程
本文章来简单的介绍入门级的c语言入门教程,下面我来介绍C语言一维数组的使用方法,包括有一维数组,数组的引,数组的遍历用,数组的初始化等. 一.一维数组 1.定义一个一维数组: (1)格式:存储类别 ...
最新文章
- 树上问题 ---- Codeforces Round #722 (Div. 1) C. Trees of Tranquillity [dfs序区间的性质+最大不相交区间的性质]
- 连续按back键盘退出自己的应用,杀掉进程
- 走差异化发展路线思想
- FormData上传文件同时附带其他参数
- Android 实现文件上传功能(upload)
- java导入excel 实例_Java数据导入功能之读取Excel文件实例
- 优酷html5视频没有弹幕,优酷弹幕怎么设置 优酷PC端怎么屏蔽底下弹幕?
- 爱链工具 v1.11.24.0
- solaris php,在Solaris 10 64位上配置PHP
- 最小化或关闭时隐藏到系统托盘
- Serv-U FTP Jail Break(越权遍历目录、下载任意文件)
- Day15Day16多任务和任务切换
- Awesomium源码及编译
- 集团企业智慧建造管理平台劳务管理系统
- NPDP 产品经理国际资格认证
- 带你Dart带你Diao之类
- el-input和和filter结合实现实时搜索
- “打开文件所在位置”提示“找不到应用程序”的解决方案
- 开发电商App哪家好
- 在线端口检查工具 Online IP TCP UDP port scan
热门文章
- powershell + python 批量更改图片大小
- js发送http post请求
- 【Luogu_P5465】Dirichlet 前缀和
- 5个高质量免费下载SVG图标网站(第一个是中文的)
- php zlib 解压缩,使用php的zlib压缩和解压缩swf文件
- Docker 内部 DNS 原理
- E+H流量计之Proline Promass F 300 科氏力质量流量计概述
- 涂鸦智能和智能生活软件
- matlab手机版论坛,首页 - MATLAB中文论坛
- python读取sav文件_Python如何导入Spss的sav类型的数据