【C/C++每日一题】手机号码抽奖问题-对数据文件的操作与文件流

目录

问题描述:

任务一、生成手机号

方法一、使用C兼容,生成七位随机数

方法二 、使用C兼容,循环生成七位数

方法三、使用C++,循环生成7位数

任务二、抽奖程序的编写

代码程序

测试截图(共两次)

难点分析


问题描述:

1、编程生成文本文件data.txt,文件内容是10个手机号码(手机号码前4位为1871,
后面随机生成)(尝试用多种方式实现)
2、编程:从文本文件data.txt中读取抽奖者的个人信息 (尝试用多种方式实现)
3、预设一、二、三等奖的人数(一等奖 1 名、二等奖 2 名、三等奖 5名)
4、按下任意键开始抽奖,并把中奖人的手机号显示在屏幕上,反复抽出一、二、三
等奖。如果抽完就不能再抽。
分析:
为保证抽奖的公正性,要使用随机函数生成获奖者。
抽奖者不能重复获奖。

任务一、生成手机号

方法一、使用C兼容,生成七位随机数

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void generate(const char* filename, int count) {
FILE* file = fopen(filename, "w");
if (file == NULL) {
perror("Error opening file");
return;
}
srand(time(NULL)); // 初始化随机数种子
for (int i = 0; i < count; ++i) {

    int number = rand() % 90000000 + 10000000; // 生成7位随机数

    fprintf(file, "1871%07d\n", number);

}
fclose(file);
}
int main() {
generate("data.txt", 10);
printf("Phone numbers have been generated and written to data.txt\n");
return 0;
}

运行结果截图

可以发现,使用这种方法产生的7位随机数,除开头1871外,前三位均为100,通过查阅相关网站和资料,了解到这是因为rand函数所产生随机数的范围为0—32767,最大只有5位,因此这种方法存在一定的问题

详情参见:C语言中生成随机数函数_c语言随机数函数-CSDN博客文章浏览阅读3.9w次,点赞78次,收藏255次。文章目录前言一、产生随机数二、具体分析1.rand函数(1)范围(2)对应头文件2.sand函数3.整合总结前言本文主要详细介绍如何在C语言中生成随机数。一、产生随机数我们先看一个示例:产生一个随机数并在屏幕上输出#include#include#includeint main(){srand((unsigned int)time(NULL));int ret=rand() % 1.._c语言随机数函数https://blog.csdn.net/m0_53689542/article/details/120810761

方法二 、使用C兼容,循环生成七位数

方法二对方法一存在的问题做了改善

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void generate(const char* filename, int count) {
    FILE* file = fopen(filename, "w");
    if (file == NULL) {
        perror("Error opening file");
        return;
    }
    srand(time(NULL)); // 初始化随机数种子
    for (int i = 0; i < count; ++i) {
        int number = 0;
        // 循环生成7位随机数
        for (int j = 0; j < 7; ++j) {
            number = number * 10 + (rand() % 10); // 生成0-9的随机数并累加
        }
        fprintf(file, "1871%07d\n", number);
    }
    fclose(file);}
int main() {
    generate("data.txt", 10);
    printf("Phone numbers have been generated and written to data.txt\n");
    return 0;
}

通过循环,每次生成0-9的个位数累加,同时包含了前导0,增大了随机性,非常完美

方法三、使用C++,循环生成7位数

#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
#include <iomanip>
void generate(const std::string& filename, int count) {
    std::ofstream file(filename.c_str()); 
    if (!file.is_open()) {
        std::cerr << "Error opening file" << std::endl;
        return;
   }
    std::srand(std::time(NULL)); // 初始化随机数种子
    for (int i = 0; i < count; ++i) {
        int number = 0;
        // 循环生成7位随机数
        for (int j = 0; j < 7; ++j) {
            number = number * 10 + (std::rand() % 10); // 生成0-9的随机数并累加
        }
        file << "1871" << std::setw(7) << std::setfill('0') << number << "\n";
    }
    file.close();
}
int main() {
    generate("data.txt", 10);
    std::cout << "Phone numbers have been generated and written to data.txt" << std::endl;
    return 0;

}

生成号码截图:

 此时生成的电话号码才是真正随机的

任务二、抽奖程序的编写

代码程序

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <ctime>
#include <cstdlib>
#include <string>
#include <sstream>
#include <vector>
#include <iomanip>
using namespace std;

//定义类
class People {
private:
    std::vector<int> c;
public:
    People() : c(11) {}
    void show();
    void set_data(const std::vector<int>& a);
};
//类外函数实现
void People::set_data(const std::vector<int>& a) {
    c = a;
}
void People::show() {
    for (unsigned int i = 0; i < c.size(); ++i) {
        std::cout << c[i];   }
    std::cout << std::endl;
}
/*-----抽奖函数------*/
int chose_number() {
    std::srand(std::time(0));
    return std::rand() % 10;
}

int raffle(std::vector<bool>& usedNumbers) {//这里也可以用静态函数,不过我用了bool类型的动态数组存储号码状态,false则表示未抽中
    while (true) {
        int t = chose_number();
        if (!usedNumbers[t]) {//已被选过的号码为!ture,不会进入循环,需要重新抽取
            usedNumbers[t] = true;
            return t;
        }
    }
}
//用上面写的程序撰写数据,生成电话号码
void data(const std::string& filename, int count) {
    std::ofstream file(filename.c_str());
    if (!file.is_open()) {
        std::cerr << "Error opening file" << std::endl;
        return;
   }
    std::srand(std::time(NULL)); // 初始化随机数种子
    for (int i = 0; i < count; ++i) {
        int number = 0;
        // 循环生成7位随机数
        for (int j = 0; j < 7; ++j) {
            number = number * 10 + (std::rand() % 10); // 生成0-9的随机数并累加
        }
        file << "1871" << std::setw(7) << std::setfill('0') << number << "\n";
    }
    file.close();
}
//抽奖准备
int main() {
    data("data.txt", 10);
    std::vector<People> a(10);  // 对象向量
    std::ifstream in("data.txt");
    std::string line;
    std::vector<int> tmp(11);
// 读数据,并装入数组
int index = 0; // 索引变量
while (std::getline(in, line)) {
    int i;
    for (i = 0; i < line.size() && i < tmp.size(); ++i) {
        tmp[i] = line[i] - '0';
    }
    a[index++].set_data(tmp);
}
    std::vector<bool> usedNumbers(10, false);
/*------抽奖过程------*/
	cout << "准备好获奖了吗?\n\n";
	system("pause");
	cout << "\n开始抽一等奖(1名)\n";
	system("pause");
	cout << "中奖号码为:";
	int t = raffle(usedNumbers); 
	a[t].show();
	cout << "\n开始抽二等奖(2名)\n";
	cout << "第1个二等奖,"; system("pause"); cout << "中奖号码为:"; t = raffle(usedNumbers); a[t].show();
	cout << "第2个二等奖,"; system("pause"); cout << "中奖号码为:"; t = raffle(usedNumbers); a[t].show();
	cout << "\n开始抽三等奖(5名)\n";
	for (int i = 0; i < 5; i++) {
		cout << "第" << i + 1 << "个三等奖, "; system("pause");
		cout << "中奖号码为:"; t = raffle(usedNumbers); a[t].show();
	}
 return 0;
}

测试截图(共两次)

难点分析

  1. 随机数生成
  2. 读取数据,抽奖过程的逻辑实现
  3. 使用了<vector>容器做对象(stl模板库)
  4. 程序运行速度较慢,可能是循环较多的原因
  • 34
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值