之前学习时没做笔记,现在有点忘了,回顾一下。
结构体相关知识
冒泡排序
从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。
从小到大排序时
总共n个数,
第1轮比较n个数,比较n-1次
第2轮只比较n-1个数,比较n-2次
…
一直比较
第n-2轮比较3个数,比较2次
第n-1轮比较2个数,比较1次
所以总共比较n-1轮,第 i 轮比较 n - i 次
//冒泡排序加指针
void sort(int * p1,int len)
{
cout << "排序前的数组为";
for (int i = 0; i < len; i++)
{
cout << *(p1 + i) << " ";
}
cout << endl;
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1;j++)
{
if(*(p1+j)>*(p1+1+j))
{
int temp = *(p1+j);
*(p1+j) = *(p1 + j + 1);
*(p1 + j + 1) = temp;
}
}
}
cout << "排序后的数组为";
for(int i =0;i<len;i++)
{
cout << *(p1 + i) << " ";
}
cout << endl;
}
指针常量和常量指针
常量指针 const int * p 指针指向可以改,指针指向的值不能改
指针常量 int * const p 指针指向不可以改,指针指向的值可以改
const既修饰指针又修饰常量 const int * const p ,两个都不可以改
结构体做函数参数
struct student
{
string name;
int age;
int score;
};
//值传递
void print1(struct student s)
{
s.age = 90;//值传递 改变形值的大小不会改变实参的大小
cout << "子函数中姓名:" << s.name << "子函数中年龄:" << s.age << "分数:" << s.score
<< endl;
}
//地址传递
void print2(struct student * s)
{
s->age = 90;//地址传递 也会改变主函数中的数据
cout << "子函数中姓名:" << s->name << "子函数中年龄:" << s->age << "分数:" << s->score
<< endl;
}
const在结构体中的使用
//地址传递 用指针可以减少内存,指针占四个字节,若使用值传递进行输出,内存大大增加
//地址传递中参数改变会改变主函数中的值,因此引入const
void print2(const struct student * s)
{
//s->age = 90;此时有修改的操作就会报错
cout << "子函数中姓名:" << s->name << "子函数中年龄:" << s->age << "分数:" << s->score
<< endl;
}
结构体案例
通讯录管理系统
设置通讯录容量:#define max 1000
建立一个 个人信息的结构体
struct information
{
string name;
int sex;//1即男性,2即女性
int age;
string phone;
string address;
};
再建立一个通讯录结构体
struct MAX_1000
{
struct information arr[max];//个人信息结构体数组
int num;
};
功能函数
void showmeue();
void add(struct MAX_1000 * addbooks);
void print(struct MAX_1000* addbooks);
void showone(struct MAX_1000* addbooks, int i);
void delet(struct MAX_1000* addbooks);
int find(struct MAX_1000* addbooks, string name);
void findshow(struct MAX_1000* addbooks);
void change(struct MAX_1000* addbooks);
void clear(struct MAX_1000* addbooks);
int main()
{
struct MAX_1000 addbooks;
addbooks.num = 0;//初始人员个数为0
int button = 0 ;
while (1)
{
showmeue();
cout <<endl<< "请输入操作序号:" << endl;
cin >> button;
switch (button)
{
case 1:add( &addbooks); break;
case 2:print(&addbooks); break;
case 3:delet(&addbooks); break;
case 4:findshow(&addbooks); break;
case 5:change(&addbooks); break;
case 6:clear(&addbooks); break;
case 7: {
cout << "欢迎下次使用" << endl;
system("pause");
return 0;
} break;
default:
break;
}
}
return 0;
}
void showmeue()
{
string meue[] = { "1.添加联系人" ,"2.显示所有联系人" ,
"3.删除联系人" ,"4.查找联系人" ,"5.修改联系人信息" ,
"6.清空联系人" ,"7.退出菜单" };
for (int i = 0; i < 35; i++)
{
cout << "*";
}
cout << endl << "\t通讯录管理系统" << endl;
for (int i = 0; i < 7; i++)
{
cout <<meue[i]<< endl;
}
/*cout
<< "1.添加联系人" << endl
<< "2.显示所有联系人" << endl
<< "3.删除联系人" << endl
<< "4.查找联系人" << endl
<< "5.修改联系人信息" << endl
<< "6.清空联系人" << endl
<< "7.退出菜单" << endl;*/
for (int i = 0; i < 35; i++)
{
cout << "*";
}
}
void add(struct MAX_1000* addbooks)
{
if(addbooks->num == max)
{
cout << "通讯录已满,无法添加。" << endl;
}
else
{
string name;
int sex=0;
int age=0;
string phone;
string address;
cout << "请输入姓名:";
cin >> name;
addbooks->arr[addbooks->num ].name = name;
cout << "请输入性别:(1-男 2-女):";
cin >> sex;
while(sex != 1 && sex != 2)
{
cout << "输入性别格式错误,请重新输入:";
cin >> sex;
}
addbooks->arr[addbooks->num].sex = sex;
cout << "请输入年龄:";
cin >> age;
addbooks->arr[addbooks->num ].age = age;
cout << "请输入电话:";
cin >> phone;
addbooks->arr[addbooks->num ].phone = phone;
cout << "请输入地址:";
cin >> address;
addbooks->arr[addbooks->num ].address = address;
addbooks->num = addbooks->num + 1;
cout << "添加成功";
system("cls");
}
}
void print(struct MAX_1000* addbooks)
{
string sex;
for (int i = 0; i < (addbooks->num); i++)
{
if (addbooks->arr[i].sex == 1) { sex = "男"; }
else if (addbooks->arr[i].sex == 2) { sex = "女";}
cout << "姓名:" << addbooks->arr[i].name<<"\t"
<< "性别:" << sex << "\t"
<< "年龄:" << addbooks->arr[i].age << "\t"
<< "电话:" << addbooks->arr[i].phone << "\t"
<< "地址:" << addbooks->arr[i].address << "\t"
<< endl;
}
system("pause");
system("cls");
}
int find(struct MAX_1000* addbooks, string name)
{
for (int i = 0; i < addbooks->num; i++)
{
if (name == addbooks->arr[i].name)
{
return i;
}
}
return -1;
}
void showone(struct MAX_1000* addbooks,int i)
{
string sex;
if((i<0) || (i>=addbooks->num))
{
cout << "错误 num = "<<i<<endl;
}
else
{
if (addbooks->arr[i].sex == 1) { sex = "男"; }
else if (addbooks->arr[i].sex == 2) { sex = "女"; }
cout << "姓名:" << addbooks->arr[i].name << "\t"
<< "性别:" << sex << "\t"
<< "年龄:" << addbooks->arr[i].age << "\t"
<< "电话:" << addbooks->arr[i].phone << "\t"
<< "地址:" << addbooks->arr[i].address << "\t"
<< endl;
}
}
void delet(struct MAX_1000* addbooks)
{
string delet_name;
cout << "请输您要删除的联系人姓名:";
cin >> delet_name;
if(find(addbooks, delet_name)==-1)
{
cout << "查无此人。" << endl;
}
else
{
cout << "找到了。原信息为:"<<endl;
showone(addbooks, find(addbooks, delet_name));
for (int i = find(addbooks, delet_name); i < addbooks->num-1; i++)
{
addbooks->arr[i] = addbooks->arr[i + 1];
}
cout << "删除成功。" << endl;
addbooks->num = addbooks->num - 1;
}
system("pause");
system("cls");
}
void findshow(struct MAX_1000* addbooks)
{
string sex;
string find_name;
cout << "请输入您要查找的联系人姓名:";
cin >> find_name;
if (find(addbooks, find_name) == -1)
{
cout << "查无此人。" << endl;
}
else
{
showone(addbooks, find(addbooks, find_name));
}
system("pause");
system("cls");
}
void change(struct MAX_1000* addbooks)
{
string new_name;
int new_sex=0;//1即男性,2即女性
int new_age;
string new_phone;
string new_address;
string change_name;
cout << "请输入您要修改的联系人姓名:";
cin >> change_name;
int ret = find(addbooks, change_name);
if(ret==-1)
{
cout << "查无此人。"<<endl;
}
else
{
cout << "原信息为:" << endl;
showone(addbooks, ret);
cout << "修改联系人姓名为:";
cin >> new_name;
addbooks->arr[ret].name = new_name;
// cout << "修改成功,新信息为:num=" << find(addbooks, change_name) << endl;
cout << "修改联系人性别为:(1-男 2-女):";
cin >> new_sex;
while (new_sex != 1 && new_sex != 2)
{
cout << "输入性别格式错误,请重新输入:";
cin >> new_sex;
}
addbooks->arr[ret].sex = new_sex;
cout << "修改联系人年龄为:";
cin >> new_age;
addbooks->arr[ret].age = new_age;
cout << "修改联系人联系电话为:";
cin >> new_phone;
addbooks->arr[ret].phone = new_phone;
cout << "修改联系人地址为:";
cin >> new_address;
addbooks->arr[ret].address = new_address;
// addbooks->arr[find(addbooks, change_name)].address = new_address;
//错误示范,经过修改后find(addbooks, change_name)已经无法找到修改前的姓名change_name,因此会返回-1,而数组没有第-1项,
// 因此发生错误退出
cout << "修改成功,新信息为:" <<endl;
showone(addbooks, ret);
}
system("pause");
system("cls");
}
void clear(struct MAX_1000* addbooks)
{
addbooks->num = 0;
cout << "通讯录已清空。" << endl;
system("pause");
system("cls");
}