1,結構體基本概念
結構體屬于自定義的數據概念,允許用戶存儲不同的數據類型
2,結構體的定義和使用
語法:struct? 結構體名{ 結構體成員列表};
通過結構體創建變量的方式有三種:
1,struct? 結構體名? {? 結構體成員列表 }
示例:
//1,創建學生數據類型:包括姓名,年齡,成績
//自定義數據類型,一些類型集合組成一個類型struct Student
{//成員列表//姓名string name;//年齡int age;//成績char score;
};int main()
{//2,通過學生類型創建具體學生struct Student s1;//給s1賦值,通過“.”訪問結構體變量中的屬性s1.name = "張三";s1.age = 18;s1.score = 100;cout << "姓名:" << s1.name << "年齡:" << s1.age << "成績:" << s1.score << endl;system("pause");return 0;
}
?
2,struct? 結構體名? 變量名= {成員1值,成員2值......}
#include<iostream>
using namespace std;
#include<string>//1,創建學生數據類型:包括姓名,年齡,成績
//自定義數據類型,一些類型集合組成一個類型struct Student
{//成員列表//姓名string name;//年齡int age;//成績int score;
};int main()
{struct Student s2 = { "李四",20,90 };cout << "姓名:" << s2.name << "年齡:" << s2.age << "成績:" << s2.score << endl;system("pause");return 0;
}
3,定義結構體時順便創建變量
#include<iostream>
using namespace std;
#include<string>//1,創建學生數據類型:包括姓名,年齡,成績
//自定義數據類型,一些類型集合組成一個類型struct Student
{//成員列表//姓名string name;//年齡int age;//成績int score;
}s3;int main()
{s3.name = "王五";s3.age = 56;s3.score = 99;cout << "姓名:" << s3.name << "年齡:" << s3.age << "成績:" << s3.score << endl;system("pause");return 0;
}
總結1:定義結構體時的關鍵字是struct,不可省略
總結2:創建結構體變量時,關鍵字struct可以省略
總結3:結構體變量利用操作符”.“訪問成員?
建議用前面兩種方式
3,結構體數組
作用:將自定義的結構他放入到數列中方便維護
語法:struct? 結構體名? ?數組名[元素個數]={{},{},{}};
示例:
struct student
{//成員列表//姓名string name;//年齡int age;//成績int score;
};int main()
{//創建結構體數組struct student StuArr[3] ={{"張三",18,100},{"李四",28,99},{"王五",28,66}};//給結構體數組中的元素賦值StuArr[2].name = "趙六";StuArr[2].age = 60;StuArr[2].score = 82;//遍歷結構體數組for (int i = 0; i < 3; i++){cout << "姓名:" << StuArr[i].name << "年齡:" << StuArr[i].age << "成績:" << StuArr[i].score << endl;}system("pause");return 0;
}
4,結構體指針
作用:通過指針訪問結構體成員
利用->操作符可以通過結構體指針訪問結構體屬性
示例:
struct Student
{//成員列表//姓名string name;//年齡int age;//成績int score;
};int main()
{struct Student s2 = { "李四",20,90 };struct Student* p = &s2;p->score = 80;cout << "姓名:" << s2.name << "年齡:" << s2.age << "成績:" << s2.score << endl;system("pause");return 0;
}
總結:結構體指針可以通過->操作符來訪問結構體中的成員?
5,結構體嵌套結構體
作用:結構體中的成員時另一個結構體:
例如:每個老師輔導一個學生,一個老師的結構體中,記錄一個學生的結構體
示例:
//結構體嵌套結構體
struct student
{//學生列表string name;//學生名字int age; //學生年齡int score;//學生成績
};struct teacher
{//成員列表int id;//職工編號string name;//教師姓名int age;//年齡struct student s1;//老師所輔導的學生
};int main()
{//結構體嵌套結構體//創建老師teacher t;t.id = 10000;t.name = "老王";t.age = 25;t.s1.name = "小王";t.s1.age = 18;t.s1.score = 100;cout << "老師姓名:" << t.name << endl;cout << "老師編號:" << t.id << endl;cout << "老師年齡:" << t.age << endl;cout << "老師輔導的學生:" << t.s1.name << endl;cout << "老師輔導的學生的年齡:" << t.s1.age << endl;cout << "老師輔導的學生的成績" << t.s1.score << endl;system("pause");return 0;
}
6,結構體做函數參數
作用:將結構體作為參數向函數中傳遞
傳遞的方式有兩種:
? ?值傳遞
struct student
{//學生列表string name;//學生名字int age; //學生年齡int score;//學生成績
};void printfstudent1(struct student s)
{s.age=56;cout << "子函數中的打印" << endl;cout << " 姓名:" << s.name << "年齡:" << s.age << "成績:" << s.score << endl;
}int main()
{struct student s;s.name = "張三";s.age = 18;s.score = 100;cout << "main函數中的打印:" << endl;cout << " 姓名:"<<s.name << "年齡:" << s.age << "成績:" << s.score << endl;printfstudent1(s);//結構體做函數參數system("pause");return 0;
}
? ?地址傳遞
struct student
{//學生列表string name;//學生名字int age; //學生年齡int score;//學生成績
};void printfstudent2(struct student* p)
{p->age = 100;cout << "子函數中的打印" << endl;cout << " 姓名:" << p->name << "年齡:" << p->age << "成績:" << p->score << endl;}int main()
{struct student s;s.name = "張三";s.age = 18;s.score = 100;cout << "main函數中的打印:" << endl;cout << " 姓名:" << s.name << "年齡:" << s.age << "成績:" << s.score << endl;printfstudent2(&s);system("pause");return 0;
}
總結:如果不想修改主函數中的數據,用值傳遞,反之,用地址傳遞?
7,結構體中const的使用場景
作用:用const來防止操作錯誤
示例:
//const 使用場景
//將函數中的形參改為指針,可以減少內存空間,而且不會復制出新的副本出來
void printfstudent2(struct student* p)//加const防止函數體中的誤操作
{//p->age = 100;加了const,不可以修改數據,可以防止我們的誤操作cout << "子函數中的打印" << endl;cout << " 姓名:" << p->name << "年齡:" << p->age << "成績:" << p->score << endl;}
8,結構體案例
8.1?案例1
學校正在做畢設項目,每名老師帶領5名學生,總共三名老師,需求如下:
設計學生和老師的結構體,其中在老師的結構體中,有老師姓名和一個存放5名學生的數組作為成員
學生的成員有姓名,考試成績,創建數組存放3名老師,通過函數給每個老師及所帶的學生賦值
最終打印出老師數據以及老師所帶的學生數據
代碼展示:
#include<iostream>
using namespace std;
#include<string>
#include<ctime>
//學生的結構體
struct student
{string sName;int score;
};//老師的結構體
struct teacher
{string tName;struct student sArray[5];
};//信息賦值
void allocate_student(struct teacher tArray[], int len)
{string nameSeed = "ABCDE";for (int i = 0; i < len; i++){tArray[i].tName = "Teacher";tArray[i].tName += nameSeed[i];for (int j = 0; j < 5; j++){tArray[i].sArray[j].sName = "Studemt_";tArray[i].sArray[j].sName += nameSeed[j];int random = rand() % 61 + 40;//40~99tArray[i].sArray[j].score = random;}}
}
//打印所有老師及所帶的學生信息
void print_Student(struct teacher tArray[], int len)
{for (int i = 0; i < len; i++){cout << "老師姓名:" << tArray[i].tName << endl;for (int j = 0; j < 5; j++){cout << "\t學生姓名:" << tArray[i].sArray[j].sName<<"學生成績:"<< tArray[i].sArray[j].score << endl;}}}
int main()
{srand((unsigned)time(NULL));//1,創建3名老師的數組struct teacher tArray[3];//2,通過函數給3名老師賦值,并給老師帶的學生信息賦值int len = sizeof(tArray) / sizeof(tArray[0]);allocate_student(tArray, len);//3,打印所有老師及所帶的學生信息print_Student(tArray, len);system("pause");return 0;
}
8.2 案例二
案例描述:
設計一個英雄的結構體,包括成員姓名,年齡,性別;
創建結構體數組,數組中存放5名英雄。
通過冒泡排序的算法,將數組中的英雄按照年齡進行升序排序,最終打印排序后的結果
五名英雄信息如下:
{”劉備“,23,”男“}
{“關羽”,22,“男”}
{“張飛”,21,“男”}
{“趙云”,20,“男”}
{“貂蟬”,19,“女”}
代碼如下:
#include<iostream>
using namespace std;
#include<string>//1,設計英雄結構體
struct Hero
{//姓名string name;//年齡int age;//性別string sex;
};void printsort(struct Hero Array[], int len)
{cout << "排序后" << endl;for (int i = 0; i < len; i++){cout << "英雄姓名:" << Array[i].name << "\t"<< "英雄年齡:" << Array[i].age << "\t"<< "英雄性別:" << Array[i].sex << "\t"<< endl;}
}void Bubblesort(struct Hero Array[], int len)
{for (int i = 0; i < len - 1; i++){for (int j = 0; j < len - i - 1; j++){if (Array[j].age > Array[j + 1].age){int temp = Array[j].age;Array[j].age = Array[j + 1].age;Array[j+1].age = temp;}}}
}int main()
{//2,創建數組存放英雄struct Hero Array[5] ={{"劉備",23,"男" },{ "關羽",22,"男" },{ "張飛",21,"男" },{ "趙云",20,"男" },{ "貂蟬",19,"女" }};int len = sizeof(Array) / sizeof(Array[0]);cout << "排序前" << endl;for (int i = 0; i < len; i++){cout << "英雄姓名:" << Array[i].name << "\t"<< "英雄年齡:" << Array[i].age << "\t"<< "英雄性別:" << Array[i].sex << "\t"<< endl;}//3,創建函數對數組進行排序,按照年齡進行升序排序Bubblesort(Array, len);//4,對排序后結果進行打印輸出printsort(Array, len);system("pause");return 0;
}
?
9, 通訊錄管理系統
#include<iostream>
using namespace std;
#include<string>//頭文件信息
#define MAX 1000//聯系人結構體
struct Person
{string m_name;//姓名int m_sex;//性別int m_age;//年齡string m_phone;//電話string m_address;//住址
};//通訊錄結構體
struct Addressbooks
{struct Person personArray[MAX];//通訊錄保存聯系人信息int m_size;//通訊錄中人員個數
};//菜單界面
void showMenu()
{cout << "**********************" << endl;cout << "*****1,添加聯系人*****" << endl;cout << "*****2,顯示聯系人*****" << endl;cout << "*****3,刪除聯系人*****" << endl;cout << "*****4,查找聯系人*****" << endl;cout << "*****5,修改聯系人*****" << endl;cout << "*****6,清空聯系人*****" << endl;cout << "*****0,退出通訊錄*****" << endl;cout << "**********************" << endl;cout << endl;
}//添加聯系人
void addPerson(Addressbooks * abs)
{//先判斷通訊錄是否已滿,如果滿了后不再添加if (abs->m_size == MAX){cout << "通訊錄已滿,無法添加!" << endl;return;}else{//添加聯系人//姓名string name;cout << "請輸入名字:" << endl;cin >> name;abs->personArray[abs->m_size].m_name = name;//性別cout << "請輸入性別" << endl;cout << "1----男" << endl;cout << "2----女" << endl;int sex = 0;while (true){cin >> sex;if (sex == 1 || sex == 2){abs->personArray[abs->m_size].m_sex = sex;break;}cout << "輸入有誤,請重新輸入" << endl;}//年齡cout << "請輸入年齡" << endl;int age = 0;cin >> age;abs->personArray[abs->m_size].m_age = age;//聯系電話cout << "請輸入電話" << endl;string phone;cin >> phone;abs->personArray[abs->m_size].m_phone = phone;//家庭住址cout << "請輸入地址" << endl;string address;cin >> address;abs->personArray[abs->m_size].m_address = address;//更新通訊錄人數abs->m_size++;cout << "添加成功" << endl;}system("pause");//按任意鍵繼續system("cls");//清屏操作
}//顯示聯系人
void showPerson(Addressbooks* abs)
{//判斷如果當前通訊錄中沒有人員,就提示記錄為空//人數大于0,顯示通訊錄中信息if (abs->m_size == 0){cout << "當前記錄為空" << endl;}else{for (int i = 0; i < abs->m_size; i++){cout << "姓名:" << abs->personArray[i].m_name << "\t";cout << "性別:" << (abs->personArray[i].m_sex == 1 ? "男" : "女" )<< "\t";cout << "年齡:" << abs->personArray[i].m_age << "\t";cout << "電話:" << abs->personArray[i].m_phone << "\t";cout << "地址:" << abs->personArray[i].m_address << endl;}}system("pause");//按任意鍵繼續system("cls");//清屏操作
}//如果存在,返回聯系人在通訊錄中的位置,不存在則返回 - 1
//參數1 通訊錄 參數2 對比姓名
int isExist(Addressbooks * abs,string name)
{for (int i = 0; i < abs->m_size ; i++){//找到用戶姓名if (abs->personArray[i].m_name == name){//返回這個人的下標return i;}return -1;//如果遍歷結果都沒有找到,則返回-1}
}void deletePerson(Addressbooks * abs, string name)
{int ret = isExist(abs, name);//ret==-1 未查到//ret != 1 查到了if (ret != -1){//查到人,要進行刪除操作for (int i = 0; i < abs->m_size; i++){//數據遷移//刪除:就是將后面每個人的信息的位置替換前一個人的信息abs->personArray[i] = abs->personArray[i + 1];}abs->m_size--;cout << "刪除成功" << endl;}else{cout << "查無此人" << endl;}system("pause");system("cls");
}void findPerson(Addressbooks * abs)
{cout << "輸入您要查找的聯系人" << endl;string name;cin >> name;//判斷聯系人是否在通訊錄中int ret = isExist(abs, name);if (ret != -1)//找到聯系人{cout << "姓名:" << abs->personArray[ret].m_name << "\t";cout << "性別:" << (abs->personArray[ret].m_sex == 1 ? "男" : "女") << "\t";cout << "年齡:" << abs->personArray[ret].m_age << "\t";cout << "電話:" << abs->personArray[ret].m_phone << "\t";cout << "地址:" << abs->personArray[ret].m_address << endl;}else {cout << "查無此人" << endl;}system("pause");system("cls");
}void modifyPerson(Addressbooks* abs)
{cout << "輸入您要修改的聯系人" << endl;string name;cin >> name;int ret = isExist(abs, name);if (ret != -1)//找到聯系人{//姓名string name;cout << "請輸入名字:" << endl;cin >> name;abs->personArray[ret].m_name = name;//性別cout << "請輸入性別" << endl;cout << "1----男" << endl;cout << "2----女" << endl;int sex = 0;while (true){cin >> sex;if (sex == 1 || sex == 2){abs->personArray[ret].m_sex = sex;break;}cout << "輸入有誤,請重新輸入" << endl;}//年齡cout << "請輸入年齡" << endl;int age = 0;cin >> age;abs->personArray[ret].m_age = age;//聯系電話cout << "請輸入電話" << endl;string phone;cin >> phone;abs->personArray[ret].m_phone = phone;//家庭住址cout << "請輸入地址" << endl;string address;cin >> address;abs->personArray[ret].m_address = address;cout << "修改成功" << endl;}else{cout << "查無此人" << endl;}system("pause");system("cls");
}void cleanPerson(Addressbooks* abs)
{abs->m_size = 0;cout << "通訊錄已經清空" << endl;system("pause");system("cls");
}int main()
{Addressbooks abs;//創建通訊錄結構體變量abs.m_size = 0;//初始化當前人數個數int select = 0;//創建用戶輸入變量while (1){//調用菜單showMenu();cout << "請輸入:" << endl;int select = 0;cin >> select;switch (select){case 1://1,添加聯系人addPerson(&abs);//利用地址傳參,可以修飾實參break;case 2://2, 顯示聯系人showPerson(&abs);break;case 3://3,刪除聯系人{cout << "請輸入刪除聯系人的姓名:" << endl;string name;cin >> name;if (isExist(&abs, name) == -1){cout << "查無此人" << endl;}else{cout << "找到此人" << endl;}deletePerson(&abs, name); }break;case 4://4,查找聯系人findPerson(&abs);break;case 5://5,修改聯系人modifyPerson(&abs);break;case 6://6,清空聯系人cleanPerson(&abs);break;case 0://0,退出通訊錄cout << "歡迎下次使用!" << endl;system("pause");break;default:break;}}system("pause");return 0;
}
通訊錄管理系統具體操作請看以下文章:
本文鏈接:c++之通訊錄管理系統-CSDN博客