C++5 数组

/*今天复习下数组的一些零碎知识点。
第五章: 数组---都给我排好队
计算机的强大在于处理数据。而且是大量的数据。今天介绍的数组就是很强大。仅仅通过简单的几行
语句却可以生成大量的数据。加上循环真是无敌。
5.1 初始C++数组 
数组可以用来存储同类型的大量数据,不需要为他们一个个单独声明。数组通过下标来访问,虽然下标是
语法糖。但是加上一个下标的确清晰了。
语法格式:type_name array_name [size]  type_name 是数组的数据类型名,当然类,结构体都是
数据类型。 array_name 是数组名称。 size 就是数组大小了。元素是从0到size-1个。
5.2 初始化
声明过后就初始化这是个好习惯,能减少很多低级错误。一般用集合法或者循环。不嫌麻烦可以拿出来
单独的一个个的初始化。集合法初始化的时候不要忘记加上分号。
如果某个变量或者数组是全局的,那么C++会默认把他初始化为0.但是局部变量就没有这个待遇了。
局部的数组你若不不初始化直接调用,里面会产生垃圾值。
5.3 从0开始的下标。
其实换种思路理解就能接受了。不要把下标当作第几就行了。你把下标当成相对于第一个元素的偏移量那就好理解了。
那么第一个元素的偏移量肯定是0了。第二个元素的偏移量自然就是1.是不是感觉耳目一新。
其实数学中的数列如果采用这个定义也是挺好的。
关于更深层次的数组的下标为什么从0开始。有的语言的数组下标的确是从1开始的。但是要记住,无论什么
语言写的代码,最终都要被翻译成机器语言才能然cpu执行。在机器级别,数组的下标是通过偏移量来处理的
。一个寄存器存储着某个数组的地址,其实就是第一个元素的地址。另一个寄存器存储着一个偏移量,
也就是到某给定元素的距离。
那么第一个元素的偏移量是多少?是0.但是在fortran 语言中,数组下标从1开始,那么计算机处理的时候
必须先减去1,变成0下标,然后在乘以每个元素的长度。举个例子,为了访问下标为I的那个元素,
那么必须如此做: 元素I的地址=基地址+(I-1)*每个元素的长度。
但是对于C++来说,却是省去了减一。程序运行更高效了。
虽然从0开始只能节约非常短暂的cpu周期,但是这种做法充分体现了C语言以及从他发展而来的各种语言锁
秉承的理念,在动作行为方面贴近CPU的操作。
*/
#include<cmath>
#include<ctime>
#include<iostream>
using namespace std;
int array[10];
int main(){
	while (1){
		int numbers = 0;
		cout << "Enter how many trials and press ENTER" << endl;
		cin >> numbers;
		cout << "想生成0到几的随机数,请输入n" << endl;
		int n = 0;
		cin >> n;
		for (int i = 0; i < numbers; i++){
			int r = rand() % n;
			array[r]++;
		}
		for (int i = 0; i <n; i++){
			double r = array[i];
			cout << "The frequency of  " << i << " is\t" << r / (numbers / n) << endl;
		}
		cout << "0-quit,1-continue" << endl;
		int temp = 0;
		cin >> temp;
		if (temp == 0)
			break;
		else {
			array[10] = { 0 };
		}
	}
	system("pause");
	return 0;
}
/*贴个代码大家参考下。 
介绍一个转换 static_cast<double>(元素)类型转换。
5.4 字符串和字符串数组
字符串用双引号引起。 字符串数组 
char *p  ;char p[10]  都是字符串。
char* str[10]  字符串数组、
5.4 经验之谈 
注意数组边界*,自己负责,C++不负责。
二维数组略,只要知道是数组的数组就行了。比如一维数组五个元素,但是里面的每个元素又是数组,所以
形成了二维数组。
总结: 
1)数组的声明语法格式
2)下标0.
3)初始化
4)集合法初始化
5) 用指针声明字符串
6)字符串数组其实就是指针指针
7)主要数组边界
8)声明二维数组的格式*/
#include<iostream>
using namespace std;
#include<ctime>
#include<cmath>
bool s_suits[4];
bool r_ranks[13];
char* suits[4] = { "hearts", "diamonds", "spaders", "cubes" };
char* ranks[13] = { "ace", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "jack", "queen", "king" };
void draw_a_card(){
int r = 0, s = 0;
int card;
card = rand() % 52;
r = card % 13;
//s_suits[s] = 1;
s = card / 13;
while(r_ranks[r]==1 && s_suits[s]==1){
r = card % 12;
s = card / 12;
}
s_suits[s] = 1;
r_ranks[r] = 1;
cout << ranks[r] << " of " << suits[s] << endl;
}
int main(){
srand(time(nullptr));
while (1){
int temp = 0;
cout << "Enter no. of cards to draw ";
cout << "0 to exit" << endl;
cin >> temp;
if (temp == 0)
break;
for (int i = 0; i < temp; i++)
draw_a_card();
}
system("pause");
return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值