㈠ 課堂隨機點名系統(用C語言編寫)
沒有規矩不成方圓,如果沒有人翹課,教務處也不會要求點名。
學風一年不如一年。
㈡ 用C語言編寫一個隨機點名程序
例:
#include<stdio.h>/*standardinput&output*/
#include<stdlib.h>/*standardlibary*/
#include<string.h>/*string*/
#include<conio.h>/*ConsoleInput/Output*/
#include<time.h>
structstudentinfo/*學生信息的結構體*/
{
charsNo[5];/*學生編號*/
charsxueNo[14];/*學號*/
charsname[20];/*學生的姓名*/
}st[100];
charhash[100]={0};/*鏈表的數組*/
intmain()
{
inti=0,j=0,flag=0,RN,*a;
FILE*fp;
charch,filename[20]={0},line[100]={0};
printf("Pleaseinputfilename:");
//fflush(stdin);/*用來清空輸入緩存,以便不影響後面輸入的東西*/
gets(filename);/*鍵盤輸入文件名*/
fp=fopen(filename,"r");/*openreadonly*/
printf("名單如下:\n");/*顯示所有的學生信息*/
while(fgets(line,sizeof(line)-1,fp))
{
if(line[0]!='\n'&&line[0]!='')
{
sscanf(line,"%s%s%s\n",st[i].sNo,st[i].sxueNo,st[i].sname);/*文件輸入*/
printf("%s\n%s\n%s\n",st[i].sNo,st[i].sxueNo,st[i].sname);/*列印出來*/
i++;/*統計人數*/
}
}
/*設置隨機數種子*/
srand((unsigned)time(NULL));
/*sizeof(類型符)是計算類型所佔位元組數,sizeof(int)是int所佔位元組數,再乘以i,得到i個int型數據的總位元組數。malloc函數用於動態開辟一塊內存空間,參數為開辟的內存空間位元組數,返回開辟的內存空間的首地址指針。*/
a=(int*)malloc(sizeof(int)*i);
memset(a,-1,sizeof(a));/*將已開辟內存空間a的第4個位元組設置為-1*/
printf("按空格鍵點名,其他鍵退出:");
fflush(stdin);
while((ch=getch())=='')
/*while(!(ch=getch())==NULL)*/
{
if(flag==i)/*如果flag等於總人數*/
{
printf("%s\n","點名結束");
break;
}
RN=rand()%i;/*產生一個隨機數*/
while(hash[RN]==1)/*判斷有沒有完成某個一個學生點名*/
RN=rand()%i;/*產生隨機數*/
flag++;/*計數*/
printf("\n~~~~~\n%s\n%s\n%s\n------------\n",st[RN].sNo,st[RN].sxueNo,st[RN].sname);/*輸出學生的信息*/
hash[RN]=1;
}
}
printf函數使用注意事項
1、域寬
%d:按整型數據的實際長度輸出。
如果想輸出指定寬度可以指定域寬,%md-->m域寬,列印出來以後,在控制台上,顯示m位;
如果我們要列印的數的位數如果超過我們設定m則原樣輸出;
如果我們要列印的數的位數如果小於我們設定的位數,則補空白,具體如下:
如果m為正數,則左對齊(左側補空白);
如果m為負數,則右對齊(右側補空白)。
2、轉義字元
如果想輸出字元"%",則應該在「格式控制」字元串中用連續兩個%表示。
如:printf("%f%%",1.0/3);輸出結果:0.333333%。
㈢ 課堂隨機點名系統程序設計。
查找:我認為,首先把txt文件存在硬碟上,最好在學生前面編上序號,完了用rand(srand)抽取號碼。抽取完畢後,用號碼對應用c語言函數fscanf查找號碼所對應的學生姓名。
刪除和添加可以直接在txt里進行。如果非要在程序中的話,用fprintf就可以實現了。
隨機點名:從網上下載個漢語的發音包,用c調用即可。
rand(srand)用法:
計算機的隨機數都是由偽隨機數,即是由小M多項式序列生成的,其中產生每個小序列都有一個初始值,即隨機種子。(注意: 小M多項式序列的周期是65535,即每次利用一個隨機種子生成的隨機數的周期是65535,當你取得65535個隨機數後它們又重復出現了。)
我們知道rand()函數可以用來產生隨機數,但是這不是真正意義上的隨機數,是一個偽隨機數,是根據一個數(我們可以稱它為種子)為基準以某個遞推公式推算出來的一系列數,當這系列數很大的時候,就符合正態公布,從而相當於產生了隨機數,但這不是真正的隨機數,當計算機正常開機後,這個種子的值是定了的,除非你破壞了系統。
1.rand()
功能:隨機數發生器
用法:int rand(void)
所在頭文件: stdlib.h
rand()的內部實現是用線性同餘法做的,它不是真的隨機數,因其周期特別長,故在一定的范圍里可看成是隨機的。
rand()返回一隨機數值的范圍在0至RAND_MAX 間。RAND_MAX的范圍最少是在32767之間(int)。用unsigned int 雙位元組是65535,四位元組是4294967295的整數范圍。0~RAND_MAX每個數字被選中的機率是相同的。
用戶未設定隨機數種子時,系統默認的隨機數種子為1。
rand()產生的是偽隨機數字,每次執行時是相同的;若要不同,用函數srand()初始化它。
2.srand()
功能:初始化隨機數發生器
用法: void srand(unsigned int seed)
所在頭文件: stdlib.h
srand()用來設置rand()產生隨機數時的隨機數種子。參數seed必須是個整數,如果每次seed都設相同值,rand()所產生的隨機數值每次就會一樣。
3.使用當前時鍾作為隨機數種子
rand()產生的隨機數在每次運行的時候都是與上一次相同的。若要不同,用函數srand()初始化它。可以利用srand((unsigned int)(time(NULL))的方法,產生不同的隨機數種子,因為每一次運行程序的時間是不同的。
4.產生隨機數的用法
1) 給srand()提供一個種子,它是一個unsigned int類型;
2) 調用rand(),它會根據提供給srand()的種子值返回一個隨機數(在0到RAND_MAX之間);
3) 根據需要多次調用rand(),從而不間斷地得到新的隨機數;
4) 無論什麼時候,都可以給srand()提供一個新的種子,從而進一步「隨機化」rand()的輸出結果。
0~RAND_MAX之間的隨機數程序
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
srand((unsigned)time(NULL));
for(int i = 0; i < 10;i++ )
cout << rand() << '\t';
cout << endl;
return 0;
}
5.產生一定范圍隨機數的通用表示公式
要取得[a,b)的隨機整數,使用(rand() % (b-a))+ a;
要取得[a,b]的隨機整數,使用(rand() % (b-a+1))+ a;
要取得(a,b]的隨機整數,使用(rand() % (b-a))+ a + 1;
通用公式:a + rand() % n;其中的a是起始值,n是整數的范圍。
要取得a到b之間的隨機整數,另一種表示:a + (int)b * rand() / (RAND_MAX + 1)。
要取得0~1之間的浮點數,可以使用rand() / double(RAND_MAX)。
界面可用switch函數選擇
㈣ 如何製作點名系統
記錄所有需要點名人員的信息,後使用語音合成軟體進行語音讀取。如windows自帶的tts語音合成系統。或第三方tts產品。都可以實現這些功能。