Blutiger Anfänger



  • Hallo Leute, wie der Titel schon verrät bin ich ein blutiger Anfänger in C-Programmieren und hoffe, dass ich hier die nötige Hilfe(n) bekomme 🙂

    Ich möchte ein Programm schreiben, welches 2 Grenzen einliest und anschließend alle Zahlen innerhalb der Grenzen durch 7 teilt. Dazu soll ich eine for Schleife verwenden:

    Das mit den Grenzen eingeben, habe ich hinbekommen. Doch bei der for Schleife taucht ein Fehler auf: Ich schreibe mal meinen Code hier rein:

    for (laufvariable = anfang +1; laufvariable < ende; laufvariable /= 7)
    printf("%d ", laufvariable);

    Also mit anfang und ende habe ich ja die Grenzen definiert. Und zwischen den Grenzen soll nun eine Laufvariable alle Zahlen, die durch 7 teilbar sind, berechnen. Doch irgenwie scheint dies nicht richtig zu sein, da dieses Programm mir eine seltsame 7-stellige Zahl unendlich mal ausspuckt 😕

    Wie muss es denn richtig lauten?



  • for (laufvariable = anfang +1; laufvariable < ende; laufvariable /= 7)
    printf("%d ", laufvariable);
    

    1. Ich nehme mal an dass das Ende größer als der Anfang ist (wegen laufvariable < ende).
    2. vermute ich die variablen sind alle vom Typ int.

    Die Endlosschleife kommt daher, dass deine Laufvariable durch 7 geteilt wird. D.h. sie wird noch kleiner als vorher. Daher wird es schwierig größer als Ende zu werden.

    Du solltest dir mal den Modulo-Operator (%) ansehen.



  • Also wenn ich dich richtig verstanden habe, willst du alle Zahlen in einem Intervall ausgeben, die durch 7 teilbar sind.

    Ich hätte das so gelöst:

    #include <stdio.h>
    
    int main(){
    
    	int lauf, anfang,end;
    	printf("Bitte untere Grenze angeben.\n",anfang);
    	scanf("%i",&anfang);
    	printf("Bitte obere Grenze angeben.\n",end);
    	scanf("%i",&end);
    
    	for(lauf=anfang;lauf<=end;lauf++){
    		if (lauf%7==0){
    			printf("\n%i ist durch 7 teilbar.\n",lauf);
    		}
    	}
    }
    

    Es sieht dann ca so aus:

    Bitte untere Grenze angeben.
    1
    Bitte obere Grenze angeben.
    50
    
    7 ist durch 7 teilbar.
    
    14 ist durch 7 teilbar.
    
    21 ist durch 7 teilbar.
    
    28 ist durch 7 teilbar.
    
    35 ist durch 7 teilbar.
    
    42 ist durch 7 teilbar.
    
    49 ist durch 7 teilbar.
    

    Natürlich kann man auch komazahlen angeben lassen, indam man bei der eingabe anstatt %i %f nutzt und "anfang" und "end" als float definiert. allerdings macht das hier eigentlich keinen sinn, da keine kommazahl durch 7 teilbar ist.

    das % nennt sich "Modulo" und gibt als ergibnis den rest einer rechnung aus. d.h. wenn x%7=0 ist de zahl durch sieben teilbar, da kein rest bleibt.



  • da 7 eine primzahl ist sollte doch eigentlich eine einfaches += 7 ausreichen? natürlich muß man dafür die erste zahl welche durch 7 teilbar ist finden, von dieser dann in 7er schritten aufwärts..



  • Recht vielen Dank für Eure Hilfen!!! Kann aber sein, dass ich nochmehr davon für andere Aufgaben brauche 🙂



  • So, ich habe nun die nächste Frage. Nun möchte ich ein kleines Programm schreiben, womit ich die Quersumme einer Zahl ausrechnen kann.

    Als Ansätze hätte ich 2:

    1. Ansatz: Ich rechne die Zahl so lange durch 10, bist kein Rest mehr übrig bleibt, so dass ich die erste Stelle nach dem Komma zusammen rechne und die Quersumme erhalte; zB:
    453/100=45,3
    45,3/10=4,53
    4,53/10=0,453
    Quersumme: 3+5+4=12

    Hier stellt sich mir das Problem, wie lange das Programm bis 10 dividiert, bis nur noch eine 0 vorm Komma steht.

    2. Ansatz: Ich weiß nicht, ob es so einen Befehl gibt, aber als 2. Möglickeit hätte ich die Zahl einfach in ihre Ziffern aufgeteilt und zusammen addiert. Die Variante scheint mir die einfachere zu sein, jedoch kenne ich diesen Befehl nicht, falls der überhaupt vorhanden sein sollte.

    Über Anregungen/Hilfen würde ich mich sehr freuen!



  • Auch dafür kannst du den Modulo-Operator nehmen.
    Dieser gibt dir den Rest der Division aus (so wie in der Grundschule)
    Z.B 63 geteilt 10 = 6 Rest 3
    63 / 10 = 6
    63 % 10 = 3
    Diese Rechnung gilt aber nur für Integer-Zahlen

    Dein Programm könnte so ablaufen:
    Du setzt die Quersumme auf 0
    Solange die Zahl > 0
    Du addierst den Rest (3) zur Quersumme,
    dann teilst du die Zahl durch 10, und machst bei Solange ... weiter



  • Also ich habe mal so angefangen:

    #include <stdio.h>

    int main () {
    int quersumme, zahl;
    quersumme=0,
    printf("Gebe eine Zahl ein:");
    scanf("%d",&zahl);
    printf("%d",zahl/10);
    }

    Jedoch habe ich es nicht hinbekommen, dass das Programm mir gleichzeitig noch den Rest angibt. Wenn ich zusätzlich
    printf("%d",zahl%10);
    eingebe, rechnet er gar nicht weiter.



  • Naja, du mußt schon über alle Stellen der Zahl gehen.
    Damit für dich noch was übrig bleibt mal in Pseudocode

    Eingabe von zahl
    quersumme = 0
    
    Solange zahl > 0 tue 
      quersumme = quersumme + zahl % 10
      zahl = zahl / 10
    endsolange
    
    Drucke Quersumme
    


  • Ist das schwer für so einen Anfänger -.-

    Wie bekomme ich denn so eine "solange" Schleife?
    Geht das mit einer do-while Schleife?



  • Bei der do-while Schleife steht die Abbruchbedingung am Ende der Schleife, d.h. die Schleife wird mindestens einmal durchlaufen.
    Bei der while-Schleife steht die Abbruchbedingung am Anfanf der Schleife, d.h. die Schleife wird evtl. gar nicht durchlaufen.
    Und eine for-Schleife ist nur eine kürzer Schreibweise für eine while-Schleife.

    for(i=0;i<n;i++)  machwas;
    

    ist gleich mit

    i=0
    while(i<n) {
     machwas;
     i++;
    }
    

    Bei diesem Proplem ist es egal da 0 % 10 == 0.



  • Kann ich vielleicht einen Tipp bekommen, also in Programmiersprache??

    Ich grübel echt schon die ganze Zeit, und komme nicht weiter, echt frustrieren -.-



  • Schreibst du dann in deine Hausaufgabe auch dieses Forum als Quelle?
    Was für eine Schule ist das denn und welche Klasse?



  • Es ist keine Schule, sondern eine Uni.
    Aber wenn man noch nie mit solchen Sachen konfrontiert wurde, ist es
    schwer gleich von Anhieb eben mal so ein Programm zu schreiben.



  • Hallo Leute,

    ich möchte mich mal vergewissern, ob ich den folgenden Quellcode richtig deute:

    double absolut(double x)
    {
    	if (x<0) x=-1*x;
    	return x;
    }
    
    double sinus(double x, double g)
    {
    	double s=x,y=x*x*x/6;
    	int i=0;
    	while (absolut(y)>=g) {
    		s = s - y;
    		y = (-1)*y*x*x/((4+i)*(5+i));
    		i = i+2;
    	}
    	return s;
    }
    

    Im ersten Schritt wird doch die Variable absolut einer von x abgängigen Funktion zugeordnet.
    Wenn x kleiner als 0 sein sollte, dann wird x als negativ zugewiesen, so dass am Ende wieder ein positiver Wert entsteht.
    Wie deute ich das return x richtig?

    Als nächstes wird sinus einer von x und g abhängigen Funktion zugeornet.
    s und y sind dann dezimalzahlen (wegen double) und s ist dann x und y ist x^3/6.
    Bei i handelt es sich um eine ganze Zahl, die gleich 0 ist.
    Jetzt kommt eine while-Schleife, die solange ausgeführt wird, wie die Gleichung absolut(y)>=g gilt. (g wird später als eine dezimalzahl angegeben)
    Aber warum steht da nun ein (y)?

    Desweiteren verstehe ich nicht ganz, was in der while-Schleife ganz genau passiert.

    Kann mir da jemand weiterhelfen? Darüber wäre ich sehr dankbar!



  • Wie deute ich das return x richtig?

    Der aktuelle Wert von x wird zurückgegeben.
    Wenn x >= 0 ist bleibt x so wie es ist.
    Wenn x < 0 ist ... weißt du schon.

    Der Sinus wird näherungsweise über eine Reihe berechnet. Siehe http://de.wikipedia.org/wiki/Sinus#Definition_als_Taylorreihe
    g ist die Ungenauigkeit, die du angeben mußt. Wenn die Änderung kleiner als die Ungenauigkeit ist kann abgebrochen werden.

    Aber warum steht da nun ein (y)?

    Das y ist ein Element der Reihe, und wird mit dem 2. Reihenwert vorbesetzt.



  • Danke für Deine Hilfe!!!

    Okay jetzt ist mir da ein klarer. Dennoch habe ich hierzu noch eine Frage, die auch zum Programm gehört:

    double PeriodenCheck(double x)
    {
    	while (x>(2*pi)) {
    		x=x-2*pi;
    	}
    	if (x>pi) x=pi-x;
    }
    

    Das bedeutet ja, solange x größer 2pi ist, dann wird x als x-2pi ausgegeben.
    Falls x größer pi ist, dann ist x=pi-x.

    Wozu dient das ganze? Ist dies notwendig um sich der Reihe von Sinus anzunähern?



  • Ich denke ich habe das Vorgehen so in etwa verstanden.

    Also wenn wir zB als x die Zahl 9 wählen, ist diese ja größer als 2pi. Deswegen wird das neue x dann als 9-2pi ausgegeben.

    Nun ist diese Zahl aber nicht mehr größer als 2pi, aber dennoch größer als pi.
    So wird am Ende x als pi-(9-pi) herausgegeben.

    Aber dann habe ich ja ein negatives Ergebnis. Aber am Anfang wurde ja definiert, falls x negativ ist, wird es in positiv umgewandelt.

    Aber warum das ganze mit 2 pi? Meine Erklärung wäre jetzt dazu, dass Sinus 2pi-periodisch ist.
    Aber brauche ich das für eine Annäherung für diese Potenzreihe/Tayloreihe?



  • Das ist einfach nur um den Wertebereich und damit Aufwand einzuschränken. Wie du schon festgestellt hast, ist der Sinus periodisch. Also berechnen wir die Werte für eine Periode und übernehmen den die Ergebnisse. Das sollte aber eigentlich alles im Unterricht behandelt worden sein. Ich meine jetzt den Matheunterricht in der Schule. Ich weiß aus sicherer Quelle, dass die Winkelfunktionen in der 10. Klasse behandelt werden. Bei uns war das zumindest damals so und angeblich soll ja der Stoff immer schwerer werden.
    Ich will damit nicht deine Mathekenntnisse angreifen, sondern nur darauf hinweisen, dass das Problem fehl am Platz ist. Wenn du Fragen zur Mathematik hast, bist du in einem Matheforum besser aufgehoben.



  • Dir Reihe ist im Bereich von -π bis +π definiert. (http://de.wikipedia.org/wiki/Bogenma%C3%9F)

    Diese Schleife

    while (x>(2*pi)) {
            x=x-2*pi;
        }
    

    zieht sooft 2π ab bis x < 2π ist. (⚠ mehrmals wenns sein muss)

    Das if (x>pi) x=pi-x; dient dazu den Bereich auf -π bis +π zu bringen.

    Wenn du dir die Sinuskurve anschaust wirst du feststellen das sin(x) = -sin(-x) ist. Und sin(π+x) = -sin(x) ist.


Anmelden zum Antworten