闲暇之余所作,功能未完善,望见谅。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <windows.h>
#include <time.h>
#include <math.h>
#include <unistd.h>
typedef struct Information{//结点 char sName[10]; //姓名 char sPhoneNum[12]; //电话号码 char sID[19]; //身份证 char sPassword[20]; //密码 char sAccount[20]; //账号 struct Information *next; //指针域 }Node; #define MAX 100 int hh=11; int pp=11; int kk=22; int ll=11; char ch; int a[MAX]; int len; int love; int cc=0; Node *head=NULL; void keep2(); void Loading(); //加载 void SamllMune(); //小界面 void login(); //开户 void registered(); //登录 void read(); //读取 输入缓存存区 void keep(); //保存 存储道硬盘 void SuanFaMune(); //算法菜单 void JiSuanJi(); //计算器 void YuanSuanQi(); void Sort(); //排序菜单 void panyao(); void mao(int a[],int len); //冒泡排序 void QuickSort(int *a,int left,int right); //快排 void InsertSort(int *a,int n); //插入排序 void HillSorting (int *a,int n); //希尔排序 void xuan(int a[],int len); //简单选择 void DuiSort(int *a,int left,int right); //堆排序 void HeapAdjust(int *a,int start,int end); //堆调整 void swap(int *a,int *b); //该函数用于交换两个变量的值 void TuMune(); //图形打印 void SanJiaoXing(); //三角形 void XinXing(); //心形 void LingXing(); //菱形 void YuanXing(); //圆形 void QiPan(); //棋盘 //账号设置 int main(){ int start=time(NULL),end; //运行时间统计 Loading(); system("color 07"); srand((unsigned)time(NULL)); //时间种子 for(;;){//死循环 printf("\t\t\t*********************************\n"); printf("\t\t\t***1.欢迎使用小应用系统1.0版本***\n"); printf("\t\t\t*********************************\n"); printf("\t\t\t\t|-------------|\n");//菜单界面 printf("\t\t\t\t|----1.开户---|\n"); printf("\t\t\t\t|----2.登录---|\n"); printf("\t\t\t\t|----0.退出---|\n"); printf("\t\t\t\t|-------------|\n"); scanf(" %c",&ch);//功能选项输入 switch(ch){//功能选项判定 case '1' : login();//开户 break; case '2' : registered();//登录 break; case '0': free(head);//释放空间 printf("本次程序运行使用时间为%d",(end=time(NULL))-start); exit(0); //退出 break; default ://有误提示 printf("输入有误,请您重新选择\n"); break; } } return 0; } void Loading(){ int k; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),14); int i; love=88^100; printf(">>"); for(i=1;i<=100;i++) { if(i<10) printf(">"); printf("\b\b\b%d%%",i); fflush(stdout); usleep(20000); } printf("\n"); keep2(); system("pause"); system("cls"); } void login(){ Node *p=head; //变量定义 int flag=0; char name[10]; int i=0,j=1; char password1[20]; char password2[20]; char ID[19]; char phonenum[12]; int k=0,num; for(;j==1;){//循环输入设置结束条件 flag=0;//标签 printf("请输入姓名:\n"); //输入信息 scanf("%s",name); printf("请输入身账号份证:\n"); scanf("%s",ID); printf("请输入电话号码:\n"); scanf("%s",phonenum); printf("请输入密码(密码只能由数字和字母构成):\n"); scanf("%s",password1); printf("请输入确认密码:\n"); scanf("%s",password2); while(ID[i]){//ID格式判定 //有误 if(!isdigit(ID[i])){ printf("身份证格式不正确请重新输入\n"); flag=1; break; } i++; k++; } if(k!=18||flag){ printf("身份证格式不正确请重新输入\n"); continue; } i=0; k=0; while(phonenum[i]){//手机号格式判定 if(phonenum[i]<'0'||phonenum[i]>'9'){ printf("手机号格式不正确请重新输入\n"); flag=1; break; } i++; k++; } if(k!=11||flag){ printf("手机号格式不正确请重新输入\n"); continue; } i=0; while(password1[i]){//判定密码格式是否正确 if(!isalnum(password1[i])){ printf("密码格式不对\n请重新输入\n"); flag=1; break; } i++; } if(flag){//判定标签是否改变 continue;//结束本次循环,重新开始 } i=0;//归零 while(password2[i]){//判定密码格式是否正确 if(!isalnum(password2[i])){ printf("密码格式不对\n请重新输入\n"); flag=1; break; } i++; } if(flag){//判定标签是否改变 continue;//结束本次循环,重新开始 } if(strcmp(password1,password2)!=0){//判定两次密码是否相同 printf("两次密码不一致\n请重新输入\n"); continue; } while(head!=NULL&&p->next!=NULL){//寻找空白结点 p=p->next; } Node *NewNode=(Node*)malloc(sizeof(Node));//创建结点 NewNode->next=NULL; if(head==NULL){//将新创的结点和头结点联系起来 head=NewNode; p=head; } else{//指针域指向下一个结点 p->next=NewNode; } sprintf(NewNode->sAccount,"%d%d%d%d",rand()%9000+1000,rand()%9000+1000,rand()%9000+1000,rand()%90+10); //格式转换并存储 printf("您的账号%s\n",NewNode->sAccount); //输出账号 strcpy(NewNode->sName,name);//将其余信息存储到结点 strcpy(NewNode->sID,ID); strcpy(NewNode->sPassword,password1); strcpy(NewNode->sPhoneNum,phonenum); keep(); printf("恭喜您开户成功\n"); system("pause"); system("cls"); j=0; } } void keep2(){//加密 FILE *fp; fp=fopen("E:\\0.txt","w"); love=(rand()%9000+1000)^1000; fprintf(fp,"%d\n",love); fclose(fp); } void keep(){//保存信息 Node *p=head; FILE *fp;//文件类型 fp=fopen("./3.txt","a");//打开文件 while(p!=NULL){ fprintf(fp,"%s %s %s %s %s\n",p->sName,p->sAccount,p->sPassword,p->sPhoneNum,p->sID);//输出到硬盘中 p=p->next; // 下一个结点 } fclose(fp); } void read(){//读取数据 Node *p,*p1; FILE *fp; p=p1=head; while(p!=NULL){ p=p->next; free(p1); p1=p; } head=NULL; fp=fopen("./3.txt","r");//打开文件 while(!feof(fp)){ Node*New=(Node*)malloc(sizeof(Node)); fscanf(fp,"%s %s %s %s %s\n",New->sName,New->sAccount,New->sPassword,New->sPhoneNum,New->sID);//输出到硬盘中 if(head==NULL){ head=New; p=head; } else{ p->next=New; //指向New(新)结点 p=p->next; //指向下一个结点 p->next=NULL; //设置为尾节点 } } fclose(fp); //关闭文件 } void registered(){ system("cls"); char Account[20]; char password[20]; Node *p; printf("请输入账号:"); scanf("%s",Account); printf("请输入密码:"); scanf("%s",password); read();//读取数据库信息 p=head;//设置一个局部结点暂代链表 while(p!=NULL){ if(strcmp(p->sAccount,Account)==0&&strcmp(p->sPassword,password)==0){ printf("登陆成功\n"); SamllMune(); //小界面 } p=p->next; } if(p==NULL){ printf("账号输入有误\n"); } } void SamllMune(){ ll=11; for(;ll;){ system("color 17"); printf("\t\t********************************\n"); printf("\t\t*** 欢迎使用简省小程序 ***\n"); printf("\t\t********************************\n"); printf("\t\t**** 1.图形打印 ****\n"); printf("\t\t**** 2.六大排序 ****\n"); printf("\t\t**** 3.小算法问题 ****\n"); printf("\t\t**** 4.知识输出(暂无 ****\n"); printf("\t\t**** 5.激活 ****\n"); printf("\t\t**** 6.返回上一级 ****\n"); printf("\t\t**** 0.直接关闭 ****\n"); printf("\t\t*********************************\n"); scanf(" %c",&ch); switch(ch){ case '1' : TuMune(); break; case '2' : if(love!=cc){ printf("权限不够\n"); } else{ Sort(); } break; case '3': SuanFaMune(); break; case '4' : printf("功能暂无\n"); break; case '5' : printf("请输入激活码:"); scanf("%d",cc); if(cc==love){ printf("激活成功\n"); } else{ printf("激活失败\n"); } break; case '6' : ll=0; break; default : printf("抱歉该选项暂无服务\n"); break; } } } void TuMune(){ int oo=1; for(;oo;){ printf("\t\t\t***********************\n"); printf("\t\t\t*** 1.三角形 ***\n"); printf("\t\t\t*** 2.菱形 ***\n"); printf("\t\t\t*** 3.心形 ***\n"); printf("\t\t\t*** 4.圆形 ***\n"); printf("\t\t\t*** 5.棋盘 ***\n"); printf("\t\t\t*** 6.返回上一级 ***\n"); printf("\t\t\t***********************\n"); scanf(" %c",&ch); switch(ch){ case '1' : SanJiaoXing(); break; case '2' : if(love!=cc){ printf("权限不够"); } else{ LingXing(); } break; case '3' : if(love!=cc){ printf("权限不够"); } else{ XinXing(); } break; case '4' : if(love!=cc){ printf("权限不够"); } else{ YuanXing(); } break; case '5' : if(love!=cc){ printf("权限不够"); } else{ QiPan(); } break; case '6' : oo=0; break; default : printf("功能暂未添加\n"); break; } } } void SanJiaoXing(){ //三角形 int row,col,i,height; printf("请输入等腰三角形的高:"); scanf("%d",&height); for(i=1;i<=height;i++) { for(row=1;row<=height-i;row++) printf(" "); for(col=1;col<=2*i-1;col++) printf("*"); printf("\n"); } } void XinXing() { float x,y,z; printf("请输入心形打印的矩阵(宽等于输入的数乘10,高为宽的2倍,z至少大于等于1.2否则无法正常打印)\n"); scanf("%f",&z); if(z<1.2||z>5){ printf("输入大过大(过小)无法正常打印\n"); } for(x=z;x>=-z;x-=0.1){ for(y=-z;y<=z;y+=0.05){ if(pow(x*x+y*y-1,3)-x*x*x*y*y<=0){ Sleep(20); printf("*"); } else{ printf(" "); } } printf("\n"); } } void LingXing(){ int i,j,num; scanf("%d",&num); if(num>0){ if(num%2==0){ printf("不符合菱形打印\n"); } else{ num/=2; for(i=1;i<=num+1;i++){//上三角 for(j=1;j<=num-i+1;j++){ printf(" "); } for(j=1;j<=2*i-1;j++){ printf("*"); } printf("\n"); } for(i=num;i>=1;i--){//下三角 for(j=0;j<=num-i;j++){ printf(" "); } for(j=1;j<=2*i-1;j++){ printf("*"); } printf("\n"); } } } else{ printf("输入数据不合理\n"); } } void YuanXing(){ int x, r, y; printf("请输入圆的半径r,圆心:"); scanf("%d%d%d", &r, &x, &y); if (x < r || y < r){ printf("输入有误\n"); } for (int i = 0; i <= r*r; i++){ for (int j = 0; j <= r*r + 10; j++){ if (3.14*(i - x)*(i - x) + (j - y)*(j - y) <= r*r){ printf("*"); } else{ printf(" "); } } printf("\n"); } } void QiPan(){//棋盘 int num,i,j; printf("请输入打印的棋盘的边长:"); scanf("%d",&num); for(i=0;i<num;i++){ for(j=0;j<num;j++){ if((j+i)%2==0){ printf("■"); } else{ printf("□"); } } printf("\n"); } } void Sort(){ system("pause"); int num; int i; kk=1; for(;kk;) { printf("\t\t++++++++++++++++++++++++++++++++++\n"); printf("\t\t++++ 1.冒泡排序 +++++\n"); printf("\t\t++++ 2.快速排序 +++++\n"); printf("\t\t++++ 3.直接插入排序 +++++\n"); printf("\t\t++++ 4.希尔排序 +++++\n"); printf("\t\t++++ 5.简单选择排序 +++++\n"); printf("\t\t++++ 6.堆排序 +++++\n"); printf("\t\t++++ 0.返回上一级 +++++\n"); printf("\t\t++++++++++++++++++++++++++++++++++\n"); printf("\t\t注意:本排序使用范围为20个数的排序\n"); printf("请输入需排序的数据个数:"); scanf("%d",&num); if(num<=0||num>20){ printf("记录数据过多(过少),请重新输入\n"); system("pause"); system("cls"); continue ; } printf("请输入排序的数据"); for(i=0;i<num;i++) { scanf("%d",&a[i]); } printf("请输入你的排序方式:"); scanf(" %c",&ch); switch(ch) { case '1' : mao(a,num);// 冒泡——橙色 system("pause"); system("cls"); break; case '2' : QuickSort(a,0,num-1);//快速排序 for(i=0;i<num;i++) printf("%5d\t",a[i]); printf("\n"); system("pause"); system("cls"); break; case '3' : InsertSort(a,num); //插入排序 system("pause"); system("cls"); break; case '4' : HillSorting (a,num);//希尔排序 for(i=0;i<num;i++) printf("%5d\t",a[i]); printf("\n"); system("pause"); system("cls"); break; case '5' : xuan(a,num);//选择——橙色 system("pause"); system("cls"); break; case '6' : DuiSort(a,0,num-1); //堆排序 for(i=0;i<num;i++) printf("%5d\t",a[i]); printf("\n"); system("pause"); system("cls"); break; case '0' : kk=0; break; default : printf("输入有误\n"); break; } } } void mao(int a[],int len)//冒泡排序 { int i,t,j,k; for(i=0;i<len-1;i++) { for(j=0;j<len-1;j++) { if(a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } for(k=0;k<len;k++) { printf("%d\t",a[k]); } printf("\n"); } void QuickSort(int *a,int left,int right){//快速排序 if(left>=right){//结束条件 return ; } int i=left;//初始化 int j=right; int key=a[left]; while(i<j){ while(i<j&&key<=a[j]){ j--; } a[i]=a[j];//将查找到比key小的数移到前面 while(i<j&&key>=a[i]){ i++; } a[j]=a[i];//将查找到比key大的数移到后面 } a[i]=key; QuickSort(a,left,i-1);//自身调用 QuickSort(a,i+1,right);//自身调用 } void InsertSort(int *a,int n){//插入排序 int temp; int i,j; for(i=1;i<n;i++){//循环趟数 temp=a[i];//temp存值 for(j=i-1;j>=0;j--){ if(temp>=a[j]){ break; } else{ a[j+1]=a[j];//元素移动 } } a[j+1]=temp; } for(i=0;i<n;i++){ printf("%5d\t",a[i]); } printf("\n"); } void xuan(int a[],int len)//简单选择 { int i,min,j,t; for(i=0;i<len-1;i++) { min=i; for(j=i+1;j<len;j++) { if(a[min]>a[j]) { min=j; } } if(i!=min) { t=a[min]; a[min]=a[i]; a[i]=t; } } for(i=0;i<len;i++) { printf("%d\t",a[i]); } } void HillSorting (int *a,int n){//希尔排序 int k; int i,j,temp; k=n/2;//一开始增量等于元素个数/2 while(k>=1) { for(i=k;i<n;i++) { temp=a[i]; for(j=i-k;j>=0;j=j-k) { if(temp>a[j]) { break; } else { a[j+k]=a[j]; } } a[j+k]=temp; } k=k/2; } } void DuiSort(int *a,int left,int right){//堆排序 int i; for(i=(right-left+1)/2;i>=left;--i){//调整整个二叉树为最大堆 HeapAdjust(a,i,right); } for(i=right;i>left;--i){ swap(&a[left],&a[i]); HeapAdjust(a,left,i-1); } } void HeapAdjust(int *a,int start,int end){//堆调整 int temp=a[start]; int parent=start,child;//定义两个结点parent和child while(2*parent<=end){ child=2*parent; if(child!=end&&a[child]<a[child+1]) ++child; if(temp>a[child]) break; else{ a[parent]=a[child]; } parent=child; } a[parent]=temp; } void swap(int *a,int *b){//该函数用于交换两个变量的值 int temp=*a; *a=*b; *b=temp; } void SuanFaMune(){ pp=1; for(;pp;){ printf("\t\t\t********************************\n"); printf("\t\t\t****** 1.小数计算器 *****\n"); printf("\t\t\t****** 2.斐波那契数列 *****\n"); printf("\t\t\t****** 3.穷举法 *****\n"); printf("\t\t\t****** 4.进制转换 *****\n"); printf("\t\t\t****** 5.汉罗塔 *****\n"); printf("\t\t\t****** 0.返回上一级 *****\n"); printf("\t\t\t********************************\n"); printf("请输入你的选择:"); scanf(" %c",&ch); switch(ch){ case '1' : // YuanSuanQi(); break; case '2': printf("功能暂无\n"); break; case '3' : printf("功能暂无\n"); break; case '4' : printf("功能暂无\n"); break; case '0' : pp=0; break; default : printf("其余功能暂未开发\n"); break; } } } void FuYunSuanQi() { } void FuYuanSuanQi(){ hh=1; float x,y; char xuanze; for(;hh;){ printf("\t\t\t========================\n"); printf("\t\t\t======= 功能 =======\n"); printf("\t\t\t========================\n"); printf("\t\t\t==== 1.加法 ====\n"); printf("\t\t\t==== 2.减法 ====\n"); printf("\t\t\t==== 3.除法 ====\n"); printf("\t\t\t==== 4.乘法 ====\n"); printf("\t\t\t==== 5.次幂 ====\n"); printf("\t\t\t==== 6.绝对值 ====\n"); printf("\t\t\t==== 0.返回上一级 ====\n"); printf("\t\t\t========================\n"); printf("注使用时直接输入符号即可:次幂用“^ ”表示,绝对值用"); scanf("%f",&x); scanf(" %c",&xuanze); switch(xuanze){ case '+': scanf("%d",&y); printf("%.2f\n",x+y); break; case '-': scanf("%f",&y); printf("%.2f\n",x-y); break; case '*': scanf("%f",&y); printf("%.2f\n",x*y); break; case '/': scanf("%f",&y); printf("%.2f\n",x/y); break; case '^': scanf("%f",&y); printf("%.2f\n",pow(x,(int)y)); break; case '|': printf("%.2f",abs(x)); break; case '0': break; default : printf("暂无此功能\n"); break; } } }