0=黑色 8=灰色
1=蓝色 9=淡蓝色
2=绿色 10=淡绿色
3=蓝色 11=浅绿色
4=红色 12=淡红色
5=紫色 13=淡紫色
6=黄色 14=淡黄色
7=白色 15=亮白色
#include
#include
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");
}
#include
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;
}
文件内容
studentname.txt
曹植
曹丕
小乔
孙尚香
曹操
诸葛亮
陆逊
周瑜
司马懿
张飞
刘备
关羽
庞统
袁绍
孙仲谋
#include
#include
#include
#include
#include
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;
}
文件name.txt
艾琳
云樱
司空震
澜
夏洛特
阿古朵
蒙恬
镜
蒙犽
鲁班大师
李信
上官婉儿
嫦娥
猪八戒
盘古
云中君
瑶
曜
铠
马超
西施
沈梦溪
伽罗
盾山
司马懿
孙策
元歌
米莱迪
狂铁
弈星
裴擒虎
杨玉环
公孙离
明世隐
女娲
梦奇
苏烈
百里玄策
百里守约
鬼谷子
杨戬
雅典娜
蔡文姬
太乙真人
哪吒
诸葛亮
黄忠
大乔
东皇太一
干将莫邪
成吉思汗
钟馗
虞姬
李元芳
张飞
刘备
后羿
牛魔
孙悟空
亚瑟
姜子牙
刘邦
韩信
王昭君
兰陵王
花木兰
张良
不知火舞
娜可露露
橘右京
露娜
程咬金
安琪拉
貂蝉
关羽
老夫子
武则天
项羽
达摩
狄仁杰
芈月
吕布
周瑜
夏侯惇
甄姬
曹操
典韦
宫本武藏
李白
马可波罗
白起
扁鹊
孙膑
钟无艳
阿珂
高渐离
刘禅
庄周
鲁班七号
孙尚香
嬴政
妲己
墨子
小乔
廉颇
赵云
project.h
#include
#include
#include
#include
#include
#include
#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;
}