数组

     C语言课程笔记(3)数组

8.1 一维数组的定义和初始化

一、数组是一组具有相同类型的变量的集合

    数组名数组元素 数组的下标(都是从0开始的)

    ●数组大小必须是值为正的常量,不能为变量,一旦定义,不能

     改变大小

    ●数组大小最好用宏观来定义,以适应未来可能的变化

      int a[5] ={12,34,56,78,9}

      int a[5]={0}

    ●数组的引用

     数组名[下标]

     下标既可以是常量,也可以是整型表达式,允许快速随机访问

      如a[i] 可以像使用普通变量一样使用它们

二、使两个数组相等

    main()

    {

       int a[5]={1,2,3,4,5},b[5];

       b=a;

    }

    解决方法

    ①逐个元素赋值    

    ②通过循环赋值  (数组名表示数组的首地址其值不可改变)

三、下标越界是大忌!!!

    ●编译程序不检查是否越界

    ●下标越界,将访问数组以外的空间

    ●那里的数据是未知的,不受我们掌控,可能带来严重后果 

四、例题

例5.1  输入n个数 要求程序按输入时的逆序把这n个数打印出来,已知整数不                

        超过100个。也就是说,按输入相反顺序打印这n个数。

      #include <iostream>

    using namespace std;

    int a[110];

    int main()

    {

          int x,n=0;

        while(cin>>x) 

        {

        a[n++]=x; //相当{a[n]=x;n++;

        }

        for (int i=n-1;i>=1;--i)

        cout< <a[i];

        cout< <a[0];

        return  0;

    } 

例5.3宾馆里有- -百个房间,从1-100编了号。第- -个服务员把所有的房间门

      开了,第二个服务员把所有编号是2的倍数的房间“相反处理”,第三服

      务员把所有编号是3的倍数的房间作“相反处理”....以后每个服务员都如。

      当第100个服务员来过后,哪几扇门是打开的。(所谓“相反处理是:原来

      着的门关上,原来关上的门打开。)

[分析]此题较简单,用1[),2).)..,.u]表示编号为1, 23, .,.的门是否开着。拟这些操作即可。

#include<cstdio>

#include<cstring>

#define MAXN 100+10

int a[MAXN];

int main()

{

    int n,k,first=l;

    memset(a,0,sizeof(a));

    for (int i=l;i<=100;++i)

       for (int j=l;j<= 100;++j)

       if (j%i==0) a[j]=!a[j];

       for (int i=l;i<=100;++i)

       if (a[i])

       {

           if(first) first=0;

           else 

           printf("");

           printf("%d",i);

       }

    printf("n");

    return 0;

}

五、数组的选择排序

main()

{

    int a[10OO00];

    int i,j,max,l;

    cin> >n;

    for(i=0;i<n;i++) 

    cin>> a[i];

    for(j=0;j<n-l;j++)

    {

       l=j;

       for(i=l;i<n;i++)

       if(a[l]<a[i])

       l=I;

       if(I!=j) i=a[I],a[I]=a[j],a[j]=i;

    }

    return 0;

冒泡排序

 

#include< iostream>

#include<iomanip>

using namespace std; 

const int n=10;

int t,a[n+1];

int main()

{

    for (int i=1; i<=n; ++i) cin>>a[i];

    for (intj=1;j<=n-1; ++j)

    for (int i=1; i<=n-j; ++i)

       if (a[i]<a[i+1]) 

       {

          t=a[i]; a[i]=a[i+1]; a[i+1]=t;

       }

    for (int i=1;i<=n; ++i)

       cout<*<setw(5)<<a[i];

    cout<< <endl;

    return 0;

}

8.2  二维数组

一、二维数组的定义

  当一维数组元素的类型也是一维数组时,便构成了“数组的数组”,即二维数组。

  二维数组定义的一般格式:

      数据类型数组名[常量表达式1] [常量表达式2]

二、二维数组元素的引用

  二维数组的数组元素引用与一维数组元素引用类似,区别在于二维数组元标。

  引用的格式为:

                <数组名>[下标1][下标2]

三、二维数组的初始化

  二维数组的初始化和一-维数组类似。可以将每一行分开来写在各自的括号里,

  也可以把所有数据写在一个括号里。

例5.11打印杨辉三角形的前10行。

 #include< iostream>

 #include<iomanip>

 using namespace std;

 int main()

 {

     int a[11][11];

     a[1][1]=1;

     for (int i=2;i<=10;++i)//设定第一行的值/从第二行开始推

        a[i][1]=1; a[i][i]=1; //设定每一行的首尾值为1

     for (int j=2; j<=i-1; ++j)  //当行非首尾的数

        a[i][j]=a[i-1][j-1]+a[i-1][j]; //每个数等于上一行的二个数之和

     for (inti=1;i<=10; i++)

     {

         if (i!=10) cout< <setw(30-3*i)<<" ";//控制每行的起始位置,即空格量

         for (int j=1; j<=i; j++) 

           cout< <setw(6)<<a[il[i];

           cout << endl;

     }

 

     return 0;

 }

 

 

 

 

8.3  字符数组和字符串类型

一、字符数组

  字符数组是指元素为字符的数组。字符数组是用来存放字符序列或字符串。

  字符数组也有一维、二维和三维之分。

1、字符数组的定义格式

字符数组定义格式同于一般数组,所不同的是数组类型是字符型,第一个元素同样是从char[0]开始,而不是char[1]。具体格式如下:

    [存储类型] char数组名[常量表达式1]...

2.字符数组的赋值

(1).用字符初始化数组例如:

     char char[5]={'a','b','c','d','e'};

字符数组中也可以存放若干个字符,也可以来存放字符串。两者的区别是字符串有一结束符("\0)。反过来说,在一维字符数组中存放着带有结束符的若干个字符称为字符串。字符串是一维数组,但是一维字符数组不等于字符串。

(2).用字符串初始化数组

 用一个字符串初始化一个-维字符数组,可以写成下列形式

     char char[5]="abcd";

 对二维字符数组来讲,可存放若千个字符串。可使用由若干个字符串组成的初始值表给维字符数组初始化。

(3).数组元素赋值

字符数组的赋值是给该字符数组的各个元素赋一个字符值

(4).字符常量和字符串常量的区别

①两者的定界符不同,字符常量由单引号括起来,字符串常量由双引号括起来。

②字符常量只能是单个字符,字符串常量则可以是多个字符。

③可以把一个字符常量赋给一个字符变量, 但不能把一个字符串常量赋给一个字符变量 。

④字符常量占一个字节,而字符串常量占用字节数等于字符串的字节数加1。增加的一个字节中存放字符串结束标志'\0'

三、字符串的输入与输出

1、输入

从键盘输入一个字符数组可以使用scanf语句或gets语句。

(1)scanf语句

 格式: scanf("%s",字符数组名);说明:

      ①系统会自动在输入的字符串常量后添加“\0'标志,因此输入时,仅输入

        字符串的内容即可。

      ②输入多个字符串时,以空格分隔。

        例如: scanf("%s%s%s",s1,s2,s3); 从键盘分别输入Let usgo,  则三个

        字符串分别获取了三个单词。

(2)gets语句

格式: gets(字符数组名);说明:

     使用gets只能输入一个字符串。读入的是一整行,包括空格。

     例如: scanf("%s",s1); gets(s2); 对于相同的输入HelloWorld!。s1获取的

     结果仅仅是Hello,而s2获取的结果则是Hello World!

 

2、输出

向屏幕输出一个字符串可以使用printf语句或puts语句。

(1)printf语句

格式: printf(“%s",字符数组名);

(2) puts语句

格式: puts(字符串名称);

说明: puts语句输出-个字符串和一个换行符。对于已经声明过的字符串a, printf("%s\n",a)和 puts(a)是等价的。

  1. 总结

在oj上做这部分的题目时感觉很吃力,有些问题根本无从下手,查阅资料和参照别人的解题思路后才能有些自己想法,虽然最后题目都能提交成功,但我觉得自己其实有很大的问题,觉得有些知识还不够扎实,有些东西没有好好落实,还要继续努力!期末考试马上就要到了,感到有些急躁和恐慌,不管怎么样先扎扎实实好好思考以前的题目,相信自己,只要努力了就不会有遗憾。

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值