TURBOTX 2017-11-13 00:36 采纳率: 0%
浏览 937

这个程序运行时一直死循环是为什么呀?

/*新一届校园十大优秀青年评比开始了!每一位在校学生可通过网上评比系统,为自己认为优秀的学生提名与投票。请开发一个可用于该需求的系统,满足下列基本功能。
提名优秀学生和投票。查看提名学生的基本信息。显示各提名学生的票数。显示排行榜*/
#include
#include
#include
#include
using namespace std;
struct student {
char name[40];//姓名的拼音加学号
int number;//票数
int Class;//班级
char grade[30];//年级
char major[50];//专业
char honor[100];//优秀事迹
};
class vs {/*votesystem*/
private:
student stu;
int count;//当前元素个数
int sizeindex;//哈希表长
public:
vs() { stu = NULL; count = 0; sizeindex = 0; }
~vs() { delete[]stu; count = 0; }
void InitHashTable(int n);//初始化哈希表
int Hash(char *name);//哈希函数
void collision(int&k) { k++; } //开放定址线性探测法处理冲突
int search(char *name,int &k);//寻找
int vote(char *name);//投票
void insert(char *name);//插入
void display();//显示哈希表
void showvote(int k);//按哈希表下标显示票数
void showrank();//显示排行榜

};
void vs::InitHashTable(int n)
{//初始化哈希表
sizeindex = n;
stu = new student[sizeindex];
for (int i = 0; i < sizeindex; i++)
stu[i].name[0] = '\0';
}
int vs::Hash(char *name)
{//哈希函数
char *p = name;
int key = 0;
while (*p)
{
key += int(*p); p++;
}
return key%sizeindex;
}
int vs::search(char *name,int &k)
{//寻找
k=Hash(name);//哈希函数定位
while(stu[k].name[0]!='\0'&&strcmp(stu[k].name,name))
collision(k);//处理冲突
if(!strcmp(stu[k].name,name)) return 1;//找到
else return 0;
}
void vs::insert(char *name)
{
int s; char a[2];
search(name,s);
cout << "提名学生信息格式如下: \n" << "\t班级: 一班\n" << "\t专业:软件工程\n" << "\t年级:二年级\n" << "\t突出事迹:三好学生\n";
strcpy(stu[s].name, name);
cout << "班级:\t"; cin >> stu[s].Class;
cout << "专业:\t"; cin.getline(a, 2); cin.getline(stu[s].major, 50);
cout << "年级:\t"; cin.getline(stu[s].grade, 10);
cout << "突出事迹:\t"; cin.getline(stu[s].honor, 100);
stu[s].number = 1;//提名即为投一票
count++;//当前人数加一
}
int vs::vote(char *name)//记录已存在时调用search函数
{
int s;
search(name,s);//定位
if (s) { stu[s].number++; return 1; }//投票成功
else return 0;//投票失败
}
void vs::display()
{//显示哈希表
for (int i = 0; i < sizeindex; i++)
if (stu[i].name[0] != '\0')
cout << stu[i].name << ""
<< stu[i].number << ""
<< stu[i].major << ""
<< stu[i].grade << ""
<< stu[i].Class << ""
<< stu[i].honor << "\t"
<< endl;
}
void vs::showvote(int k)
{//按哈希表下标显示票数
cout << "票数" << stu[k].number;
}
void vs::showrank()
{//显示排行榜

int a[11];//定义一个数组存放前十名在哈希表的下标
for (int i = 0; i < 10; i++) a[i] = -1;
for (int i = 0; i < sizeindex; i++)//遍历哈希表
{
if (stu[i].name[0] != '\0')
{
int k = 9;
for (; k >= 0; k--)//利用插入法进行排序
{
if (a[k] > -1)
{
if (stu[a[k]].number < stu[i].number)
a[k + 1] = a[k];
else break;
}
}
a[k + 1] = i;
}
}
for (int i = 0; i-1; i++)//对前十名输出
cout << stu[a[i]].name << '/t' << stu[a[i]].number << endl;
}
int main()
{
int choose = -1, k = -1;
char name[40];
vs L;
L.InitHashTable(50);
while (choose != 5)
{
cout << "
*********\n"
<< "1、选手信息\n"
<< "2、选手得票数\n"
<< "3、投票\n"
<< "4、排行榜\n"
<< "5、退出系统\n"
<< "**********\n"
<< "请选择操作:\n";
cin >> choose;
switch (choose)
{
char a[2];
case 1:L.display(); break;
case 2:
cout << "请输入选手姓名拼音加学号(如:tianxiao 2016201118):" << endl;
cin.getline(a, 2);
cin.getline(name, 40);
int f;
f = L.search(name, k);
if (f)L.showvote(k), cout << endl;
else cout << "无此记录\n";
break;
case 3:
cout << "请输入选手姓名拼音加学号(如:tianxiao 2016201118):" << endl;
cin.getline(a, 2);
cin.getline(name, 40);
f = L.search(name, k);
if (f) { L.vote(name); cout << "投票成功\n"; }
else
{
cout << "无此记录\n";
cout << "1、提名该学生\n" << "2、返回\n" << "请选择操作:";
int t;
cin >> t;
if (t == 1)
{
L.insert(name);
cout << "提名成功\n";
}
}
break;
case 4:
L.showrank(); break;
case 5:
cout << "投票系统已关闭\n"; break;
default: cout << "操作无效,请重新选择\n"; break;
}
}
return 0;
}

  • 写回答

2条回答 默认 最新

  • 大米粥哥哥 2017-11-13 00:42
    关注

    在哪死循环啊 自己在相应位置设置断点调试

    评论

报告相同问题?

悬赏问题

  • ¥15 vhdl+MODELSIM
  • ¥20 simulink中怎么使用solve函数?
  • ¥30 dspbuilder中使用signalcompiler时报错Error during compilation: Fitter failed,求解决办法
  • ¥15 gwas 分析-数据质控之过滤稀有突变中出现的问题
  • ¥15 没有注册类 (异常来自 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
  • ¥15 知识蒸馏实战博客问题
  • ¥15 用PLC设计纸袋糊底机送料系统
  • ¥15 simulink仿真中dtc控制永磁同步电机如何控制开关频率
  • ¥15 用C语言输入方程怎么
  • ¥15 网站显示不安全连接问题