Beiträge von xxyy

    Hi Leute,

    habe jetzt schon länger mit C nichts mehr gemacht und deshalb bin ich mir jetzt etwas unsicher.

    Also ich habe ein paar ganz kleine Algorithmen die ich kurz erklären möchte.

    Code
    int[] algA (int j) {
    int[] myAr = new int[6];
    myAr[0] = j;
    myAr[1] = myAr[0] * j;
    myAr[2] = myAr[1] * j;
    myAr[3] = myAr[2] * j;
    myAr[4] = myAr[3] * j;
    myAr[5] = myAr[4] * j;
    return myAr;
    }

    Hier wird ein Array mit 6 (0-5) Speicherzellen definiert. Und jede bekommt als Wert das Quadrat der vorherigen zugewiesen.
    Ausgegeben wird die 6 oder? Bin mir gar nicht sicher.

    Hier werden die Multiplikationen den einzelnen Arrays zugewiesen. Aber welchen Sinn macht die Ausgabe?

    Code
    int algC (int i) {
    int result = 0;
    if (i == 0)
    result = 0;
    if (i < 0)
    result = -1;
    if (i > 0)
    result = 1;
    return result;
    }

    Also bei Eingabe i=0=Ausgabe, Eingabe kleiner also 0, dann wird -1 ausgegeben, bei Eingabe>0 wird 1 ausgegeben.

    Code
    Betrachten Sie nur Eingabewerte k > 0.
    int[] algD (int k){
    int[] bar = new int[k];
    for (int i = 0; i < k; i++) {
    bar[i] = i * i;
    }
    return bar;
    }

    Hier wird ein Array mit k bzw. i Zellen definiert und jeder wird das Quadrat von i zugewiesen, also Zelle 1 wird 1*1=1 zugewiesen, der 2. Zelle 2*2=4 usw...
    Was return bar ausgibt weiß ich nicht, wie bei dem 1. Code.
    Oder wird damit einfach der neue Inhalt vom Array bar an die Hauptfunktion zurückgegeben?

    Code
    int algE (int[] k){
    int a = 0;
    int res = 0;
    while (a < k.Length) {
    res = res + k[a];
    a = a + 1;
    }
    return res;
    }

    Hier haben wir das Array k mit a Elementen und der Inhalt von allen Elementen wird summiert und ausgegeben, richtig?
    k.Length steht ja für die Anzahl der Elemente in array k.

    Gibt es einen Befehl der mir ein Array invertiert?
    Also z.B. aus [1, 2, 3, 4, 5] dann [5, 4, 3, 2, 1] macht?

    Dann noch etwas kurz zu booleschen Werten.
    Ich habe 2 Tabellen für die ich einen Algorithmus schreiben will, aber ich weiß nicht was das für boolesche Funktionen sind.
    Der dritte Wert ist immer die Ausgabe.

    1.
    false, false, false
    false, true, false
    true, false, false
    true, true, false

    2.
    false, false, true
    false, true, false
    true, false, true
    true, true, true

    Bei 1. kann ich doch einfach immer false ausgeben lassen??
    Bei 2. fällt mir zur Zeit gar nichts ein.


    Vielen Dank für´s Lesen!

    Ich habe jetzt durch Tipps und das Tutorial Pronix das hier:


    argc ist die Anzahl der übergebenen Parameter, argv[1] der Operator (z.b. +), argv[2] und argv[3] die beiden Operanden.

    Wenn ich das so laufen lasse, dann bekomme ich die die Fehlermeldung ausgegeben und fertig.
    Aber was muss ich machen/hinzufügen,dass ich das auch eingeben kann?
    Also z.b.: calcul + 2 3

    gelbasack

    Danke für den Hinweis. Wenn ich & weglasse bekomme ich die Fehlermeldung "op is used without being defined".

    MickeyM

    Ja das wäre natürlich die einfachste Lösung. Aber wir müssen das als Zeichenkette einlesen.

    Zitat


    Aufgabenstellung:
    Es sollen arithmetische Ausdrücke in den vier Grundrechenarten berechnet werden. Operator und Argumente werden als Kommandozeilenargumente angegeben.
    Zur Umwandlung einer Zeichenkette in einen double Wert kann die Funktion atof() verwendet werden.

    Hi Leute,

    ich muss ein kleines Programm schreiben das wie folgt funktionieren soll:

    Eingabe: calcul + 5.1 6.2

    Ich nehme mal an, dass er mir die beiden Zahlen addieren soll.
    Jedoch müssen diese ja in einer Zeile eingegeben werden, also String.

    Jetzt kenne ich die Funktion atof die mir jetzt die 5.1 "rausholen" kann. Aber wie mache ich das mit der 6.2 ?

    Bin mit Hilfe von jemanden darauf gekommen, dass man alles einzeln als string einlesen kann.

    Wenn ich das laufen lasse, dann gebe ich z.b. ein + 5 2.
    Und dann wird der Debuger wegen einer "unbehandelten Win32 Ausnahme" gestartet.

    Ich nehme an, dass ich etwas bei der scanf Adressierung falsch mache. Kann mir jemand helfen?

    Vielen Dank!

    Ich habe mal die Funktion zur Berechnung iterativ geschrieben und mit einer Abfrage.


    Hab jetzt diesen Beitrag hier editiert, weil es etwas durcheinander wurde.

    Ich glaube, dass es jetzt so richtig ist.
    Zuerst hatte ich in der If-Abfrage UINT_MAX. Da hatte ich das Problem, dass bei der Eingabe 46 (also dass die 46. Fibonacci Zahl ausgegeben werden soll) eine negative Zahl ausgegeben wurde. Und erst ab der Eingabe 47 der "Fehler" ausgegeben wurde.
    Die negative Ausgabe liegt wahrscheinlich daran, dass da schon der Überlauf stattgefunden hat und das Überlaufbit gesetzt wurde.

    Nachdem ich jetzt INT_MAX genommen habe, bekomme ich schon ab der 46 die "Fehlermeldung".

    Ich hoffe dass das jetzt so richtig ist...

    Interessante Tabelle, das ist nämlich überhaupt nicht standardisiert. Das einzige was fix ist ist, dass "int" der Bitbreite des Prozessors entspricht (also 8bit bei einem 8bit-Prozessor, 16bit auf einem 16bit-Prozessor, 32bit bei einem 32bit-Prozessor und 64bit bei einem 64bit-Prozessor), und dass char die kleinste addressierbare Einheit (üblicherweise 1 Byte) ist.
    Die Tabelle kann also nur für genau einen Compiler auf genau einer Plattform sein, was vermutlich nicht deiner Plattform entspricht.

    Das höchste Bit einer Zahl kannst du bestimmen, indem du eine Schleife machst:

    Code
    for(unsigned int i = sizeof(zahl)*8; i; i--)
      if(zahl & (1 << i)) {
        printf("Höhstes Bit ist %u\n",i);
        break;
      }


    Oder so in der Art (könnte wieder einen off by one-Fehler enthalten, um sowas zu kontrollieren bin ich nimmer nüchtern genug ;)).

    Danke, dass du dich da noch gequält hast *g*

    Die Tabelle bzw. Info habe ich aus dem Pronix C Tutorial.

    Ich habe die for-Schleife vor das return 0 eingebaut und es kamen folgende Meldungen.

    Kann man die Bedingung "i" einfach alleine stehen lassen?

    Ich habe mal ausgeben lassen:

    Code
    printf("%d",sizeof(zahl));


    Und da kommt immer 4 raus, d.h. dass unsigned int 4 Bytes hat? Hab gedacht 2 (laut meiner Tabelle).

    Wie kann man dann die Bits bzw. Bytes des Ergebnisses bestimmen um zu "sagen" es werden mehr benötigt ?

    Danke euch für die Antworten.

    Ein unsigned int hat ja 2 Bytes, 16 Bits. Also von 0...65535.
    Was mich grad verwirrt ist, dass wenn ich mein Programm laufen lasse und eingebe, dass mir die 30. angezeigt werden soll, dann kommt 832040.
    Wo liegt mein Denkfehler??

    Und die Abfrage kann ich dann so machen?

    Code
    if (sizeof(zahl)>16)
    {
    printf("Nicht darstellbar");
    }

    Hi Leute,

    ich bin dabei ein Programm zu schreiben, das mir Fibonacci Zahlen berechnet.
    Das "Hauptprogramm" habe ich geschafft.
    Jedoch soll ich bei dem Programm die größte darstellbare Zahl bei dem verwendeten Datentyp beachten und es soll eine Fehlermeldung ausgegeben werden, wenn diese "zu groß" ist.

    Das hat etwas mit dem sizeof Operator zu tun, oder? Habe mit ihm noch nie so gearbeitet bzw. so einen Aufgabentyp.

    Mein Fibonacci Programm sieht so aus:


    Wie mache ich das mit der "größten darstellbaren" Zahl?

    Vielen Dank!!

    Ja das stimmt, ist nicht wirklich sauber, was mich auch stört.

    ich habe deshalb in der messwert.c noch die funktion double einlesen(int anzahl) definiert und läuft jetzt auch so.

    Danke nochmal!


    Kleine Frage zu einem Programm wo ich sagen soll was für eine Bildschirmausgabe es bewirkt.

    Wenn ich es so übernehme bekomm ich einen Fehler, weil g[/d] keine Zuweisung bekommen hat.
    Ich nehme mal an, den Fehler hat der prof ausversehen gemacht.
    Ich habe dann mal einfach für g=0 gesetzt.

    Meine Bildschirmausgabe ist dann
    [b]21 12 23 14 5 0 0
    wobei die letzte Null ich ja so gesetzt habe.

    Jetzt frage ich mich was soll dabei so besonders sein, bei der Ausgabe?
    Sieht das jemand?

    Danke für den Tipp. ich hab double messwert[20]; in der messwert.c gelassen und zusätzlich extern double messwert[20]; in die messwert.h reingeschrieben. Jetzt kann ich auch in der main.c drauf zugreifen.

    Normal habe ich die messwert[20]; in der main.c nur wegen der Eingabe der Zahlen gebraucht. Aber die macht ja jetzt die double mittel am anfang.
    So erspare ich mir eine weitere int Variable in der main.c.

    nochmal wegen den Variablen i, s und m. Die brauche ich in beiden Funktionen, also double mittel und double abweichung. Deshalb hab ich sie global. oder meintest es anders?

    Danke!

    So einen Fehler hatte ich schon mal bei einem anderen Programm...

    Jetzt geht es aber.

    Wegen den Variablen i, anzahl, s und m. Wo soll ich sie dann definieren?

    und extern mittelwert[20]; kann ich in messwerte.h schreiben und double messwert[20]; in messwerte.c lassen?

    Weil ich bekomme die Meldung:
    'messwert': Neudefinition; unterschiedliche Basistypen

    Hallo,

    danke für die Erklärungen.

    Ich hab eben gesehen was du meinst, hab schon geahnt es liegt an den Variablen.

    Jetzt habe ich um es mir zu erleichtern die Eingabeschleife

    Code
    for (i=0;i<anzahl;i++)
    {
        scanf("%f", &messwert[i]);
    }

    aus main.c rausgenommen und in messwerte.c in die double mittel Funktion eingefügt.

    Dann habe ich in main.c für die Eingabe der Anzahl der Zahlen die Variable x genommen.
    Diese wird dann der mittel Funktion in messwerte.c übergeben. Entsprechend habe ich dann die Funktionen verändert.

    double mittel(int anzahl)
    double abweichungl(int anzahl)

    Somit wird ja x der Variablen anzahl übergeben.
    messwert[i] sind die Zahlen die eingegeben/eingelesen werden.

    Dann habe ich wieder durchlaufen lassen und meine 4 Zahlen eingegeben: 4, 5, 6, 5.

    Aber bekomme leider 0.00000 raus, beim Mittelwert, als auch der Abweichung...

    Hier nochmal die veränderten Dateien
    main.c

    messwerte.c

    messwerte.h

    Code
    #ifndef MESSWERTE_H
    #define MESSWERTE_H
    
    
    double mittel(int anzahl);
    double abweichung(int anzahl);
    
    
     #endif

    Was stimmt noch nicht?

    Jetzt habe ich doch noch ein Problem.

    Und zwar muss ich die Funktionen zur Berechnung des Mittelwertes mittel(anzahl) und der Abweichung abweichung(anzahl) in eine headerdatei speichern.

    Ich habe das schon mal gemacht bei Vektoraufgabe. War aber etwas anders.

    Ich habe also drei Dateien
    main.c
    messwerte.c (die Funktionen)
    messwerte.h (die Funktionsdeklarationen)

    in messwerte.c habe ich


    messwerte.h

    Code
    #ifndef MESSWERTE_H
    #define MESSWERTE_H
    
    
    float mittel(int i);
    float abweichung(int i);
    
    
    #endif

    main.c


    Wenn ich das in Visual Studio eingebe läuft das Programm zwar, aber bekomme beim Mittelwert und bei der Abweichung mit meinen Zahlen -1.#IND00 raus was ja nicht richtig ist.

    habe ich bei den Definitionen in der messwerte.h oder messwerte.c was vergessen?

    Danke für deinen Tipp!

    Es hat ausgereicht die 1 in 1.00 im Zähler zu schreiben.

    Und dann war ausschlaggebend, dass ich in der Funktion ganz oben den Mittelwert m nicht zurückgegeben habe, also return m.

    Jetzt läuft es prima!

    Danke nochmal!

    Hallo Leute,

    habe gerade ein Programm fast ganz fertig bekommen.
    Es soll den Mittelwert von x eingegebenen (maximal 20) float Werten ausgeben und die Standardabweichung.

    Der Mittelwert wird richtig ausgegeben, aber bei der Abweichung bekomme ich irgendwie -1.#IND00.
    Als Testdaten habe ich 4 Werte eingegeben, und zwar 4, 5, 6, 5.
    Mittelwert: 5 stimmt
    Abweichung müsste 0.707 sein, aber kommt wie gesagt nicht raus.

    Die Formel für die Abweichung ist ja wie hier
    http://de.wikipedia.org/wiki/Geometrische_Standardabweichung

    Das zweite x mit dem Oberstrich steht ja für den Mittelwert.

    Was mache ich falsch? Alles scheint zu funktionieren bis auf das mit der Berechnung der Abweichung. Habe ich da einen Fehler?

    Hier mal mein Quellcode:


    VIelen Dank fürs Lesen!

    Ich habe etwas herumgesucht und habe bei Wikipädia bisschen was rausgefunden...

    Und zwar bekomme ich die Adresse von sum, indem ich die Ausgabe von sum so verändere

    Code
    printf("Summe: [b]%p[/b]\n", [B]&[/B]sum);


    So bekomme ich bei der Ausgabe 0012FF18.

    Wird das gemeint?

    Hallo Leute,


    hab eine "kleine" Aufgabe die ich nicht so ganz verstehen kann.


    Geben Sie das Speicherabbild des folgenden Programms vor Aufruf von printf() an.



    Hinweis: Die Adressen der Variablen lassen sich durch geeignete Ausgabeanweisungen bestimmen.


    Ich verstehe nicht wirklich was gemeint wird. Um das Ergebnis zu kennen brauche ich ja nicht unbedingt printf, denn das sieht man ja so.


    Oder geht es speziell um die Speicherstellen der Variablen? Ich verstehe das irgendwie nicht...


    Vielen Dank fürs Lesen!