#学习笔记 c语言数组

谢谢实验楼~

一、一维数组

例子1
定义一个含有 10 个元素的数组,依次赋值为 1,2,3,4,5,6,7,8,9,10,然后按逆序输出。

#include<stdio.h>
int main()
{
    int i,a[10];

    for(i=0;i<10;i++)
        a[i] = i + 1;

    for(i=9;i>=0;i--)
        printf("%d\t",a[i]);

    return 0;  
}

例子2冒泡排序
现在输入 10 个用户的有效学习时间,要求对它们按由小到大的顺序排序。

冒泡排序:
其思路为:每次将相邻两个数比较,将小的调到前面,如果有 6 个数:8,7,5,4,2,0。第一次先将最前面的两个数 8 和 7 对调。第二次将第二个数和第三个数(8 和 5)对调…如此总计进行了 5 次,得到 7-5-4-2-0-8 的顺序,可以看到:最大的数 8 已经沉底,成为最下面的一个数,而小的数上升。经过第一轮(5 次比较)后,得到了最大的数 8。

如果有数组里有n个数字,则需要循环(n-1)次,第1次排序(n-1)次,最后一次排序1次。

#include<stdio.h>

int main()
{
  int i,j,t,LearnTime[10];
  printf("please enter 10 number:\n");

  for(i=0;i<10;i++)
      scanf("%d",&LearnTime[i]);

  for(j=0;j<9;j++)    //9次外循环,9次比较
      for(i=0;i<9-j;i++)    //9-j次内循环
          if(LearnTime[i]>LearnTime[i+1])    //交换值
          {
              t=LearnTime[i];
              LearnTime[i] = LearnTime[i+1];
              LearnTime[i+1] = t;
          }
   printf("the sorted number:\n");
   for(i=0;i<10;i++)
       printf("%d\t",LearnTime[i]);

   return 0;
}

二、二维数组

二位数组的表示方法:
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
或者int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
第一个[ ]是行 第二个[ ]是列
可以对部分赋值:
int a[3][4]={{1},{3},{5}};
结果是:

1 0 0 0
3 0 0 0
5 0 0 0

例子2
有一个 3*4 的矩阵,求出其中的最大值并输出最大值和其所在的行号和列号。
解题思路:先思考一下在打擂台的时候怎样确定最后的优胜者。先找出任一个人站在台上,第 2 个人上去与之比武,胜者留在台上。再上去第 3 个人,与台上的人比武,胜者留在台上,败者下台。以后每一个人都和当时留在台上的人比武。直到所有人都上台比过为止,最后留在台上的就是冠军,这中方法就是打擂台法。 我们本题目也采用打擂台算法。先让 a[0][0] 做“擂主”,把它的值赋给变量 max,max 用来存放当前已知的最大值,在开始时还未进行比较,把最前面的元素认为是当前最大值,然后让下一个元素 a[0][1] 和 max 比较,如果 a[0][1]>max,则把 a[0][1] 赋值给 max,取代 max 的原值。以后以此处理,直到全部比完之后,max 就是最大值。

#include<stdio.h>

int main()
{
    int i,j,row = 0,colum = 0,max;
    int a[3][4] = {{3,4,16,2},{7,5,1,9},{11,23,3,8}};

    max = a[0][0];
    for(i=0;i<3;i++)
        for(j=0;j<4;j++)
            if(a[i][j]>max)
            {
                max = a[i][j];
                row = i;
                colum = j;
            }

    printf("max=%d\nrow=%d\ncolum=%d\n",max,row,colum);

    return 0;
}

三、字符数组

1.字符数组的表示方法:

char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};
char c[]={'I',' ','a','m',' ','h','a','p','p','y'};

char[] = {"I love shiyanlou"};
char[] = "I love shiyanlou";
  • 数组 c[] 的长度自动定为 10。这种方式不用人工去数字符的个数,尤其在赋初值字符个数不较多的情况下,比较方便。
  • 注意:上面例子中花括号提供的初值个数(即字符个数)等于数组长度,倘若花括号中的提供初值个数大于数组长度,则会出现语法错误。倘若初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余元素自动定为空字符(即’’\0’).

例子3:
输出一个正方形。

解题思路:先画出一个平面正方形图案,每行包含 5 个字符,其中有的是空白字符,有的是’*'字符,定义一个字符型的二维数组并初始化,用 for 循环嵌套输出。

#include<stdio.h>

int main()
{
    char c[ ][9]={
    {'*',' ','*',' ','*',' ','*',' ','*'},
    {'*',' ',' ',' ',' ',' ',' ',' ','*'},
    {'*',' ',' ',' ',' ',' ',' ',' ','*'},
    {'*',' ',' ',' ',' ',' ',' ',' ','*'},
    {'*',' ','*',' ','*',' ','*',' ','*'},
    };
    int i,j;

    for(i=0;i<5;i++)
    {
        for(j=0;j<9;j++) 
            printf("%c",c[i][j]);
        printf("\n");
    }

    return 0;  
}

2.为了简洁,代替了printf和scanf,出现了puts和gets:

puts(字符数组)

其作用是讲一个字符串输出到终端,因此该函数用的不是很多,我们可以编写小程序来体验。

gets(字符数组)

其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。

例子4

#include<stdio.h>
#include<string.h> //在使用字符串处理函数时,在程序文件的开头用#include<string.h>
int main()
{
   char str[] = "China\nChengdu";

   puts(str);
   printf("Enter a new string:");
   gets(str);    //有的编译器会报 warning,提示 gets() 函数不安全;
                   //这里说明一下,这个warning是编译器针对这个函数的,不影响实验。感兴趣的同学可以作为课后自学。
   puts(str);

   return 0;
}

3.strcat
strcat(字符数组1,字符数组2)
把2接到1后面去

#include<stdio.h>
#include<string.h> //在使用字符串处理函数时,在程序文件的开头用#include<string.h>
int main()
{
   char str1[30] = "People's Republic of'";
   char str2[] = "China";

   printf("%s",strcat(str1,str2));

   return 0;
}

在这里插入图片描述
4.strlen 函数-测字符串长度的函数

char str[] = "China";
printf("%d",strlen(str));
  • strlen() 返回的值比实际占用的长度要小,因为不包含 ‘\0’。

5.strcpy ——字符串复制函数
strcpy(字符串 1,字符串 2)
作用是将字符串 2 复制到字符串 1 中。

char str1[10],str2[] = "China";
strcpy(str1,str2);

6.strcmp——字符串比较函数
strcmp(字符串1,字符串2)

strcmp(str1,str2);
strcmp("Chengdu","Beijing");

将两个字符串自左向右逐个字符比较(按照 ASCII 码值大小比较),直到出现不同的字符或者遇到 '\0 '为止。

  • 如果全部字符相同,则认为两个字符串相同。
  • 若出现不同的字符,则以第1对不相同的字符的比较结果为准。例如:“A”<“D”,“e”>“E”,“these”>“that”,“computer”>“compare”。
  • 比较结果由函数值带回。
    字符串1=字符串2,则函数值为0
    字符串1>字符串2,则函数值为一个正整数
    字符串1<字符串2,则函数值为一个负整数

例子5
任意键入 3 个字符串,编程找出最小的一个。

#include<stdio.h>
#include<string.h>

int main()
{
    char string[30];
    char ch[3][30];
    int i;

    for(i=0;i<3;i++)
        gets(ch[i]);
    strcpy(string,ch[0]);
    for(i=1;i<3;i++)
        if(strcmp(ch[i],string)<0)
            strcpy(string,ch[i]);
    printf("The result is :\n%s",string);

    return 0;
}

练习1
输入 20 个实数存放在一维数组中,输出它们的平均值以及高于平均的数的个数。

#include<stdio.h>

int main()
{
    int num[20];
    int ave,sum;
    int flag = 0;               //大于平均数的个数

    //输入
    for(int i=0;i<20;i++)
        scanf("%d",&num[i]);

    //求和
    for(int i=0;i<20;i++)
        sum += num[i];

    ave = sum / 20;

    for(int i=0;i<20;i++)
       if(num[i]>ave)
            flag++;

    printf("ave=%d,num bigger than ave is %d",ave,flag);

    return 0;
}

练习2
围绕着山顶有 10 个洞,一只兔子和一只狐狸住在各自的洞里,狐狸总想吃掉兔子,一天兔子对狐狸说,你想吃我有一个条件,你先把洞编号 1 到 10,你从第 10 洞出发,先到第 1 号洞找我,第二次隔一个洞找我,第三次隔两个洞找我,以后依次类推,次数不限,若能找到我你就可以饱餐一顿,在没找到我之前不能停止,狐狸一想只有 10 个洞,寻找的次数又不限,哪有找不到的道理,就答应了条件,结果狐狸跑得昏了过去也没找到兔子,请问兔子躲在哪个洞里。程序中可假定狐狸找了 1000 次。

#include<stdio.h>

int main()
{
    int hole[10],i,n = 0;

    for(i=0;i<10;i++)
        hole[i] = 0;                    //为每个洞赋值为0,代表狐狸未找过该洞

    for(i=0;i<1000;i++)                 //用循环实现狐狸找1000次洞
    {
        n = n % 10;                      //n为狐狸当前寻找的洞的编号(实际编号应为n+1)
        hole[n] = 1;                    //为找过的洞赋值为1,代表狐狸已经找过该洞
        n += i + 2;                     //设置下一次寻找的编号
    }

    printf("The hole's numbers are:");

    for(i=0;i<10;i++)                   //逐个输出洞的编号(实际编号)
    {
        if(hole[i]==0)
        {
            printf("%d ",i + 1);
        }
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值