5 C++数组

5 数组

5.1概述

特点1:数组中每一个元素的数据类型都相同;
特点2:存放在连续的内存空间中。

5.2 一维数组

5.2.1 一维数组的定义

数据类型 数组名[数据长度];
数据类型 数组名[数组长度] = {值1, 值2, ... };如果只给出少部分的值,剩余元素默认为0.
数据类型 数组名[ ] = {值1, 值2, ...};给定数组值后,数组长度可省略。
需要初始化,不初始化系统会给定一个值。数组的下标从0开始。不能定义长度可变的数组。如果必须改变数组的长度,可以先定义一个符号常量,通过改变符号常量的值改变数组长度。

5.2.2 一维数组数组名

作用:获取数组在内存中得首地址;统计整个数组在内存中的长度sizeof(数组名)
数组名不能进行赋值操作。

#include<iostream>
using namespace std;
int main(){
	int array[3] = {1, 2, 3};
	cout <<(int)array << endl;//输出:14350080,加(int)可以用十进制表示地址。
	cout << array[1] << endl;//输出:2
	cout << (int)&array[1] << endl;//输出:14350084.查看元素的地址,前面要加&。
	system("pause");
	return 0;
}
//数字前后元素交换位置
#include<iostream>
using namespace std;
int main(){
	int arr[4] = { 1,2,3,4 };
	int start = 0;
	int end = sizeof(arr) / sizeof(arr[0]) - 1;
	if (start < end){
		int temp = arr[start];
		arr[start] = arr[end];
		arr[end] = temp;
		start++;
		end--;
	}
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){
		cout << arr[i] << endl;
	}
	system("pause");
	return 0;
}
//冒泡排序升序
#include<iostream>
using namespace std;
int main()
{
	int arr[5] = { 7,3,5,9,2 };
	for (int i = 0; i < 5 - 1; i++){
		for (int j = 0; j < 5 - i - 1; j++){
			if (arr[j] > arr[j + 1]){
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
	for (int i = 0; i < 5; i++){
		cout << arr[i] << endl;
	}
	system("pause");
	return 0;
}

5.3 二维数据的定义

数据类型 数据名[常量][常量];
数据类型 数据名[3][2] = {{1, 2}, {3, 4}, {5, 6}};
数据类型 数据名[3][2] = {1,2,3,4,5,6};
数据类型 数据名[ ][2] = {1,2,3,4,5,6};可以不指定行数。
通过两个嵌套的for循环打印二维数组。
内存存放方式:拉成一条直线。
在这里插入图片描述

5.4 三位数组

一维代表片,二维代表行,三维代表列。
尽可能少用。
在这里插入图片描述
输出100以内的素数

在这里插入图片描述

#include<iostream>
using namespace std;
int main(){
	bool flag = true;
	for (int i = 1; i < 100; i++){
		flag = true;
		for (int j = 2; j < i; j++){
			if (i%j == 0){
				flag = false;
			}
		}
		if (flag == true){
			cout << i << endl;
		}
	}
	system("pause");
	return 0;
}

5.5 字符数组与字符串

5.5.1 字符数组与字符串的定义

字符数组char a[4] = {'a', 'b', 'c', 'd'}
如果char a[4] = {'a', 'b'}后面的元素被初始化是\0.
内容相同的字符串比字符数组多了一个元素。
在这里插入图片描述
在这里插入图片描述

#include<iostream>
using namespace std;
int main() {
  char str1[] = "C++ language";
  char str2[20];
  int i = 0;
  while(str1[i] != '\0'){
    str2[i] = str1[i];
    i++;
  }
  str2[i] = '\0';
  cout << "String1" << str1 <<endl;//用字符数组的名字输出字符数组。
  cout << "String2" << str2 <<endl;
  return 0;
}

5.6 字符/字符数组/字符串的输入输出

5.6.1 输入的过程

1)输入缓冲区的定义:从键盘输入一些数据给一段程序,需要从键盘键入一些字母,例如How are you回车,之后这串字母和回车被送入到一个地方,这个地方就叫输入缓冲区。一敲回车输入的数据就被送入到缓冲区,然后程序到缓冲区获取字符。
2)cin空格回车都当作区分数据的标记,跳过空格回车,不认为空格回车是数据。
3)如果cin读到数据就返回非0值,所以可以用while(cin >> n)接收连续数据的情况。

int n;//定义一个输入变量用于接收系统输入的数字
cin >> n;//方式一,直接输入,再执行相应操作
while(cin >> n){
	/*方式二,将输入放在while后面,这种方式推荐大家用
	因为C++的输入是流的方式
	因此用while来判断接收是比较常用的方法,不容易出错
	如果直接要求输入一组数,并不告知具体的数量,只能用这种输入
	所以推荐用这种,包括后面的字符串)*/
}
#include<iostream>
using namespace std;
int main(){
	float grade;
	cout << "enter grade:" ;
	while (cin >> grade){//能从cin流读取数据
		if (grade >= 85)
			cout << grade << "GOOD" << endl;
		if (grade < 60)
			cout << grade << "fail" << endl;
		cout << "enter grade:";
	}
	system("pause");
	return 0;
}

5.6.2 一个字符的输入

方法一:直接用cin输入一个字符
程序执行方式:先输入数据,敲回车,再输出。终止输入:ctrl + z

#include<iostream>
using namespace std;
int main(){
	char a;
	cout << "enter a sentence:" << endl;
	while (cin >> a) 
		cout << a;
	system("pause");
	return 0;
}

在这里插入图片描述
在这里插入图片描述

方法二:用cin.get()函数输入一个字符
1)方法二输出结果与方法一不同:方法二比方法一更强大,方法二将所有空格也输出了,同时还输出了一个回车。也就是说,cin.get()能把空格和回车都当作字符输出。
2)可以用于读取一个字符,两种形式cin.get()或者cin.get(char)。调用cin.get(),就从缓冲区读一个字符。终止输入:ctrl + z

#include<iostream>
using namespace std;
int main(){
	char a;
	cout << "enter a sentence:" << endl;
	while ((a = cin.get()) != EOF) {
	//EOF是End Of File文件结束标志
		cout << a;
	}
	system("pause");
	return 0;
}

在这里插入图片描述
方法三:用cin.get(char)输入一个字符。
1)与方法二输出结果一样,但形式简单。
2)cin.get(a)含义:用键盘读一个字符把它赋给a
3)终止输入:ctrl + z.

#include<iostream>
using namespace std;
int main(){
	char a;
	cout << "enter a sentence:" << endl;
	while (cin.get(a)) 
		//读取一个字符给字符变量a
		cout << a;
	system("pause");
	return 0;
}

结果
方法四:用getchar()输入字符,
1)比以上方法都强大:可以把ctrl + z都输出。

#include<iostream>
using namespace std;
int main(){
	char a;
	cout << "enter a sentence:" << endl;
	while (a = getchar())//不跳过任何字符包括CTRL+ Z
		cout << a;
	system("pause");
	return 0;
}

在这里插入图片描述

5.6.3 一串字符的输出

1)cout输出字符数组,只需把字符数组的名字写在cout里面,程序会从第一个元素开始,直到遇到第一个反斜杠0;如例1正常输出。

#include<iostream>
using namespace std;
int main(){
	char a[10] = "Computer";
	cout << a;
	system("pause");
	return 0;
}

在这里插入图片描述

在这里插入图片描述
2)第二个例子:会打印乱码,直至有\0,因此,为了确保用cout输出不会输出乱码,一定要以\0结尾。

#include<iostream>
using namespace std;
int main(){
	char a[8] = { 'C','o','m','p','u','t','e','r' };
	cout << a;
	system("pause");
	return 0;
}

在这里插入图片描述

在这里插入图片描述
3)cout输出二维数组,cout << weekday[i] << endl;

#include<iostream>
using namespace std;
int main()
{
	char weekday[7][11] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };
	for (int i = 0; i < 7; i++){
		cout << weekday[i] << endl;
	}
	system("pause");
	return 0;
}

在这里插入图片描述
4)这个方法不能用于int数组
在这里插入图片描述

5.6.4 一串字符的输入

方法一:传统方法,cin >> str
1)输入abc def gcin的做法是:abc后面有空格,cin认为是独立的字符串。
2)cin空格和回车作为区分字符串的间隔标记

#include<iostream>
using namespace std;
int main(){
	char str[10];//定义了一个字符数据
	cout << "enter a sentence:" << endl;
	while (cin >> str)
		cout << str << endl;
	system("pause");
	return 0;
}

在这里插入图片描述
方法二:用cin.get()函数输入,这个函数有三个参数
1)ch是字符数组的名字
2)10代表我要从缓冲区读10-1个字符
3)'\n'含义换行。
4)含义从键盘上读入10-1个字符,赋给ch,如果还没读完就碰到了'\n',就提前结束。

在这里插入图片描述

#include<iostream>
using namespace std;
int main(){
	char ch[20];
	cout << "enter a sentence:" << endl;
	cin.get(ch, 10, 'o');//指定终止字符为'o'
	cout << ch << endl;
	system("pause");
	return 0;
}

在这里插入图片描述

方法三:用cin.getline()函数输入。
1)与cin.get()函数类似。
2)结果与方法二完全一样。
3)**区别:**要特别小心处理。遇到终止字符都会停止,但缓冲区的指针位置不同。cin.get()更接近我们的思维方式,但cin.getline()更常用。

#include<iostream>
using namespace std;
int main(){
	char ch[20];
	cout << "enter a sentence:" << endl;
	cin.getline(ch, 10, 'o');
	cout << ch << endl;
	system("pause");
	return 0;
}

在这里插入图片描述
在这里插入图片描述
5)cin.get()更接近我们的思维方式,但cin.getline()更常用。原因是:大部分我们会把终止字符设置成换行。

#include<iostream>
using namespace std;
int main(){
	char a[10][10];
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
		cin.getline(a[i],10);
	for (int i = 0; i < n; i++)
		cout << a[i] << endl;
	system("pause");
	return 0;
}

在这里插入图片描述

#include<iostream>
using namespace std;
int main(){
	char a[10][10];
	int n;
	cin >> n;
	cin.get();
	for (int i = 0; i < n; i++)
		cin.getline(a[i],10);
	for (int i = 0; i < n; i++)
		cout << a[i] << endl;
	system("pause");
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值