MFC之初*/!·#¥!

       前段时间,下了点VC教程(主讲MFC加一点点API),决定在这学期把那些教程弄完,闲时,就看到了诸多人在漫骂微软用MFC来麻木程序员,使之只能停留在一个被禁锢的圈子里,不能长期进步下去,当然,之前在成都某书店里也看见了这样的文章,但久之就淡忘其影响了,就又开始弄了,不过又在网上看见了,仿佛加深了这种说法对我的影响,再加上一些惰性,停了下来,教程也放在那里吃着硬盘空间。
       现在也是很彷徨,但是,班主任叫把一个数据结构的内容放到面向对象的VC里面来弄一个程序出来,呵呵,没有理由不弄啊,呵呵,上课没听怎么懂,抄了个程序回来(没抄完),程序是用FLOYD算法求图中任意两点的最短路径,其中最短路径(长度)当然没问题(比较简单),但是,其路径,只抄了一点点,太复杂了。。。
     经过一阵子的思想暂停后,决定先不让我的程序显示路径,先只显示长度,不就行了啊,于是动工了!!
思考:因为城市之间的矩离得从文件读出,于是想出以下方案:
一、针对数据文件的录入:
                1.把书上的每个城市编上号,用一维数组存储城市间的距离(二维数组),
                2.为了能正确的读入数据,所以文件存储是:每个数据之后加‘*  ’以示 区别,
                3.本城市到本城市的长度为0,没有相邻的两个城市之间的距离初始值为1(因为1比32767容易输入)
                4.数据按第3步录入完毕之后,用WORD的替换功能,将’*1*’替换为’*32767’.
                5.进入数据检测阶段,作为一个写程序的人(而不敢说程序员,呵呵,还没考过呢),我当然没有一个一个去对照,而是采用程序检查的方法。使用双重循环检测点A。当i=j的时候,a[i][j]=0否则输出来以便更正。检测点B.a[i][j]==a[j][i]否则,输出以便更正。C,在整个程序中计数‘*’有多少个,若不为625,则更正。
                6.数据文件以“num.dat”存储起来。数据文件工作结束!(花了俺不少时间哦。。。)
二、程序阶段
         1.先选用读文件方法,我选用了最简单的顺序读入方法,代码如下
                Ch=fgetc(fp);
              While(ch!=EOF){
                Putchar(ch);
               Ch=fgetc(fp);}

         2.由于读入的是字符串,而计算中要求的是整型数字,因此,在读文件的操作中,得用一个字符数组保存读入的,至到读到一个‘*’的时候,在那个字符数组后面加‘/0’然后用函数int atoi(char *)把这个字符数组转成数据并存到相应的二维数组之中.
         3.在TC中调试通过FLOYD算法。


 准备工作已经差不多了。
        
进入VC调试阶段:
开始------>Microsoft Visual C++6.0--------->new------------->MFC AppWizard [exe]---->Shortpath---->....................
在一个对话框中加入两个COMBOX,一个是出发点,一个是目的点,去掉其排序属性,在其CONTENT按前面的编号依次输入城市
在此对话框中再加入一个EDITBOX,用来显示结果
CTRL+W为此对话框创建一个类,CCityDlg,再为其成员添加变量,两个COMBOX,为其添加变量的类型为int 型,而EDITBOX添加变量类型为Control。
在MENU里为其添加菜单,
回到对话框,双击OK,然后生成函数:
void CCityDlg::OnOK(){}
加入代码:
  UpdateData(TRUE);
    CString str,str0;
 str="从";
 int i= m_From;
 switch(i){
 case 0:str0=" 哈尔滨";break;
 case 1:str0="长春";break;
 case 2:str0="沈阳";break;
 case 3:str0="大连";break;
 case 4:str0="天津";break;
 case 5:str0="北京";break;
 case 6:str0="呼和浩特";break;
 case 7:str0="兰州";break;
 case 8:str0="乌鲁木齐";break;
 case 9:str0="西宁";break;
 case 10:str0="西安";break;
 case 11:str0="郑州";break;
 case 12:str0="徐州";break;
 case 13:str0="上海";break;
 case 14:str0="武汉";break;
 case 15:str0="成都";break;
 case 16:str0="昆明";break;
 case 17:str0="贵阳";break;
 case 18:str0="株州";break;
 case 19:str0="南昌";break;
 case 20:str0="福州";break;
 case 21:str0="深圳";break;
 case 22:str0="广州";break;
 case 23:str0="柳州";break;
 case 24:str0="南宁";break;
 case -1:MessageBox("请选择出发地!!");break;
 default:MessageBox("please input right!!");break;
 }
 str+=str0;
 str+="到";
 int j= m_To;
    switch(j){
 case 0:str0=" 哈尔滨";break;
 case 1:str0="长春";break;
 case 2:str0="沈阳";break;
 case 3:str0="大连";break;
 case 4:str0="天津";break;
 case 5:str0="北京";break;
 case 6:str0="呼和浩特";break;
 case 7:str0="兰州";break;
 case 8:str0="乌鲁木齐";break;
 case 9:str0="西宁";break;
 case 10:str0="西安";break;
 case 11:str0="郑州";break;
 case 12:str0="徐州";break;
 case 13:str0="上海";break;
 case 14:str0="武汉";break;
 case 15:str0="成都";break;
 case 16:str0="昆明";break;
 case 17:str0="贵阳";break;
 case 18:str0="株州";break;
 case 19:str0="南昌";break;
 case 20:str0="福州";break;
 case 21:str0="深圳";break;
 case 22:str0="广州";break;
 case 23:str0="柳州";break;
 case 24:str0="南宁";break;
 case -1:MessageBox("请选择目的地!!");break;
 default:MessageBox("please input right!!");break;
 }
 str+=str0;
 int len=ShortPpath(i,j);
 CString str2;
 str2.Format("%d",len);
 str+="的最短路径是:";
 str+=str2;
 m_Show.SetWindowText(str);
然后把先前准备的文件中的函数粘过来
#define MAXV 25
void floyd(int cost[][MAXV],int n,int a[MAXV][MAXV]){
 int i,j,k;
 for(i=0;i<n;i++)
  for(j=0;j<n;j++)
   a[i][j]=cost[i][j];
 for(k=0;k<n;k++)
  for(i=0;i<n;i++)
   for(j=0;j<n;j++)
    if(a[i][j]>a[i][k]+a[k][j]){
     a[i][j]=a[i][k]+a[k][j];

    }
}
int ShortPpath(int m,int n){
 FILE *fp=new FILE;
    char ch,s[128];
 int a[MAXV*MAXV],b[MAXV][MAXV],i,j,k,flag=0,c[MAXV][MAXV];
 if((fp=fopen("num.dat","r"))==NULL){
        AfxMessageBox("不能打开数据文件num.dat");
        exit(0);
    }
    else {
        i=0;
        j=0;
        ch=fgetc(fp);
        while(ch!=EOF){
       if(ch!='*')
       {
        s[i]=ch;
        i++;
       }
       else {
         s[i]='/0';
         i=0;
         a[j]=atoi(s);  //把从数据文件中读入的数据分别存储到一个数组中

        j++;
        }
         ch=fgetc(fp);
        }
    }
    fclose(fp);
    j=0;i=0;k=0;
    while(j<MAXV){     //把一维数组转存为二维数组
       b[j][i]=a[k];
       k++;
       if(i+1==MAXV) j++;
           i=(i+1)%MAXV;
       }
 floyd(b,MAXV,c);
 return c[m][n];
     //数组C中保存的是最短路径  */
}
到了这里,我们就得CTRL+F5  
调用对话框,在COMBOX1里面选择哈尔滨,在第二个里面选择长春,点击OK,于是EDITBOX里显示” 从 哈尔滨到长春的最短路径是:242”


呵呵,昨天晚上写到了2点,呵呵,今天中午还有点余兴,于是写了这个实验清单,还是比较HAPPY的
  

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值