概要
在ubuntu下,通过cmake编译一个简单的通讯录程序
整体代码
主程序 main.cpp
#include <iostream>
#include <string>
#include <unistd.h>
using namespace std;
#define MAX 500
struct Person{
string name;
int sex;
int age;
string phone_number;
string addr;
};
struct AddressBooks{
struct Person personlist[MAX];
int size;
};
int getExistIndex(AddressBooks* address_books, string name){
for (int i = 0; i < address_books->size; i++){
if (address_books->personlist[i].name == name){
return i;
}
}
return -1;
}
void deletePerson(AddressBooks* address_books){
system("clear");
cout << "input delete name" << endl;
string name;
cin >> name;
int ret = getExistIndex(address_books, name);
if (ret == -1){
cout << "input error:none this person" << endl;
}else{
cout << "find this person" << endl;
for (int i = ret; i < address_books->size; i++){
address_books->personlist[i] = address_books->personlist[i + 1];
}
address_books->size--;
cout << "delete person success" << endl;
}
std::cout << "Press Enter to continue...";
cin.ignore();
cin.get();
system("clear");
}
void showPerson(AddressBooks* address_books){
system("clear");
if (address_books->size == 0){
cout << "books is empty" << endl;
}
else{
for(int i = 0; i < address_books->size; i++){
cout << "name: " << address_books->personlist[i].name << endl;
cout << "sex: " << address_books->personlist[i].sex << endl;
cout << "age: " << address_books->personlist[i].age << endl;
cout << "phone number: " << address_books->personlist[i].phone_number << endl;
cout << "home addr: " << address_books->personlist[i].addr << endl;
cout << "*************" << endl;
}
}
std::cout << "Press Enter to continue...";
cin.ignore();
cin.get();
system("clear");
}
void set_attr(Person &temp_person){
string name;
cout << "input name " << endl;
cin >> name;
temp_person.name = name;
int sex = 0;
cout << "input sex " << endl;
cout << "1:male " << endl;
cout << "2:female " << endl;
while (true){
cin >> sex;
if( sex == 1 || sex == 2){
temp_person.sex = sex;
break;
}
cout << "input error.input again" << endl;
}
int age;
cout << "input age " << endl;
cin >> age;
temp_person.age = age;
string phone_number;
cout << "input phone number " << endl;
cin >> phone_number;
temp_person.phone_number = phone_number;
string addr;
cout << "input home addr " << endl;
cin >> addr;
temp_person.addr = addr;
}
bool addPerson(AddressBooks* address_books){
if (address_books->size == MAX) {
cout << "books is full!" << endl;
return false;
}else{
struct Person& temp_p = address_books->personlist[address_books->size];
set_attr(temp_p);
address_books->size++;
return true;
}
}
void findPerson(AddressBooks* address_books){
system("clear");
cout << "input find name" << endl;
string name;
cin >> name;
int ret = getExistIndex(address_books, name);
if (ret == -1){
cout << "input error:none this person" << endl;
}else{
cout << "find this person" << endl;
cout << "name: " << address_books->personlist[ret].name << endl;
cout << "sex: " << address_books->personlist[ret].sex << endl;
cout << "age: " << address_books->personlist[ret].age << endl;
cout << "phone number: " << address_books->personlist[ret].phone_number << endl;
cout << "home addr: " << address_books->personlist[ret].addr << endl;
cout << "*************" << endl;
}
std::cout << "Press Enter to continue...";
cin.ignore();
cin.get();
system("clear");
}
void modifyPerson(AddressBooks* address_books){
system("clear");
cout << "input modify name" <<endl;
string name;
cin >> name;
int ret = getExistIndex(address_books, name);
if (ret == -1){
cout << "input error:none this person" << endl;
std::cout << "Press Enter to continue...";
cin.ignore();
cin.get();
system("clear");
}else{
struct Person& temp_p = address_books->personlist[ret];
set_attr(temp_p);
}
}
//逻辑删除
void cleanPerson(AddressBooks* address_books){
system("clear");
address_books->size = 0;
cout << "address_books was clean" << endl;
std::cout << "Press Enter to continue...";
cin.ignore();
cin.get();
system("clear");
}
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;
}
int main(){
int select = 0;
AddressBooks address_books;
address_books.size = 0;
while (true){
showMenu();
cin >> select;
bool flag = false;
string name;
switch (select){
case 1:
system("clear");
flag = addPerson(&address_books);
if (flag){
system("clear");
cout << "add person success " << endl;
}
break;
case 2:
showPerson(&address_books);
break;
case 3:
deletePerson(&address_books);
break;
case 4:
findPerson(&address_books);
break;
case 5:
modifyPerson(&address_books);
break;
case 6:
cleanPerson(&address_books);
break;
case 0:
cout << "bye" << endl;
return 0;
// break;
default:
break;
}
}
// getchar();
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.6) # cmake最低版本
project(demo_project) #项目名称
set(CMAKE_CXX_STANDARD 11) #设置C++编译版本
set(CMAKE_BUILD_TYPE "Debug") # 默认是Release模式,设置为Debug才能调试
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) #设置可执行文件生产的路径
aux_source_directory(. SRC_LISTS) #.下所有的cpp文件打包到变量SRC_LISTS中
add_executable(demo ${SRC_LISTS}) #生成可执行文件demo
run.sh
#!/bin/bash
mkdir -p build
cd build
cmake ..
make
cd ../bin
./demo
运行结果