第五章数组、字符串
你好!我是小柒,今天咱们来学习一下C语言里的数组。
数组
本节内容:
1、数组
2、字符串
一、数组
大家想像一下,咱们班学员的最大年龄,应该怎么计算?如果10个人的话,也就是说要创建10个变量进行比较,人少的话还好算一些,那要是成千上万条该怎么办?这个时候我们就用数组。
小柒什么是数组?
答:所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。
1、数组的定义
数据类型 数组名[元素个数] = {元素1,元素2,...};
数组长度可以是常量、表达式
示例:int ageArr[10] = {21, 23, 22, 21, 20, 24, 22, 23, 21,26};
ageArr—数组变量名
int [10]--类型:表示这个数组是一个有10个整型元素的数组
int 说明元素类型是整型
[10] 说明数组有10个元素
{21,23,22...}我们可以用下标将这些元素取出来。
小柒什么是下标?
下标表示了元素在数组中的顺序号。
示例:int ageArr[10] = {21, 23, 22, 21, 20, 24, 22, 23, 21,26};
a[0] = 21;
a[1] = 23;
a[2] = 22;
...
a[9] = 26;
小柒提示:
- 数组元素始终从0开始,所以长度为n的数组元素的索引是从0到n-1。
- 如果说继续取a[10] = 30;会出现不正确的结果,关于这个错有关专用名,数组越界。至今没有检查数组越界的方法,所以同学们写的时候要格外注意。
2、数组的初始化
形式:数据类型 数组名[元素个数]= {元素1,元素2...};
1)定义数组时初始化元素
int a[2] = {8,10};//数据类型 数组名[元素个数] = {元素1,元素2};
int b[4] = {2,5};//下标先取2和5,之后系统会自动补0
int c[] = {2,5,7};//不写元素个数也行
2)先定义数组变量,再初始化元素
int a[2];
a[0] = 8;
a[1] = 10;
3、数组的遍历
小柒什么是数组的遍历?
答:数组和for循环常常结合在一起使用。通过for循环对数组中的每个元素执行一些操作称作遍历数组。
int a[5] = {1,2,3,4,5};
for (int i = 0; i < 5; i++) {
printf("%d\n",a[i]);
}
a[i] a是数组名,i代表里面的元素。
例题
手动输入10个数,用数组遍历出来。
int a[10];
printf("请输入10个数——————");
for (int i = 0; i < 10; i++) {
scanf("%d",&a[i]);
}
printf("输出数组元素:");
for (int j = 0; j < 10; j++) {
printf("%d",a[j]);
}
-----------------------------------------------------------------
// 自动补0
int a[5] = {1,2};
for (int i = 0; i < 5; i++) {
printf("%d",a[i]);
}
打印结果:12000
-----------------------------------------------------------------
// 数组越界
int a[5] = {1,2,3,4,5,6};
for (int i = 0; i < 6; i++) {
printf("%d",a[i]);
}
打印结果:1234532767
-----------------------------------------------------------------
// 假设整型数组 a,10个元素,求最大值。
int a[10] = {1,20,30,4,5,6,7,8,9,0};
int max = a[0];//保存最大元素
int mac = 0;
for (int i = 1; i < 10; i++)
{
if (a[i] > max)//比较其元素大小,记录最大元素及其下标。
{
max = a[i];//把最大值赋给max
mac = i;//a[i]里面的i赋值给了mac
}
}
printf("max = %d\n",max);
printf("mac = %d\n",a[mac]);//最后a[mac]就是最大元素,值同时也保存在max变量里面。
打印结果:
max = 30
mac = 30
-----------------------------------------------------------------
// 假设整型数组 a,10个元素,求最小值。
int a[10] = {1,20,30,4,5,6,7,8,9,0};
int max = a[0];//保存最小元素
int mac = 0;
for (int i = 1; i < 10; i++)
{
if (a[i] < max)//比较其元素大小,记录最大元素及其下标。
{
max = a[i];//把最小值赋给max
mac = i;//a[i]里面的i赋值给了mac
}
}
printf("mac = %d\n",mac);//下标
printf("max = %d\n",max);//保存最小数
printf("mac = %d\n",a[mac]);//最后a[mac]就是最小元素,值同时也保存在max变量里面。
打印结果:
mac = 9
max = 0
mac = 0
4、冒泡排序
-
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
-
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
-
针对所有的元素重复以上的步骤,除了最后一个。
-
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
// 计算85分以上学生的人数
int a[5],i,j,t;
int count = 0;//85分以上的人数
printf("??");
for (i = 0; i < 5; i++) {
// 输入
scanf("%d",&a[i]);
}
// 冒泡排序
//外部表示行
for (i= 0; i<5-1; i++) {
//内部表示列
for (j = 0; j < 5-i-1; j++) {
if (a[j]<a[j+1]) {
// 交换值
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
// 遍历
for (i = 0; i<5; i++) {
printf("%d",a[i]);
if (a[i]>=85) {
count++;
printf("\n85以上%d\n",count);
}
}
5、二维数组
小柒什么是二维数组?
语法定义:
类型 数组名[元素个数][元素个数];
int a[3][2] = {{2,3},{2,4},{2,5}};//3表示的是一维数组个数,2表示的是二维数组个数
二、字符串
回顾:
我们有个数据类型叫字符型,用‘’来表示输出用%c
char f = 'a';
printf("f = %c\n",f);
小柒什么是字符串?
用双引号包含的内容,我们叫字符串,输出用%s
以前我们有个数据类型叫字符型,用‘’来表示,字符串用“”来表示
char aa[2] = {'a','b'};
int len = strlen(aa);
for (int i = 0; i < len; i++) {
printf("aa = %c\n",aa[i]);
}
程序打印结果会出问题
字符串所占的空间: 至少要比字符串长度大1,因为字符串以’\0’表示结束。系统提供的字符串处理函数都是根据’\0’来判断字符串是否结束。
char aa[3] = {'a','b'};
int len = strlen(aa);
for (int i = 0; i < len; i++) {
printf("aa = %c\n",aa[i]);
}
aa[0] = a
aa[1] = b
aa[2] = /0 //系统默认有一个\0
打印结果:
aa = a
aa = b
1、字符串的初始化
1)第一种字符数组
char a[3] = {'s','c','\0'};
2)第二种
char b[3];
3)第三种
char a[3] = "ww";
4)第四种字符指针
char *d = "ww";
2、字符串的遍历
char *d = "ACE";
for (int i = 0 ; i < 3; i++) {
char c = d[i];
printf("c = %c\n",c);
}
printf(" d = %s\n",d);
打印结果:
c = A
c = C
c = E
d = ACE
3、strlen() 计算字符串长度
需要导入#include<string.h> #include <ctype.h>头文件
char *tes ="scsys";
// 计算字符串字符的个数
int len = strlen(tes);
// 用len代替元素个数
for (int k = 0; k < len; k++) {
// 取得字符串中的字符
char l = tes[k];
printf("%c\n",l);
}
打印结果:
s
c
s
y
s
4、strcmp() 字符串比较
char a[] = "hello";
char a1[] = "hello";
int r = strcmp(a, a1);
printf("==%d\n",r);
// 相等0
// 大于是正数
// 小于是负数
打印结果:
==0
5、strcat() 字符串拼接
char str[100]="ddd";
char str2[100] = "hello";
strcat(str, str2);
printf("str = %s\n",str);
打印结果:
str = dddhello
6、strcpy() 字符串拷贝
char str[100]="ddd";
char str2[100] = "hello";
stpcpy(str,str2);//str2复制到str里面
printf("str = %s\n",str);
打印结果:
str = hello
7、判断是不是字母
char c = 'a';
int t = isalpha(c);
printf("t = %d\n",t);
如果1就代表是,0就代表不是。
打印结果:t = 1
8、sscanf()--从字符串读取数据
char buf[5] = {'s','c'};
sscanf("12456", "%s",buf);
printf("%s",buf);
打印结果:12456
9、sprintf()--数据输出到字符串
char a[50];
char a2[50]="hello";
sprintf(a,"%10s",a2);
printf("a = %s",a);
打印结果:
a = hello \\字符串输出时可以加空格
10、puts()--输出字符串到控制台
小柒提示:puts()函数只能输出字符串, 不能输出数值或进行格式变换。 (2). 可以将字符串直接写入puts()函数中, puts()输出字符串格式为: puts(s)puts(s) 等效于printf("%s\n",s),前提 :s是C风格字符串,最后以'\0'结尾。
char st[] = "scsys";
puts(st);
打印结果:
scsys
11、gets()--从控制台获得字符串
char s[5];
gets(s);
printf("s====%s\n",s);
打印结果;warning: this program uses gets(), which is unsafe.
从键盘输入5回车
打印:
s====5
12、putchar()输出字符到控制台,
作用是向终端输出一个字符。其格式为putchar(c).
char o,p,q;
o = 'q';
p = 'm';
q = 'y';
putchar(o);putchar(p);putchar(q);putchar('\n');
putchar(o);putchar('\n');
putchar(p);putchar('\n');
putchar(q);putchar('\n');
打印结果:
qmy
q
m
y
13、getchar()--从控制台输入字符
char a,b,c,d;
a = getchar();
b = getchar();
c = getchar();
putchar(a);putchar('\n');
putchar(b);putchar('\n');
putchar(c);putchar('\n');
putchar(d);putchar('\n');
打印结果:
qmy //键盘输入
q
m
y
数组与字符串就讲到这里了,代码要好好敲完;明天小柒将带领大家一起学习函数,加油哦!
浙公网安备 33010602011771号