Probleme eine geeignete Schleife zu finden...
-
Hallo zusammen! habe für die folgende aufgabenstellung ein problem die passende schleife zu finden. wäre prima, wenn ihr mir helfen könntet. vielen dank für eure mühe!
in einer schleife über alle elemente des feldes soll für jedes element geprüft werden, ob irgendein anderes element (zweite schleife!) in punkto semeser, studienrichtung und termin übereinstimmt. wenn das der fall ist , werden die fachbezeichnungen der betreffenden elemente mit einer warnung ausgegeben.
das programm bis zur schleife:
#include <stdio.h>
#include <stdlib.h>struct pruefg //struktur
{
char fach [30];
int semester;
int richtung;
int wdh;
int termin;
};
main() {
struct pruefg p [8]=
{
{"Informatik I", 1, 1, 0, 4 }, //Ote Element;
{"Informatik I", 1, 3, 0, 4 },
{"Informatik I", 3, 4, 0, 4 },
{"Mathematik II", 2, 2, 1, 1 },
{"Mathematik II", 2, 5, 1, 1 },
{"A/D-Technik", 4, 1, 1, 9 },
{"KT III", 3, 1, 0, 2 },
{"Humanbio I", 1, 3, 0, 4 }
};------------------schleife-------------------// war ein versuch!!
int i;
int j;
for(i=0; i<=50; i++)
{for (j=0; j<=50; j++)
{
if(p[i].semester == p[j].semester && p[i].richtung==p[j].richtung && p[i].termin==p[j].termin &&i!=j)
{printf("%s %s Warnung \t", p[i].fach, p[j].fach);
}
}
}
system ("PAUSE");
return 0;
}
-
1. Das ist C was du da machst, kein C++.
2. Benutz CPP-Tags für den Code
3. Rücke den Code richtig ein
4. <=50 bei 8 Elementen?
5. Erste Schleife bis < Anzahl Elemente - 1 gehen lassen
6. Zweite Schleife bei i+1 anfangen lassen und bis < Anzahl Elemente gehen lassen
-
...soll für jedes element geprüft werden, ob irgendein anderes element...
daher würde ich
6. die zweite Schleife bei 0 anfangen lassen
-
MiP schrieb:
daher würde ich
6. die zweite Schleife bei 0 anfangen lassenWarum? Damit jeder Vergleich doppelt gemacht wird (1 mit 2 und natürlich auch 2 mit 1), und vor allem jedes Element mit sich selbst verglichen wird?
-
1 mit 2 und natürlich auch 2 mit 1
Die Warnung soll doch in beiden Fällen ausgegeben werden, oder ?
Edit:
Element mit sich selbst vergleichen muss natürlich übersprungen werden.
-
#include <stdio.h> #include <stdlib.h> struct pruefg //struktur { char fach [30]; int semester; int richtung; int wdh; int termin; }; main() { struct pruefg p [8]= { {"Informatik I", 1, 1, 0, 4 }, //Ote Element; {"Informatik I", 1, 3, 0, 4 }, {"Informatik I", 3, 4, 0, 4 }, {"Mathematik II", 2, 2, 1, 1 }, {"Mathematik II", 2, 5, 1, 1 }, {"A/D-Technik", 4, 1, 1, 9 }, {"KT III", 3, 1, 0, 2 }, {"Humanbio I", 1, 3, 0, 4 } }; ------------------schleife-------------------// war ein versuch!! int i; int j; for(i=0; i<8; i++) { for (j=0; j<8; j++) { if(p[i].semester == p[j].semester && p[i].richtung==p[j].richtung && p[i].termin==p[j].termin &&i!=j) { printf("%s %s Warnung \t", p[i].fach, p[j].fach); } } } system ("PAUSE"); return 0; }
-
MiP schrieb:
1 mit 2 und natürlich auch 2 mit 1
Die Warnung soll doch in beiden Fällen ausgegeben werden, oder ?
Was für "beide Fälle"?
Willst du wirklich unterscheiden, ob 1 und 2 gleich sind, oder 2 und 1?
-
Du bist im C**++**-Forum...
#include <iostream> #include <string> #include <vector> class exam_t { private: std::string subject; int term; int branch; int wdh; // "Wiederholung"? -> Boolean? int date; public: exam_t( const std::string &subject, int term, int branch, int wdh, int date ) : subject( subject ), term( term ), branch( branch ), wdh( wdh ), date( date ) { } bool operator==( const exam_t &other ) { return ( term == other.term ) && ( branch == other.branch ) && ( date == other.date ); } std::string get_subject( ) { return subject; } }; typedef std::vector< exam_t > exams_t; int main( ) { exams_t exams; exams.push_back( exam_t( "Informatik I", 1, 1, 0, 4 ) ); exams.push_back( exam_t( "Informatik I", 1, 3, 0, 4 ) ); exams.push_back( exam_t( "Informatik I", 3, 4, 0, 4 ) ); exams.push_back( exam_t( "Mathematik II", 2, 2, 1, 1 ) ); exams.push_back( exam_t( "Mathematik II", 2, 5, 1, 1 ) ); exams.push_back( exam_t( "A/D-Technik", 4, 1, 1, 9 ) ); exams.push_back( exam_t( "KT III", 3, 1, 0, 2 ) ); exams.push_back( exam_t( "Humanbio I", 1, 3, 0, 4 ) ); for( exams_t::iterator i = exams.begin( ); i != exams.end( ); ++i ) { for( exams_t::iterator j = i + 1; j != exams.end( ); ++j ) { if( *i == *j ) { std::cout << "Warning: " << i->get_subject( ) << " overlaps " << j->get_subject( ) << "!" << std::endl; } } } }cheers, Swordfish
PS:
maingibt einen Integer zurück - auch in C.
-
MFK schrieb:
MiP schrieb:
1 mit 2 und natürlich auch 2 mit 1
Die Warnung soll doch in beiden Fällen ausgegeben werden, oder ?
Was für "beide Fälle"?
Willst du wirklich unterscheiden, ob 1 und 2 gleich sind, oder 2 und 1?
Ja,ja. Wenn er nur die doppelten ausgeben will, dann nicht.
Würde allerdings die komplette Liste ausgegeben (und an entspechenden Stellen die Warnungen), so müsste er bei 0 beginnen.
-
hey, vielen dank! das hat mir echt geholfen. bin schon viel schlauer!