Vergleichen Array Wert mit Variable Wert
-
markuswenczel schrieb:
brotbernd schrieb:
Du initialisierst j mit 0 und die Abbruchbedingung ist j == 0 ('/0'). Du gehst also nie in die for schleife. Du willst wohl eigentlich
j=0; j<90; ++jhaben. Besser wäre noch einenstd::vectorundfind, bzw. am besten wahrscheinlich einstd::setzu benutzen.aha
ich dachte '/0' ist das Ende des Array danke,
sehr lg markusNur dass Deine Abbruchbedingung (was brotbernd übersehen hat) nicht prüft, ob
ieinen bestimmten Wert angenommen hat, sondern obsvneinen beszimmten Wert angenommen hat. Undsvnist zum Zeitpuunkt der ersten Prüfung nicht intialisiert.
-
Tachyon schrieb:
Nur dass Deine Abbruchbedingung (was brotbernd übersehen hat) nicht prüft, ob
ieinen bestimmten Wert angenommen hat, sondern obsvneinen beszimmten Wert angenommen hat. Undsvnist zum Zeitpuunkt der ersten Prüfung nicht intialisiert.Es wird bei ihm aber wohl "zufällig" funktionieren, weil svn eben irgendetwas != 0 ist. Aber dass es ein weiterer Fehler ist, ist natürlich richtig. svn sollte sinnvoll initialisiert werden und i<90 geprüft werden.
Edit: und j sollte natürlich nur bis anzahl laufen.
-
Das cout Warning wird nicht ausgegeben wenn svn und der Wert vom Array gleich sind sondern viel öfter
Ich dachte wenn ich vergleichearray[j]==svn;
dann wird nur ausgegeben wenn der Wert an der Stelle j vom >Array mit der zu
letzt eingegeben svn übereinstimmt.
hmmm#include <iostream> using namespace std; int main(){ int svn=1; int anzahl=0; int array[90]; for(int i=0; svn!=0;i++) { cout<<"Bitte Sozialversicherungsnummer eingeben; Ende = '0'"<<endl; cin>>svn; anzahl++; array[i]=svn; if(anzahl>2){ for(int j=0;j<anzahl;j++){ if(array[j]==svn){ cout<<"WARNING Sozialversicherungsnummer bereits vorhanden"<<endl; } } } } }
-

_matze schrieb:
d) Arbeite an deiner Einrückung! Manchmal rückst du gar nicht ein, manchmal gleich mehrfach. So lässt sich der Code einfach sehr schlecht lesen.
-
#include <iostream> using namespace std; int main(){ int svn=1; int anzahl=0; int array[90]; for(int i=0; svn!=0;i++) { cout<<"Bitte Sozialversicherungsnummer eingeben; Ende = '0'"<<endl; cin>>svn; anzahl++; array[i]=svn; if(anzahl>=2){ for(int j=0;j<anzahl;j++){ if(array[j]==svn){ cout<<"WARNING Sozialversicherungsnummer bereits vorhanden<<endl; } } } } }
-
_matze schrieb:

_matze schrieb:
d) Arbeite an deiner Einrückung! Manchmal rückst du gar nicht ein, manchmal gleich mehrfach. So lässt sich der Code einfach sehr schlecht lesen.
habe verstanden was du meinst
aber witzig ist
C Einrückung
In der Praxis können diese Klammern nahezu beliebig positioniert werden, so dass sich mehrere verschiedene Stile entwickelt haben, von denen keiner als dominant zu bezeichnen ist.Für C++ steht da gar nix
-
markuswenczel schrieb:
Für C++ steht da gar nix
Für C++ gilt das gleiche wie für C und für andere Sprachen. Und welchen Stil du verwendest ist egal solange man:
a) Die Gültigkeitsbereiche daran eindeutig erkennen kann.
b) Dieser in sich einheitlich ist.Ich verwende z.B. privat im wesentlichen den hier als "Allman / BSD / „East Coast“"-Stil bezeichneten (Den ich auch in den meinen vorherigen Firmen bislang immer als den "Standard" vorgefunden habe), und in meiner aktuellen Firma den unter "Variation: Original K&R / Kernel / Linux / UNIX / Stroustrup" benannten, nur mit 4 statt 8 Zeichen Einrücktiefe.
-
markuswenczel schrieb:
_matze schrieb:

_matze schrieb:
d) Arbeite an deiner Einrückung! Manchmal rückst du gar nicht ein, manchmal gleich mehrfach. So lässt sich der Code einfach sehr schlecht lesen.
habe verstanden was du meinst
aber witzig ist
C Einrückung
In der Praxis können diese Klammern nahezu beliebig positioniert werden, so dass sich mehrere verschiedene Stile entwickelt haben, von denen keiner als dominant zu bezeichnen ist.Für C++ steht da gar nix
Wie asc schon sagte, orientiere dich nicht an einer bestimmten Sprache, sondern rücke konsistent und gut lesbar ein. Regel Nr. 1 ist schon mal: wenn du einrückst, dann rück auch ein!
Das tust du nämlich nur manchmal. Bei deinem letzten Code dachte ich zuerst, dass da eine Klammer zuviel ist, bis ich nachgezählt habe. Das schöne an vernünftiger Einrückung ist aber gerade, dass man nicht nachzählen muss. Dass man immer sehen kann, wo ein Block beginnt und wo er aufhört. Es ist eigentlich ganz einfach. Immer, wenn ein Block beginnt (geschweifte Klammer), rückst du 2/4/8 Zeichen ein (die genaue Anzahl darfst du dir aussuchen, aber dann bleib auch dabei). Und wenn der Block endet, gehst du wieder die gleiche Zahl an Zeichen zurück. Dann sieht dein Code nämlich so aus und ist viel besser lesbar:#include <iostream> using namespace std; int main() { int svn=1; int anzahl=0; int array[90]; for(int i=0; svn!=0;i++) { cout<<"Bitte Sozialversicherungsnummer eingeben; Ende = '0'"<<endl; cin>>svn; anzahl++; array[i]=svn; if(anzahl>=2) { for(int j=0;j<anzahl;j++) { if(array[j]==svn) { cout<<"WARNING Sozialversicherungsnummer bereits vorhanden<<endl; } } } } }Jetzt kannst du z.B. an jeder schließenden Klammer erkennen, zu welchem Block sie gehört, einfach indem du von der Klammer aus nach oben wanderst. So ist die Einrückung nicht nur lästige Pflicht, "weil man das so macht", sondern sie macht plötzlich Sinn und ist praktisch.

-
Der Profi C++'ler erreicht mit einem eleganten Schwung die Enter-Taste, bevor er die {-Taste drückt.
-
314159265358979 schrieb:
Der Profi C++'ler erreicht mit einem eleganten Schwung die Enter-Taste, bevor er die {-Taste drückt.
Der Profi C++'ler weiß natürlich, dass er den Stil nach eigenem Gutdünken wählen kann, dass beide Varianten in Ordnung sind und dass letztendlich entweder der eigene Anspruch an Lesbarkeit oder übergeordnete Richtlinien entscheidend sind.

-
314159265358979 schrieb:
Der Profi C++'ler...
...arbeitet in der Regel nicht für sich Alleine, sondern im Team, und auch wenn er bestimmtes hinterfragen, und vielleicht ändern kann, ist dies dennoch eine Angelegenheit des Teams und nicht des Einzelnen.
P.S: Und auch wenn ich die öffnende geschweifte Klammer in einer eigenen Zeile vorziehe, und dafür gute Gründe habe, heißt das nicht das ich im "Recht" bin und behaupte das Alle die es anders machen keine Ahnung haben (Das gilt auch für andere Dinge wie "const int a" versus "int const a").
-
asc schrieb:
...arbeitet in der Regel nicht für sich Alleine, sondern im Team, und auch wenn er bestimmtes hinterfragen, und vielleicht ändern kann, ist dies dennoch eine Angelegenheit des Teams und nicht des Einzelnen.
So wahr. Ich bevorzuge zwar die zeilenärmere Variante (Klammer noch in der Zeile der Anweisung), aber ich könnte auch gar nicht anders. Wir haben da noch ein paar uralte Codeparser im Einsatz, die uns viel Code erzeugen und somit eine Menge Arbeit abnehmen. Die sind aber so übel geschrieben, dass eine Klammer in der nächsten Zeile das Ganze aus dem Tritt bringt.
Solange sich also keiner da ransetzt und die Dinger umschreibt, müssen sich sowieso alle an den hier verwendeten Stil halten, ob sie wollen oder nicht. 
-
Ich kann nur von meinen Erfahrungen (C#) sprechen, aber ich durfte mir meinen Codestil weitestgehend aussuchen. Dennoch habe ich mich an die Team-Regeln gehalten, da sie ungefähr dem entsprechen, wie ich bisher in C++ programmiert habe. (mit kleinen Unterschieden bei den Namenskonventionen.)
-
314159265358979 schrieb:
Ich kann nur von meinen Erfahrungen (C#) sprechen, aber ich durfte mir meinen Codestil weitestgehend aussuchen. Dennoch habe ich mich an die Team-Regeln gehalten, da sie ungefähr dem entsprechen, wie ich bisher in C++ programmiert habe. (mit kleinen Unterschieden bei den Namenskonventionen.)
Es gibt also irgendwie schon Konventionen, aber jeder darf trotzdem machen, was er will? Seltsam.

-
Es gibt Regeln, wie der Code im Idealfall aussehen sollte, aber man muss sich nicht zu 100% daran halten.
-
ich dachte wenn ich überprüfe die Variable svn
mit dem Array über Indexif(array[j]==svn)
bekomme ich die Ausgabe wenn die svn ein zweites mal eingegeben wird,
die Ausgabe ist allerdings so das der Wert in der runden Klammer immer
True ist bitte warum verstehe ich nicht.#include <iostream> using namespace std; int main(){ int svn=1; int anzahl=0; int array[90]; for(int i=0; svn!=0;i++) { cout<<"Bitte Sozialversicherungsnummer eingeben; Ende = '0'"<<endl; cin>>svn; anzahl++; array[i]=svn; if(anzahl>=2){ for(int j=0;j<anzahl;j++){ if(array[j]==svn){ cout<<"WARNING Sozialversicherungsnummer bereits vorhanden"<<endl; } } } } }
-
for(int j=0;j<anzahl;j++){
Gehe nur bis j<i, denn bei i (= anzahl-1) ist ja das zuletzt eingefügte. Oder noch sinnvoller, prüfe erst ob es schon vorhanden ist und füge es danach ein. Oder benutze wie schon ganz am Anfang erwähnt vorhandene Klassen, Funktionen der STL.
-
brotbernd schrieb:
for(int j=0;j<anzahl;j++){
Gehe nur bis j<i, denn bei i (= anzahl-1) ist ja das zuletzt eingefügte. Oder noch sinnvoller, prüfe erst ob es schon vorhanden ist und füge es danach ein. Oder benutze wie schon ganz am Anfang erwähnt vorhandene Klassen, Funktionen der STL.
SUPER danke sehr jetzt funktioniert es danke vielmals lg markus
-
markuswenczel schrieb:
SUPER danke sehr jetzt funktioniert es danke vielmals lg markus
Wobei du das Einrücken dennoch überdenken solltest (nachfolgend mal etwas angepasst):
#include <iostream> using namespace std; int main() { int svn=1; // ... // Die Schleife beginnt im gleichen Block wie die Variablendeklaration for(int i=0; svn!=0;i++) { // Der Schleifeninhalt ist ein eigener Gültigkeitsbereich cout<< "Bitte..."; // ... } // <-- Jetzt sieht man als Leser auch WAS geschlossen wird. }Besser lesbarer Code wird eher durchgelesen und man erhält eher eine Hilfe.
Zudem: Du fügst trotz Warnung eine Dopplung ein, das Einfügen sollte wirklich erst nach der Prüfung erfolgen, und auch nur wenn diese erfolgreich ist.