C-Programmierung Hilfestellungen

Status
Für weitere Antworten geschlossen.
wer selbst mal testet, sieht das es ja eigentlich funktioniert
Hat es nicht, was hier an deiner scanf Abfrage nach Integern lag. Ein weiterer Punkt, der allerdings zu erwähnen ist, ist dass du in Zeile 22 ein einfaches Gleichheitszeichen verwendet hast. Das ist so nicht zulässig und hat logischerweise auch dazu geführt, dass der if-Zweig nie ausgeführt wurde, da es f in jedem Durchgang auf NULL setzte (was für ein Integer nicht zulässig ist, davor muss der Compiler gewarnt haben). Und NULL ist halt nunmal nicht true, der If-Zweig konnte niemals ausgeführt werden.
Einzig und allein dein Scanf hat die Schleife sofort bis zum Ende durchgegangen, und zwar ohne f zu ändern.

So, da könnte jetzt der ein oder andere Fehler drin sein, das können und werden andere korrigieren. Wichtig ist v.a. dass man bei Vergleichsabfragen immer zwei Gleichheitszeichen nimmt, nicht vergessen.

Edit: antred, das ist mir halt auch deshalb aufgefallen, weil mir der Compiler in der Zeile einen Hinweis wegen des Cast ausgespuckt hat.
 
Zuletzt bearbeitet: (Das durchgestrichene stimmt so nicht)
simpsonsfan schrieb:
Ein weiterer Punkt, der allerdings zu erwähnen ist, ist dass du in Zeile 22 ein einfaches Gleichheitszeichen verwendet hast. [...] Wichtig ist v.a. dass man bei Vergleichsabfragen immer zwei Gleichheitszeichen nimmt, nicht vergessen.

Guter Blick, ist mir nicht mal aufgefallen. Eine mögliche Strategie, um solche Fehler zu vermeiden, ist die Konstante auf der linken Seite des Vergleichs zu halten. Hätte er geschrieben:

Code:
if ( NULL = f )

dann hätte ihm sein Compiler schon eins um die Ohren gehauen (unzulässige Wertzuweisung an Konstante ... oder irgend ein äquivalenter Fehlertext).
 
Zuletzt bearbeitet: (links ist, wo der Daumen rechts ist :rolleyes)
buaehuaheuaheuh!!!

a[d]= NULL;
jetzt klappts ... danke für die HIlfe!

aber wird nicht lange dauern biss ich wieder hänge...
 
Zuletzt bearbeitet:
Anders als in diesem Thread behauptet wurde, sind Character-Literals (sowas wie 'p') in C vom Typ int.
Wenn du prüfen möchtest, welchen Inhalt dein Zeichen hat, gibt es einen Haufen Makros in ctype.h: http://pubs.opengroup.org/onlinepubs/7908799/xsh/ctype.h.html

Und setze mal deine Klammern vernünftig, dann kann man deinen Code auch lesen und dir ggf. auf die weiteren Fragen eine Antwort geben.
 
omg... jetzt wird spät...sry...
|58|warning: assignment makes integer from pointer without a cast [enabled by default]|
 
Zuletzt bearbeitet:
Ja und? Meine Glaskugel ist gerade in der Werkstatt. Was steht denn in Zeile 58??

(Aber eigentlich ist die Warnung eindeutig, wenn du sie dir nur mal richtig auf der Zunge zergehen lassen würdest.)
 
Code:
  #include<stdio.h>
    #include<stdlib.h>

  double gmittel (int a[], int dim) //dim = dimension? ur unnötig, dafür gibts doch .length()
            {
            int i;
            int sum = 0;
            int anzahl = 0;
            double sum1 ;
            for ( i = 0; i < dim; i++)
                {
            if (a[i] % 2 != 0)
                { sum += a[i]; anzahl++;} //Gerade Zahlen
            }
            sum1 = sum / anzahl;
            printf("Anzahl der ungeraden Zahlen: %d\n",anzahl);
            printf("Mittelwert: %lf\n",sum1);
            return (double)sum / (double)anzahl;
            }

 int read_ints(int a[], int dim)
 {
     printf("Geben Sie maximal %d Zahlen ein, Ende mit einem Buchstaben\n",dim);
     int d;
     int n;
     int r;
     int b;
      r=0;
      b=0;
      n=0;
     for (d=0; d<dim; d++)
     {


     printf("a[%d]",d
            );
     scanf("%d", &a[d]);
        n=n+1;


                if (a[d] == 0)
                {
                printf("Programm wird beendet!\n");
                n=n-1;
                break;
                }

                        if (a[d]>1000)
                        {
                        a[d]=NULL;
                        d=d-1;
                        r=r+1;

                        }

        }
          b=n-r;

          printf("Es wurden %d Zahlen gespeichert und %d Zahlen ignoriert\n",b,r);
          printf("Es wurden insgesamt n = %d Zahlen eingelesen!\n",n);
     return b;
 }




    int main()
    {
    int x[2000];
    int d;
    int sum;
    int Ergebnis;
    printf("Hallo\n");

    printf("Welches dim??\n");
    scanf("%d",&d);



    Ergebnis = read_ints(x,d);
    gmittel (x,Ergebnis);


system("pause");
    return 0;
    }

wooohoouuuu.... erste aufgabe wäre damit geschafft... danke für die Hilfe allerseits !!!:)
Ergänzung ()

upps... die warnung befindet sich hier in Zeile 50... nicht in Zeile 58...
 
jop... hat geklappt...

so bei der 2ten aufgabe habe ich noch imense Schwierigkeiten...irgendwie verstehe ich nicht mal die Aufgabenstellung !

a) Das Programm erwartet auf der Kommandozeile einen Integerparameter 0<n<12,einen int x >1, einen Arreynamen aname (Text) und einen Filenamen fname (Text). Alle Parameter müssen vorhanden sein und müssen die bedingungen erfüllen.Bei Fehlern ist eine ordentliche Usage-Meldung auszugeben und das Programm endet.
b)Stellen Sie nun sicher ,dass die Datei fname noch nicht existiert: öffnen Sie die Datei zu Lesen. Wenn das erfolgreich ist, beenden Sie das Programm mittels usage(...) . Öffnen Sie nun die Datei im Überschreibmodus.
c)schreiben Sie nun in diese Datei die definition eines C-int Arrays, das mit n in [1,x] gleichverteilten ganzzahligen Zufallszahlen initialisiert ist. Nach dem Aufruf ./a.out 10 10 MyArray My File sollte in der Datei MyFile ein ähnlicher Output stehen wie: int MyArray[10] = {1, 3, 7, 9, 4, 2, 1, 5, 5, 10};


Code:
#include<stdio.h>
#include<stdlib.h>



int main()
{


int n;
int x;
char aname[100];
char fname[100];
int d;
char texteingabe[600];
FILE *f;



            printf("Geben Sie den Interparameter `n`, einen Doubleparameter `e`, \neinen Arraynamen `aname` und einen Filenamen `fname` an!\n");
            printf("n : ");
            scanf("%d", &n);

                            if (n>12)
                            {
                                printf("Programm wird beendet!");
                                return 0;
                            }
                                     if (n<0)
                                        {
                                            printf("Programm wird beendet!");
                                            return 0;
                                        }

            printf("x : ");
            scanf("%d", &x);


                            if (x<2)
                            {
                                printf("Programm wird beendet!");
                                return 0;
                            }

            printf("aname : ");
            scanf("%s", &aname);
            printf("fname : ");
            scanf("%s", &fname);

            printf("Was wollen Sie nun machen, zum lesen der Datei druecke 1, zum ueberschreiben 2!\nDeine Eingabe: ");
            scanf("%d3",&d);



switch (d)
{


        case 1:

        f = fopen(fname,"r");

                        if (f==NULL)
                        {
                            printf("Fehler beim oeffnen der Datei, Datei existiert nicht! "
                                   );
                                   printf("Programm wird beendet!");
                                   return 0;
                        }
                        else
                        {
                            printf("Datei existiert bereits\n");
                        }
                break;


        case 2:
        fflush(stdin);
        printf("geben Sie den Text ein:\n");
        f = fopen(fname,"w");
        fgets(texteingabe, sizeof(texteingabe), stdin);
        fputs(texteingabe,f);

        fclose(f);

        system("PAUSE");
        return 0;


}
return 0;
}
 
Zuletzt bearbeitet:
Gewöhn dir bitte dringend an, auf saubere und konsistente Einrückung zu achten. Das sieht ja aus, als wäre da eine Katze über die Tastatur gerannt.

Genau welchen Teil der Aufgabenstellung verstehst du nicht?
 
Du sollst Kommandozeilenparameter verarbeiten, das geht über
Code:
int main(int argc, char **argv){
}
argc gibt die Anzahl der übergebenen Parameter an, die dann in argv stehen, argv[0] enthält dabei den Namen des Programms.

Beispiel:
~ $ ./a.out 10 3 test.txt arrayname

argc=5
argv= { "./a.out", "10","3","test.txt","arrayname"}

Und damit kannst du jetzt arbeiten.
 
hallo... erstmals danke für den tipp... leider weiss ich noch nicht recht was ich damit anfangen soll... aber mal egal...

zuerst mal warum bekomme ich meine Zufallszahlen nicht hin? ich bekomme immer nur die selbe zufallszahl!
Code:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>


int main()
{

int r;
int i;
int n;
int x;
int e[1000];


            printf("Geben Sie den Interparameter `n`, einen Doubleparameter `e`,ngetrennt durch ein leerzeichen\n");

            scanf("%d ", &n);
            scanf("%d", &x);

for (i=0;i<n;i++)
       {	//Zufallszahl erzeugen
    srand(time(NULL) * time(NULL));
    r = rand() % x;


            printf("%d\n",r);

           e[i]=r;
            printf("e[%d]=%d\n",i,r);

            }




return 0;
}
 
Weil dein time( NULL ) mit ziemlicher Sicherheit für jeden Durchlauf deiner Schleife das selbe Resultat bringt. time( NULL) liefert die Anzahl der Sekunden seit dem 1. Jan. 1970, 00:00 Uhr. Deine Schleife läuft in einem Bruchteil einer Sekunde durch ... also ergibt time( NULL) * time( NULL) immer den gleichen Wert. Ich würde srand() nur einmal zu Beginn des Programms aufrufen.


P.S. Dein Code ist immer noch furchtbar eingerückt.
 
thanks...
jetzt hab ich also meine Zufallszahlenin arrays gespeichert...

Code:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>


int main()
{

int r;
int i;
int n;
int x;
int u;
int s;
int e[100];
char aname[199];


            printf("Geben Sie den Interparameter `n`, einen Doubleparameter `e`,einen Arrayname,getrennt durch ein leerzeichen\n");

            scanf("%d ", &n);
            scanf("%d", &x);
            scanf("%s", &aname);

                        for (i=1;i<n+1;i++)
                        {

                        r = rand()%x+1;

                        printf("%d\n",r);

                        e[i]=r;
                        printf("e[%d]=%d\n\n",i,r);

                        }


            printf("int %s [%d] : {%d,%d,%d}",aname,n,e[1],e[2],e[3]);


return 0;
}


aber wie schaffe ich es nun diese in der form "MY Array [n]:{ e[1],e[2],e[3],e[4],e[5]...,e[n]} auszugeben??
 
Zuletzt bearbeitet:
Hancock: Du verstehst ihn falsch. Hättest du mal den Thread aufmerksam gelesen, wüsstest du, dass hier mit "Hilfestellung" die weniger geläufige Bedeutung "Mir schnell die Lösung geben" gemeint ist.
 
Den Eindruck habe ich nun auch gewonnen. Sämtliche hier gestellten Fragen kann man mit ein klein wenig Aufwand selbst beantworten. Aufgrund mangelnder Eigeninitiative geschlossen.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben