本文目錄一覽:
跪求c語言上課隨機點名程序設計
#includestdio.h
#includestdlib.h
#includetime.h
#defineSTU_NUM_MAX4
structStudentInfo//學生信息結構
{
charname[15];
intstu_id;
}stu[STU_NUM_MAX];
voidWriteData()//寫入學生信息
{
FILE*fp;
intstu_num=4;
for(inti=0;istu_num;i++)
{
printf("請輸入第%d個學生的姓名:",i+1);
scanf("%s",stu[i].name);
printf("請輸入第%d個學生的學號:",i+1);
scanf("%d",stu[i].stu_id);
}
if((fp=fopen("myfile.dat","ab"))==NULL)
{
printf("Can'topenfile\n");
exit(1);
}
for(intj=0;jstu_num;j++)
{
if(fwrite(stu[j],sizeof(structStudentInfo),1,fp)!=1)
printf("Errorwritingfile.\n");
}
fclose(fp);
}
voidTeacherDM(intstuID)//教師點名
{
FILE*fp;
boolfind_mark=false;
printf("\n\t%s\t\t%s\n","學號","姓名");
if((fp=fopen("myfile.dat","rb"))==NULL)
{
printf("Can'topenfile\n");
exit(1);
}
inti=0;
do
{
fseek(fp,i*sizeof(structStudentInfo),SEEK_SET);
fread(stu[i],sizeof(structStudentInfo),1,fp);
if(stu[i].stu_id==stuID)
{
printf("\t%4d\t%s\n",stu[i].stu_id,stu[i].name);
printf("\n\n\t請【%s】同學回答某某問題.\n",stu[i].name);
find_mark=true;
break;
}
i++;
}while(!feof(fp));
if(!find_mark)printf("\n\t\t未能找到學生號為:%d的記錄!\n",stuID);
fclose(fp);
}
voidmain(void)
{
intstuID[4]={2013011001,2013011002,2013011003,2013011004};
//WriteData();
srand((unsigned)time(NULL));//隨機種子
TeacherDM(stuID[rand()%(3-0+1)+0]);
}
運行效果截圖:
另外多說一句,你所說的公正性,是不是指被點名過的同學不會再次被隨機點名到。如果是這個意思,那麼你可以通過數組來設置它,即把點名過的同學的學號或姓名保存到一維數組裡,隨機判斷時只需循環檢查下該同學是否已被點名過。這裡就留給你做了。
用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%。
隨機點名程序設計 C語言編程
設置一個足夠大的隨機池,給每一個學生分配相同的空間,然後利用隨機數來選取被點名的學生,同時對該學生所分配的空間和其他學生的空間進行縮減或增加。然後執行下一輪。
大致思路就是這樣,希望能夠幫到你哦~
c語言 隨機點名
「為了公平起見,我們決定做一個隨機點名小程序」不是說你們決定做一個小程序嗎?為什麼不自己做呀?沒有必要一個班的學生都沒有能力編寫一個這種簡單程序吧
百度知道並不是一個提交結果的平台,所謂知道就是將知識貢獻,讓大家獲得啟發,不是給人當奴隸幹活!
求c語言班級點名程序,高手們來幫幫忙啊
#include stdio.h
#include stdlib.h
#include time.h
typedef struct Student
{
char name[20];
bool IsRead;
}Student;
int main()
{
int i;
int select;
int mark=1;
//下面中你還可以加入一些學生,記得初始化的IsRead都是false
Student student[]=
{
{"張三",false},
{"李四",false},
{"王五",false},
{"劉六",false},
{"趙七",false}
};
printf("歡迎進入點門系統,以下是全班的花名冊:\n");
for (i=0;isizeof(student)/sizeof(Student);i++)
printf("%s ",student[i].name);
printf("\n");
do
{
printf("請選擇:\n1.點名\n2.顯示沒有點到的學生名字\n3.退出點名系統\n");
scanf("%d",select);
system("cls");//如果是Linux系統,把cls改成clear。如果是其他系統請把這行注釋掉,清頻
if(1==select)
{
mark = 1;
while (1)
{
for(i=0;isizeof(student)/sizeof(Student);i++)
mark=mark*(student[i].IsRead? 1:0);
if(mark)
{
printf("你已經把全班點了個遍\n");
break;
}
srand(time(NULL));
i = rand()%(sizeof(student)/sizeof(Student));
if(!student[i].IsRead)
{
printf("點名:%s\n",student[i].name);
student[i].IsRead = true;
break;
}
}
}
else if (2==select)
{
for(i=0;isizeof(student)/sizeof(Student);i++)
{
if(!student[i].IsRead)
printf("%s ",student[i].name);
}
printf("\n");
}
else if(3==select)
{
printf("謝謝使用\n");
return 0;
}
}while(true);
return 0;
}
這可是我一個字一個字的打出來的,專門為你寫的!~
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/288996.html