C++實現隨機點名器(支持文件讀入、手動輸入、不重複點名)

目錄一覽

一.使用效果​​​

二.代碼分析\功能分解

1.copyright(製作說明模塊)

2.input(選擇/輸入模塊)

3.work(核心工作點模塊)

4.main(主函數)

三.完整源碼\資源下載



一.使用效果




 



二.代碼分析\功能分解

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函數)---核心

  1. time函數
    使用時需要包含頭文件<time.h>
    函數原型: time_t time(time_t *timer)
    time(0)的返回的是從1970 UTC Jan 1 00:00到當前時刻的秒數,爲unsigned int類型
  2. srand函數
    使用時需要包含頭文件<stdlib.h>
    函數原型:void srand(unsigned int seed);
    srand()爲初始化隨機數發生器,用於設置rand()產生隨機數時的種子。
    如果不調用srand()的話,默認爲srand(1),也就是seed是固定的,那麼多次運行固定seed的程序rand()所得到的結果是不變的
  3. 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),你的點贊是我莫大的動力~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章