基于C語(yǔ)言實(shí)現(xiàn)隨機(jī)點(diǎn)名器(附源碼)
突發(fā)奇想寫了個(gè)隨機(jī)點(diǎn)名器…以供使用
隨機(jī)點(diǎn)名器

main函數(shù)
#include "myList.h"
#define FILENAME "stu.txt"
void menu();//畫面界面;
void userOptions(Node* headNode);//用戶選項(xiàng)
int main(void) {
SetConsoleTitle(L"隨機(jī)抽查系統(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é)生點(diǎn)名系統(tǒng)\n");
printf("\t\t1)開始隨機(jī)抽查"
"\t\t2)添加學(xué)生\n"
"\t\t3)刪除學(xué)生"
"\t\t4)修改學(xué)生信息\n"
"\t\tq)退出\n");
printf("請(qǐng)輸入你的選項(xiàng):");
}
void userOptions(Node* List) {
Student info;
char choose = '0';
choose = enter();
switch (choose) {
case '1':
printf("\t\t\t*開始隨機(jī)抽查*\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("注意請(qǐng)從%d之后開始也就是%d\n", LengthNode(List),LengthNode(List)+1);
printf("\t\t請(qǐng)輸入學(xué)生序號(hào):");
scanf_s("%d",&info.num);
printf("\t\t請(qǐng)輸入學(xué)生學(xué)號(hào):");
scanf_s("%ld", &info.number);
printf("\t\t請(qǐng)輸入學(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請(qǐng)輸入學(xué)生學(xué)號(hào)(后兩位即可):");
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請(qǐng)輸入學(xué)生學(xué)號(hào):");
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
(這個(gè)就是我自己寫來玩的,讀取輸入的字符,你們也可以自己弄一個(gè),就可以不用我這個(gè)了。但是要記得修改一下引用這個(gè)的代碼喔)
#pragma once //防止重復(fù)引用
#include "myList.h"
//處理寫入
char enter(void); //函數(shù)聲明
char enter(void) {
short count = 1;//次數(shù)
char input = getchar(); // 讀取單個(gè)字符
fflush(stdin);//清空輸入緩存區(qū),防止讀取后,又讀取
for (int i = 1; i <= 12; i++) {//如果超過誤輸入超過13次,強(qiáng)制退出程序
if (input == '\n') {//如果讀取的一直是回車,就會(huì)執(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別在摁回車鍵了!最后一次機(jī)會(huì)了\n");
continue;
}
else if (count == 13) {
printf("\n\t\t\t\t\t\t程序已強(qiáng)制退出!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;//給定一個(gè)序號(hào)然后添加一個(gè)學(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é)點(diǎn)
Node* createrNode(Student data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode) {
newNode->data = data;
newNode->next = NULL;
}
return newNode;
}
//插入結(jié)點(diǎn)
void insetNodeByHead(Node* headNode, Student data) {
Node* newNode = createrNode(data);
newNode->next = headNode->next;
headNode->next = newNode;
}
//刪除結(jié)點(diǎn)
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) {//找完最后一個(gè)了還沒有
printf("\t\t表中沒有該學(xué)生\n");
return;
}
}
//找到了,執(zhí)行刪除操作
posFrontNode->next = posNode->next;
free(posNode);
printf("\t\t刪除完成!");
}
}
//修改結(jié)點(diǎn)
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請(qǐng)選擇要修改的選項(xiàng):1)姓名 2)學(xué)號(hào) q)退出!\n");
printf("\t\t請(qǐng)輸入:");
choose = enter();
switch (choose) {
case '1':
printf("\t\t請(qǐng)輸入你要更改的名字(原姓名是%s):", posNode->data.name);
scanf_s("%s", posNode->data.name, sizeof(posNode->data.name));
system("pause");
break;
case '2':
printf("\t\t請(qǐng)輸入你要更改的學(xué)號(hào)(原學(xué)號(hào)是%ld):", posNode->data.number);
scanf_s("%ld", &posNode->data.number);
system("pause");
break;
case 'q':
printf("\t\tquit!");
return;
default:
printf("請(qǐng)輸入正確選項(xiàng):");
break;
}
}
}
}
//打印結(jié)點(diǎn)
void printfNode(Node* headNode) {
Node* pMove = headNode->next;
printf("\t\t\t\t\t\t\t\t學(xué)號(hào)\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;
}
//求出鏈表長(zhǎng)度然后返回
int LengthNode(struct Node* headNode) {
int length = 0;
struct Node* pMove = headNode->next;
while (pMove) {
length++;
pMove = pMove->next;
}
return length;
}
//讀取隨機(jī)數(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該表中沒有這這個(gè)學(xué)號(hào)(%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)生隨機(jī)數(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語(yǔ)言實(shí)現(xiàn)隨機(jī)點(diǎn)名器(附源碼)的文章就介紹到這了,更多相關(guān)C語(yǔ)言隨機(jī)點(diǎn)名器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++多態(tài)的實(shí)現(xiàn)及原理詳細(xì)解析
C++的多態(tài)性用一句話概括就是:在基類的函數(shù)前加上virtual關(guān)鍵字,在派生類中重寫該函數(shù),運(yùn)行時(shí)將會(huì)根據(jù)對(duì)象的實(shí)際類型來調(diào)用相應(yīng)的函數(shù)。如果對(duì)象類型是派生類,就調(diào)用派生類的函數(shù);如果對(duì)象類型是基類,就調(diào)用基類的函數(shù)2013-09-09
大數(shù)據(jù)情況下桶排序算法的運(yùn)用與C++代碼實(shí)現(xiàn)示例
在排序元素很多的情況下,其實(shí)桶排序的性能并不是太高,這里我們配合單鏈表的直接插入排序,來看下一大數(shù)據(jù)情況下桶排序算法的運(yùn)用與C++代碼實(shí)現(xiàn)示例:2016-07-07
C語(yǔ)言實(shí)現(xiàn)查看進(jìn)程是否存在的方法示例
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)查看進(jìn)程是否存在的方法,涉及C語(yǔ)言針對(duì)進(jìn)程操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-07-07
c語(yǔ)言的cps實(shí)現(xiàn)求fibonacci數(shù)列示例
這篇文章主要介紹了c語(yǔ)言的cps實(shí)現(xiàn)求fibonacci數(shù)列示例,需要的朋友可以參考下2014-03-03

