
可以, 你先用链表或数组(最好是用链表)存取学生数据,然后就进行文件写入(最好是存入二进制文件中dat 因为。txt文件我们可以人为的通过文件打开去修改数据 不安全)然后文件读取, *** 作点名函数,就这样。 至于你说的文件 *** 作不会,可以看书嘛,谭浩强C语言书讲的很清楚。也可以找课件。 汗还是等下面的说吧。
存在1个dat或txt文件就可以了
#include <stdioh>
#define N 50 // 排队人数(可任意更改)
#define CAL 3 //凡报3的人出列(可任意更改)
//下面是排队编号函数:从h 开始的n个人依次编号1到n
void stdline(int h,int n)
{
int i;
for(i=1;i<n+1;i++) (h+i-1)=i;
}
/下面函数表示从指针h处开始的人数为boy个人排队,从1报数,每报到call的人出列/
void outline(int h,int boy,int call)
{
int p, chu, callnum;
/说明:
p 工作指针,表示从头依次指向每个元素,点名
chu 计数器,记录出列的人数
callnum 计数器,记录点名次序
/
chu=0;
callnum=0;//各计数器清零
p=h; //开始时,工作指针指向数组首
printf("出列顺序是:\n");
while(chu<boy)
{
if(p!=0) callnum++; //每次加报数
if(callnum==call) //如果某一个人报到出列数call
{
printf("%5d",p); //打印编号,表示出列
chu++; //出列人数加1
if(chu==boy)//如果全部出列
{
h=p; //把最后一个出列人的编号记入地址开始处
return; //结束
}
if(chu%10==0)printf("\n");//每输出10个换行
callnum=0; //出列后,重新报数
p=0; //出列后,将其编号赋零,以示区别
}
p++; //工作指针移向下一个人,即下一个数组元素
if(p>h+boy-1)p=h;/如果移到最后一个元素的后面,则让指向地址开头继续报数/
}
}
void main()
{
int a[N]; //用数组模拟队列,每个元素代表一个人
stdline(a,N);//编号
outline(a,N,CAL);//计算并打印出列顺序
printf("\n最后留下来的是 %d 号\n",a);/在函数中,已经把最后一个人的编号写入了数组首地址处,
这里输出就可以了/
}
#include <stdioh>
#include <stdlibh>
#include <stringh>
#include <timeh>
#define MAXSTUDENT 100
char Name[MAXSTUDENT][16];
// 读文件内保存的学生姓名
int readName(const char fileName)
{
int pos, slen;
FILE fp = fopen(fileName, "r");
if(fp == NULL) return 0;
memset(Name, 0, sizeof(Name));
pos = 0;
while(!feof(fp) && pos < MAXSTUDENT)
{
fgets(Name[pos], 16, fp);
slen = strlen(Name[pos]);
if(slen > 0)
{
slen--;
while(Name[pos][slen] == 10 || Name[pos][slen] == 13) Name[pos][slen--] = 0; //去掉字符串后的换行符
pos++;
}
}
printf("读入%d人姓名\n", pos);
fclose(fp);
return pos;
}
void main()
{
char fileName[32];
int n, pos, loop;
char flag[100];
srand(time(NULL));
printf("请输入学生姓名文件名:");
scanf("%s", fileName);
n = readName(fileName);
if(n==0)
{
printf("读取错误,请确认文件%s是否名是否正确,文件的格式是否正确!\n", fileName);
return;
}
getchar();
memset(flag, 0, sizeof(flag));
while(1)
{
pos = rand() % n;
loop = 0;
while(flag[pos]) // 可以保证每个人都点到一次
{
if(++loop > n) memset(flag, 0, sizeof(flag));
pos = rand() % n;
}
flag[pos] = 1;
printf("点 %s", Name[pos]);
if(getchar() != 10) break;
}
}
查找:我认为,首先把txt文件存在硬盘上,最好在学生前面编上序号,完了用rand(srand)抽取号码。抽取完毕后,用号码对应用c语言函数fscanf查找号码所对应的学生姓名。
删除和添加可以直接在txt里进行。如果非要在程序中的话,用fprintf就可以实现了。
随机点名:从网上下载个汉语的发音包,用c调用即可。
rand(srand)用法:
计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。)
我们知道rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统。
1rand()
功能:随机数发生器
用法:int rand(void)
所在头文件: stdlibh
rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。
rand()返回一随机数值的范围在0至RAND_MAX 间。RAND_MAX的范围最少是在32767之间(int)。用unsigned int 双字节是65535,四字节是4294967295的整数范围。0~RAND_MAX每个数字被选中的机率是相同的。
用户未设定随机数种子时,系统默认的随机数种子为1。
rand()产生的是伪随机数字,每次执行时是相同的;若要不同,用函数srand()初始化它。
2srand()
功能:初始化随机数发生器
用法: void srand(unsigned int seed)
所在头文件: stdlibh
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 <stdlibh>
#include <timeh>
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函数选择
以上就是关于我现在要用c语言编一个课堂点名系统,怎么进行文件的读写呢各位路过的大侠帮忙啊~~~~全部的内容,包括:我现在要用c语言编一个课堂点名系统,怎么进行文件的读写呢各位路过的大侠帮忙啊~~~~、C语言例程、c语言课堂随机点名等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)