之前数据结构课程设计要求做这么一个小程序,现在贴上源码,来和大家进行交流学习,希望大家给出意见和建议
程序以链表为主要数据结构对客户信息进行存储,对身份证号码判断了位数及构成(前十七位为数字,最后一位是数字或X)
需求:
针对客户的消费情况,进行客户管理,根据客户的消费积分对客户实行不同程度的打折优惠。
- 采用一定的存储结构进行客户信息的存储
- 对客户的信息可以进行修改、删除、添加
- 能够根据消费情况进行客户积分的累加
- 根据积分情况,对客户实行不同程度的打折优惠
1 #include<iostream>
2 #include<iomanip>
3 #include "stdlib.h"
4 #include<string>
5 using namespace std;
6
7 bool isID(string &);
8 typedef struct cnode
9 {
10 char name[20];
11 string ID;
12 double consume;
13 double integer;
14 struct cnode *next;
15 }cnode;
16
17 void Initstack(cnode * &head)/*初始化链表*/
18 {
19 head= new cnode(); //开辟节点空间
20 head->next=NULL;
21 }
22
23 void Getelem (cnode *head);
24 void Search(cnode *head,string &ID);
25 void Amend(cnode *head,string &ID);
26 void Delete(cnode *head,string &ID);
27 void Showall(cnode *head);
28 void count(cnode *head);
29 double display_discount(double integer);
30
31 int main()
32 {
33 cnode *head;
34 int choice;
35 string y;
36 Initstack(head);
37 do
38 {
39 cout<<endl;
40 cout<<" 客户消费 积分管理系统 "<<endl;
41 cout<<" ******************************"<<endl;
42 cout<<" * *"<<endl;
43 cout<<" * 主菜单 *"<<endl;
44 cout<<" * 1 添加客户 *"<<endl;
45 cout<<" * 2 查找客户 *"<<endl;
46 cout<<" * 3 修改客户 *"<<endl;
47 cout<<" * 4 删除客户 *"<<endl;
48 cout<<" * 5 显示客户 *"<<endl;
49 cout<<" * 6 统计客户 *"<<endl;
50 cout<<" * 7 退出 *"<<endl;
51 cout<<" * *"<<endl;
52 cout<<" ******************************"<<endl;
53 cout<<"请输入您的选择(1,2,3,4,5,6):";
54 cin>>choice;
55 if(choice==1)
56 Getelem(head); //添加
57 else if(choice==2)
58 {
59 cout<<"请输入您查找客户的身份证号:";
60 cin>>y;
61 isID(y);
62 Search(head,y); //查找
63 }
64 else if(choice==3)
65 {
66 cout<<"请输入您想修改客户的身份证号:";
67 cin>>y;
68 isID(y);
69 Amend(head,y);
70 } //修改
71 else if(choice==4)
72 {
73 cout<<"请输入你想要删除的客户的身份证号:";
74 cin>>y;
75 isID(y);
76 Delete(head,y);
77 } //删除
78 else if(choice==5)
79 Showall(head); //显示
80 else if(choice==6)
81 count(head); //统计
82 else if(choice==7)
83 exit(1);
84 }
85 while(choice<=7);
86 system("pause");
87 return 0;
88 }
89 void Getelem (cnode *head)
90 {
91 //添加客户函数以头节点为参数
92 cnode *p;
93 double y;
94 p=new cnode;
95 p->next=new cnode;/*申请空的节点空间*/
96 p->ID=" ";
97 cout<<"请输入姓名:";
98 cin>>p->name;
99 cout<<"请输入身份证号(18位):";
100 cin>>p->ID;
101 isID(p->ID);
102 cout<<"请输入消费金额:";
103 cin>>p->consume;
104 p->integer=p->consume/100;
105 cout<<"积分:"<<p->integer<<endl;
106 y=display_discount(p->integer); //调用函数计算折扣
107 cout<<"折扣:"/*<<setprecision(1)*/<<y<<"折"<<endl;
108 p->next=head->next;
109 head->next=p;
110 }
111 void Search(cnode *head,string &ID)
112 {
113 cnode *p=new cnode;
114 double y;
115 p=head;
116 if(p->next==NULL)
117 cout<<"没有客户!"<<endl;
118 else
119 {
120 while(p->next!=NULL)
121 {
122 p=p->next;
123 if(ID==p->ID) //判断身份证号是否相同
124 {
125 cout<<"姓名:"<<p->name<<endl;
126 cout<<"身份证号:"<<p->ID<<endl;
127 cout<<"消费:"<</*setprecision(2)<<*/p->consume<<endl;
128 cout<<"积分:"<<p->integer<<endl;
129 y=display_discount(p->integer);
130 cout<<"折扣"<</*setprecision(1)<<*/y<<"折"<<endl;
131 return;
132 }
133 }
134 cout<<"不存在该客户!"<<endl;
135 }
136 }
137
138 /*
139 修改客户函数
140 通过ID获取信息
141 可以修改身份证号、姓名、消费金额
142 修改消费金额有覆盖原有金额及续加两种方式
143 */
144 void Amend(cnode *head,string &ID){
145 cnode *p;
146 double y,z;
147 int choose,x;
148 p=head;
149 if(p->next==NULL)
150 cout<<"没有客户!"<<endl;
151 else
152 {
153 while(p->next!=NULL)
154 {
155 p=p->next;
156 if(ID==p->ID) //判断身份证号是否相同
157 {
158 cout<<"姓名:"<<p->name<<endl;
159 cout<<"身份证号:"<<p->ID<<endl;
160 cout<<"消费:"/*<<setprecision(2)*/<<p->consume<<endl;
161 cout<<"积分:"<</*setprecision(1)<<*/p->integer<<endl;
162 y=display_discount(p->integer);
163 cout<<"折扣:"<</*setprecision(1)<<*/y<<"折"<<endl;
164 cout<<"请选择你要修改的1、姓名。2、身份证号。3、消费金额。";
165 cin>>choose;
166 if(choose==1)
167 {
168 cout<<"请输入修改后姓名;";
169 cin>>p->name;
170 }
171 if(choose==2)
172 {
173 cout<<"请输入修改后的身份证号:";
174 cin>>p->ID;
175 isID(p->ID);
176 }
177 if(choose==3)
178 {
179 cout<<"1.覆盖以前消费、2.续加上现在费用!请选择:";
180 cin>>x;
181 if(x==1)
182 {
183 cout<<"请输入修改后的消费:";
184 cin>>p->consume;
185 }
186 else{
187 printf("请输入续加金额:");
188 cin>>z;
189 p->consume+=z;
190 }
191 }
192 cout<<"姓名:"<<p->name<<endl;
193 cout<<"身份证号:"<<p->ID<<endl;
194 cout<<"消费:"<</*setprecision(2)<<*/p->consume<<endl;
195 p->integer=p->consume/100.0;
196 cout<<"积分:"<<p->integer<<endl;
197 y=display_discount(p->integer);
198 cout<<"折扣:"/*<<setprecision(1)*/<<y<<"折"<<endl;
199 return;
200 }
201 }
202 cout<<"不存在该客户!"<<endl;
203 }
204 }
205 void Delete(cnode *head,string &ID)
206 {
207 //删除客户函数
208 cnode *p;
209 int x;
210 double y;
211 p=head;
212 if(p->next==NULL)
213 cout<<"没有客户!"<<endl;
214 else
215 {
216 while(p->next!=NULL)
217 {
218 head=p;
219 p=p->next;
220 if(ID==p->ID)
221 { //判断身份证号是否相同
222 cout<<"姓名:"<<p->name<<endl;
223 cout<<"身份证号:"<<p->ID<<endl;
224 cout<<"消费:"/*<<setprecision(2)*/<<p->consume<<endl;
225 cout<<"积分:"<<p->integer<<endl;
226 y=display_discount(p->integer);
227 cout<<"折扣:"<</*setprecision(1)<<*/y<<"折"<<endl;
228 cout<<"你确认删除?1、确定。2、取消。请选择:";
229 cin>>x;
230 if(x==1)
231 {
232 head->next=p->next;
233 cout<<("删除成功!");
234 }
235 else
236 cout<<"删除失败!";
237 return ;
238 }
239 }
240 cout<<"不存在该客户!"<<endl;
241 }
242 }
243 void Showall(cnode *head) //显示所有客户函数
244 {
245 cnode *p;
246 double y;
247 p=head;
248 if(p->next==NULL)
249 cout<<"没有客户!"<<endl;
250 else
251 while(p->next!=NULL)
252 {
253 p=p->next;
254 cout<<"姓名:"<<p->name<<endl;
255 cout<<"身份证号:"<<p->ID<<endl;
256 cout<<"消费:"<</*setprecision(2)<<*/p->consume<<endl;
257 cout<<"积分:"<<p->integer<<endl;
258 y=display_discount(p->integer);
259 cout<<"折扣:"<</*setprecision(1)<<*/y<<"折"<<endl;
260 }
261 }
262
263 void count(cnode *head)
264 {
265 cnode *p;
266 int i=0;
267 p=head;
268 if(p->next==NULL)
269 cout<<"没有客户!"<<endl;
270 else
271 while(p->next!=NULL)
272 {
273 p=p->next;
274 i++;
275 }
276 cout<<"现有客户数量为"<<i<<"位!"<<endl;
277 }
278 double display_discount(double points)
279 {
280 //计算客户折扣函数,接受一个double型的数作为参数,输出对应的折扣
281 double discount;
282 if(points == 0)
283 discount = 0;
284 if(points > 0&&points <= 50)
285 discount = 9.8;
286 if(points > 50&&points <= 100)
287 discount = 9.5;
288 if(points > 100&&points <= 150)
289 discount = 9.2;
290 if(points > 150&&points <= 200)
291 discount = 9;
292 if(points > 200&&points <= 300)
293 discount = 8;
294 else if(points > 300)
295 discount = 7;
296 return discount;
297 }
298
299 int cal(string a)
300 {
301 return (a[0] - '0') * 7 + (a[1] - '0') * 9 + (a[2] - '0') * 10 + (a[3] - '0') * 5 + (a[4] - '0') * 8 +
302 (a[5] - '0') *4 + (a[6] - '0') * 2 + (a[7] - '0') * 1 + (a[8] - '0') * 6 +(a[9] - '0') * 3 +
303 (a[10] - '0') * 7 + (a[11] - '0') * 9 + (a[12] - '0') * 10 + (a[13] - '0') * 5 + (a[14] - '0') * 8 +
304 (a[15] - '0') * 4 +(a[16] - '0') * 2;
305 }
306
307 char s(string a)
308 {
309 int k = cal(a) % 11;
310 if (k == 0)
311 return '1';
312 else if (k == 1)
313 return '0';
314 else if (k == 2)
315 return 'X';
316 else
317 return '0'+12-k;
318 }
319
320 bool isNumber(string str);
321 bool isID(string &number)
322 {
323 do
324 {
325 if(18==number.length()&&isNumber(number))
326 if (number[17] == s(number))
327 return true;
328 else
329 return false;
330 else
331 cout<<"输入格式不正确,请重新输入:"<<endl;
332 }while (cin >> number);
333
334 }
335
336 bool isNumber(string str)
337 {
338 for(int i=0;i<str.length()-1;i++)
339 if(!isdigit(str[i]))
340 return false;
341 if((isdigit(str[str.length()-1]))||str[str.length()-1]=='X')
342 return true;
343 else
344 return false;
345 }
原文链接: https://www.cnblogs.com/Arthurian/p/7103573.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/256253
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!