поскажите что не так(переделка с делфи в си)
От: Lik_m  
Дата: 29.11.11 14:28
Оценка:
выбивает разные результаты,правильный 9200,что делаю не так?
На делфи :

 unit Unit1;

 interface

 uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, Grids, StdCtrls, math, XPMan;

 type
   TForm1 = class(TForm)
     StringGrid1: TStringGrid;
     Button2: TButton;
     Button3: TButton;
     Memo1: TMemo;
     XPManifest1: TXPManifest;
     procedure FormCreate(Sender: TObject);
     procedure Button3Click(Sender: TObject);
     procedure Button2Click(Sender: TObject);
     private
     { Private declarations }
     public
     { Public declarations }
 end;

 var
   Form1: TForm1;
   w:array[1..5] of integer = (3100,2600,3500,2800,2400);
   R:array[1..5] of integer = (3500,2500,4000,3000,2000);
   IC:array[1..5] of integer;
   i,j,rez,rezd,lud,ludd:integer;
   bi,bid:array[1..5] of integer;
 implementation

 {$R *.dfm}
 procedure TForm1.FormCreate(Sender: TObject);
 begin
   stringgrid1.Cells[0,0]:='i';
   stringgrid1.Cells[1,0]:='w';
   stringgrid1.Cells[2,0]:='r';
   for i:=1 to 5 do begin
     stringgrid1.Cells[0,i]:=inttostr(i);
     stringgrid1.Cells[1,i]:=inttostr(w[i]);
     stringgrid1.Cells[2,i]:=inttostr(r[i]);
   end;
 end;

 procedure bin(ii:integer);
 begin
   for j:=5 downto 1 do begin
     bi[j]:=ii mod 2;
     ii:=ii div 2;
   end;
 end;

 procedure TForm1.Button3Click(Sender: TObject);
 begin
   memo1.Clear;
   rez:=0;
   rezd:=0;
   ludd:=0;
   fillchar(bid,sizeof(bid),0);
   for i:=1 to 32 do begin
     bin(i);
     rez:=bi[1]*r[1]+bi[2]*r[2]+bi[3]*r[3]+bi[4]*r[4]+bi[5]*r[5];
     lud:=w[1]*bi[1]+w[2]*bi[2]+bi[3]*w[3]+bi[4]*w[4]+bi[5]*w[5];
     if (rez<=10000)and(lud>ludd) then
     begin
       rezd:=rez;
       bid:=bi;
       ludd:=lud;
     end;
   end;
   memo1.Lines.Add(inttostr(ludd));
   for i:=1 to 5 do
     memo1.Lines.Add(inttostr(bid[i]));
 end;

 procedure TForm1.Button2Click(Sender: TObject);
 begin
   application.Terminate;
 end;

 end.


НА си:

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

 #include <vcl.h>
 #pragma hdrstop

 #include "Unit1.h"
 //---------------------------------------------------------------------------
 #pragma package(smart_init)
 #pragma resource "*.dfm"
 TForm1 *Form1;
 int w[5] = {3100,2600,3500,2800,2400};
 int R[5] = {3500,2500,4000,3000,2000};
 int IC[5];
 int bi[5];
 int bid[5]={0,0,0,0,0};
 int ludd=0;

 //---------------------------------------------------------------------------
 __fastcall TForm1::TForm1(TComponent* Owner)
 : TForm(Owner)
 {
 }
 //---------------------------------------------------------------------------

 void __fastcall TForm1::FormCreate(TObject *Sender)
 {
   StringGrid1->Cells[0][0] = 'i';
   StringGrid1->Cells[1][0] = 'w';
   StringGrid1->Cells[2][0] = 'r';
   for (int i=0;i<2;i++)
   {
     StringGrid1->Cells[0][i+1] = IntToStr(i+1);
     StringGrid1->Cells[1][i+1] = IntToStr(w[i]);
     StringGrid1->Cells[2][i+1] = IntToStr(R[i]);
   }
 }
 //---------------------------------------------------------------------------
 void bin(int ii)
 {
   for (int j=5;j>0;j--)
   {
     bi[j] =ii % 2;
     ii = ii / 2;
   }
 }
 void __fastcall TForm1::Button1Click(TObject *Sender)
 {
   Memo1->Clear();
   int rez =0;
   int rezd =0;
   int ludd =0;


   for (int i=0;i<=31;i++)
   {
     bin(i);
     int rez;
     int lud;

     int rezd=0;
     rez=bi[0]*R[0]+bi[1]*R[1]+bi[2]*R[2]+bi[3]*R[3]+bi[4]*R[4];
     lud=w[0]*bi[0]+w[1]*bi[1]+bi[2]*w[2]+bi[3]*w[3]+bi[4]*w[4];
     if (rez<=10000)(lud>ludd);
     {
       rezd = rez;
       for (int i=0;i<5;i++)
       {
         bid[i] = bi[i];
       }
       ludd = lud;
     }

   }
   Memo1->Lines->Add(IntToStr(ludd));
   for (int i=0;i<5;i++)
   {
     Memo1->Lines->Add(IntToStr(bid[i]));
   }
 }
 //---------------------------------------------------------------------------



задача такая :7. Шериф округа Вашингтон принимает участие в переизбрании на следующий срок. Денежные средства на предвыборную кампанию составляют примерно 10000 долларов. Хотя комитет по переизбранию хотел бы провести кампанию во всех пяти избирательных участках округа, ограниченность денежных средств предпи¬сывает действовать по-другому. Приведенная ниже таблица содержит данные о числе избирателей и денежных средствах, необходимых для проведения успешной кампании по каждому избирательному участку. Каждый участок может либо ис¬пользовать все предназначенные деньги, либо вовсе их не использовать. Как сле¬дует распределить денежные средства?

цены участков в коде

добавил форматирование и табуляцию — Кодт
Re: поскажите что не так(переделка с делфи в си)
От: trophim Россия  
Дата: 29.11.11 15:14
Оценка:
Ошибок довольно много (неправильная индексация):

 #include <vcl.h>
 #pragma hdrstop

 #include "Unit3.h"
 //---------------------------------------------------------------------------
 #pragma package(smart_init)
 #pragma resource "*.dfm"
 TForm3 *Form3;
 int w[5] = {3100,2600,3500,2800,2400};
 int R[5] = {3500,2500,4000,3000,2000};
 int IC[5]={0};
 int bi[5]={0};
 int bid[5]={0,0,0,0,0};
 int ludd=0;

 //---------------------------------------------------------------------------
 __fastcall TForm3::TForm3(TComponent* Owner)
 : TForm(Owner)
 {
 }
 //---------------------------------------------------------------------------

 void __fastcall TForm3::FormCreate(TObject *Sender)
 {
 StringGrid1->Cells[0][0] = 'i';
 StringGrid1->Cells[1][0] = 'w';
 StringGrid1->Cells[2][0] = 'r';
 for (int i=1;i<=5;i++)
 {
 StringGrid1->Cells[0][i] = IntToStr(i);
 StringGrid1->Cells[1][i] = IntToStr(w[i-1]);
 StringGrid1->Cells[2][i] = IntToStr(R[i-1]);
 }
 }
 //---------------------------------------------------------------------------
 void bin(int ii)
 {
 for (int j=4;j>=0;j--)
 {
 bi[j] =ii % 2;
 ii = ii / 2;
 }
 }
void __fastcall TForm3::Button1Click(TObject *Sender)
{
    Memo1->Clear();
    int rez =0;
    int rezd =0;
    int lud=0,ludd =0;

    for (int i=1;i<=32;i++)
    {
        bin(i);
        rez=bi[0]*R[0]+bi[1]*R[1]+bi[2]*R[2]+bi[3]*R[3]+bi[4]*R[4];
        lud=w[0]*bi[0]+w[1]*bi[1]+bi[2]*w[2]+bi[3]*w[3]+bi[4]*w[4];
        if ((rez<=10000) && (lud>ludd))
        {
            rezd = rez;
            memcpy(bid,bi,sizeof(bid));
            ludd = lud;
        }
    }
    Memo1->Lines->Add(IntToStr(ludd));

    for (int i=0;i<5;i++)
    Memo1->Lines->Add(IntToStr(bid[i]));
 }
 //---------------------------------------------------------------------------
Let it be! — Давайте есть пчелу!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.