【基于C语言的随机点名器】

在这里插入图片描述

【1】C语言-》控制台颜色绚丽多彩

0=黑色 8=灰色  
1=蓝色 9=淡蓝色   
2=绿色 10=淡绿色   
3=蓝色 11=浅绿色
4=红色 12=淡红色  
5=紫色 13=淡紫色   
6=黄色 14=淡黄色   
7=白色 15=亮白色

#include <stdio.h>
#include <windows.h>
void color(int x) //设置字体颜色
{
    
    
if(x>=0 && x<=15)
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);
else//其他白色
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
int main(){
    
    
color(6);   //在打印前设置颜色,6是黄色
printf("hello world!\n");
}

【2】C语言-》 printf 输出颜色花样百出

#include <stdio.h>
int main()
{
    
    
	printf("以下是测试文字:\n");
	printf("\033[0m默认文字\033[0m\n");
	printf("\033[1m高亮文字\033[0m\n");
	printf("\033[2m低亮文字\033[0m\n");
	//printf("\033[3m无效文字\033[0m\n");
	printf("\033[4m下划线文字\033[0m\n");
	printf("\033[5m闪烁文字(无效)\033[0m\n");
	//printf("\033[6m无效文字\033[0m\n");
	printf("\033[7m反显文字\033[0m\n");
	printf("\033[8m消隐文字(无效)\033[0m\n");

	printf("\n\033[31;1m字体颜色\033[0m测试文字\n");
	printf("\033[30m低亮黑色文字\033[0m\t\033[30;1m高亮黑色文字\033[0m\n");
	printf("\033[31m低亮红色文字\033[0m\t\033[31;1m高亮红色文字\033[0m\n");
	printf("\033[32m低亮绿色文字\033[0m\t\033[32;1m高亮绿色文字\033[0m\n");
	printf("\033[33m低亮黄色文字\033[0m\t\033[33;1m高亮黄色文字\033[0m\n");
	printf("\033[34m低亮蓝色文字\033[0m\t\033[34;1m高亮蓝色文字\033[0m\n");
	printf("\033[35m低亮紫色文字\033[0m\t\033[35;1m高亮紫色文字\033[0m\n");
	printf("\033[36m低亮浅蓝文字\033[0m\t\033[36;1m高亮浅蓝文字\033[0m\n");
	printf("\033[37m低亮白色文字\033[0m\t\033[37;1m高亮白色文字\033[0m\n");
	//printf("\033[38m测试文字\033[0m\n");
	//printf("\033[39m测试文字\033[0m\n");

	printf("\n\033[31;1m背景颜色\033[0m测试文字\n");
	printf("\033[40m低亮文字黑色背景\033[0m\t\033[40;1m高亮文字黑色背景\033[0m\n");
	printf("\033[41m低亮文字红色背景\033[0m\t\033[41;1m高亮文字红色背景\033[0m\n");
	printf("\033[42m低亮文字绿色背景\033[0m\t\033[42;1m高亮文字绿色背景\033[0m\n");
	printf("\033[43m低亮文字黄色背景\033[0m\t\033[43;1m高亮文字黄色背景\033[0m\n");
	printf("\033[44m低亮文字蓝色背景\033[0m\t\033[44;1m高亮文字蓝色背景\033[0m\n");
	printf("\033[45m低亮文字紫色背景\033[0m\t\033[45;1m高亮文字紫色背景\033[0m\n");
	printf("\033[46m低亮文字浅蓝背景\033[0m\t\033[46;1m高亮文字浅蓝背景\033[0m\n");
	printf("\033[47m低亮文字白色背景\033[0m\t\033[47;1m高亮文字白色背景\033[0m\n");
	//printf("\033[48m测试文字\033[0m\n");
	//printf("\033[49m测试文字\033[0m\n");

	return 0;
}

【3】C语言-》 随机点名试炼中

文件内容
studentname.txt

曹植
曹丕
小乔
孙尚香
曹操
诸葛亮
陆逊
周瑜
司马懿
张飞
刘备
关羽
庞统
袁绍
孙仲谋

#include<stdio.h>
#include<stdlib.h>
#include <windows.h>
#include <unistd.h>
#include<time.h>
char appear[15];//全局变量
int main()
{
    
      
	char ID[15][30];//存放.txt的字符二维数组
    bzero(ID,sizeof(ID));//清空
    FILE*fp;
    fp=fopen("studentname.txt","rb");//只读方式打开文件
    if(fp==NULL)//判断文件是否为空
    {
    
    
        printf("error opening file\n");
        exit(1);//退出程序  0正常退出  其他异常退出 
    }
    else //正常打开文件
    {
    
       printf("\033[45msuccessful opening file\033[0m\n");
        printf("\n");
        for(int i = 0; i<15; i++)
		{
    
    
			//将文件指针fp指向的数据,以字符串的格式存入ID[]数组
            fscanf(fp, "%s", ID[i]);//读取文本文件内容
        }     
    }
    fclose(fp);
   
  int number=1;
   //int number;
   printf("\033[36m你想抽取几位幸运者:\033[0m");
//方法1:
//    while (1)
//     {   scanf("%d",&number); //有输入部分就是  选做部分
//         getchar();

//         if( number == 0 || number< 1 || number > 15 )
//         {
    
    
//             printf("警告!请正确输入抽取数据!\n");
//             printf("请输入 1 ~ 15内的整数: ");
//         }
//         else break;
//     }

    int i,j;
    int t=50;
    int q[15];
    srand((unsigned) time(NULL));//time(NULL)1970/1/1 0点走过的秒数
    //产生不同的随机数
    for(i=0;i<26;i++)
    {
    
    
        for(j=0;j<number;j++) 
        {
    
    
            q[j]=rand()%15;//通过srand给rand配置不同的系数
            
            printf("        ");
            //强制刷新在屏幕
            fflush(stdout);//解决名字长度不一样的问题
            
            printf("\r%s",ID[q[j]]);//被点到的对象
            fflush(stdout);//stdout像一个行缓冲区
            
            //fflush 的作用就是直接把缓冲区的内容打印到屏幕上,并清空缓冲区。不必等换行符
           
        }
        printf("\r                                   \r");
        Sleep(t);//延迟
        t += 5;
    }
    for(int j=0; j<number; j++)
    {
    
    
        printf("\033[34m幸运者是:\033[0m\033[32m%s\033[0m\t",ID[q[j]]);//输出被点到的对象
        //重复刷新一行,新内容覆盖旧内容(不断闪烁不同名字)
        printf("\n");
    }
   return 0;
}

【4】C语言-》 随机点名项目实现

文件name.txt

艾琳
云樱
司空震

夏洛特
阿古朵
蒙恬

蒙犽
鲁班大师
李信
上官婉儿
嫦娥
猪八戒
盘古
云中君



马超
西施
沈梦溪
伽罗
盾山
司马懿
孙策
元歌
米莱迪
狂铁
弈星
裴擒虎
杨玉环
公孙离
明世隐
女娲
梦奇
苏烈
百里玄策
百里守约
鬼谷子
杨戬
雅典娜
蔡文姬
太乙真人
哪吒
诸葛亮
黄忠
大乔
东皇太一
干将莫邪
成吉思汗
钟馗
虞姬
李元芳
张飞
刘备
后羿
牛魔
孙悟空
亚瑟
姜子牙
刘邦
韩信
王昭君
兰陵王
花木兰
张良
不知火舞
娜可露露
橘右京
露娜
程咬金
安琪拉
貂蝉
关羽
老夫子
武则天
项羽
达摩
狄仁杰
芈月
吕布
周瑜
夏侯惇
甄姬
曹操
典韦
宫本武藏
李白
马可波罗
白起
扁鹊
孙膑
钟无艳
阿珂
高渐离
刘禅
庄周
鲁班七号
孙尚香
嬴政
妲己
墨子
小乔
廉颇
赵云

project.h

#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#define M 106       // 假设最多有 106 名同学

#define N "\033[0m"         // 清除 前面设置的格式

#define RED "\033[1;31;40m"  // 红色高亮
#define G "\033[1;32;40m"   // 绿色高亮
#define Y "\033[1;33;40m"   // 黄色高亮

// 函数的声明
bool isChinese();       // 判断输入是否为中文

bool isAppear(int id);  // 功能:判断该学号是否出现过

bool myPass();          // 功能:输入密码,如果输错超过 3 次就退出程序

int myGUI(int num);     // 功能:显示主界面

int b1(); // 功能:查看名单

int b2(); // 功能:修改名单

int b3(); // 功能:进行点名

// 定义全局变量
struct student      // 结构体数组
{
    
    
    unsigned char s[30];     // 用于存放每一个名字
    int id;         // 学号
} stu[M];

int appear[M];      // 用以保存出现过的学号

main.c

#include "project.h"
int main(int argc, char const *argv[])
{
    
    
    FILE *fp;       // 定义一个文件指针fp (file pointer)

    fp = fopen("name.txt", "r");     // 以 只读 方式打开 "name.txt"
    
    // 将名单存入 stu[k].s
    int k = 0;
    // feof(fp): 如果没到文件尾,则一直返回 0
    while ( !feof(fp) )//!1=0退出循环
    {
    
    
        fgets(stu[k++].s,sizeof(struct student),fp);//文件内容写进结构体
    }
    fclose(fp);     // 关闭 fp 指向的文件
    // 按照名单顺序设置 id
    for(int i=0; i<M; i++)
    {
    
    
        stu[i].id = i+1;    // id 从 1 开始
    }
    int num = 0;        // 定义输入的序号
    k = 1;              // 把 k 重置为 1
    if ( myPass() )         // 如果密码正确
    {
    
    
        while ( num != 4 )
        {
    
    
            switch ( num )
            {
    
    
            case 0:
                num = myGUI(num);   // 显示主界面
                break;
            case 1:
                num = b1();         // 查看名单
                break;
            case 2:     
                num = b2();         // 修改名单
                break;
            case 3:
                num = b3();         // 进行点名
                break;
            }
        }
    }
    return 0;
}
/*****************  分割线  *****************/

// 功能:判断输入是否为中文
bool isChinese(char *str)//返回0:无中文,返回1:有中文
{
    
    
   char c;
   while (1)
   {
    
    
        c = *str++;
        if (c==0) break;   //如果到字符串尾则说明该字符串没有中文字符
        if (c&0x80)        //如果字符高位为1且下一字符高位也是1则有中文字符
            if (*str & 0x80) return true;
   }
   return false;
}
/*****************  分割线  *****************/

// 功能:判断该学号是否出现过
bool isAppear(int id)
{
    
    
    for(int i=0; i<M; i++)
    {
    
    
        if(appear[i] == id) 
            return true;
    }
    return false;
}
/*****************  分割线  *****************/

// 功能:输入密码,如果输错超过 3 次就退出程序
bool myPass()
{
    
       
    char pw[7];         // 用于存放从 键盘 输入的密码
    printf("请输入密码:");
    for(int i=0; i<3; i++)
    {
    
    
        gets(pw);       // 输入密码
        if( strcmp(pw, "wzg666") == 0 )  // 将输入的密码 逐个 与"wzg666"比较
        {
    
    
            printf(G"密码输入正确!\n"N);
            return true;
        }
        else if( i<2 ) printf(RED"密码错误!你还有 %d 次机会\n请重新输入:"N, 2-i);
    }
    return false;
}
/*****************  分割线  *****************/

// 功能:显示主界面
int myGUI(int num)
{
    
    
    printf("|\t欢迎使用随机点名器!\t|\n");
    printf("|   1. 查看名单   2. 修改名单   |\n");
    printf("|   3. 进行点名   4. 退出程序   |\n");

    usleep(600*1000);       // 延时 600 ms
    while (1)
    {
    
    
        printf("请输入序号以执行相应功能:");
        int sc = scanf("%d", &num);
        getchar();

        if( sc == 0 || num < 0 || num > 4 )
            printf(RED"读取错误!\n"N);
        else break;
    }
    return num;
}
/*****************  分割线  *****************/

// 功能:查看名单
int b1()
{
    
    
    for(int i=0; i<M; i++)
        printf("| id: %03d | name: %s", i+1, stu[i].s);

    printf("\n");

    usleep(600*1000);
    return 0;
}
/*****************  分割线  *****************/

// 功能:修改名单
int b2()
{
    
    
    int id;
    printf("请输入需要修改的id: ");
    while (1)
    {
    
    
        int sc = scanf("%d", &id);
        getchar();

        if( sc == 0 || id < 1 || id > 106 )
        {
    
    
            printf(RED"读取错误!\n"N);
            printf("请输入 1 ~ 106 内的整数: ");
        }
        else break;
    }

    printf("原来的名字:%s", stu[id-1].s);   // id 是从 1 开始的
    printf("现在的名字:");                 // 因此对应的数组下标为 id-1
    
    while (1)
    {
    
    
        char *str = fgets(stu[id-1].s, 100, stdin);

        if( !isChinese(str) )
        {
    
    
            printf(RED"读取错误!\n"N);
            printf("请输入中文名字: ");
        }
        else break;
    }

    usleep(600*1000);
    return 0;
}
/*****************  分割线  *****************/

// 功能:进行点名
int b3()
{
    
    
    int x = 0;      // 用于存放人数
    printf("请输入要抽取的人数:");
    while (1)
    {
    
    
        int sc = scanf("%d", &x);
        getchar();

        if( sc == 0 || x < 1 || x > 106 )
        {
    
    
            printf(RED"读取错误!\n"N);
            printf("请输入 1 ~ 106 内的整数: ");
        }
        else break;
    }
    
    // 每循环一次,就获得一个随机数,这个随机数就是 id
    for(int i=1; i<=x; i++)
    {
    
    
        int t = 100*1000;                 // 设定延迟时间的初始值: 100ms
        time_t n = time(NULL);          
        srand(n);                       // 获得随机数种子
        int rand_id = rand() % (M+1);   // 取随机数范围: 0 ~ (M+1)

        // 只有当通过 随机数 产生的 rand_id 没有出现过的时候,
        // 才将那个 id 对应的名字输出
        // 否则 i--, 再继续上一次循环
        if( isAppear(rand_id) )
        {
    
    
            i--;
            continue;
        }
        appear[i] = rand_id;            // 将出现过的 随机学号 保存起来

        // 从名单的第 1 个名字开始,遍历数组,直至出现随机数对应的名字
        for(int j=1; j<=rand_id; j++)
        {
    
    
            char *find = strchr(stu[j].s, '\n'); // 查找 换行符
            if(find)                            // 如果 find 不为空指针
                *find = '\r';                   // 就使 光标 移到左边
            
            usleep(t);

            printf(G"第 %d 位:"N,i);

            if( j < (rand_id * 2/3) )   // 设置速度变化的节点
            {
    
    
                printf(RED"%+12s"N, stu[j].s);
                t -= 420;               // 延迟时间不断减少,即循环变快
            }
            else if( j == rand_id )     // 直至出现 rand_id,循环结束
            {
    
    
                usleep(420*1000);
                printf(G"%+12s\n"N, stu[j].s);
                usleep(600*1000);
                break;
            }
            else
            {
    
    
                printf(Y"%+12s"N, stu[j].s);
                t += 8000;              // 延迟时间不断增加,即循环变慢
            }
            fflush(stdout);
        }
    }
    return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_45463480/article/details/124972556