目录一览
一.使用效果
![](https://i-blog.csdnimg.cn/blog_migrate/b48c0ad4cfebe9bb574dd2357ca4d5c0.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/8a7bf887b71a18962025d273bb5e53c4.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/a128d2bfc6dce906c35509746e44b8a5.jpeg)
二.代码分析\功能分解
1.copyright(制作说明模块)
①Sleep函数
使用时需要包含头文件<windows.h>
函数原型:void Sleep(DWORD ms);
Sleep()里面的单位,是以毫秒为单位,所以如果想让函数滞留1秒的话,应该是Sleep(1000)。
copyright模块功能:声明版权或者制作说明
-代码
inline void copyright()
{
cout<<"Program Name: Random Name.\n";
cout<<"Improver: DS\n";
Sleep(500);
cout<<"Get ready.\n"<<endl;
//Sleep(1000);
}
2.input(选择/输入模块)
①fopen函数
使用时需要包含头文件<stdio.h>或者<cstdio>
函数原型:FILE *fopen(const char *filename, const char *mode);
调用方式:fopen(文件名,使用文件方式)
本程序中使用文件方式有:r(只读)、w+(读和写--指定文件不存在时建立新文件)
②rewind函数
使用时需要包含头文件<stdio.h>或者<cstdio>
函数原型:void rewind(FILE *fp);
功能: 用rewind函数可以使文件位置标记指向文件开头
input模块功能:可以选择输入若干名字的方式,1表示可以直接读取文件;2表示直接在控制台输入若干名字
-代码
inline void input()
{
cout<<"Welcome OVO~\n\n输入1为读取文件(.txt), 输入2为手动输入若干名字.\n";
cin>>temp;
getchar();
if(temp == 1) { //导入txt文本文件
cout<<"请输入文件名:\n";
cin.getline(filename,MAXN);
fp=fopen(filename,"r"); //读入文本文件
if(fp==NULL) {
cout<<"无法打开文件!\n";
exit(0);
}
}else{ //手动输入名字
cout<<"输入几个名字(名字间以空格分隔, 以-1结束):\n";
fp=fopen("Test111.txt","w+");
cin>>namestr;
while(namestr[0] != '-') {
fputs(namestr,fp);
fputc('\n',fp);
cin>>namestr;
}
rewind(fp);//使文件位置标记返回文件开头
}
puts("Everything is ready.\n");
}
3.work(核心工作点模块)
①fgets函数
使用时需要包含头文件<stdio.h>或者<cstdio>
函数原型:char *fgets(char *str, int n, FILE *stream);
调用形式: fgets(str, n, fp)
功能: 从fp指向的文件读入一个长度为(n-10)的字符串(因为最后一个放'\0'),存放到字符数组str中
②sscanf函数
使用时需要包含头文件<stdio.h>或者<cstdio>
函数原型:int sscanf(const char *buffer , const char *format , [argument ]...);
功能:从一个字符串中读进与指定格式相符的数据的函数,即sscanf会从buffer里读取数据,依照format的格式将数据写入到argument里
③getch函数
使用时需要包含头文件<conio.h>
函数原型:int getch(void)
功能:从控制台读取一个字符,但不显示在屏幕上,此程序用这个来判断用户是否按下空格以决定是否开始输出随机名
④随机数产生函数(time函数、srand函数 和 rand函数)---核心!
- time函数
使用时需要包含头文件<time.h>
函数原型: time_t time(time_t *timer)
time(0)的返回的是从1970 UTC Jan 1 00:00到当前时刻的秒数,为unsigned int类型 - srand函数
使用时需要包含头文件<stdlib.h>
函数原型:void srand(unsigned int seed);
srand()为初始化随机数发生器,用于设置rand()产生随机数时的种子。
如果不调用srand()的话,默认为srand(1),也就是seed是固定的,那么多次运行固定seed的程序rand()所得到的结果是不变的 - rand函数
使用时需要包含头文件<stdlib.h>
函数原型:int
rand
(
void);
rand()函数不需要任何参数,直接返回一个随机数,注意,这个随机数是有范围的,在0~RAND_MAX之间,RAND_MAX一般最小取值为32767,其具体值在头文件stdlib.h中进行定义
④实现防止重复抽取功能
while(occupy[randnum]) randnum=rand()%cnt;
occupy[randnum]=true;
work模块功能:实现读入名字信息和随机抽取不重复的人名
-代码
inline void work()
{
while(fgets(line,sizeof(line),fp)) if(line[0]!='\n'&&line[0]!=' ') sscanf(line,"%s\n",info[cnt++].name);//input information
cout<<"按下空格生成一个随机名字,按其它键则退出程序.\n";
srand(time(0));//time(0)的返回的是从1970 UTC Jan 1 00:00到当前时刻的秒数,为unsigned int类型
while((ch=getch())==' ') //实现随机功能的核心部分!
{
int randnum=rand()%cnt; //产生随机数randnum
while(occupy[randnum]) randnum=rand()%cnt; //实现防止重复抽取功能
occupy[randnum]=true;
printf("%s\n",info[randnum].name);
system("pause");//从程序里调用“pause”命令。
if(++num==cnt)
{
puts("~Program has been exited.\n");
puts("~Thank you for your using.\n");
return ;
}
}
}
4.main(主函数)
-代码
int main()
{
copyright();//Production instructions 制作说明模块
input();//Input module 输入模块
work();//Core work points 核心工作点模块
fclose(fp);//关闭数据文件
return 0;
}
三.完整源码\资源下载
欢迎去我的资源进行下载(有源码和exe),你的点赞是我莫大的动力~
传送门:随机点号器 v1.0