游戏规则
1.“双色球”彩票投注区分为红色球号码区和蓝色球号码区。
2.“双色球”每注投注号码由 6 个红色球号码和 1 个蓝色球号码组成。红色球号码从 1–33
中选择;蓝色球号码从 1–16 中选择。
ball.txt
是我们每期存放的数据号,一共10期,每期7个号码,我们将数据写入到数组中,像类似这样的数据,我们一般都是用一维数组来存取,因为不确定完整性,无法定义其他维度,也不能确定长度,例如,某个数据丢失,磁盘问题导致的问题.
我们将数据存储到数组中,但是,存储方式也决定读取方式,要思考如何更好的便于操作管理,相信大家都会考虑,将我们每期的值直接保存成数组的值,然后,再进行数组的值操作统计,而我考虑的是将每期的每个号作为数组下标,并将数组的值全部初始为0,再通过遍历读取数据时每读个号,就将此号当做下标来存,例如:第一个数是8,我们8-1等于7,这个7就作为下标,为什么要 -1 操作,是因为数组下标是从0开始的.
int ball_16[33] = { 0 } 定义数组,下标 0 – 32代表 前6位的 1 – 33 号球,数组值全部初始0,当我们遍历数组第一个数是 8, 数组下标0开始,所以,要对8 – 1 操作, 将7做为数组下标: ball_16[ 7 ] = 0, 我们再通过循环遍历 到数组 下标是 7的时候 ,我们只需要为这个 下标是 7 的做+1操作,就可以统计多少期这个 8 出现多少次了, ball_16[ 7 ] += 1.
实例:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
using namespace std;
#define NUM 7 // 7个球
#define SUM 33 // 1 - 33号球
bool statNum(const char* path, int ball_16[],int ball_16_r[], int len);
int main(void) {
string filename;
int ball_16[SUM] = { 0 }; //统计红球
int ball_16_r[SUM] = { 0 }; //统计蓝球
cout << "请输入文件名:\n";
cin >> filename;
if (statNum(filename.c_str(), ball_16,ball_16_r, SUM)) {
cout << "红球统计:" << endl;
for (int i = 0; i < SUM; i++) {
cout << "第 " << setw(2) << i + 1 << " 球出现次数: " << ball_16[i] << endl;
}
cout << "蓝球统计:" << endl;
for (int i = 0; i < SUM; i++) {
cout << "第 " << setw(2) << i + 1 << " 球出现次数: " << ball_16_r[i] << endl;
}
}
else {//统计出错
cerr << "统计错误" << endl;
}
system("pause");
return 0;
}
bool statNum(const char* path, int ball_16[], int ball_16_r[], int len) {
int result[NUM] = { 0 };
int i = 0;
ifstream file;
if (!path) {
cerr << "文件名错误,请检查" << endl;
return false;
}
file.open(path);
if (file.fail()) {
cerr << "文件打开失败,请检查" << strerror(errno) << endl;
return false;
}
//读取数据到数组,一行7个球
do {
i = 0;
for (i = 0; i < NUM; i++) {
//将文件数据写入数组
file >> result[i];
//读取文件中字符,当遇到结束符EOF,也就是结尾时.
if (file.eof()) {
break;
}
if (file.fail()) {
cerr << "文件读取失败,原因:" << strerror(errno) << endl;
break;
}
//cout << " " << result[i] << endl;
}
//开始定义i = 0; 到所有数据都读完后,file >> result[i]还会往下找
//完全都完,i就会等于0,找不到数据
if (i == 0) break;
//小于7个号码,报错,数据有问题
if (i < NUM) {
cerr << "仅读到" << i << "个记录,原因:" << strerror(errno) << endl;
file.close();
return false;
}
//成功的话,打印结果
for (i = 0; i < NUM; i++) {
cout << " " << result[i];
}
cout << endl;
//对读入的数据进行统计,NUM - 1,统计红球
for (i = 0; i < NUM - 1; i++) {
int index = *(result + i) - 1;
if (index >= 0 && index < len) {
*(ball_16 + index) += 1;
//(*(ball_16 + index))++; //第二种写法
}
}
//统计蓝球
for (i = NUM - 1; i < NUM; i++) {
int index = *(result + i) - 1;
if (index >= 0 && index < len) {
*(ball_16_r + index) += 1;
}
}
} while (1);
file.close();
return true;
}
奇牛学院