1)头文件
1.#include<stdio.h>,头文件stdio.hC语言标准输入输出函数库。
2.#include<stdlib.h>,头文件stdlib.hC语言实用工具函数库。
3.#include<windows.h>,头文件windows.h这是Windows平台下的系统库
#include<assert.h>,头文件,assert.h用来解决程序终止问题。(源于网络,在程序运行中需要一个结束程序的方法)
struct ITEM
{
int key;
int balue;
};
void additem(struct ITEM *itemptr)
{
assert(itemptr != NULL);
}
2)结构体
定义了一个结构体类型,结构体名为“book”。
结构体成员分别为
1.字符类型char,成员名为name,用来表示通讯录姓名。
2.字符类型char,成员名为office,用来表示通讯录的办公电话。
3.字符类型char,成员名为home,用来表示通讯录的家庭电话。
4.字符类型char,成员名为move,用来表示通讯录的移动电话。
5.字符类型char,成员名为sex,用来表示通讯录的性别。
6.字符类型char,成员名为cla,用来表示通讯录的分组。
定义一个结构体变量s[M];
struct book
{
char name[10];//姓名
char office[20];//办公电话
char home[20];//家庭电话
char move[20];//移动电话
char sex[10];//性别
char cla[10];//分组
}s[M];
(1)准备数据
建立数据文件,如下图2所示。
图2
(2)程序整体框架设计
思路分析:手机通讯录的信息存放在“JK0124.txt”文件中,在我的程序中并没有进行全局变量的定义,全是局部变量,也就是每个函数功能块都是单独的一个小程序。通过主函数进行调用,整个程序框架如下图3所示。
图3 系统框图
(3)主运行OPEN()函数和查阅信息refer()函数
思路分析:利用OPEN()函数调用各个功能模块。由于查询函数refer()和主运行函数的思路是一样的,都是先展示菜单部分,在使用swich选择结构进行选择,调用。所以下面以OPEN()函数进行详细说明。
第一步,先展示主菜单menu1(),根据用户键盘输入数字,判断并调用对应的功能函数。
void menu1()//主菜单
{
printf("_________________________________\n");
printf("| 手机通讯录操作系统 |\n");
printf("|_______________________________|\n");
printf("|*******************************|\n");
printf("|**********1.查询信息***********|\n");
printf("|**********2.修改数据***********|\n");
printf("|**********3.添加数据***********|\n");
printf("|**********4.删除数据***********|\n");
printf("|**********5.进行排序***********|\n");
printf("|**********6.退出系统***********|\n");
printf("|*******************************|\n");
printf("|_______________________________|\n");
}
第二步,根据用户键盘输入的数组,赋值给input。采用switch选择结构进行选择。并调用每个数字对应的函数功能块。
switch (input)
{
case 1:
refer();
break;
case 2:
modify();
break;
case 3:
AddData();
break;
case 4:
Delete();
break;
case 5:
ordering();
break;
case 6:
getout();
additem(NULL);
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
} while (input);
(4)作者信息Front()函数
思路分析:使用windows系统下的系统库SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_);用来设置控制台的颜色信息。
使用一个for运行来延迟程序的运行,在for循环中使用了整数后加U来解决整数长度过长问题。
最后使用system(“cls”);清除指令,清除控制台信息。
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置红色
printf("\n");
printf(" 手机通讯录系统\n");
printf("\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);//设置绿色
printf("\n");
printf(" 作者:XXX\n");
printf("\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);//设置蓝色
printf("\n");
printf(" QQ:2238265682\n");
printf("\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);//设置红色和蓝色相加
printf("\n");
printf(" 请等待......");
printf("\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
for(int i =0 ;i<=3000000000U;i++){
}
system("cls");
(5)查询函数部分。姓名查询refername()函数,分组查询referclass()函数,办公电话查询officephone()函数,家庭电话查询homephone()函数,移动电话查询movephone()函数。
思路分析:查询函数部分的代码和思路基本一样,这里以姓名查询为例进行思路分析。唯一不一样的地方就在于查找的信息不同,对结构体体类型中成员的引用的不一样,也就是s[i].name还是s[i].cla的不同。
第一步:从键盘获取用户输入的查找信息。
char nam[100];
printf("请输入你要查找的姓名->");
scanf("%s",nam);
第二步,使用字符操作函数strcmp(str1,str2)进行两个字符串的比较。如果两个字符串相同就输入这一整条信息,如果不一样就输出查无此人。
while(!feof(fp))
{
if(strcmp(nam,s[i].name)==0)
{
printf("\n已查到该信息,记录为:\n");
puts(title);
printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
k=1;
break;
}
i++;
}
if(k==0)
{
printf("\n对不起,查无此人!\n");
}
(6)修改数据部分modify()函数
思路分析:
第一步,既然需要修改数据,首先就要对数据进行查询,判断所要查询的数据是否存在,这个查询部分就和上面的查询函数就有点相识了。
while(!feof(fp))
{
if(strcmp(nam,s[i].name)==0)
{
printf("\n已查到该信息,记录为:\n");
puts(title);
printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
k=1;
break;
}
i++;
}
if(k==0)
{
printf("\n对不起,查无此人!\n");
第二步,查找到需要修改的信息后就要,对该数据进行修改,这里仍然要使用对字符串的操作函数,这里使用的是strcpy(str1,str2)字符串拷贝函数,将str2所指的字符串内容复制到str1所指的存储空间中,函数返回str1的值。
char num1[10];
printf("\n请输入你要修改的新姓名信息->");
scanf("%s",&num1);
strcpy(s[i].name,num1);
char num2[10];
printf("\n请输入你要修改的新办公电话信息->");
scanf("%s",&num2);
strcpy(s[i].office,num2);
char num3[10];
printf("\n请输入你要修改的新家庭电话信息->");
scanf("%s",&num3);
strcpy(s[i].home,num3);
char num4[10];
printf("\n请输入你要修改的新移动电话信息->");
scanf("%s",&num4);
strcpy(s[i].move,num4);
char num5[10];
printf("\n请输入你要修改的新性别信息->");
scanf("%s",&num5);
strcpy(s[i].sex,num5);
char num6[10];
printf("\n请输入你要修改的新分组信息->");
scanf("%s",&num6);
strcpy(s[i].cla,num6);
(7)添加数据AddData()函数
思路分析:添加数据,事实上和修改数据的思路一样,只是添加数据不需要进行判断了,直接在数组的最后加一行,进行数据输入就可以了。同样使用字符串操作函数strcpy()函数进行字符串的操作。
char num1[10];
printf("\n请输入你要添加的新姓名信息->");
scanf("%s",&num1);
strcpy(s[i].name,num1);
char num2[10];
printf("\n请输入你要添加的新办公电话信息->");
scanf("%s",&num2);
strcpy(s[i].office,num2);
char num3[10];
printf("\n请输入你要添加的新家庭电话信息->");
scanf("%s",&num3);
strcpy(s[i].home,num3);
char num4[10];
printf("\n请输入你要添加的新移动电话信息->");
scanf("%s",&num4);
strcpy(s[i].move,num4);
char num5[10];
printf("\n请输入你要添加的新性别信息->");
scanf("%s",&num5);
strcpy(s[i].sex,num5);
char num6[10];
printf("\n请输入你要添加的新分组信息->");
scanf("%s",&num6);
strcpy(s[i].cla,num6);
(8)删除数据Delete()函数
思路分析:删除数据事实上,就是将你要删除的数据替换掉就行了,也就是将所给的数据换成空字符串就行了。在删除数据中同样使用的是字符串操作函数strcpy(str1,str2),只是将这里的str2换成空字符串了。对于需要查找你要删除的信息的代码和添加数据已经修改数据一样都是一个字符查找操作。
strcpy(s[i].name," ");strcpy(s[i].office," ");strcpy(s[i].home," ");
strcpy(s[i].move," ");strcpy(s[i].sex," ");strcpy(s[i].cla," ");
(9)排序操作ordering()函数
思路分析:运用了一个排序的模板,这里用变量m记录最小的数组元素下标,先设m=i,然后通过循环来实现,循环变量n从最小开始,不断比较。用当前最小值(s[n].name)与(s[m].name)进行比较,如果s[n].name小于s[m].name,然后运用结构体变量t将s[n].name与s[m].name进行对换。
for(i = 0;i < j;i++ )
{
m = i;
for(int n = 1;n < i;n++)
{
if(strcmp(s[n].name,s[m].name)>0)
{
m = n;
}
t = s[m];
s[m] = s[n];
s[n] = t;
}
}
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<assert.h>
#define M 20
struct book
{
char name[10];//姓名
char office[20];//办公电话
char home[20];//家庭电话
char move[20];//移动电话
char sex[10];//性别
char cla[10];//分组
}s[M];
/
struct ITEM
{
int key;
int balue;
};
//
char title[100];
void OPEN();//总运行
void Front();//作者信息
void menu1();//主目录
void menu2();//查询目录
void refer();//查询页面
void getout();//退出程序
void input();//读取数据
void print();//输出数据
void refername();//根据姓名查询
void referclass();//根据分组类型查询
void officephone();//根据办公电话查询
void homephone();//根据办公电话查询
void movephone();//根据办公电话查询
void modify();//修改数据
void AddData();//添加数据
void Delete();//删除数据
void ordering();//进行排序
///
int main()
{
Front();
OPEN();
}
///
void Front()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置红色
printf("\n");
printf(" 手机通讯录系统\n");
printf("\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);//设置绿色
printf("\n");
printf(" 作者:乾中权\n");
printf("\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);//设置蓝色
printf("\n");
printf(" QQ:2238265682\n");
printf("\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);//设置红色和蓝色相加
printf("\n");
printf(" 请等待......");
printf("\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
for(int i =0 ;i<=3000000000U;i++){
}
system("cls");
}
///
void getout()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);//设置蓝色
printf("\n");
printf("\n");
printf(" 你已退出程序,欢迎下次使用。 ");
printf("\n");
printf("\n");
for (int i = 0; i <= 3000000000U; i++){
}
}
void additem(struct ITEM *itemptr)
{
assert(itemptr != NULL);
}
/
void menu1()//主菜单
{
printf("_________________________________\n");
printf("| 手机通讯录操作系统 |\n");
printf("|_______________________________|\n");
printf("|*******************************|\n");
printf("|**********1.查询信息***********|\n");
printf("|**********2.修改数据***********|\n");
printf("|**********3.添加数据***********|\n");
printf("|**********4.删除数据***********|\n");
printf("|**********5.进行排序***********|\n");
printf("|**********6.退出系统***********|\n");
printf("|*******************************|\n");
printf("|_______________________________|\n");
}
void menu2()//查询菜单
{
printf(" _________________________________\n");
printf(" | 查询信息菜单 |\n");
printf(" |________________________________|\n");
printf(" |*******1.按姓名查询*************|\n");
printf(" |*******2.按分组查询*************|\n");
printf(" |*******3.按办公电话查询*********|\n");
printf(" |*******4.按家庭电话查询*********|\n");
printf(" |*******4.按移动电话查询*********|\n");
printf(" |*******6.显示全部信息***********|\n");
printf(" |*******0.返回上一级目录*********|\n");
printf(" |********************************|\n");
printf(" |________________________________|\n");
}
/
void refer()//refer查阅信息
{
int Q;
do
{
menu2();
printf("请选择功能->");
scanf("%d",&Q);
switch (Q)
{
case 1:
refername();
break;
case 2:
referclass();
break;
case 3:
officephone();
break;
case 4:
homephone();
break;
case 5:
movephone();
break;
case 6:
print();
break;
case 0:
OPEN();
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
} while (Q);
}
//
void OPEN()//主运行
{
int input;
do
{
menu1();
printf("请选择功能—>");
scanf("%d",&input);
switch (input)
{
case 1:
refer();
break;
case 2:
modify();
break;
case 3:
AddData();
break;
case 4:
Delete();
break;
case 5:
ordering();
break;
case 6:
getout();
additem(NULL);
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
} while (input);
}
//
void input()//输入数据,查询所有数据
{
FILE *fp;
fp = fopen("JK0124.txt","r");
if (fp==NULL)
{
printf("文件打开失败!");
exit(0);
}
fgets(title,100,fp);
int i=0;
while (!feof(fp))
{
fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
i++;
}
fclose(fp);
}
//
void print()//输出所有数据
{
int i;
puts(title);
for(i=0;i<M;i++)
{
printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
}
}
//
void refername()//按姓名进行查询
{
int k=0,i;
char nam[100];
printf("请输入你要查找的姓名->");
scanf("%s",nam);
FILE *fp;
fp = fopen("JK0124.txt","r");
if (fp==NULL)
{
printf("文件打开失败!");
exit(0);
}
while(!feof(fp))
{
fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
if(strcmp(nam,s[i].name)==0)
{
printf("\n已查到该信息,记录为:\n");
puts(title);
printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
k=1;
break;
}
i++;
}
if(k==0)
{
printf("\n对不起,查无此人!\n");
}
fclose(fp);
}
//
void referclass()//按分组进行查询
{
int k=0,i=0;
char nam[100];
printf("请输入你要查找的分组类型->");
scanf("%s",nam);
printf("\n已查到该信息,记录为:\n");
puts(title);
FILE *fp;
fp = fopen("JK0124.txt","r");
if (fp==NULL)
{
printf("文件打开失败!");
exit(0);
}
while(!feof(fp))
{
fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
if(strcmp(nam,s[i].cla)==0)
{
printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
k=1;
}
i++;
}
if(k==0)
{
printf("\n对不起,查无此类型!\n");
}
fclose(fp);
}
void officephone()//按办公电话查询
{
int k=0,i;
char nam[100];
printf("请输入你要查找的办公电话->");
scanf("%s",nam);
FILE *fp;
fp = fopen("JK0124.txt","r");
if (fp==NULL)
{
printf("文件打开失败!");
exit(0);
}
while(!feof(fp))
{
fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
if(strcmp(nam,s[i].office)==0)
{
printf("\n已查到该信息,记录为:\n");
puts(title);
printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
k=1;
break;
}
i++;
}
if(k==0)
{
printf("\n对不起,查无此人!\n");
}
fclose(fp);
}
/
void homephone()//按家庭电话查询
{
int k=0,i;
char nam[100];
printf("请输入你要查找的家庭电话->");
scanf("%s",nam);
FILE *fp;
fp = fopen("JK0124.txt","r");
if (fp==NULL)
{
printf("文件打开失败!");
exit(0);
}
while(!feof(fp))
{
fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
if(strcmp(nam,s[i].home)==0)
{
printf("\n已查到该信息,记录为:\n");
puts(title);
printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
k=1;
break;
}
i++;
}
if(k==0)
{
printf("\n对不起,查无此人!\n");
}
fclose(fp);
}
///
void movephone()//按移动电话查询
{
int k=0,i;
char nam[100];
printf("请输入你要查找的移动电话->");
scanf("%s",nam);
FILE *fp;
fp = fopen("JK0124.txt","r");
if (fp==NULL)
{
printf("文件打开失败!");
exit(0);
}
while(!feof(fp))
{
fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
if(strcmp(nam,s[i].move)==0)
{
printf("\n已查到该信息,记录为:\n");
puts(title);
printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
k=1;
break;
}
i++;
}
if(k==0)
{
printf("\n对不起,查无此人!\n");
}
fclose(fp);
}
///
void modify()//修改数据
{
int m,k=0,i=0;
char namekey[10];
printf("请输入你要修改的通讯录姓名->");
scanf("%s",&namekey);
FILE *fp;
fp = fopen("JK0124.txt","r");
if (fp == NULL)
{
printf("文件打开失败!");
}
while(!feof(fp))
{
fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
if(strcmp(namekey,s[i].name)==0)
{
k=1;
break;
}
i++;
}
if (k==1)
{
printf("已经查到该姓名所对应的信息\n");
puts(title);
printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
printf("*********************\n");
printf("******1.确定修改******\n");
printf("******0.放弃修改******\n");
printf("*********************\n");
printf("请选择->");
scanf("%d",&m);
if(m==1)
{
char num1[10];
printf("\n请输入你要修改的新姓名信息->");
scanf("%s",&num1);
strcpy(s[i].name,num1);
char num2[10];
printf("\n请输入你要修改的新办公电话信息->");
scanf("%s",&num2);
strcpy(s[i].office,num2);
char num3[10];
printf("\n请输入你要修改的新家庭电话信息->");
scanf("%s",&num3);
strcpy(s[i].home,num3);
char num4[10];
printf("\n请输入你要修改的新移动电话信息->");
scanf("%s",&num4);
strcpy(s[i].move,num4);
char num5[10];
printf("\n请输入你要修改的新性别信息->");
scanf("%s",&num5);
strcpy(s[i].sex,num5);
char num6[10];
printf("\n请输入你要修改的新分组信息->");
scanf("%s",&num6);
strcpy(s[i].cla,num6);
printf("修改成功\n");
printf("修改后的通讯录信息如下\n");
print();
}
}
else
{
printf("查无此人,无法修改!");
}
fclose(fp);
}
void AddData()//添加数据
{
int i=0;
FILE *fp;
fp = fopen("JK0124.txt","r");
if (fp == NULL)
{
printf("文件打开失败!");
}
while(!feof(fp))
{
fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
i++;
}
char num1[10];
printf("\n请输入你要添加的新姓名信息->");
scanf("%s",&num1);
strcpy(s[i].name,num1);
char num2[10];
printf("\n请输入你要添加的新办公电话信息->");
scanf("%s",&num2);
strcpy(s[i].office,num2);
char num3[10];
printf("\n请输入你要添加的新家庭电话信息->");
scanf("%s",&num3);
strcpy(s[i].home,num3);
char num4[10];
printf("\n请输入你要添加的新移动电话信息->");
scanf("%s",&num4);
strcpy(s[i].move,num4);
char num5[10];
printf("\n请输入你要添加的新性别信息->");
scanf("%s",&num5);
strcpy(s[i].sex,num5);
char num6[10];
printf("\n请输入你要添加的新分组信息->");
scanf("%s",&num6);
strcpy(s[i].cla,num6);
printf("添加成功\n");
printf("添加后的通讯录信息如下\n");
print();
fclose(fp);
}
///
void Delete()//删除数据
{
int m,k=0,i=0;
char namekey[10];
long a;
printf("请输入你要删除的通讯录姓名->");
scanf("%s",&namekey);
FILE *fp;
fp = fopen("JK0124.txt","a");
if (fp == NULL)
{
printf("文件打开失败!");
}
while(!feof(fp))
{
fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
if(strcmp(namekey,s[i].name)==0)
{
k=1;
break;
}
i++;
}
if (k==1)
{
printf("已经查到该姓名所对应的信息\n");
puts(title);
printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla);
printf("*********************\n");
printf("******1.确定删除******\n");
printf("******0.放弃删除******\n");
printf("*********************\n");
printf("请选择->");
scanf("%d",&m);
int n;
if(m==1)
{
for(n = i; n < M-1;n++)
{
strcpy(s[n].name,s[n+1].name);strcpy(s[n].office,s[n+1].office);strcpy(s[n].home,s[n+1].home);
strcpy(s[n].move,s[n+1].move);strcpy(s[n].sex,s[n+1].sex);strcpy(s[n].cla,s[n+1].cla);
}
/*strcpy(s[i].name," ");strcpy(s[i].office," ");strcpy(s[i].home," ");
strcpy(s[i].move," ");strcpy(s[i].sex," ");strcpy(s[i].cla," ");*/
printf("删除成功\n");
printf("删除后的通讯录信息如下\n");
print();
}
}
else
{
printf("查无此人,无法修改!");
}
fclose(fp);
}
///
void ordering()//选择法排序操作
{
int i=0,m,n,j=0;
struct book t;
FILE *fp;
fp = fopen("JK0124.txt","r");
if (fp == NULL)
{
printf("文件打开失败!");
}
while(!feof(fp))
{
fscanf(fp,"%s%s%s%s%s%s\n",s[j].name,s[j].office,s[j].home,s[j].move,s[j].sex,s[j].cla);
j++;
}
for(i = 0;i < j;i++ )
{
m = i;
for( n = i+1;n < j;n++)
{
if(strcmp(s[n].name,s[m].name)>0)
{
m = n;
}
t = s[m];
s[m] = s[n];
s[n] = t;
}
}
print();
fclose(fp);
}
文章浏览阅读6.5k次。作为一个程序员,我们在进行项目部署和运维时,经常会用到一些linux命令,可是这些命令老是忘记,每次用到的时候都要去谷歌百度,很是麻烦!这不,为了自己使用方便,对常见的linux命令进行了系统的总结,以便在用到时能够快速地找到相关命令,同时有需要的朋友也可以参考搜藏该篇文章!文章对讲到的每个命令都有详细的参数解释,并且给出一些常用例子,因此也非常适合用来学习!全文命令分为以下6个模块:1、常用系统工作命令2、系统状态检测命令3、工作目录切换命令4、文本文件编辑命令5、文件目录管理命令6、打包._ls `pwd`/*
文章浏览阅读2.9w次,点赞10次,收藏16次。javax.servlet.ServletException: Servlet[SpringMvc]的Servlet.init()引发异常处理分析错误描述错误原因分析原因解决办法分析关于javax.servlet.ServletException: Servlet[SpringMvc]的Servlet.init()引发异常处理情况Servlet[SpringMvc]的Servlet.init()引发异常错误描述Servlet[SpringMvc]的Servlet.init()引发异常创建Ser_javax.servlet.servletexception: servlet[springmvc]的servlet.init()引发异常
文章浏览阅读1.9k次。1、文件搜索find 可以找到你想要的文件格式: find [目录] [选项] [选项值]目录:去哪找,可以不写,默认代表当前目录选项:怎么找 >> -name 按照名字找 可以使用通配符 -size 按照大小找 单位为 kmg 10k(等于10k) +10k(大于10k) -10k(小于10k) -user 按照用户名 -group 按照组名 -maxdepth -minde_centos7搜索变量属于那个文件
文章浏览阅读115次。1.keepalived是什么? keepalived是集群管理中保障集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障 2.keepalived 工作原理keepalived是以**VRRP**协议为实现基础的,VRRP全称Virtual Route Redundancy Protocol,即**虚拟路由冗余协议** ..._lvs client在lb节点请求vip
文章浏览阅读5.9w次,点赞21次,收藏179次。一、AOP是什么? AOP的全称是Aspect Orient Programming,即面向切面编程。是对OOP(Object Orient Programming)的一种补充,战门用于处理一些具有横切性质的服务。常常用于日志输出、安全控制等。 上面说到是对OOP的一种补充,具体补充的是什么呢?考虑一种情况,如果我们需要在所有方法执行前打印一句日志,按照OOP的处理思想,我们需要..._springaop实现原理面试
文章浏览阅读358次。Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数特殊变量列表变量 含义$0 当前脚本的文件名$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。$# 传递给脚本或函数的参数个数。$* 传递给脚本或函数的所有参数。$@ 传递给脚本或函数的所有参数。被双引号(&amp;amp;amp;quot; &amp;amp;amp;quot;)包含时,与 $* _在shell脚本里下面哪些特殊符号可以用来表示所有向脚本传递的参数
文章浏览阅读2.6k次,点赞30次,收藏30次。一、文件预览1、安装 `pdfjs-dist` ,此处指定版本为 `2.16.105`2、`html` 结构内容3、`js` 功能实现:4、可能出现的问题(1) 部分字体出现乱码或浏览器控制台出现警告二、文本选中1、功能实现2、可能出现的问题:(1) 页面文字可选中,但文本不可见(2) 浏览器控制台报错 `Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'dispatch_vue3对pdf文件操作文件选取
文章浏览阅读139次。先序遍历递归版本很简单,学习一下非递归的写法。先遍历根节点,再遍历左儿子,最后遍历右儿子def preOrder(root): # 返回先序遍历序列 if not root: return [] p = root res = [] stack = [] while stack or p: ..._后序遍历,第一个访问的节点
文章浏览阅读3.7k次,点赞2次,收藏11次。一、创建一个接口maven项目 里面存放服务的接口与实体类,在本地仓库安装(install)一下接口服务,目录结构User就是简单的pojo实体类,在UserService中提供了两个接口方法package com.fhh.springboot.service;import com.fhh.springboot.Entity.User1;/** * 功能描述:(..._springboot、dubbo和mybatisplus和redis搭建工程如何自动生成pom依赖
文章浏览阅读681次。恢复背景--早上不小心将FAT32分区格式化,需要恢复格式化之前的数据,但现在这个盘是空盘了,如图 已用空间16KB ,总容量30GB . 为什么格式化了 ,已用空间还有16KB呢。 这是因为FAT32文件系统格式化时 会对根目录清零 ,根目录占用一个簇的大小,所以这里看到已用空间占了16KB。 有的电脑可能会看到格式化后占用8KB或者32KB,原因都一样 只是因为格式化时..._2、如果不小心将u盘的fat32文件系统中数据格式化了,我们可以采用哪些工具恢复。若要手工恢复使用winhex工具,恢复的思路是什么?
文章浏览阅读2.9k次,点赞2次,收藏20次。在禁用 UAC 后,系统将不再提示 UAC 提示框,直接以管理员权限运行命令,从而避免了 UAC 的干扰。但是,禁用 UAC 会降低系统的安全性,因为这会使得恶意软件有更大的机会在计算机上运行和执行操作,因此不建议在正式生产环境中禁用 UAC。UAC(用户帐户控制)是 Windows 操作系统的一项安全特性,用于控制用户在计算机上的活动,以减少恶意软件或病毒的危害。在Windows系统下,如果你是以管理员身份运行cmd,但是仍然无法安装MySQL服务,可能是因为系统的用户账户控制(UAC)设置的问题。_install/remove of the service denied! that operation should be made by an us
文章浏览阅读1.5k次。eNSP常用命令3、acl命令格式基本/高级 ACL 支持:acl [ ipv6 ] acl-number { inbound | outbound }undo acl [ ipv6 ] acl-number { inbound | outbound }二层 ACL 支持:acl acl-number inboundundo acl acl-number inbound功能:acl 命令用来引用访..._ensp历史命令查看