第五章数组、字符串

你好!我是小柒,今天咱们来学习一下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;

小柒提示:

  1. 数组元素始终从0开始,所以长度为n的数组元素的索引是从0到n-1。
  2. 如果说继续取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、冒泡排序

冒泡排序算法的运作:
  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  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

 

 数组与字符串就讲到这里了,代码要好好敲完;明天小柒将带领大家一起学习函数,加油哦! 

posted on 2015-12-20 18:44  xxQMYxx  阅读(165)  评论(0)    收藏  举报

导航