基于C語言實現(xiàn)隨機點名器(附源碼)
更新時間:2022年07月27日 11:48:36 作者:草木之花
這篇文章主要為大家詳細介紹如何基于C語言實現(xiàn)一個簡單的隨機點名器,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起動手嘗試一下
突發(fā)奇想寫了個隨機點名器…以供使用
隨機點名器

main函數(shù)
#include "myList.h"
#define FILENAME "stu.txt"
void menu();//畫面界面;
void userOptions(Node* headNode);//用戶選項
int main(void) {
SetConsoleTitle(L"隨機抽查系統(tǒng)");
Node* List = createrList();
readInfoFromFile(List, FILENAME);
while (true) {
menu();
userOptions(List);
system("pause");
system("cls");
}
system("pause");
return 0;
}
void menu() {
printf("\t\t\t學生點名系統(tǒng)\n");
printf("\t\t1)開始隨機抽查"
"\t\t2)添加學生\n"
"\t\t3)刪除學生"
"\t\t4)修改學生信息\n"
"\t\tq)退出\n");
printf("請輸入你的選項:");
}
void userOptions(Node* List) {
Student info;
char choose = '0';
choose = enter();
switch (choose) {
case '1':
printf("\t\t\t*開始隨機抽查*\n");
seekNode(List, rollCall(LengthNode(List)));
break;
case '2':
printf("\t\t\t\t\t\t已有學生如下\n");
printfNode(List);
printf("\t\t\t*添加學生*\n");
printf("注意請從%d之后開始也就是%d\n", LengthNode(List),LengthNode(List)+1);
printf("\t\t請輸入學生序號:");
scanf_s("%d",&info.num);
printf("\t\t請輸入學生學號:");
scanf_s("%ld", &info.number);
printf("\t\t請輸入學生姓名:");
scanf_s("%s", info.name, sizeof(info.name));
insetNodeByHead(List, info);
break;
case '3':
printf("\t\t\t\t\t\t已有學生如下\n");
printfNode(List);
printf("\t\t\t*刪除學生*\n");
printf("\t\t請輸入學生學號(后兩位即可):");
scanf_s("%ld", &info.number);
deleteNodeAppoinNumber(List, info.number);
break;
case'4':
printf("已有學生如下\n");
printfNode(List);
printf("\t\t\t*修改學生信息*\n");
printf("\t\t請輸入學生學號:");
scanf_s("%ld", &info.number);
upDataNode(List, info.number);
break;
case'q':
printf("\t\tquit!\n");
exit(0);
break;
default:
break;
}
weiteInfoToFile(List, FILENAME);
}enter.h
(這個就是我自己寫來玩的,讀取輸入的字符,你們也可以自己弄一個,就可以不用我這個了。但是要記得修改一下引用這個的代碼喔)
#pragma once //防止重復引用
#include "myList.h"
//處理寫入
char enter(void); //函數(shù)聲明
char enter(void) {
short count = 1;//次數(shù)
char input = getchar(); // 讀取單個字符
fflush(stdin);//清空輸入緩存區(qū),防止讀取后,又讀取
for (int i = 1; i <= 12; i++) {//如果超過誤輸入超過13次,強制退出程序
if (input == '\n') {//如果讀取的一直是回車,就會執(zhí)行,否則返回該值
count++;
scanf_s("%c", &input, 3);
fflush(stdin);
if (count == 5) {
printf("\n\t\t\t\t\t\t別再調皮了!\n");
continue;
}
else if (count == 11) {
printf("\n\t\t\t\t\t\t別在摁回車鍵了!最后一次機會了\n");
continue;
}
else if (count == 13) {
printf("\n\t\t\t\t\t\t程序已強制退出!byebye");
exit(0);
}
}
else { return input; }
}
return 0;
}
myList.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#include <windows.h>
#include "enter.h"
typedef struct student {//類型
long int number;
char name[10];
int num;//給定一個序號然后添加一個學生后就自加1;
}Student;
typedef struct Node {
Student data;
struct Node* next;
}Node;
//創(chuàng)建鏈表
Node* createrList(void) {
Node* headNode = (Node*)malloc(sizeof(Node));
if (headNode) {
headNode->next = NULL;
}
return headNode;
}
//創(chuàng)建結點
Node* createrNode(Student data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode) {
newNode->data = data;
newNode->next = NULL;
}
return newNode;
}
//插入結點
void insetNodeByHead(Node* headNode, Student data) {
Node* newNode = createrNode(data);
newNode->next = headNode->next;
headNode->next = newNode;
}
//刪除結點
void deleteNodeAppoinNumber(Node* headNode, long int number) {
Node* posNode = headNode->next;
Node* posFrontNode = headNode;
if (posNode == NULL) {
printf("\t\t表中沒有學生\n");
}
else {
while (posNode->data.number != number) {//沒有找到就繼續(xù)找
posFrontNode = posNode;
posNode = posNode->next;
if (posNode == NULL) {//找完最后一個了還沒有
printf("\t\t表中沒有該學生\n");
return;
}
}
//找到了,執(zhí)行刪除操作
posFrontNode->next = posNode->next;
free(posNode);
printf("\t\t刪除完成!");
}
}
//修改結點
void upDataNode(Node* headNode, long int number) {
Node* posNode = headNode->next;
Node* posFrontNode = headNode;
char choose = '0';
if (posNode == NULL) {
printf("\t\t該表中沒有學生\t");
}
else {
while (posNode->data.number != number) {
posFrontNode = posNode;
posNode = posNode->next;
if (posNode == NULL) {
printf("\t\t表中沒有該學生\n");
return;
}
}
while (true) {
printf("\t\t請選擇要修改的選項:1)姓名 2)學號 q)退出!\n");
printf("\t\t請輸入:");
choose = enter();
switch (choose) {
case '1':
printf("\t\t請輸入你要更改的名字(原姓名是%s):", posNode->data.name);
scanf_s("%s", posNode->data.name, sizeof(posNode->data.name));
system("pause");
break;
case '2':
printf("\t\t請輸入你要更改的學號(原學號是%ld):", posNode->data.number);
scanf_s("%ld", &posNode->data.number);
system("pause");
break;
case 'q':
printf("\t\tquit!");
return;
default:
printf("請輸入正確選項:");
break;
}
}
}
}
//打印結點
void printfNode(Node* headNode) {
Node* pMove = headNode->next;
printf("\t\t\t\t\t\t\t\t學號\t\t姓名\n");
while (pMove != NULL) {
printf("\t\t\t\t\t\t\t\t%ld\t%s\n", pMove->data.number, pMove->data.name);
pMove = pMove->next;
}
printf("\n");
}
//文件讀
bool readInfoFromFile(Node* headNode, char* fileName) {
Student data;
boolean one = false;
FILE* fp;
fopen_s(&fp, fileName, "r");
if (fp == NULL) {
fopen_s(&fp, fileName, "w+");
}
if (fp == NULL) { return EOF; }
while (fscanf_s(fp, "%d\t%ld\t%s"
, &data.num,&data.number, data.name, sizeof(data.name)) != EOF) {
insetNodeByHead(headNode, data);
}
if (fp == NULL) { return EOF; }
fclose(fp);
return 0;
}
//文件寫
bool weiteInfoToFile(Node* headNode, char* fileName) {
FILE* fp;
fopen_s(&fp, fileName, "w");
Node* pMove = headNode->next;
if (fp == NULL) { return EOF; }
while (pMove) {
fprintf_s(fp, "%d\t\t%ld\t\t%s\n", pMove->data.num,pMove->data.number,pMove->data.name);
pMove = pMove->next;
}
if (fp == NULL) { return EOF; }
fclose(fp);
return 0;
}
//求出鏈表長度然后返回
int LengthNode(struct Node* headNode) {
int length = 0;
struct Node* pMove = headNode->next;
while (pMove) {
length++;
pMove = pMove->next;
}
return length;
}
//讀取隨機數(shù)然后選出該學生
void seekNode(Node* headNode, long int rand_1) {
Node* posNode = headNode->next;
Node* posFrontNode = headNode;
if (posNode == NULL) {
printf("\t\t該表中沒有學生\t");
}
else
{ //這里的number改為num
while (posNode->data.num != rand_1) {
posFrontNode = posNode;
posNode = posNode->next;
if (posNode == NULL) {
printf("\t\t該表中沒有這這個學號(%ld)的學生\n", rand_1);
return;
}
}
printf("就決定是你了->");
printf("\t\t%ld\t%s\n\n\n\n\n", posNode->data.number, posNode->data.name);
}
}
//產(chǎn)生隨機數(shù)
long int rollCall(long int length) {
long int number;
srand((unsigned)time(NULL));
number = rand() % length + 1;//33+40;//length+1
return number;
}到此這篇關于基于C語言實現(xiàn)隨機點名器(附源碼)的文章就介紹到這了,更多相關C語言隨機點名器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
大數(shù)據(jù)情況下桶排序算法的運用與C++代碼實現(xiàn)示例
在排序元素很多的情況下,其實桶排序的性能并不是太高,這里我們配合單鏈表的直接插入排序,來看下一大數(shù)據(jù)情況下桶排序算法的運用與C++代碼實現(xiàn)示例:2016-07-07
c語言的cps實現(xiàn)求fibonacci數(shù)列示例
這篇文章主要介紹了c語言的cps實現(xiàn)求fibonacci數(shù)列示例,需要的朋友可以參考下2014-03-03

