Programozási feladatom

Fórumok

Ü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

{

cout << "\n Kerem a \t" << i+1 << ". nevezőt:\t";

cin >> 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ások

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.

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é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.

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.

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;
}

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)