Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 22 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 14.01.12
Prihlásený: 20.07.13
Príspevky: 46
Témy: 9
Príspevok NapísalOffline : 21.02.2012 9:10

Zdravim, chcel by som sa spytat,
ako mozem naplnit novovytvorene 2D dynamicke pole (*dyn_pole)[7] vyhovujucimi riadkami z predchadzajuceho 2D statickeho pola p1[6][7]..
myslel som ze to bude najmensi problem, ale nie. a nedari sa mi na nete natrafit na tento konretny pripad..(viem si vypisat indexy vyhovujucich riadkov ale neviem ich dalej pouzit)
Nove dynamicke p. ma pevny pocet stlpcov (7), a malo by mat variabilny pocet riadkov, prave podla toho kolko ich vyhovuje z pedchadzajuceho stat. pola, podla max prvku v 6 stlpci, ktory sa moze aj opakovat.
Ma to byt prog. pre optimalne vyuzitie loznych ploch.(automatizacia v priemyselnom inzinierstve), tento kod je len usek z celeho. Som este lamka takze main() je zatial zbytocne dlhocizny, amatersky a skaredy(podstatne je az na konci), ale funkcny az po tvorenie dynam. pola na konci.(ale vlozim ho pre istotu cely)
Ak by mi niekto vedel poradit, pripadne aspon usmernit tak super.
Vdaka.

Kód:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define AND &&
#define rezerva 0.05

int over(float p1[6][7], int a, int k, int n){
      int i;
      i=a;
      p1[i][3]>=1?n++:k++;
                                              }

double vstup(int a, float p1[6][7], float Dmj1r, float Smj1r, float Vmj1r, float Dpal, float Spal, float Vlp, float Vpal)     
{ int i;
  i=a;
 {
         p1[i][0]=Dmj1r; p1[i][1]=Smj1r; p1[i][2]=Vmj1r;
         p1[i][3]=(floor(Dpal/Dmj1r))*(floor(Spal/Smj1r));                  //pk1v
         p1[i][4]=floor((Vlp-(Vpal+rezerva))/Vmj1r);                               //pv 
         p1[i][5]=Vpal+(p1[i][4]*Vmj1r);                                         //vmj2r
         p1[i][6]=p1[i][3]*p1[i][4];                                         //pknapal
 }
}

void perm(float *a, float *b){
     float p;
           p=*a;
          *a=*b;
          *b=p;
                             }
float ppm(float pozd, float priec, float Dpal, float Spal, float Dlp, float Slp, float max, float Nlp){
       float opt;
       pozd=(floor(Dlp/Dpal))*(floor(Slp/Spal));
       priec=(floor(Dlp/Spal))*(floor(Slp/Dpal));
       
       if((priec*max)>Nlp && (pozd*max)>Nlp){
       opt=floor(Nlp/max);
                                            }
       else if((pozd>priec?pozd:priec)*max>Nlp && (pozd>priec?priec:pozd)*max<Nlp){
       opt=(pozd>priec?priec:pozd);
                                                                                  }
       else if(pozd>priec){
               opt=pozd;
                          }
               else if(pozd<priec){
                    opt=priec;
                                  }
                    else if(pozd==priec){
                    opt=priec;
                                        }
       printf("ppm je %.0f", opt);
       }
main(int argc, char *argv[]) {
       int i, j, k, n, m, g, f, q, r, a;
       float Dmj1r, Smj1r, Vmj1r, Hmj1r, Qmj1r, Dpal, Spal, Vpal, Hpal, Dlp, Slp, Vlp, Nlp,
              pv, Vmj2r, Hmj2r, max, pozd, priec, maxf;
       float p1[6][7];       
       float (*dyn_pole)[7];
       //=======================================================================     
       printf("zadaj DLZKU palety v <m>: \n"); scanf("%f",&Dpal);
       printf("zadaj SIRKU palety v <m>: \n"); scanf("%f",&Spal);
       printf("zadaj VYSKU palety v <m>: \n"); scanf("%f",&Vpal);
       printf("zadaj VAHU palety v <m>: \n"); scanf("%f",&Hpal);
       //--------------------------------------------------------
       do{
       printf("zadaj 1. rozmer mj1r v <m>: \n"); scanf("%f",&Dmj1r);
       if(Dmj1r>Dpal)
       printf("Tento rozmer je vacsi nez dlzka palety\n");
         }
         while(Dmj1r>Dpal);
       //-------------------------------------------------------
       do{
       printf("zadaj 2. rozmer mj1r v <m>: \n"); scanf("%f",&Smj1r);
       if(Smj1r>Spal)
       printf("Tento rozmer je vacsi nez sirka palety\n");
         }
         while(Smj1r>Spal);
        //------------------------------------------------------
       printf("zadaj 3. rozmer mj1r v <m>: \n"); scanf("%f",&Vmj1r);
       printf("zadaj HMOTNOST mj1r v <kg>: \n"); scanf("%f",&Hmj1r);
       printf("zadaj POCET mj1r v <ks>: \n"); scanf("%f",&Qmj1r);   
       printf("\nzadaj DLZKU loznej plochy v <m>: \n"); scanf("%f",&Dlp);
       printf("zadaj SIRKU loznej plochy v <m>: \n"); scanf("%f",&Slp);
      printf("zadaj VYSKU loznej plochy v <m>: \n"); scanf("%f",&Vlp);
       printf("zadaj NOSNOST loznej plochy v <kg>: \n"); scanf("%f",&Nlp);
       //=======================================================================
     
        a=n=k=0;
       
       //---------------------------perm 1. az 6. -------------------1
       perm(&Dmj1r, &Smj1r);
       vstup(a, p1, Dmj1r, Smj1r, Vmj1r, Dpal, Spal, Vlp, Vpal);
       over(p1, a, k, n);
       a++;
       //------------------------------------------------------------2
       perm(&Smj1r, &Vmj1r);
       vstup(a, p1, Dmj1r, Smj1r, Vmj1r, Dpal, Spal, Vlp, Vpal);
       over(p1, a, k, n);
       a++;
       //------------------------------------------------------------3
       perm(&Dmj1r, &Smj1r);
       vstup(a, p1, Dmj1r, Smj1r, Vmj1r, Dpal, Spal, Vlp, Vpal);
       over(p1, a, k, n);
       a++;
       //------------------------------------------------------------4
       perm(&Smj1r, &Vmj1r);
       vstup(a, p1, Dmj1r, Smj1r, Vmj1r, Dpal, Spal, Vlp, Vpal);
       over(p1, a, k, n);
       a++;
       //------------------------------------------------------------5
       perm(&Dmj1r, &Smj1r);
       vstup(a, p1, Dmj1r, Smj1r, Vmj1r, Dpal, Spal, Vlp, Vpal);
       over(p1, a, k, n);
       a++;
       //------------------------------------------------------------6
       perm(&Smj1r, &Vmj1r);
       vstup(a, p1, Dmj1r, Smj1r, Vmj1r, Dpal, Spal, Vlp, Vpal);
       over(p1, a, k, n);
       a++;
       //------------------------------------------------------------
       printf("\n n a k - %i - %i\n", n, k);           //n- pocet pouzitelnych ulozeni, k- pocet nepouzitelnych ulzeni na paletu
     

      printf("D     S     V      pk1v    pv   vmj2r   pknapal     \n");       
       for(i=0;i<6;i++){                           
           for(j=0;j<7;j++)                         
                                                               /*      STAT. MATICA       */
                        printf(" %.3f",p1[i][j]);   
                        printf(" \n");             
                       
                       }
     
     
 
   
      maxf=p1[0][6]; f=0;
      for(i=0,j=6; i<6; i++){
                           if(maxf<p1[i][6]){
                           printf(" %i\n",i);                      //i-vytlaci indexi vyhovujucich riadkov
                           f++;                                    //f-pocet vyhovujucich riadkov kde je rovnaky max v 6 slpci
                           g=i;             }                      //g-index posledneho najdeneho maxu v stlpci
                            }                                 
     
      printf("\n %i\n",f);
      for(j=0; j<7; j++)
      printf(" %.3f",p1[g][j]);          //tlaci len jeden riadok(v poradi posledny ktory najde v predch. poli), problem je ze ich moze byt viac             
 
      dyn_pole=(float(*)[7])malloc(f*7*sizeof(float)); /*******************************/
                                                        /*ODTIAL BY SA MI ZISLO HELPNUT*/
      for(q=0; q<f; q++){                              /*****???????????????????*******/
      for(r=0; r<7; r++){
         
                        }
                       }
     
system("pause");
}



                                    


                               



// pridané po 4 hodinách 32 minútach od posledného príspevku

+funkcia over() by mi mala vratit int 'n' a 'k' ale ked to dam skusobne vytlacit dava mi nuly.hm


Offline

Skúsený užívateľ
Skúsený užívateľ
zaciatocnik - C

Registrovaný: 11.01.09
Prihlásený: 26.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 21.02.2012 11:39

Pravdu povediac, velmi som nepochopil, co presne od nas chces. Je nutne skopirvat data zo statickeho pola ( p1 ? ) do tohto dynamickeho ale iba konkretne riadky? Ak ano, ktore? Podla coho sa to urci?

Kod som si len zbezne preletel a tato funkcia nie je spravne napisana ( ta sposobuje chybu, ktoru spominas na konci ):
Kód:
int over(float p1[6][7], int a, int k, int n){
      int i;
      i=a;
      p1[i][3]>=1?n++:k++;
                                              }


Treba ju upravit na pouzitie smernikov + v kazdom volani funkcie over predat parametre k a n cez ich adtresy &k a &n:
Kód:
int over(float p1[6][7], int a, int *k, int *n){
      int i;
      i=a;
      p1[i][3]>=1 ? (*n)++: (*k)++;
                                              }


Dalsia chyba: Nasledujuci riadok mi sposobi Segmentation fault ->
Kód:
        printf(" %.3f",p1[g][j]);          //tlaci len jeden riadok(v poradi posledny ktory najde v predch. poli), problem je ze ich moze byt viac


Preco? Pretoze premenna g nie je inicializovana. Hodnota sa jej priraduje jedine pri splneni podmienky:
Kód:
if(maxf<p1[i][6])

Treba mu priradit nejaku predefinovanu hodnotu, pripadne to nejako inak osetrit.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 14.01.12
Prihlásený: 20.07.13
Príspevky: 46
Témy: 9
Príspevok Napísal autor témyOffline : 22.02.2012 8:32

Dakujem, ratal som s chybami. jednym okom som uz pal ked som to v noci pisal..a ano chcel som vytvorit dyn. maticu len z riadkov ktore vyhovuju z predchadzajucej normalnej matice..kriterium je max. prvok v 6 stlpci..cize dolezity je ten 6 stlpec a podla toho v ktorom riadku v tom 6 stlpci sa nachadza max. prvok toho stlpca..tak cely ten riadok naliat do novej dynam. matice, ten max prvok sa moze v tom stlpci opakovat, cize tych riadkov moze byt viac, preto by mala mat pevny pocet stlpcov, ale premenlivy pocet riadkov(moze byt pripad ze bude v celom 6. stlpci rovnake cislo a potom ta dyn. matica bude vlastne kopia predchadzajucej, ale moze byt kludne len jeden najvacsi prvok v tom 6. stlp. a tak nova dyn. matica bude len jednorozmerne pole(1r,7s))..este raz vdaka.

// pridané po 11 minútach od posledného príspevku

// pridané po 7 hodinách 33 minútach od posledného príspevku

dobry postreh, mal si vo vsetkom pravdu.hmm aby to bolo menej komlikovane..nemusi to priamo suvisiet s mojim kodom, ale ak by si mohol, stacil by nejaky vseobecny kod pre dedukciu, kt. ilustruje naplnenie novo-alokovaneho dyn. 2D pola prvkami nejakeho predchadzajuceho akehokolvek 2d pola.. vlastne v ramci moznosti.thnx a lot

// pridané po 5 hodinách 22 minútach od posledného príspevku

nechcem byt nenazraty ale este teda ak mozes vies mi ozrejmit kde je chyba ?..ak chcem tlacit 2d pole cez fciu:
Kód:
double press(float **p){
      int i, j;
           
       for(i=0;i<6;i++){                           
           for(j=0;j<7;j++)                         
                                                   
                        printf(" %.3f",&p[i][j]);   
                        printf(" \n");             
                       
                       }
                      }

a pocas behu ju zavolam:
Kód:
 press(p1);


hlasi: warning.passing arg1 of 'press' incompatible pointer type


Offline

Skúsený užívateľ
Skúsený užívateľ
zaciatocnik - C

Registrovaný: 11.01.09
Prihlásený: 26.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 22.02.2012 12:25

Najprv odpoved na otazku, ako zapisovat do pola dyn_pole: kedze pocet riadkov je premenlivy, predpokladam, ze je ulozeny v nejakej premennej ( ak som dobre pochopil, tak f? Nazvy premennych odporucam volit vhodnejsie, pretoze pre cudzieho cloveka je to dost tazke pochopit - to len taka rada pomimo ). Rovnako by som vytovril aj nejake pole velkosti poctu riakov, kde uz budu indexy vyhovujucich riadkov. Potom staci pekne vo for cykle kopirovat bunku po bunke:
Kód:
for ( q = 0; q < f; q++ )
    for ( r = 0; r < 7; r++ )
        dyn_pole[q][r] = p1[ indexy[q] ][r];


kde premenna indexy je jednorozmerne pole typu int, ktore uchovava indexy vyhovujucich riadkov pola p1 a je dlzky f.

math-ew píše:
nechcem byt nenazraty ale este teda ak mozes vies mi ozrejmit kde je chyba ?..ak chcem tlacit 2d pole cez fciu:

Ak chce niekto nieco vediet, nie je nenazraty, takze nic sa nedeje. Problem je v tom, ze typ float** a float[6][7] nie je to iste. Typ float** je pole smernikov, tzn v kazdej bunke je ulozena adresa, kde ulozeny typ float*. Typ float[][7] je pole, kde kazda bunka obsahuje dalsie pole floatov. Ak sa pole vola nasePole, tak v priapde definicie float** je velkost bunky nasePole[0] rovne sizeof(float*), cize povacsine 4 bajty. V druhom pripade, teda float nasePole[6][7] je velkost bunky nasePole[0] rovne sizeof( 7 * sizeof( float ) ), cize povacsine 28 bajtov.
Preto nemozno predat funkcii, ktora berie ako parameter typ float** pole float[6][7]. Riesenim je but dane pole cele alokovat dynamicky a definovat ho ako float**, alebo zmenit deklaraciu funkcie takto:
Kód:
double press( float p[][7] )


// pridané po 15 minútach od posledného príspevku

A potom pri printf uz netreba pri poli uvadzat ampersand & a netreba volat druhy printf s \n, da sa to spojit do jedneho cize iba takto:
Kód:
printf( " %.3f\n", p[i][j] );







_________________
Ak potrebujete pomoc s diagnostikou/opravou vasej elektroniky ( notebook, motherboard, GPU, a ine ), kontaktujte ma cez SS.
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 14.01.12
Prihlásený: 20.07.13
Príspevky: 46
Témy: 9
Príspevok Napísal autor témyOffline : 23.02.2012 10:45

presne, nove pole indexov vyhovujucich riadkov .. Dakujem

// pridané po 11 hodinách 41 minútach od posledného príspevku

one more question pls, vydumkal som tento kod aby som dostal nove pole "pole_indexov" maximalnych prvkov "pola_a" ,a vrati mi pole so spravnym POCTOM prvkov, KTORY je urceny premennou "pocet_vyskytu_max" , ale to cislo indexu cize pozicie max. prvku v poli_a sa opakuje..cize napr. mam pole_a={0, 1, 4, 2, 4, 4 }, a ja potrebujem pozicie cize indexy maximalneho prvku (cize 4), tak by mi malo vratit pole_indexov={2,4,5}..ale vrati mi pole_indexov={5,5,5}, cize spravny pocet prvkov, ale stale len s poslednym najdenym INDEXOM max. prvku, v TOMTO PRIPADE 5. .. napada ta kde by mohla byt chyba plis <?



Kód:
 pocet_vyskytu_max=0; 
       for ( i = 0; i < 6; i++ ){
           if(max_in(pole_a)==pole_a[i])          /* fcia max_in(pole_a) vracia maximum 6-prvkoveho  pola_a */
           pocet_vyskytu_max++;
                                        }
         
           pole_indexov=(int*)malloc(pocet_vyskytu_max*sizeof(int));
           for ( i = 0; i < 6; i++ ){
               if(max_in(pole_a)==pole_a[i]){
                 for( j = 0; j <pocet_vyskytu_max ; j++ )
                     pole_indexov[j]=i;     }               
                                    }
           
           
           for( j = 0; j <pocet_vyskytu_max ; j++ )   
            printf("\n %i \n", pole_indexov[j]);
       free(pole?indexov);


Offline

Skúsený užívateľ
Skúsený užívateľ
zaciatocnik - C

Registrovaný: 11.01.09
Prihlásený: 26.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 23.02.2012 11:03

Pretoze to tam zapisujes v cykle for, cize sa pri najdeni indexu stale prepise cele pole s tym istym cislom:
Kód:
if(max_in(pole_a)==pole_a[i]){
                 for( j = 0; j <pocet_vyskytu_max ; j++ )
                     pole_indexov[j]=i;     }


Staci si vytvorit pomocnu premennu, ktora bude indexom do tohto pola, povedzme s nazvom pi_index:
Kód:
int pi_index = 0;
/* vsetok predchadzajuci kod az po hore uvedeny chybny blok */
for ( i = 0; i < 6; i++ )
{
    if ( max_in( pole_a ) == pole_a[i] )
        pole_indexov[ pi_index++ ] = i;
}


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 14.01.12
Prihlásený: 20.07.13
Príspevky: 46
Témy: 9
Príspevok Napísal autor témyOffline : 23.02.2012 11:07

hm. resp. kohokolvek


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 01.02.12
Prihlásený: 23.02.12
Príspevky: 4
Témy: 0
Príspevok NapísalOffline : 23.02.2012 11:19

Neslo by to jednoduchsie ? V jednom cykle ? napr.:

Kód:
int tmp_max = max_in(pole_a);
int pole_indexov[6];
int pocet_vyskytu_max=0;

for (i=0; i<6; i++) {
  if(tmp_max==pole_a[i]) {
    pole_indexov[pocet_vyskytu_max]=i;
    printf("\n %d \n", i);
    pocet_vyskytu_max++;
  }
}


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 14.01.12
Prihlásený: 20.07.13
Príspevky: 46
Témy: 9
Príspevok Napísal autor témyOffline : 23.02.2012 11:54

pindex znie inspirativne .. indiciu si mi dal uz v predch. dialogu. funguje to.musim nabrat tie vnorene tahy.n1


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 14.01.12
Prihlásený: 20.07.13
Príspevky: 46
Témy: 9
Príspevok Napísal autor témyOffline : 24.02.2012 13:39

..ak sa mozem este opytat, tento kod by mi mal naliat do dynamickeho pola dyn_pole tie riadky matice pole_b v ktorej v jednom stlpci sa nachadzaju maximalne prvky toho stlpca..tento stlpec matice pole_b predstavuje pole_a. problem je ze nehlasi chybu a vrati mi spravny pocet prvkov dyn_pola, ale je to akysi bordel..niekde je nula niekde 30miestne cislo s 12 desatinnymi miestami atp.
hmm..mal by niekto nejaky napad ?
Kód:
  t = pocet_vyskytu_max( pole_a ) ; b = 0 ;
           dyn_pole = ( float ( * ) [ ] ) malloc ( t * 7 * sizeof ( float ) ) ;                                 
           for ( i = 0; i < t; i++ ){                                             /*fica max_in() vracia int max pola*/
                                                                                         /*fcia pocet_vyskytu_max() vracia int
               for ( j = 0; j < 7; j++ )                                         ale obsahuje fciu max_in()*/
               if ( max_in ( pole_a ) == pole_a[ i ]){
                   dyn_pole[ b ][ j ] = pole_b[ i ][ j ]; b++ ;     }               
                                    }
         
          for ( i = 0; i < t; i++ ){
               for ( j = 0; j < 7; j++ )
               printf("\n %.3f \n", dyn_pole[ i ][ j ]);}
           
               free (dyn_pole );


// pridané po 3 minútach od posledného príspevku

.. skusal som zmeny v datovych typoch, ale neviem..a v kode neviem najst chybu.fakticky s tym uz par hodin neviem pohnut.Dakujem

// pridané po 9 minútach od posledného príspevku

pre istotu sem dam aj fcie max_in() a pocet_vyskytu_max()
Kód:
int pocet_vyskytu_max(float *p){                                                       
    int i, f=0;
    for(i=0; i<6; i++){
        if(max_in(p)==p[i])
        f++;          }
        return f;      }


Kód:
int max_in(float *p){                                                           
      int i, j;
      float m=p[0];
      for ( i = 0; i < 6; i++ ){
          if(m<p[i])
             m=p[i];
                             
                               }
      return m;                 
                   } 


Offline

Skúsený užívateľ
Skúsený užívateľ
zaciatocnik - C

Registrovaný: 11.01.09
Prihlásený: 26.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 24.02.2012 13:43

Skus zamenit tento tvoj blok kodu:
Kód:
for ( j = 0; j < 7; j++ )
    if ( max_in ( pole_a ) == pole_a[ i ]){
        dyn_pole[ b ][ j ] = pole_b[ i ][ j ]; b++ ;     }


za tento:
Kód:
if ( max_in ( pole_a ) == pole_a[ i ])
{
    for ( j = 0; j < 7; j++ )
        dyn_pole[ b ][ j ] = pole_b[ i ][ j ];
    b++;
}


Ty si totiz v tom cykle zvysoval index b, cize zapisoval si do roznych casti pola, len nie tam, kde treba. Neviem ale, co je pole_a a co je pole_b, kedze si to uz vsetko pomenil, som trocha dezorientovany.

//EDIT: odporucam pouzivat debugger - s nim sa velmi lahko ( vo vacsine pripadov ) daju najst chyby, pretoze je krasne vidiet, kadial program "postupuje" a da sa sledovat pocas behu programu, ake hodnoty maju jednotlive premenne.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 14.01.12
Prihlásený: 20.07.13
Príspevky: 46
Témy: 9
Príspevok Napísal autor témyOffline : 24.02.2012 15:54

ou, sorry za tie zmeny..ok skusim tvoj navrh. a k tomu debuggeru, este dnes si zistim co to je (: ..nie ja som prvy krat otvoril knihu jazyka C z 87 roku pred mesiacom a pol a nemam este nabrate take nadupane tahy ako napr. ty. a postupujem dost dynamicky co nieje velmi vyhodne lebo vela naraz sa tazko pamata+posledny mesiac som mal skuskove cize .. ale vdaka za radu. pozriem si to

// pridané po 28 minútach od posledného príspevku

..a je jasne ze este dlho nebudem, inak zasa zle. pocet prvkov ok, ale hodnoty uplne mimo. hmm vlastne ja som to chcel trosku skomprimovat a vynechat to pole indexov. cize ciel s aktualnymi nazvami premennych je vytvorit dynamicku maticu dyn_pole s pevnym poctom stlpcov(7). z vyhovujucich riadkov existujucej statickej matice pole_b. pricom pole_a je samostatne pole tvorene prvkami toho stlpca stat. matice pole_b(v tom stlpci hladaju fcie max_in()-maximalny prvok, a pocet_vyskytu_max() <--- .) a teda pozicia/e max prvku/ov, a jeho pocet vyskytu v tom stlpci(pocas behu pole_a) udavaju samotne riadky stat. matice pole_b ktore sa maju zobrazit v dyn_pole. .. ale este skusim aj ine cesty


Offline

Skúsený užívateľ
Skúsený užívateľ
zaciatocnik - C

Registrovaný: 11.01.09
Prihlásený: 26.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 24.02.2012 18:35

Debugger je ladiaci nastroj, ktory obsahuje vacsina vyvojovych prostredi, pripadne sa da spustat aj samostatne, ale je to trocha komplikovanejsie. Mozes sem napisat, ake vyvojove prostredie pouzivas ( Dev-C++, Code::Blocks, MSVS, alebo ine ), pripadne ci nepouzivas ziadne a kod kompilujes samostatne a ja sa ti pokusim napisat, pripadne najst nejaky strucny navod, ako debuggovat program. ( inak ocenujem tvoje vedomosti, ak je pravda, ze sa ucis C este len mesiac a pol )

Zrejme by bolo zbytocne nieco vysvetlovat na tvojom konkretnom priklade, ako sa posunut dalej, lebo uz je tazko vyjst z toho, co treba spravit, co uz je funkcne, atd, tak som ti vytvoril funkcny priklad toho, co potrebujes - z toho, co som pochopil - ak je nieco inak, tak mi daj vediet. Pre jednoduchost som vytvoril polia int-ov, nie float-ov, ale ide iba o ukazku, to uz si vies zmenit. V priklade je matica p1, ktora obsahuje uz predefinovane hodnoty. Program najde jej maximalny prvok a zapise indexy vsetkych riadkov matice, kde sa tento prvok nachadza. Nasledne sa do pola dyn_pole skopiruju vsetky tieto riadky.

Hodnota pola p1 v ukazke:
Citácia:
10 1 8
8 9 6
3 10 0
6 3 1
0 5 7


Maximum sa nachadza na prvom a tretiom riadku, cize pole dyn_pole bude vysledne vyzerat takto:
Citácia:
10 1 8
3 10 0


Ak si si to nejako takto predstavoval, uz by si snad nemal problem si to prisposobit. Kedze si pisal, ze si zaciatocnik, tak niektore pasaze kodu su zjednodusene a zbytocne sa opakujuce. Pri tak malych velkostiach poli to ale neprekaza. Ak by si potreboval vacsie polia, tak kod mozme zoptimalizovat. Najprv si to ale skus takto.

Kod:
http://ideone.com/xGhut


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 14.01.12
Prihlásený: 20.07.13
Príspevky: 46
Témy: 9
Príspevok Napísal autor témyOffline : 25.02.2012 5:07

..vzdy je to asi o urovni zaujmu cloveka a dakujem.aj ked postradam este horu podstatnych detailov. a k tomu kodu, je mozne ze som sa vyjadroval zbytocne komplikovane, predstavme si maticu
p1[][]:

0 1 2 3 4 5 6 7 (pozicie stlpcov)
____________
7 5 9 8 1 2 3 4
4 1 2 5 7 8 6 1
4 7 2 2 3 4 1 5
4 5 4 7 2 3 1 4
1 2 5 7 9 8 3 4

,a napr. dolezity je 5. stlpec, vyhladam v nom max.(cize 8) a pocet jeho vyskytu(cize 2). a teda dyn_pole bude v tomto pripade tvorene dvoma riadkami, a to tymi, v ktorych na 5. pozicii je max 5. stlpca. cize riadok p1[ 1 ][ j ] a riadok p1[ 4 ][ j ],
a tak vysledne dyn_pole= {4 1 2 5 7 8 6 1
1 2 5 7 9 8 3 4},
no a pisem to v devc++ tak ten navod by bol cool,
ale kod, ktory si mi poslal nebol vobec zbytocny, odhalil mi par novych detailov takze ozaj vdaka.


Offline

Skúsený užívateľ
Skúsený užívateľ
zaciatocnik - C

Registrovaný: 11.01.09
Prihlásený: 26.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 25.02.2012 11:02

Aha, uz mi to je jasnejsie. V kode som urobil iba par drobnych zmien:
- pridal som premennu dolezity_stlpec, podla ktorej sa urci stlpec, z ktoreho sa hlada maximum ( riadok 64 )
- upravil som funkcie maximalnyPrvok a pocetVyskytuMax aby vyhladavali iba v konkretnom stlpci ( riadok 18, 32 )
- taktiez upravene zapisovanie indexov do pola pole_indexov ( riadok 84 )
- naplnanie pola dyn_pole ostalo nezmenene ( riadok 95 )

Kod: http://ideone.com/OnLle

Vystup programu s danou maticou:
Citácia:
[Vyhovuju = 2]
[index 1]
[index 4]

4 1 2 5 7 8 6 1
1 2 5 7 9 8 3 4


Debugger:
Predpokladam, ze anglictina nerobi problem. Ak nie, tak najprv si precitaj toto strucne info: http://eilat.sci.brooklyn.cuny.edu/cis1_5/HowToDebug.htm. Potom tu je celkom pekne ukazane zakladne pouzivanie debuggera v Dev-c++: http://www.youtube.com/watch?v=Jq1WTkOlk3w. Debugger je velmi mocny a uzitocny nastroj, dokaze toho este ovela viac, no na zaciatok ti stacia tieto informacie a vedz, ze s debuggerom sa ti bude ovela lepsie pracovat, co sa tyka hladania chyb. Treba si nanho len zvyknut a potom si uz nebudes vediet predstavit pracu bez neho.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 14.01.12
Prihlásený: 20.07.13
Príspevky: 46
Témy: 9
Príspevok Napísal autor témyOffline : 25.02.2012 19:00

ty si prvy a zaroven najhustejsi konzultant s kt. som komunikoval. inak k tomu debuggeru, vlastne hned prva poznamka hovori ze je poterbne pouzivat pristup cez projekt alebo sa mylim ? .. ja to pisem cez new-->source file. cize ani nemam spristupnene moznosti projektu, cez kt. sa riesia dalsie nastavenia pre debugging .. ak som to cele spravne pochopil..inak som si vedomy uz davnejsie tohto pristupu,hmm.. vedel by si mi len tak strucne priblizit ake su maximalne moznosti dev ?(je moznost upravy do nejakej zaverecnej aplikacie, nejaka estetika vystupneho okna s buttonmi, kartami, farby atp. ?), skusal som nieco hladat ale velmi som sa nesnazil, zatial sa snazim hlavne pojimat klasikC .. vies to je tak ze mam more a more otazok .. kazdopadne kod bezi ako ma (.

// pridané po 1 hodine 3 minútach od posledného príspevku

..alebo, vedel by si mi priblizit teda ucel projektu , ako sa postupuje alebo tak ? .. ale fakt v ramci moznosti


Offline

Skúsený užívateľ
Skúsený užívateľ
zaciatocnik - C

Registrovaný: 11.01.09
Prihlásený: 26.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 25.02.2012 22:43

New | source file spravi to, ze sa jednoducho vytvori jeden subor nasUkazkovySubor.c, ktory sa potom preda kompileru a vygeneruje sa spustitelny subor. Toto ti v podstate staci, ak pracujes len s jednym suborom. Ak by si pouzival viac zdrojovych suborov, tak vytvorenim projektu sa vytvori subor, v ktorom budu uchovane vsetky potrebne informacie ( podla nastavenia projektu ), z coho vyplyva vyhoda, ze sa to lahsie riadi, kontroluje, a podobne. Jednoducho je to vsetko pekne pokope. Nejaky hlbsi rozdiel v tom nehladaj. Ak si das vytvorit novy projekt a hoci tam bude iba jeden subor, stale je to z hladiska funkcnosti to iste, akoby si to vytvoril cez new source, akurat ze sa ti v zlozke vytvoria akesi dalsie subory ( zalezi od pouziteho vyvojoveho prostredia, kazdy si to spravuje inak ). Stale je ten isty kod, ktory napises, stale je ten isty vysledny spustitelny subor, akurat v projekte si mozes nastavit nazov projektu, parametre prikazoveho riadku, parametre pre kompiler, kniznice pre linker a mnozstvo dalsieho. Plus mozes pouzivat debugger. Cize kludne si teraz otvor svoje prostredie, daj vytvorit novy projekt, napis nejaky nazov, zvol jazyk ( lebo v Dev-C++ mas na vyber C a C++, takze zvol C ) a potom zvol konzolovu aplikaciu alebo nieco podobne - nepouzivam Dev-c++, takze len strielam naslepo, ale vacsinou je to vsade podobne. Potom uz do projektu daj new source a tam si vloz cely kod, ktory potrebujes. Potom ak by si pracoval s viacerymi subormi, jednoducho si ich tam pekne nahadzes, pridas takisto hlavickove subory a vsetko bude bezat.

Uz si len staci prestudovat a pozriet video navod, ktory som ti poslal, ako pracovat s debuggerom a skusaj rozne techniky, aby si do toho vosiel. Snad som to popisal vystizne. Nie je umenie napisat dlhy text, ale napisat uzitocny text, ktory aj pomoze :)


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 14.01.12
Prihlásený: 20.07.13
Príspevky: 46
Témy: 9
Príspevok Napísal autor témyOffline : 27.02.2012 16:41

pravda, kvalita = hustote obsahu(za idealnych podmienok), nie objemu. thanx a lot


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 14.01.12
Prihlásený: 20.07.13
Príspevky: 46
Témy: 9
Príspevok Napísal autor témyOffline : 07.03.2012 16:30

Cauko, snad by si mi vedel poradit..vec je takato: aj ked viem ze otazky podobneho typu sa tu uz riesili ale nenasiel som konkretne odpovede, totiz zacal som s c++ vo Visual studiu 2008. mojim cielom je nejaka desktop aplikacia ktora bude ratat napr. maticove vypocty a mala by mat nejake vstupne policka a nejaky esteticky upraveny vystup atd. ,teda co vsetko je treba nastudovat a mat nainstalovane pre splnenie uvedeneho ciela.. mam este co robit, stale som prakticky v zakladoch, ale vedel by si mi objasnit nejku hrubu koncepciu tohto planu ? Dakujem

// pridané po 5 minútach od posledného príspevku

..som vo W7 64x


Offline

Skúsený užívateľ
Skúsený užívateľ
zaciatocnik - C

Registrovaný: 11.01.09
Prihlásený: 26.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 07.03.2012 19:01

Ak spominas, ze robis vo Visual studiu, tak mas v zasade dve moznosti: pouzit WINAPI ( celkom pekny tutorial: http://www.builder.cz/art/cpp/winapi1.html ), no to je prakticky uplny zaklad grafiky pre windows, cize je to dost babracka. Dalsia moznost je MFC kniznica, ktoru ti ponuka vyvojove prostredie, ktore pouzivas. Neviem o turoriali v SK/CZ, tak mrkni aspon toto: http://www.functionx.com/visualc/ + dalej mozes skusit pogooglit, pripadne mozno nieco najdes aj na youtube. Je to o nieco jednoduchsie, kedze predsa uz su funkcie zapuzdrene v triedach a ty tak mozes pohodlne pracovat s objeektmi, ale WINAPI rozhodne nebude na skodu.

Este dalsia moznost by mohla byt napr framework qt, ale tam by sa trebalo pohrat s nastavovanim hlavickovych suborov a kniznicami, pokial by si to chcel pisat prave vo visual studiu. Inak qt je dostupny s celkom peknym editorom. Viac na oficialnej stranke: http://qt.nokia.com/ . Alebo dalsia moznost by mohla byt GTK+ ( s podporou aj pre jazyk C ), co je tiez celkom zaujimavy free produkt. Home page: http://www.gtk.org/

Volba je uz na tebe


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 14.01.12
Prihlásený: 20.07.13
Príspevky: 46
Témy: 9
Príspevok Napísal autor témyOffline : 07.03.2012 21:51

dakujem a existuje podla teba lepsie c++ prostredie pre podobne ucely ?


Offline

Skúsený užívateľ
Skúsený užívateľ
zaciatocnik - C

Registrovaný: 11.01.09
Prihlásený: 26.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 08.03.2012 8:16

Podla toho, co myslis pod lepsie. VS je free a treba uznat, ze je to velmi pohodlne a premyslene vyvojove prostredie. No ak mam povedat svoj subjektivny nazor, kniznica MFC ma velmi neohurila. Ovela radsej som mal kniznicu VCL, ktore ponuka prostredie Borland C++ ( alebo Delphi, ale tam je jazyk pascal ), no toto prostredie uz nie je zadarmo. Porovnavam to ale co sa tyka vacsich projektov.
Objektivne je na vyvoj nejakeho programu, ci uz vacsieho, alebo mensieho VS urcite dobra volba. Keby si sa rozhodol spravit si grafiku cez winapi alebo MFC, tak myslim, ze pouzit toto prostredie je idealna volba. V podstate aj pre GTK a pre qt by si ho mohol pouzit, len bude treba ponastavovat cesty k hlavickovym suborom a knizniciam. Pre GTK som nasiel toto: http://www.etechplanet.com/blog/visual- ... pment.aspx ale pre qt by som aj napriek tomu radsej odporucil pouzit ich prosredie.

Aby som to zhrnul, lebo mozno este stale nie si rozhodnuty, ak planujes iba jednoduchy graficky navrh pre tvoju aplikaciu, je zrejme zbytocne ucit sa kvoli tomu qt alebo gtk, uplne ti postaci MFC, ktory ma tvoje VS zabudovany.


Odpovedať na tému [ Príspevkov: 22 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. Zaciatocnik

[ Choď na stránku:Choď na stránku: 1, 2 ]

v Assembler, C, C++, Pascal, Java

36

4583

21.06.2008 12:20

johny3212 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Zaciatocnik

v Webdesign

13

906

18.11.2008 22:46

DeiDaro Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Zaciatocnik

v Assembler, C, C++, Pascal, Java

15

828

11.08.2011 23:25

matwej Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. zaciatocnik

v Operačné systémy Unix a Linux

10

594

17.02.2010 19:16

Semp Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. začiatočnik

v Databázy

3

892

06.02.2009 12:34

awtt Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. zaciatocnik

v Ovládače

3

676

07.07.2008 11:10

dedko45 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. LAZARUS zaciatocnik

v Delphi, Visual Basic

4

1138

10.03.2010 10:51

Medo11 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Java - zaciatocnik

v Assembler, C, C++, Pascal, Java

4

549

30.08.2015 12:43

robkio Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Subwoofer začiatočník

v Zvuk

8

457

19.08.2014 15:51

KocuR Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. WIFI - začiatočník

v Siete

14

881

01.03.2009 20:06

ertin Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Fotoaparát začiatočník.

v Ostatné

16

543

10.03.2018 21:24

Miso122 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Linux začiatočník

v Operačné systémy Unix a Linux

14

796

11.01.2010 18:53

_FleXoR_ Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. zaciatocnik programovanie

v Ostatné

7

820

04.05.2015 15:07

Johnnny Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. C++ začiatočník

v Assembler, C, C++, Pascal, Java

29

1901

12.07.2009 14:14

capricorn7 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. WP -zaciatocnik

v Redakčné systémy

2

352

02.04.2013 10:53

don jebot Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Java zaciatocnik

v Assembler, C, C++, Pascal, Java

4

1346

30.12.2011 22:57

Nanosonda Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra