C++大学教程-数组与C++标准库类模板

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
字符数组: 数组中存储了一系列字符,特殊地当最后一个字符为空字符时, 代表了一个字符串. 前者的处理同整数数组.
19
串的定义
第一种解释:特殊的一维字符数组
01
01
02
03
04
char str[size];
第二种解释:指向字符的指针
(待第八章指针后解释)
02
03
04
20
串的结束符
\0 int a[3]={1,2,3} char s[3]= {‘a’,’b’,’\0’} s的实际长度为2,但必须分配2+1个空间,多余一个空间用来存放’\0’ 串是以’\0’为结束符的一维字符数组
28
Static 局部数组
01
02
03
像其他局部变量一样, 数组也可以声称为static, 函数中定义的static 数组在程序运行其间一直存在, 但只在该函数体内可见.
当第一次遇见static数组的声明时,程序就初始化它们, 非第一次则不再执行初始化.
当第一次遇见static数组的声明时,程序如果没有显式地初始化, 编译器自动将其初始化为0.
29
第七章 数组与C++标准库类模板
01
数组
02
数组声明,初始化,引用
03
字符数组
04
数组传递给函数
05
数组存储,排序,查找
06
多维数组
07
C++标准库-vector类模板
08
总结
30
数组传递给函数
要给一个函数传递一个数组实参, 需指定数组名, 且不带方括号,并将数组的大小也传递给函数. 如 int data[24] sum(data, 24)
02
方式三: char s[ ]= “abc”;
03
24
串的输入输出
cout << string2;
06
输入时以空格为终止, 并在数组后自动加空字符’\0’; 注意输入时长度不要超过数组声明时的大小,这里为19. 否则系统并不会检查.
04
输入:
01
cin >> string2;
03
输出:
05
char string2[20];
第七章 数组与C++标准库类模板
数组
01
数组声明,初始化,引用
02
字符数组
03
数组传递给函数
04
数组存储,排序,查找
05
多维数组
06
C++标准库-vector类模板
07
总结
08
18
字符数组
字符串的处理可以使用string对象, 但字符串存储实际上是利用了一个字符数组,因此在性能上来说,有时直接使用字符数组更优更方便.
第七章 数组与C++标准库类模板
数组
数组声明,初始化,引用
字符数组
数组传递给函数
数组存储,排序,查找
多维数组
C++标准库-vector类模板
总结
1
数组的用途
程序设计要处理的数据往往是许多数据而非简单的几个数据, 对单个数据分别声明变量显露其局限性 例如,如果要处理3个学生考试成绩,我们可以声明: int grade0,grade 1,grade2; 但如果有很多成绩(例100个),该怎么办? 对一组由相同类型数据组成的数据集合使用数组
using std::endl;
26
例子:
int main() { char string1[ 20 ]; // reserves 20 characters char string2[] = "string literal"; // reserves 15 characters // read string from user into array string1 cout << "Enter the string \"hello there\": "; cin >> string1; // reads "hello" [space terminates input] // output strings cout << "string1 is: " << string1 << "\nstring2 is: " << string2; cout << "\nstring1 with spaces between characters is:\n";
21
空字符串
没有任何字符,只有\0
22
‘a’与”a”
‘a’ 字符常量,只需要1个字节存放 “a” 串常量,需要2个字节存放
a
a
\0
23
串的初始化
方法一: char s[4]={‘a’,’b’,’c’,\0’};
方法二: char s[ ]={‘a’,’b’,’c’,\0’};
数组名实际上是数组在内存中的起始地址, 函数由第一个参数获得了数组在内存中的地址.函数的第一个参数传递是按引用传递
02
25
例子:
用字符串文字初始化一个字符数组, 读入一个字符串到一个字符数组, 将字符数组作为一个字符串打印
// Treating character arrays as strings.
02
#include <iostream>
using std::cout;
using std::cin;
05
int main() { const int arraySize = 7; // ignore element zero int frequency[ arraySize ] = { 0 }; srand( time( 0 ) ); // seed random number generator // roll die 6,000,000 times; use die value as frequency index for ( int roll = 1; roll <= 6000000; roll++ ) frequency[ 1 + rand() % 6 ]++; cout << "Face" << setw( 13 ) << "Frequency" << endl; // output each array element's value for ( int face = 1; face < arraySize; face++ ) cout << setw( 4 ) << face << setw( 13 ) << frequency[ face ] << endl; return 0; // indicates successful termination } // end main
声明一个数组,用一个循环初始化数组
01
02
03
04
int n[10];
for (int i=0; i<10; i++)
n[i]=0;
13
求数组元素之和
应用范例片段
int n[10]={32,27, 64, 18, 95, 14, 90,70, 60, 37};
total=0;
for (int i=0; i<10; i++)
return 0;
}
下标或索引
下标
int a[size], 下标表示该元素距数组起始地址的位移是多少. 故第一个元素的下标为0.
数组下标范围 [0, size-1]
下标越界 a[-1],a[size]
注意:编译器并不检查在给定的数组中下标是否有效,越界问题必须由编程人员自己解决。
12
应用范例片段
7
初始化
int a[ ] = { 2,3,4,5}
int a[4] = {2,3,4,5} 当数组大小被省略,编译器计算初始化表中元素个数来确定数组元素的个数
1
2
8
使用一维数组
例:对数组赋值 (也达到初始化目的) #include <iostream> const int N= 5 int main(void) { int a[N]; int i, sum = 0; for (i = 0; i < N; ++i) a[i] = 7 + i * i; return 0; }
例子:
// output characters until null character is reached for ( int i = 0; string1[ i ] != '\0'; i++ ) cout << string1[ i ] << ' '; cin >> string1; // reads "there" cout << "\nstring1 is: " << string1 << endl; return 0; }
总结
4
一维数组的声明
数组元素的个数:必须是正值常量表达式,编译时就知值
int a到数组声明后,编译器保留恰当容量内存, 可以存储5个整型变量,每个变量有自己的表示方式: a[0], a[1], a[2], a[3], a[4]
5
内存空间占用情况
int a[5]; 设一个int需要占用4个字节的空间 存放a[0]的地址为1000,此时1000被成为数组a的基地址

7
8
11
16
23
地址
1000
1004
1008
1012
1016
6
初始化表
初始化
声明数组时可以对数组初始化 float x[5] = { -1.1, 0.2, 33.0, 4.4, 5.05 }; 初始化表的长度短于要被初始化的数组元素数目,那么剩余元素被初始化为0。取巧 int a[10]={0}. 外部或静态数组没有被初始化,系统自动把所有元素初始化为0。 没有被初始化的自动或常量数组含有的值是无用的。 数组的存储类型不能是寄存器类型。
15
// Fig. 7.10: fig07_10.cpp // Roll a six-sided die 6,000,000 times. #include <iostream> using std::cout; using std::endl; #include <iomanip> using std::setw; #include <cstdlib> using std::rand; using std::srand; #include <ctime> using std::time;
total += n[i];
14
应用范例
1
使用不同计数器跟踪一个筛子各个面出现的次数
2
分析: 筛子有6个面, 需要6个计数器, 这里可以用一个含有6个分量的数组, 为了和筛子上的数字对应, 浪费一个分量:0下标分量, 声明数组含7个分量. int frequency[7]
3
如当前掷出5, 则frequency[5]++;
2
数组的特征
有序性:数组中的所有元素都有自身的序号0,1,2…
相同类型:全部是整数、浮点数、字符型,也可以数组的数组(一维数组、二维数组、多维数组), 后面所说数组是特指一维数组。
3
第七章 数组与C++标准库类模板
数组
数组声明,初始化,引用
字符数组
数组传递给函数
数组存储,排序,查找
多维数组
C++标准库-vector类模板
数组有效的下标为: 0,1,2,3,4 0,1, … , (N-1)
常量声明数组大小
9
// Fig. 7.3: fig07_03.cpp // Initializing an array. #include <iostream> using std::cout; using std::endl; #include <iomanip> using std::setw; int main() { int n[ 10 ]; // n is an array of 10 integers // initialize elements of array n to 0 for ( int i = 0; i < 10; i++ ) n[ i ] = 0; // set element at location i to 0
10
cout << "Element" << setw( 13 ) << "Value" << endl;
// output each array element's value
for ( int j = 0; j < 10; j++ )
cout << setw( 7 ) << j << setw( 13 ) << n[ j ] << endl;
相关文档
最新文档