2016-09-05 2 views
-1

Ich weiß nicht viel über Modularität, außer es teilt im Grunde Ihren Code in kleinere Gruppen von Funktionen (diese Frage ist für die C-Sprache).Wie kann ich Modularität in meinen Code in C integrieren?

Ich mache eine Aufgabe, wo ich nur sehen kann, dass mein Quellcode mit einer riesigen verschachtelten Schleife in "main" arbeitet (keine if-Anweisungen sind für die Zuweisung erlaubt). Mit anderen Worten, wenn ich versuche, Funktionen zu verwenden, um den Code zu schneiden, sehe ich nicht, wie die notwendige verschachtelte Schleife funktioniert. Aber die Aufgabe erfordert einen Modularitätsversuch.

Kann mir also jemand sagen, wie ich den folgenden Code in kleinere Module zerlegen könnte, ohne seine tatsächliche Ausführung zu verpfuschen?

#include <stdio.h> 

int main(void) 
{ 
    int counter = 0; 
    int marknum = 0; 
    int sectioncode, studentnumber; 
    int dummyvariable = 0; 
    int index; 
    int marks; 
    int total = 0; 

    do 
    { 
     printf("Enter a Section Code: "); 
     scanf("%d", &sectioncode); 

     while(sectioncode > 4 || sectioncode < 1) 
     { 
     printf("Invalid value entered. Must be 1 to 4, please re-enter: "); 
     scanf("%d", &sectioncode); 
     } 

     do 
     { 
     printf("Enter the Student's ID: "); 
     scanf("%d", &studentnumber); 

     while (studentnumber < 1 || studentnumber > 999999999) 
      { 
       printf("Invalid value entered. Must be 1 to 999999999. Please re-enter: "); 
       scanf("%d", &studentnumber); 
      } 

     while (sectioncode != 0) 
     { 
      while (counter < 5) 
      { 
       counter++; 
       marknum++; 
       printf("Enter mark%d: ", marknum); 
       scanf("%d", &marks); 
       total = total + marks; 
      } 

      printf("%09d's total mark is %d\n", studentnumber, total); 
      counter = 0; 
      marknum = 0; 
      sectioncode = 0; 
     } 

     dummyvariable = 1; 

    } while (dummyvariable = 0); 

} while (sectioncode != 0); 

    return 0; 
} 

Auch, wie ich Modularität für diese eine (gleiche Frage im Grunde) übernehmen würde:

#include <stdio.h> 

int main(void) 
{ 
    int num;              //User inputted number 
    int i;              //Increment variable 
    char ch;              //Check for characters variable 

     do               //Begin "do while" loop 
     { 
     printf("\nEnter a number:");        //User prompt 
     scanf ("%d", &num);          //Scan for user inputted integer 
     while ((ch = getchar()) != '\n')       //Scan for character, check for non-numeric input 
     { 
      printf("Invalid number entered. Please re-enter: "); //Error message and prompt for invalid user input 
      scanf ("%d", &num);         //Scan for user inputted integer 
     }              //Repeat loop if condition becomes true again 

     for (i=0; i<num; i++)          //Begin "for" loop; condition prints asterisks equal to user number; increment i by 1 
     { 
      printf("*");           //Prints a single asterisk each loop until i is less than num 
     } 
     } while (num!=0);           //Stop "do while" loop if user enters 0 

return 0; 
} 
+1

Ehrlich gesagt, versuche ich, Ihre vorhandenen Schleifen in erster Linie sinnvoll zu machen. Insbesondere das Fehlen der Schleife in Bezug auf die Schleife while (sectioncode! = 0) und die Bedingung while (dummyvariable = 0); Unabhängig davon, klar einen richtigen Abschnitt Code und ebenso richtige Studenten ID sammeln, konnte isoliert werden, um ihre eigenen Funktionen. Ehrlich, wenn Ihr Code * funktioniert *, gehört er zu [codereview.stackexchange.com] (http: // codereview.stackexchange.com), um Fragen wie Ihre zu beantworten. – WhozCraig

+0

Das zweite Fragment kann in zwei untergeordnete Funktionen plus main aufgeteilt werden. Die erste untergeordnete Funktion würde eine Zahl lesen und zurückgeben. Es sollte einige Vorsichtsmaßnahmen mehr treffen (EOF zum Beispiel). Die zweite untergeordnete Funktion wäre die Druckschleife. Das sind einfach. Sie sollten die Vorzüge von 'putchar ('*') überprüfen:' vs 'printf (" * ");'. –

+0

Beachten Sie, dass Ihre Zeile '} while (dummyvariable = 0)' am Ende einer 'do {...} while-Schleife bewirkt, dass die Schleife jedes Mal beendet wird, da dies eine Zuweisung und kein Vergleich ist. Die Zuweisung "dummyvariable = 1;" unmittelbar bevor sie irrelevant ist. –

Antwort

0

Normalerweise würde ich vorschlagen, dass Sie fragen Sie Ihren Lehrer statt zu fragen, Hausaufgaben Fragen hier, aber als Daniel weist in den Kommentaren auf die Verwendung von Schleifen und zusätzlichen Variablen, nur um zu vermeiden, wenn Aussagen im Code dumm ist, und ich bin nicht sicher, sagen Sie, dass Sie Rat von einem Lehrer, der dachte, dass eine gute Idee wäre völlig verantwortlich Verhalten meinerseits. Also, nachdem Sie das gesagt haben:

Was Sie in solchen Fällen suchen möchten, ist mehrere Stücke ähnlichen Codes, oder Stücke von Code, die konzeptionell eine einzige Sache tun. Dann sehen Sie, ob Sie diese Brocken in eine Funktion teilen können. Im ersten Beispiel zeigen Sie eine Eingabeaufforderung an, lesen eine Benutzereingabe und überprüfen die Eingabe für sectioncode und studentnumber. Dieser Prozess könnte in eine separate Funktion aufgeteilt werden. (Alles aus printf("Enter ...") bis zum Ende der while-Schleife). Dann in der Hauptfunktion, müssen Sie nur so etwas wie

sectioncode = readval("Enter a Section Code: ", 1, 4); 
studentnumber = readval("Enter the Student's ID: ", 1, 999999999); 

Für das zweite Beispiel, dass die Eingabe/Validierungscode nicht dupliziert wird, aber es ist immer noch wahrscheinlich es lohnt sich, sich in eine Funktion zu spalten, da es eine einzige gut definierte Sache macht und genug Zeilen umfasst, die es in eine Funktion aufspalten könnten, die Logik des verbleibenden Codes klarer zu machen. Aber es ist in diesem Fall weniger wichtig als in der ersten.


Auch ein nicht verwandtes Problem: Am Ende eines der do-Weilen, haben Sie while (dummyvariable = 0);. Beachten Sie das einzelne Gleichheitszeichen. Sie vergeben 0 an die Dummy-Variable, nicht zu vergleichen.

In diesem speziellen Fall funktioniert es trotzdem, da der gesamte Ausdruck zu 0 (d. H. Falsch) ausgewertet wird, genau wie (dummyvariable == 0) würde. Aber wenn diese Konstante etwas anderes gewesen wäre oder wenn Sie nicht vor dem Ende der Schleife die Dummy-Variable auf 1 gesetzt hätten, wäre das ein Fehler.

Ich empfehle dringend, die Konstante immer auf die linke Seite von Ausdrücken wie dieser zu setzen, um Fehler dieser Art bei der Kompilierung zu finden. while (dummyvariable = 0) macht still etwas Unerwartetes; while (0 = dummyvariable) wird bei der Kompilierung einen Fehler geben, und Sie können es beheben.

Verwandte Themen