闲暇之余所作,功能未完善,望见谅。
#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;
}
}
}