用C语言编写一个随机点名程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C语言编写一个随机点名程序相关的知识,希望对你有一定的参考价值。

基本要求如下:
1. 学生名单存在一个文本文件students.txt 中(见附件),格式
学号 姓名
192101 李明
192102 王阳
……
2. 系统启动后,自动从文本文件中读取学生信息。每次选取(点击)相应功能,系
统随机抽取一个学生,显示给老师,用作点名。
用文本界面显示菜单,自行设计和完成菜单功能,供老师点选,可以考
虑动态显示系统选择的过程。考虑公平性,每个学生被点中的概率和次数尽量
一样,不能出现一个学生被点名两次了,还有学生没被点中的情况。
(可以使用另外一个文本文件,记录学生被点名的次数,或者在students.txt 文件
加入一个记录学生被点名次数的字段)
急求!!!

例:

#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%。

参考技术A #include<stdio.h>
#include <stdlib.h>
#include <time.h>
#define STU_NUM_MAX 4
struct StudentInfo // 学生信息结构

char name[15];
int stu_id;
stu[STU_NUM_MAX];

void WriteData() //写入学生信息

FILE *fp;
int stu_num=4;

for (int i=0;i<stu_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't open file\n");
exit(1);

for (int j=0;j<stu_num;j++)

if(fwrite(&stu[j],sizeof(struct StudentInfo),1,fp)!=1)
printf("Error writing file.\n");

fclose(fp);

void TeacherDM(int stuID) // 教师点名

FILE *fp;
bool find_mark=false;

printf("\n\t%s\t\t%s\n","学号","姓名");
if((fp=fopen("myfile.dat","rb"))==NULL)

printf("Can't open file\n");
exit(1);


int i=0;
do

fseek(fp,i*sizeof(struct StudentInfo),SEEK_SET);
fread(&stu[i],sizeof(struct StudentInfo),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);

void main(void)

int stuID[4]=2013011001,2013011002,2013011003,2013011004;
//WriteData();
srand((unsigned)time(NULL));//随机种子
TeacherDM(stuID[rand()%(3-0+1)+0]);

用python做一个随机点名程序(不重复点名)

用python做一个简单的随机点名程序(不重复点名)

这是我来到csdn的第一篇文章,内容如果有瑕疵的地方或者代码可以进一步改善,请大家对我指点一二。谢谢!
废话不多说,上代码!

import random               #导入随机模块
import pyttsx3              #导入第三方语音模块
listen = pyttsx3.init()     #初始化一个变量

txt_path = input('请输入txt文件的path:')		#使用者输入名单文件的路径(名单文件为txt,一行只能有一个姓名,姓名必须在行首不能有空格)
txt = open(f'{txt_path}','r',encoding='utf-8')		#打开名单文件
name_list = []								#创建空列表用于存储名单
for i in txt:								#for循环遍历
    i = i.replace('\\n','')					#处理字符串将换行符去掉
    name_list.append(i)						#添加到姓名列表里

print(name_list)							#打印名单


txt.close()									#关闭名单文件

while True:									#永真无限循环
    if len(name_list) == 0:					#当名单里所有人都被点到过一次时结束
        print('结束')
        break
    r_num = random.randint(0, len(name_list) - 1)	#创建随机数
    a = input('输入b退出,其他值继续:')		#让用户选择继续点名还是退出点名
    if a == 'b':							#当用户输入b退出即退出
        print('结束')
        break
    else:									#否则就开始随机点名
        print(f'本次被点到名的是:{name_list[r_num]}')
        listen.say(f'{name_list[r_num]}')	#输出姓名语音
        listen.runAndWait()					#运行语言
        name_list.pop(r_num)				#将点过名的去除掉以防重复
        print()								#间隔作用

将代码分割成四部分
、导入模块
需要两个模块,一个内置模块一个第三方模块分别是:random、pyttsx3(这个是第三放模块,需要安装).

import random
import pyttsx3

、用户输入名单文件,并且用程序加工一下

txt_path = input('请输入txt文件的path:')		#使用者输入名单文件的路径(名单文件为txt,一行只能有一个姓名,姓名必须在行首不能有空格)
txt = open(f'{txt_path}','r',encoding='utf-8')		#打开名单文件
name_list = []								#创建空列表用于存储名单
for i in txt:								#for循环遍历
    i = i.replace('\\n','')					#处理字符串将换行符去掉
    name_list.append(i)						#添加到姓名列表里

print(name_list)							#打印名单

txt.close()

用户要输入名单文件的路径
例如
这时我们运行一下程序,将名单的路径输入看看效果

、使用pyttsx3模块

listen = pyttsx3.init()
listen.say('输出语音')
listen.runAndWait()     #开始输出语音

注意pyttsx3模块是要自己下载的,下载方式就是在cmd里输入pip install pyttsx3这个命令即可

、随机开始

while True:									#永真无限循环
    if len(name_list) == 0:					#当名单里所有人都被点到过一次时结束
        print('结束')
        break
    r_num = random.randint(0, len(name_list) - 1)	#创建随机数
    a = input('输入b退出,其他值继续:')		#让用户选择继续点名还是退出点名
    if a == 'b':							#当用户输入b退出即退出
        print('结束')
        break
    else:									#否则就开始随机点名
        print(f'本次被点到名的是:{name_list[r_num]}')
        listen.say(f'{name_list[r_num]}')	#输出姓名语音
        listen.runAndWait()					#运行语言
        name_list.pop(r_num)				#将点过名的去除掉以防重复
        print()								#间隔作用

随机点名是根据创建随机数然后名单根据随机数索引来达到随机的效果。
。。

这就是我做的一个简单的随机点名程序。本人是一名初学者,如果代码有问题或者可以改进请大家指点出来,谢谢!

以上是关于用C语言编写一个随机点名程序的主要内容,如果未能解决你的问题,请参考以下文章

c语言 随机点名

C语言随机数序列编程:用C语言程序编写。生成随机数序列。范围:1-15要求生成1-15的随机序列,中间无重复

如何用C语言编写个1到100的随机取数程序

一道C语言作业题,让你编写随机生成10以内的整数,并且自己输入计算结果的程序,我编写了一些,求教!!

使用C语言编写猜数字问题

c语言如何随机输出同学名字?