c语言 随机点名

Posted

tags:

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

要求如下1、生成随机数n(1〜64)
2、有一文件A 格式为:
01 张三三
02 李四四四(即有四字名称)
••••••
64 王一(即有2字名称)
抽取到的随机数n为学号 显示出对应学生名,同时将结果保存到文件b中
3、出现过的人名不再出现
我测试后运行良好会再加50分〜60分

#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#define STU_NUM_MAX 64 // 假设最多有64个学生
struct Student  

char name[10];
int  stuID;
stu[STU_NUM_MAX];
int exist[STU_NUM_MAX]; // 用以保存被点过名
static int index=0; // 记住点名的次数 
void Iitialize()
for(int i=0;i<STU_NUM_MAX;i++) exist[i]=0;

bool IsExist(int id)
for(int i=0;i<STU_NUM_MAX;i++)
if(exist[i]==id) return true; //已存在
return false; // 不存在

void Add() // 添加数据

FILE *fp;
int stu_num;
printf("\\t\\t You want to input the number of student?:");
scanf("%d",&stu_num);
for (int i=0;i<stu_num;i++)
printf("\\n");
printf("\\t\\tPlease input student ID:");
    scanf("%d",&stu[i].stuID);
printf("\\t\\tPlease input student name:");
scanf("%s",stu[i].name);
fflush(stdin);

if((fp=fopen("stu.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 Student),1,fp)!=1) 
printf("Error writing file.\\n");

   fclose(fp); 

void rollcall() // 随机点名

FILE *fp;
    if((fp=fopen("stu.dat","rb"))==NULL)

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

srand((unsigned)time(NULL));
int i=0;
int randID=rand()%(64-1+1)+1; // 1~64
printf("\\t\\t随机点到的学号为:%d\\n\\t\\t%s\\t%s\\n",randID,"StuID","StuName"); 
do

        fseek(fp,i*sizeof(struct Student),SEEK_SET); 
if(fread(&stu[i],sizeof(struct Student),1,fp)) 

if(stu[i].stuID==randID&&!IsExist(randID))
   printf("\\t\\t%4d\\t%5s\\n",stu[i].stuID,stu[i].name);
               exist[index++]=randID;
   break;

  i++;
while(!feof(fp));

fclose(fp);

int main()

int select=0;
char answer='y';
Iitialize();
do 

printf("1.添加数据 2.随机点名 3.退出\\n请选择:");
fflush(stdin);
scanf("%d",&select);
switch(select)

case 1:
Add();
break;
case 2:
rollcall();
break;
case 3:
 return 0;

fflush(stdin);
printf("You want to continue?:");
scanf("%c",&answer);

 while (answer=='y'||answer=='Y');

return 0;

上面的代码,我留下几个细节问题留给你自己学着解决,都是很简单的:

    上面的代码,我没有对重复的学号作判断。

    上面的代码,我没有把点名存放到另一个文件,而是用数组替代(可以实现的也很简单)。我怕写得代码太多,百度限制提交。

    上面的代码,是测试数据,stu.dat目标文件并没有64个学生,我只写入了12条数据。

    上面的代码,我没有对数据数量(最多64条)作判断。

追问

我想问一下 对重复的学号做判断要怎么做 用if检测吗
这个程序能否做到 在关闭一次后重新打开依然不重复
谢谢

追答

由于代码较长百度限制了提交,我下面截图给你看:

参考技术A 好简单的程序,解决的方法很清晰,不过没时间做追问

帮个忙吧,这不用半小时的

java 用集合完成随机点名器和库存管理案例

一 随机点名器

1.案例需求

随机点名器即在全班同学中随机的找出一名同学打印这名同学的个人信息

我们来完成随机点名器,它具备以下3个内容:

  存储所有同学姓名

  总览全班同学姓名

  随机点名其中一人,打印到控制台

2.案例分析

全班同学中随机的找出一名同学打印这名同学的个人信息

我们对本案例进行分析,得出如下分析结果:

  1.存储全班同学信息(姓名、年龄)

  2.打印全班同学每一个人的信息(姓名、年龄)

  3.在班级总人数范围内,随机产生一个随机数查找该随机数所对应的同学信息(姓名、年龄)

  随机点名器明确地分为了三个功能。如果将多个独立功能的代码写到一起,则代码相对冗长,我们可以

针对不同的功能可以将其封装到一个方法中,将完整独立的功能分离出来。

  而在存储同学姓名时,如果对每一个同学都定义一个变量进行姓名存储,则会出现过多孤立的变量,很

难一次性将全部数据持有。此时,我们采用ArrayList集合来解决多个学生信息的存储问题。

3.代码:

 

import java.util.*;
class  Demo02
{
    public static void main(String[] args) 
    {    //储存全体学生的信息
        ArrayList<String> stuname = new ArrayList<String>();
        stuname.add("姓名:张三,年龄:99");
        stuname.add("姓名:李四,年龄:100");
        stuname.add("姓名:王五,年龄:77");
        stuname.add("姓名:赵六,年龄:50");
        stuname.add("姓名:孙七,年龄:60");
        //总览全体同学信息
        for (int i = 0;i<stuname.size() ;i++ ){
            System.out.print(stuname.get(i)+"  ");
        }
        System.out.println();
        //随机点名
        Random ra = new Random();
        int r = ra.nextInt(stuname.size());
        System.out.println(stuname.get(r));
    }
}

 

二 库存管理案例

1.案例需求

 

 

打印库存清单功能

库存商品数量修改功能

退出程序功能

2.代码:

import java.io.*;
import java.util.Scanner;
import java.util.ArrayList;
class HomeWork0630 
{
    public static void main(String[] args)throws IOException
    {
        menu();
    }
    public static void show(){
        System.out.println("------库存管理------");
        System.out.println("1.查看库存清单");
        System.out.println("2.修改商品库存数量");
        System.out.println("3.退出");
        System.out.println("请输入要执行的操作序号:");
    }
    public static void menu()throws IOException{
        Scanner sc = new Scanner(System.in);
        ArrayList<String> brand =new ArrayList<String>();
        ArrayList<Double> sizee =new ArrayList<Double>();
        ArrayList<Double> price =new ArrayList<Double>();
        ArrayList<Integer> num =new ArrayList<Integer>();
        brand.add("MacBookAir");
        brand.add("ThinkpadT450");
        brand.add("ASUS-FL5800");
        sizee.add(13.3);
        sizee.add(14.0);
        sizee.add(15.6);
        price.add(6988.88);
        price.add(5999.99);
        price.add(4999.5);
        num.add(5);
        num.add(10);
        num.add(18);
        while(true){
        show();
        int s = sc.nextInt();
        switch(s){
            case 1:
                look(brand,sizee,price,num);
                break;
            case 2:
                change(brand,num);
                break;
            case 3:
                return;
            default:
                System.out.println("输入有误请重新输入!");
        }
        }
    }
    public static void look(ArrayList<String> brand,ArrayList<Double> sizee,ArrayList<Double> price,
        ArrayList<Integer> num)throws IOException{
            System.out.println("----------商城库存清单----------");
            System.out.println("品牌型号\\t尺寸\\t价格\\t库存数");
            for (int i=0;i<brand.size() ;i++ ){
                System.out.println(brand.get(i)+"\\t"+sizee.get(i)+"\\t"+price.get(i)+"\\t"+num.get(i));
            }
            System.out.println("--------------------------------");
            int sum = 0;
            for (int i = 0;i<brand.size() ;i++ ){
                sum+=num.get(i);
            }
            System.out.println("总库存数:"+sum);
            double sum2 = 0;
            for (int i = 0;i<brand.size() ;i++ ){
                sum2+=num.get(i)*price.get(i);
            }
            System.out.println("库存商品总金额:"+sum2);
            System.out.println("输入回车键返回主菜单");         
            if(new InputStreamReader(System.in).read() == 13){
                return;
            }
        }
        public static void change(ArrayList<String> brand,ArrayList<Integer> num){    
                Scanner sca = new Scanner(System.in);
                while(true){
                System.out.println("-------------库存表-------------");
                System.out.println("序号\\t品牌型号\\t库存数");
                for (int i=0;i<brand.size() ;i++ ){
                    System.out.println(i+1+"\\t"+brand.get(i)+"\\t"+num.get(i));
                }
                System.out.println("--------------------------------");
                System.out.println("请根据上表输入需要改库存商品的序号,按0返回主界面:");    
                int s = sca.nextInt();
                int num1=0;
                    if ((s-1)<brand.size()&&s>0){
                        System.out.println("请输入修改后的内存数:");
                        num1=sca.nextInt();
                        num.set(s-1,num1);
                        System.out.println("修改成功!结果为:");
                        System.out.println("-------------库存表-------------");
                        System.out.println("序号\\t品牌型号\\t库存数");
                        for (int i=0;i<brand.size() ;i++ ){
                        System.out.println(i+1+"\\t"+brand.get(i)+"\\t"+num.get(i));
                          }
                        System.out.println("--------------------------------");
                        while(true){
                            System.out.println("是否继续修改:按1继续,按0返回主菜单");
                            int b = sca.nextInt();                            
                            if (b==1){
                                break;
                            }else if(b==0){
                                return;
                            }else{
                                System.out.println("您的输入有误请重新输入!");    
                            }
                        }
                    }else if(s==0){
                        return;
                    }else{
                        System.out.println("您的输入有误请重新输入!");        
                    }
                }        
        }
}

 

以上是关于c语言 随机点名的主要内容,如果未能解决你的问题,请参考以下文章

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

C语言随机数字

C语言问题求解! 为啥会输出随机数

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

C语言中获得随机数的方法

C语言随机数问题