Programozási feladatom

 ( boydani | 2010. november 26., péntek - 18:38 )

Üdv Mindenkinek!

Sajnos már én sem ( nem hogy a fordító:-) nem tudom feldolgozni a feladatot, amit kaptam, valahogy nem igazán értem, hogyan is fogjak neki a dolgoknak, ezért útbaigazítást szeretnék kérni, tanácsokat, miként induljak újra neki.

A feladatom szövege a következő lenne, amit C++ -ban kellene elkészítenem:

"Egy N résztvevőjű kutya-szépségversenyen M különböző szempont szerint pontoznak, s az eredményt a KUTYA(N,M) mátrix tartalmazza. Minden szempont alapján maximum 10 pontot adhatnak ( a pontszámok 0 és 10 pont közöttiek lehetnek). A versenyből automatikusan kiesik az a kutya, amelyik valamely kategóriában nem éri el az 5 pontot. Adja meg azokat a kategóriákat, amelyekben nem volt kieső kutya."

Amire eddig jutottam, saját kútfőből, sajnos vajmi kevés és gondolom többek szerint nagyon rossz nyomom járok, de remélem lesz aki eligazít vagy kisegít.


#include
#include

using namespace std;
int main()

{

int N;

cout << "\n Kerem a kutya-szepsegverseny resztvevoinek a szamat:\t";

cin >> N;

if (N==0)

{

cout << "\n A versenyen nincs nevezo!";

}

else

{

int tomb[N][M];

int i;

for(i=0;i> tomb[i];

}

Hát nem sokra jutottam, amint látni. Eddig próbáltam bekérni n nevezőt, és ehhez rendeltem értéket és tároltam egy egydimenziós tömbben. De itt, ez nem megfeleő, mivel nem az "n" nevezőhöz kell értéket rendelni, hanem az "n" nevezőhöz kell "m" szempont és ehhez kell érték.

Minden segítséget szívesen fogadok!
Üdv Dani

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Bar ki tudom talalni a kod felet, a kacsacsoroket megette a drupal. Esetleg javitsd ki, tobb segitseget remelhetsz ugy :)

emberi nyelven : egy n X m es (n sor m oszlop) matrixban az elemek 0-10ig lehetnek. adja meg azokat az oszlopokat amikben nincs 5 nel 6 nal kisebb elem.
==
`Have some wine,' the March Hare said in an encouraging tone.
Alice looked all round the table, but there was nothing on it but tea.

A ket dimenzios tombot is lehet tarolni egy dimenzios tombben, csak akkor a cimzest neked kell megoldanod.
Help: http://en.wikipedia.org/wiki/Array_data_structure#Two-dimensional_arrays

Merre indulj?

C-s megoldás: készítesz egy n x m elemű tömböt, minden kutya/kategória párhoz beleteszel egy pontot.

Ezután végigmész az oszlopokon, és megnézed, hogy van-e benne 6-nál kisebb érték. Ha van, az az oszlop kiesett, mész a következőre. Ha nincs, kiírod az oszlop nevét.

C++-ban az elv ugyanez, de persze nem tömbben kell tárolnod az eredményeket, hiszen OOP van. Sok módon meg lehet oldani, nekem az első, ami eszembe jut, az, hogy készítesz egy kutya osztályt, amiben létrehozol egy eredmények tömböt, mondjuk konstruktorban megadott számú kategóriával.

Akkor bekéred, hány kategória, hány kutya, létrehozol annyi kutyát, amennyit kell, megadva a kategóriákat.
new kutya[n](m) - ha jól emlékszem

Készítesz a kutyának valami set függvényt, amivel az eredmény tömb i pozícióját tudod írni, egy get függvényt, hogy ugyanezt tudd olvasni, és aztán úgy kezeled majdnem, mintha az eredeti tömböd lenne.

kutyák[i].seteredmeny(j, 9) kutyaeredmeny[i,j] = 9 helyett

Így OOP is, meg nem is bonyolítottad túl

De persze van egy csomó más megoldási lehetőség ugyanerre, szóval csinálhatsz mást, ha az jobban tetszik.

Köszönöm szépen válaszod, teljesen kezdő vagyok még, most ismerkedem az alapokkal C++ -ban, így ezeknek a dolgoknak, amiket írtál, utánanézek:)

Kérdés, C++-ban nem kell a tömb méretének eldőlnie fordítási időben? Mert, ha igen akkor itt inkább a láncolt lista lenne a nyerő szerintem.

szezon/fazon kategoria. Lehet statikusan foglalni tombot a stacken, es lehet dinamikusan. new operator c++ / malloc c a dinamikus foglalashoz. Akarhogy is a tomb az az elemek sorozata a memoriaban, uh lehet O(1)indexelni es ez a fo kulonbseg. Lancolt listat nem lehet mivel akarmelyik elem helyileg akarhol lehet ie be kell jarni az elem eleresehez.
Szoval a temafelvetonek: Ne - erre ne hasznalj lancolt listat
==
`Have some wine,' the March Hare said in an encouraging tone.
Alice looked all round the table, but there was nothing on it but tea.

-

Harcolsz magaddal? :D

Úgyvan! :D
Közben eszembejutott valami, lásd ebben a hozzászólásomban a "Szerk.:" utáni részt :P

Ezt honnan tudtad?
--
unix -- több, mint kód. filozófia.
Life is feudal

De igen, ezért a fenti kód hibás!
2D tömböt amelynek dimenziói futási időben derülnek ki, csak dinamikusan szabad allokálni(Vagyis akárhány dimenziós tömbnél így van ez).
Szerk.: Elfelejtettem, hogy C99-ben mindez engedélyezett.

pl:

int n;
cin >> n;
int m;
cin >> m;

int **array = new int*[n];
for(int i = 0; i < n; ++i) {
    array[i] = new int[m];
}

Amikor meg nem kell már a tömb, akkor:

for(int i = 0; i < n; ++i) {
    delete[] array[i];
    array[i] = 0;
}
delete[] array;
array = 0;

Na, nem olyan nehez azert ez. Eloszor probald elfelejteni, hogy ez egy programozasi feladat. Csinalj egy matrixot es veletlenszeruen ird be a szamokat 1-10-ig. Utana old meg a feladatot fejben a matrix alapjan. Fogalmazz meg egy algoritmust magadban. Aztan meg implementald.

Rendben, épp ezzel szenvedek most, hogy feltöltsek először egy mátrixtömböt...a többi része még ráér, mivel ezt sem igazán értem:) És amíg ez nincs meg, a többi részével nem lehet foglalkoznom.

Rendben, épp ezzel szenvedek most, hogy feltöltsek először egy mátrixtömböt...a többi része még ráér, mivel ezt sem igazán értem:) És amíg ez nincs meg, a többi részével nem lehet foglalkoznom.

(Szinte teljesen mellékes: szvsz inkább mátrix, de ha akarod tömb, azonban mátrixtömb inkább ne.)

Ugy ertem, hogy papiron ird le a matrixot, ne promgramot irjal ra.

Fogalmazd meg a feladatot rendesen. Lépésről lépésre. Utána az egyes lépéseket is bontsad lépésekre. Nem, nem így csináltad! Te egyből leültél az editor elé. El is akadtál.

Szintén hiányos vagyok C++ -ból (kb ez az első programom). Mégis kb fél óra volt összeguglizni a következőt.

#include <cstdlib>
#include <iostream>

using namespace std;

int main(void) {

  int n = 0, m = 0;
  unsigned int i = 0, j = 0;
  unsigned int *osztalyozas = NULL;
  bool  elso_bentmarado = true;

  cout << "Ennyi kutya van: ";
  cin >> n;
  if (n < 1) {
    cout << "Legalabb egy kutyanak lennie kell!" << endl;
    exit(EXIT_FAILURE);
  }

  cout << "Ennyi szempont alapjan: ";
  cin >> m;
  if (m < 1) {
    cout << "Legalabb egy szempontnak lennie kell!" << endl;
    exit(EXIT_FAILURE);
  }

  osztalyozas = new unsigned int[n*m];
  srand(time(0));
  for(i = 0; i < (unsigned)(n*m); i++) {
    osztalyozas[i] = rand() % 11 + 4;
  }

  for(i = 0; i < (unsigned)m; i++) {
    for(j = 0; j < (unsigned)n; j++) {
      if(osztalyozas[j*m + i] < 5) {
        break;
      }
      if(j == (unsigned)(n-1)) {
        if (elso_bentmarado == true) {
          elso_bentmarado = false;
          cout << "Nincs kieso: " << (i+1);
        } else {
          cout << ", " << (i+1);
        }
      }
    }
  }
  
  delete osztalyozas;

  if(elso_bentmarado == false) {
    cout << "." << endl;
  } else {
    cout << "Minden kutya kiesett!" << endl;
  }

  return EXIT_SUCCESS;
}

Nézz utána a delete és a delete[] közötti különbségnek.

Vagy használjon C#-ot :)
--
unix -- több, mint kód. filozófia.
Life is feudal

Jogos,
delete[] osztalyozas;
lesz az a sor. Egyéb kisebb-nagyobb baki? Legyen OOP és a kutya legyen egy osztály? Egységbe zárva a pontozását get(), set() tagfüggvényekkel?

Szerintem ide pont jobb valami konténer vagy tömb, ahogy az eddigi hozzászólásokban.
Azért megjegyezném, hogy egységbe zárás szempontjából egy publikus változó ugyanaz, mint egy privát változó, aminek van publikus get-, set-je. Azaz semmit nem zártam el a külvilág elől. get, set akkor kell, ha
- nem egy változóban tárolod az értéket, hanem többen, és valami módon a konzisztenciát meg kell tartani
- nem változóban tárolod az értéket, hanem máshol (adatb, háttértár, hardver...)
- csak írható vagy csak olvasható adat esetén (csak set vagy csak get)

Igazad van, bár logikailag mégis segíti elszeparálni hogy melyik változó mire való és az elnevezés zűrzavarát is megoldja.

Arról nem beszélve, hogy függvényen keresztül szabályozható a privát adattag felhasználása. Úgyhogy inkább set/get páros.
--
unix -- több, mint kód. filozófia.
Life is feudal