• 4804阅读
  • 6回复

[提问]找高手找找这个正确的程序为什么运行不了的问题啊 [复制链接]

上一主题 下一主题
离线tjlove22
 
只看楼主 倒序阅读 楼主  发表于: 2011-05-29
     如题,我写了一个程序。可是编译完全正确,但是一运行就无响应。
  我一行一行代码试过,问题出现在start函数里的while 只要把这个注释掉就可以了,但是这个是主要部分
  不知道该怎样改?
  代码如下:
  //-------------------.h-------------------
//---------homework.h------------
#ifndef HOMEWORK_H
#define HOMEWORK_H

#include<qlabel.h>
#include<qpushbutton.h>
#include<qhbox.h>
#include<qstring.h>
#include<qlist.h>
#include<qstyle.h>
//----全局函数---------------------
int comp(const char *a,const char *b);
int random(int n);
typedef int(*QSORT_UDF)(const void *,const void *);
void start1();
//---------------------------------------------

class HomeWork:public QLabel
{
Q_OBJECT
private:
  QHBox *hbox1,*hbox2,*hbox3; //用来管理13张牌即13个Label  
  QList<QPushButton>list1;//list1中放三个按钮
  QList<QLabel> list2;//list2中放12张牌
public slots:
void start();//点击按钮1开始
//void restart();//点击按钮2重新发牌
//void cheat();//点击按钮3查看别人的牌
public:
HomeWork(QWidget *parent,const char *name);

};

#endif




//---------------------------.cpp---------------------
//----------------homework1.cpp----------------

#include"homework.h"

HomeWork::HomeWork(QWidget *parent,const char *name):QLabel(parent,name)  
{

list1.insert(0,new QPushButton("开始发牌",this,"btn1"));//在按下“开始发牌”前的界面,只有一个按钮“开始发牌”  
list1.at(0)->setGeometry(260,280,80,40);
connect(list1.at(0),SIGNAL(clicked()),this,SLOT(start()));//用槽将"开始发牌"与start函数连接  

  hbox1=new QHBox(this);//用来管理13张牌  
  hbox1->setGeometry(0,0,600,200);
  hbox1->hide();//第一个界面只显示“开始发牌”一个按钮,所以其他的都隐藏了,第二个界面出现  
  hbox2=new QHBox(this);//用来管理13张牌  
  hbox2->setGeometry(0,200,600,200);
  hbox2->hide();
hbox3=new QHBox(this);//用来管理13张牌  
  hbox3->setGeometry(0,400,600,200);
  hbox3->hide();


list1.insert(1,new QPushButton("牌太烂了,我要重新发牌",this,"btn2"));//点击此按钮对应restart函数  
  list1.at(1)->hide();

list1.insert(2,new QPushButton("使用作弊器,查看别人的牌",this,"btn2"));//点击此按钮对应cheat函数  
list1.at(2)->hide();
for(int i=0;i<4;i++)//动态生成13个LABEL用来放牌  
{
list2.insert(i,new QLabel(" ",hbox1));//调用QList 的insert函数  
list2.at(i)->hide();
}
for(int i=4;i<8;i++)//动态生成13个LABEL用来放牌  
{
list2.insert(i,new QLabel(" ",hbox2));//调用QList 的insert函数  
list2.at(i)->hide();
}  
for(int i=8;i<13;i++)//动态生成13个LABEL用来放牌  
{
list2.insert(i,new QLabel(" ",hbox3));//调用QList 的insert函数  
list2.at(i)->hide();
}  
}
void HomeWork::start()
{  
  list1.at(0)->hide();//按下开始发牌后,按钮开始发牌消失,出现另外两个按钮  
  // start1();//调用start1函数进行发牌  
  char n[]={'2','3','4','5','6','7','8','9','T','J','Q','K','A'};
int a[53],b1[13],b2[13],b3[13],b4[13];
int b11=0,b22=0,b33=0,b44=0,t=1,m,flag,i;
while(t<=52){ //控制发52张牌  
m=random(52); //产生0到51之间的随机数
for(flag=1,i=1;i<=t&&flag;i++)//查找新产生的随机数是否已经存在  
if(m==a)flag=0; //flag=1:产生的是新的随机数  
  //flag=0:产生的随机数已经存在  
  if(flag){
  a[t++]=m;//如果产生了新的随机数,则存入数组
if(t%4==0)b1[b11++]=a[t-1];//根据t的模值判断当前的牌应存入哪个数组中
  else if(t%4==1)b2[b22++]=a[t-1];
else if(t%4==2)b3[b33++]=a[t-1];
else if(t%4==3)b4[b44++]=a[t-1];
}  
}
qsort(b1,13,sizeof(int),(QSORT_UDF)comp); //将每个人的牌进行排序  
  qsort(b2,13,sizeof(int),(QSORT_UDF)comp);
qsort(b3,13,sizeof(int),(QSORT_UDF)comp);
qsort(b4,13,sizeof(int),(QSORT_UDF)comp);  
hbox1->show();
hbox2->show();
  hbox3->show(); //把牌放进label,等待显示  
  
     for(int j=0;j<13;j++)//将数组中的值转换为相应的花色  
     {
if(b1[j]/13==0)
      list2.at(j)->setPixmap(QPixmap("images/heit.jpg"));//打印黑桃标记  
  else if(b1[j]/13==1)
  list2.at(j)->setPixmap(QPixmap("images/ht.jpg"));//打印红桃标记  
  else if(b1[j]/13==2)
  list2.at(j)->setPixmap(QPixmap("images/mh.jpg"));//打印梅花标记
  else  
list2.at(j)->setPixmap(QPixmap("images/fk.jpg"));//打印方块标记  

list2.at(j)->setText(QString::number(n[b1[j]%13]));
  list2.at(j)->show();//显示13张牌  
  }
    

  list1.at(1)->show();//显示第二个按钮,即重新开始发牌按钮  
  list1.at(1)->setGeometry(200,450,200,50);
  list1.at(2)->show();//显示第三个按钮,即查看别人的牌按钮  
list1.at(2)->setGeometry(200,550,200,50);



}
//void start1()//该函数发牌存入数组  
//{
    
//}
  int comp(const char *a,const char *b)
  {
  if(*a>*b)return 1;
  else if(*a==*b)return 0;
  return -1;
  }
  
int random(int n) //随机函数  
  { srand(time(NULL));//产生随机种子  
  int a=rand()%n;
  return a;
  }    




//--------------------------------------------------------------------------  

/------------------------------------main.cpp------------------------------

#include <qapplication.h>
#include "homework.h"
int main(int argc,char**argv)
{
  QApplication app(argc,argv);
  HomeWork hw(0,"hw");
  hw.setPixmap(QPixmap("bg.jpg"));
// hw.setAlignment(AlignCenter);  
hw.setGeometry(200,200,600,600);
  app.setMainWidget(&hw);
  hw.show();
  return app.exec();
}
//--------------------------------------------

求高手指教。谢谢了。
离线morriszy

只看该作者 1楼 发表于: 2011-05-29
能把你的工程文件发上来看看吗?
VS2010+Qt4.7.0
离线jdwx

只看该作者 2楼 发表于: 2011-05-29
char n[]={'2','3','4','5','6','7','8','9','T','J','Q','K','A'};
int a[53],b1[13],b2[13],b3[13],b4[13];
int b11=0,b22=0,b33=0,b44=0,t=1,m,flag,i;
while(t<=52){ //控制发52张牌  
m=random(52); //产生0到51之间的随机数
for(flag=1,i=1;i<=t&&flag;i++)//查找新产生的随机数是否已经存在  
这里t&&flag应该是个bool表达式,i<=t&&flag 你可以调试一下看看结果
if(m==a)flag=0; //flag=1:产生的是新的随机数  
int a[53] a是数组,m是int,m==a这里的a是数组地址
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线jdwx

只看该作者 3楼 发表于: 2011-05-29
编译通过,运行出现问题,第一个就要调试!
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线tjlove22
只看该作者 4楼 发表于: 2011-05-29
回 2楼(jdwx) 的帖子
if(m==a)flag=0;//抱歉,这个打错了  是if(m==a)flag=0;
for(flag=1,i=1;i<=t&&flag;i++)//查找新产生的随机数是否已经存在  
这里t&&flag是"与"条件判断,我改成这样for(flag=1,i=1;(i<=t)&&flag;i++)还是一样的。
最后,不仅是编译通过了。第一个界面也能出来,但是按下按钮后第二个界面就无响应了。
而且重要的是这个发牌算法(就是那个WHILE循环)我用C++版运行时能打印牌,但是就算是用I5的处理器也要1分多钟才能算出结果来。。。
原C++代码为:
#include<iostream>
#include"stdlib.h"
#include"stdio.h"
#include"time.h"
using namespace std;
int comp(const char *a,const char *b);
int random(int n);
void myprintf(int *b,char *n);
typedef int(*QSORT_UDF)(const void *,const void *);
int main()
{
    static char n[]={'2','3','4','5','6','7','8','9','T','J','Q','K','A'};
    int a[53],b1[13],b2[13],b3[13],b4[13];
    int b11=0,b22=0,b33=0,b44=0,t=1,m,flag,i;
    while(t<=52){       //控制发52张牌
        m=random(52);   //产生0到51之间的随机数
        for(flag=1,i=1;i<=t&&flag;i++)//查找新产生的随机数是否已经存在
           if(m==a)flag=0; //flag=1:产生的是新的随机数
                                      //flag=0:产生的随机数已经存在
        if(flag){
            a[t++]=m;//如果产生了新的随机数,则存入数组
            if(t%4==0)b1[b11++]=a[t-1];//根据t的模值判断当前的牌应存入哪个数组中
            else if(t%4==1)b2[b22++]=a[t-1];
            else if(t%4==2)b3[b33++]=a[t-1];
            else if(t%4==3)b4[b44++]=a[t-1];
                  }  
    }
    qsort(b1,13,sizeof(int),(QSORT_UDF)comp);   //将每个人的牌进行排序
   qsort(b2,13,sizeof(int),(QSORT_UDF)comp);
    qsort(b3,13,sizeof(int),(QSORT_UDF)comp);
    qsort(b4,13,sizeof(int),(QSORT_UDF)comp);
    myprintf(b1,n);      //分别打印每个人的牌
    myprintf(b2,n);
    myprintf(b3,n);
    myprintf(b4,n);
}
  void myprintf(int *b,char *n)
  {
          int i;
        cout<<endl<<"黑桃:"  ;  //打印黑桃标记
          for(i=0;i<13;i++)          //将数组中的值转换为相应的花色
          if(b/13==0)cout<<n[b%13]<<" "; //输出该花色对应的牌
        cout<<endl<<"红桃:"  ;        //打印红桃标记
        for(i=0;i<13;i++)
        if(b/13==1)cout<<n[b%13]<<" ";
        cout<<endl<<"方块:"  ;         //打印方块标记
        for(i=0;i<13;i++)
        if(b/13==2)cout<<n[b%13]<<" ";
        cout<<endl<<"梅花:";     //打印梅花标记
        for(i=0;i<13;i++)
        if(b/13==3||b/13==4)cout<<n[b%13]<<" ";
        cout<<endl;
    
  }
  int comp(const char *a,const char *b)
  {
      if(*a>*b)return 1;
      else if(*a==*b)return 0;
      return -1;
  }

  int random(int n)
  { srand(time(NULL));
      int a=rand()%n;
      return a;
  }



不管怎样还是谢谢了
离线tjlove22
只看该作者 5楼 发表于: 2011-05-29
回 4楼(tjlove22) 的帖子
f(m==a)flag=0;这个是被屏蔽了  晕   方括号和里面的i都没了。。。
所以那个原C++代码中这个问题也被屏蔽了  晕
离线tjlove22
只看该作者 6楼 发表于: 2011-05-29
我不会调试。。。晕。。。。因为QT没和VC集成  只能用DOS窗口编译   发现错了才进编译器的。。。。
快速回复
限100 字节
 
上一个 下一个