基于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學(xué)生點名系統(tǒng)\n"); printf("\t\t1)開始隨機抽查" "\t\t2)添加學(xué)生\n" "\t\t3)刪除學(xué)生" "\t\t4)修改學(xué)生信息\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已有學(xué)生如下\n"); printfNode(List); printf("\t\t\t*添加學(xué)生*\n"); printf("注意請從%d之后開始也就是%d\n", LengthNode(List),LengthNode(List)+1); printf("\t\t請輸入學(xué)生序號:"); scanf_s("%d",&info.num); printf("\t\t請輸入學(xué)生學(xué)號:"); scanf_s("%ld", &info.number); printf("\t\t請輸入學(xué)生姓名:"); scanf_s("%s", info.name, sizeof(info.name)); insetNodeByHead(List, info); break; case '3': printf("\t\t\t\t\t\t已有學(xué)生如下\n"); printfNode(List); printf("\t\t\t*刪除學(xué)生*\n"); printf("\t\t請輸入學(xué)生學(xué)號(后兩位即可):"); scanf_s("%ld", &info.number); deleteNodeAppoinNumber(List, info.number); break; case'4': printf("已有學(xué)生如下\n"); printfNode(List); printf("\t\t\t*修改學(xué)生信息*\n"); printf("\t\t請輸入學(xué)生學(xué)號:"); 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 //防止重復(fù)引用 #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別再調(diào)皮了!\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;//給定一個序號然后添加一個學(xué)生后就自加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)建結(jié)點 Node* createrNode(Student data) { Node* newNode = (Node*)malloc(sizeof(Node)); if (newNode) { newNode->data = data; newNode->next = NULL; } return newNode; } //插入結(jié)點 void insetNodeByHead(Node* headNode, Student data) { Node* newNode = createrNode(data); newNode->next = headNode->next; headNode->next = newNode; } //刪除結(jié)點 void deleteNodeAppoinNumber(Node* headNode, long int number) { Node* posNode = headNode->next; Node* posFrontNode = headNode; if (posNode == NULL) { printf("\t\t表中沒有學(xué)生\n"); } else { while (posNode->data.number != number) {//沒有找到就繼續(xù)找 posFrontNode = posNode; posNode = posNode->next; if (posNode == NULL) {//找完最后一個了還沒有 printf("\t\t表中沒有該學(xué)生\n"); return; } } //找到了,執(zhí)行刪除操作 posFrontNode->next = posNode->next; free(posNode); printf("\t\t刪除完成!"); } } //修改結(jié)點 void upDataNode(Node* headNode, long int number) { Node* posNode = headNode->next; Node* posFrontNode = headNode; char choose = '0'; if (posNode == NULL) { printf("\t\t該表中沒有學(xué)生\t"); } else { while (posNode->data.number != number) { posFrontNode = posNode; posNode = posNode->next; if (posNode == NULL) { printf("\t\t表中沒有該學(xué)生\n"); return; } } while (true) { printf("\t\t請選擇要修改的選項:1)姓名 2)學(xué)號 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請輸入你要更改的學(xué)號(原學(xué)號是%ld):", posNode->data.number); scanf_s("%ld", &posNode->data.number); system("pause"); break; case 'q': printf("\t\tquit!"); return; default: printf("請輸入正確選項:"); break; } } } } //打印結(jié)點 void printfNode(Node* headNode) { Node* pMove = headNode->next; printf("\t\t\t\t\t\t\t\t學(xué)號\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ù)然后選出該學(xué)生 void seekNode(Node* headNode, long int rand_1) { Node* posNode = headNode->next; Node* posFrontNode = headNode; if (posNode == NULL) { printf("\t\t該表中沒有學(xué)生\t"); } else { //這里的number改為num while (posNode->data.num != rand_1) { posFrontNode = posNode; posNode = posNode->next; if (posNode == NULL) { printf("\t\t該表中沒有這這個學(xué)號(%ld)的學(xué)生\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; }
到此這篇關(guān)于基于C語言實現(xiàn)隨機點名器(附源碼)的文章就介紹到這了,更多相關(guān)C語言隨機點名器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++多態(tài)的實現(xiàn)及原理詳細(xì)解析
C++的多態(tài)性用一句話概括就是:在基類的函數(shù)前加上virtual關(guān)鍵字,在派生類中重寫該函數(shù),運行時將會根據(jù)對象的實際類型來調(diào)用相應(yīng)的函數(shù)。如果對象類型是派生類,就調(diào)用派生類的函數(shù);如果對象類型是基類,就調(diào)用基類的函數(shù)2013-09-09大數(shù)據(jù)情況下桶排序算法的運用與C++代碼實現(xiàn)示例
在排序元素很多的情況下,其實桶排序的性能并不是太高,這里我們配合單鏈表的直接插入排序,來看下一大數(shù)據(jù)情況下桶排序算法的運用與C++代碼實現(xiàn)示例:2016-07-07c語言的cps實現(xiàn)求fibonacci數(shù)列示例
這篇文章主要介紹了c語言的cps實現(xiàn)求fibonacci數(shù)列示例,需要的朋友可以參考下2014-03-03