Loop Limit in C/C++
Gibt es ein limit, wie viele Male eine Schleife ausführen in C?
void main()
{
int T,N,x,X,i;
x=0;
scanf("%d",&T);
while(T>0)
{
T--;
scanf("%d",&N);
X=0;
while(N>0)
{
N--;
scanf("%d",&x);
if(x>X){X=x;}
}
printf("Case: %d",x);
}
}
T hat einen Messbereich von 0-250, und N hat einen Messbereich von 0-1000. x hat einen Messbereich von 0-10,000.
Wenn die N übersteigt etwas über 800, meine Konsole nicht mehr unter input.
Kann dies durch eine Begrenzung der input-buffer?
- Ich möchte sagen, ja.
- Für zukünftige Referenz:
int main()
, nichtvoid main()
- In C würde es sogar
int main(void)
. - Es gibt ein limit, aber es ist in der Regel mindestens 10,002, also das Programm sollte in Ordnung sein
- Robinson: Geist zitiert, dass beliebig viele, für uns?
- Ich schrieb ein Programm, das geloopt. Wenn es 10,001 es weiter gehen.
- Extrem-lol.
- es ist der neue Microsoft-VS-genehmigungssystems. Sie müssen, pay-per-loop-iteration nun.
- Unsere ältesten erzählen von einem Jungen Programm wie diesem. Es geloopt 300 mal, dann wird es geloopt 180-mal, dann... es geloopt 400 mal!!! Habe ich mich klar ausgedrückt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es gibt kein limit, wie viele Male eine loop-Schleife. Es gibt Grenzen für die max-und minimum-Werte einer
int
, und diejenigen, die spielen können, in Ihre Schleife. In diesem Fall, 800 sollte in Ordnung sein, so gibt es etwas anderes passiert hier.Edit: Arbeitet für mich... das einzige seltsame Sache, die ich sehe, ist, dass Sie zurücksetzen
X
innerhalb der innersten Schleife, so ist die Ausgabe immer die Letzte ganze Zahl eingegeben werden, wenn es >0, oder 0.Sind Sie Rohrleitungen input zu diesem Programm? Es kann einige Pufferung Einschränkung mit, dass. Versuchen Sie, die Daten in einer Datei und aus der Datei gelesen.
Es ist gängige Praxis, um eine Schleife 10.000 mal oder (viel) mehr zu vergleichen die Leistung von zwei kleinen Berechnungen.
Wenn es eine Grenze gäbe es nicht so etwas wie eine Endlosschleife. 😉
Weil die Kommentare gegangen respektlos auf Sie, ich werde dies ein community-wiki und beginnen mit einem Fragewort-wie der Vorschlag, das gehört in die Kommentare:
Überprüfen Sie die Rückgabe-Werte von allen
scanf
Anrufe. Tun Sie dies zuerst, um festzustellen, ob die standard-library-API ist bereits die übermittlung von Informationen an Sie-über "elektrostatische übertragung", anders bekannt als der Inhalt des Registerseax
nach Aufrufscanf
auf der x86-Architektur. Lassen Sie sich nicht das Licht in das register sterben unbeobachtet. Nehmen Sie die registrieren die elektrischen Ladungen (bits) in eine variable und vergleichen Sie Sie auf null (0) undEOF
. Diese alien-übertragung gesendet wurden, um Sie aus dem Jahr 1976, alsscanf
wurde zuerst geschrieben, um eine informative numerischen Wert an den Aufrufer.Als tomlogic darauf hingewiesen, in den Kommentaren zu einer Antwort, wenn Sie die Daten einfügen, sollten Sie stattdessen versuchen Sie, die Technik, bekannt als "input redirect" oder "piping." Erste, erhalten Sie Ihre Daten in eine Datei, sagen wir mal name mit dem Namen.dat. Dann, führen Sie einen Befehl wie den folgenden:
executable-name < filename.dat
Wo ausführbaren Datei name der Datei, die Sie generieren, mit dem C-compiler. Technisch gesehen ist die obige syntax erstellt eine "input-Umleitung" oder "stdin-Umleitung" -- die shell öffnet eine Datei zum Lesezugriff als Datei-Deskriptor null (0), auch bekannt als
stdin
. Die Kind-Programm als hervorgegangen aus der shellscanf
aus der Datei, anstatt das terminal (Ihre paste-buffer).Ein weiterer Ansatz ist die Schaffung eines "pipe-Umleitung", in dem die shell öffnet sich ein weiteres Prozess Ausgabe zum Lesen und übergibt diese an das Kind, wieder wie
stdin
Datei-Deskriptor. In diesem Fall wird die shell verwendet wahrscheinlichpopen
eher alsopen
. Die syntax HIERFÜR könnten sein:cat filename.dat | executable-name
als wenn Sie auf einem Unix-Klon, odertype filename.dat | executable-name
wenn im Zusammenhang mit einem IBM PC-DOS® - Klon.