Frage zu zwei C Programmen
-
Da ich von simon.gysi hingewiesen wurde das ich falschen bereich war poste ich es nochmal hier und hoffe es ist ok also
Hi Leute also bin neu hier und habe zwei Probleme!
Also muss zwei Programme schreiben nur irgendwie krieg ich bei dem erstens keine ergebnisse jedefalls kommt es mir so vor und beim zweiten fehlt noch etwas bzw. finde ich den fehler nicht!
ich hoffe das mir jemand helfen kann!wäre echt nett von euch
ich habe hier mal den link wo alles drin ist sowohl aufgaben stellung als auch die bis her von mir geschriebenen Cods!
Hier noch beide Progs gleich als code
Hier ist programm 1
#include<stdio.h> #include<sys/timeb.h> //#include<zeiten.h> int compare(const void *elmt1,const void *elmt2) { int *e1=(int *)elmt1; int *e2=(int *)elmt2; return *e1-*e2; } void dsort (int *base,int num) { int i,j,x,c; for(i=0;(i < num); i++) { for (j=i;(j < num); j++) { if ((base[i]-base[j]) > 0) { x = base[i]; base[i] = base[j]; base[j] = x; } } //printf("\n das %d. Element ist %d",(i+1),base[i]); } //printf("\n\n\n"); } void main () { int n=0,i,*a,*b; struct timeb tm1, tm2; printf("\n\n\n Dieses Programm sortiert die Elemente eines n-dimensionalen (n > 0)\n Vektors nach ihrer Groesse, beginnend mit dem Kleinsten.\n Die Elemente sind dabei eine Groesse von 0 bis 1000"); printf("\n\n ------ \n\n\n Bitte geben sie n an: "); scanf("%d",&n); while ((n == 0) || (n < 0 )) { printf("\n\n FEHLERHAFTE EINGABE VON n! BITTE ERNEUT EINGEBEN!!!\n\n n: "); scanf("%d",&n); } a = (int*)malloc(n*sizeof(int)); b = (int*)malloc(n*sizeof(int)); ftime(&tm1); srand(tm1.millitm); for (i=0;i < n; i++) { a[i] = rand()%1001; b[i] = a[i]; } printf("\n\n\n -------- \n\n\n"); ftime(&tm1); qsort(a,n,4,compare); ftime(&tm2); printf("\n\n\n Zeit benötigt mit qsort (msec): %d",(tm2.time - tm1.time) * 1000 + tm2.millitm - tm1.millitm); dsort(b,n); ftime(&tm2); printf("\n\n\n Zeit benötigt mit dsort (msec): %d",(tm2.time - tm1.time) * 1000 + tm2.millitm - tm1.millitm); printf("\n\n\n"); free(a); free(b); }
Hier Programm 2
#include<stdio.h> void main() { double *a, *b, c, d, e; int m, n ,o, i, j, k; char dir_a[256], dir_b[256]; FILE *matrix_file_a, *matrix_file_b; printf("\n\n\n Dieses Programm berechnet fuer zwei Matrizen A und B die\n Multiplikation nach A * B = C .\n\n\n"); printf("\n Anzahl der Zeilen von A: "); scanf("%d",&m); printf("\n Anzahl der Spalten von A: "); scanf("%d",&n); printf("\n Anzahl der Spalten von B: "); scanf("%d",&o); a = malloc(m * n * sizeof(double)); b = malloc(n * o * sizeof(double)); printf("\n\n"); for(i=0;i<m;i++) for(j=0;j<n;j++) { printf("Wert fuer Zeile %d Spalte %d von A eingeben: ",i+1,j+1); scanf("%lf",&a[i*n+j]); } printf("\n\n"); for(i=0;i<n;i++) for(j=0;j<o;j++) { printf("Wert fuer Zeile %d Spalte %d von B eingeben: ",i+1,j+1); scanf("%lf",&b[i*o+j]); } printf("\n\n Verzeichnis fuer die Ausgabe von A eingeben (max. 255 Zeichen):\n\n "); scanf("%s",dir_a); matrix_file_a = fopen(dir_a,"w"); fwrite(a,sizeof(double),m*n,matrix_fil_ea); fclose(matrix_file_a); printf("\n\n Verzeichnis fuer die Ausgabe von B eingeben (max. 255 Zeichen):\n\n "); scanf("%s",dir_b); matrix_file_b = fopen(dir_b,"w"); fwrite(b,sizeof(double),n*o,matrix_file_b); fclose(matrix_file_b); free(a); free(b); matrix_file_a = fopen(dir_a,"r"); matrix_file_b = fopen(dir_b,"r"); printf("\n\n"); for(i=0;i<m;i++) { for(j=0;j<o;j++) { c = 0; for(k=0;k<n;k++) { fseek(matrix_file_a,(i*n+k)*sizeof(double),SEEK_SET); fseek(matrix_file_b,(k*o+j)*sizeof(double),SEEK_SET); fread(&d,sizeof(double),1,matrix_file_a); fread(&e,sizeof(double),1,matrix_file_b); c += d*e; } printf("%6.3lf\t",c); } printf("\n"); } printf("\n\n"); }
Programm 1 läuft nur krieg ich immer null raus bei dem was er berechnen soll und programm 2 gibt einen fehler wenn ich es starten soll
-
Vorschlag:
Du benutzt die Code-Tags und ich lese es dann.
-
ich hoffe das es so ok ist
-
benutze cpp tags
-
ok danke habe ich und tut mir leid für die unannehmlickeiten
-
Hallo,
ich habe mir mal dein erstes Programm angesehen.
Hier meine Verbesserungen:#include <stdio.h> #include <sys/time.h> #include <stdlib.h> int compare(const void *elmt1,const void *elmt2) { int *e1=(int *)elmt1; int *e2=(int *)elmt2; return *e1-*e2; } void dsort (int *base,int num) { int i,j,x; for(i=0;(i < num); i++){ for (j=i;(j < num); j++) { if ((base[i]-base[j]) > 0) { x = base[i]; base[i] = base[j]; base[j] = x; } } } } void print_array(int *a, int *b, int num) { int i; for (i=0; i<num; ++i) printf("%d %d\n", a[i], b[i]); } int main (void) { int n=0,i,*a,*b; struct timeval tm1, tm2; int usec; printf("Dieses Programm sortiert die Elemente eines n-dimensionalen (n > 0)\n Vektors nach ihrer Groesse, beginnend mit dem Kleinsten.\n Die Elemente sind dabei eine Groesse von 0 bis 1000\n"); printf("------ \n\n Bitte geben sie n an: "); scanf("%d",&n); while ((n == 0) || (n < 0 )) { printf("\n\n FEHLERHAFTE EINGABE VON n! BITTE ERNEUT EINGEBEN!!!\n\n n: "); scanf("%d",&n); } a = (int*)malloc(n*sizeof(int)); b = (int*)malloc(n*sizeof(int)); gettimeofday(&tm1, NULL); srand(tm1.tv_usec); for (i=0;i < n; i++) { a[i] = rand()%1001; b[i] = a[i]; } printf("-------- \n"); gettimeofday(&tm1, NULL); qsort(a,n,4,compare); gettimeofday(&tm2, NULL); usec = (tm2.tv_sec - tm1.tv_sec) * 1000000 + tm2.tv_usec - tm1.tv_usec; printf("Zeit benötigt mit qsort (usec): %d\n", usec); fflush(stdout); gettimeofday(&tm1, NULL); dsort(b,n); gettimeofday(&tm2, NULL); usec = (tm2.tv_sec - tm1.tv_sec) * 1000000 + tm2.tv_usec - tm1.tv_usec; printf("Zeit benötigt mit dsort (usec): %d\n", usec); /* print_array(a, b, n); */ free(a); free(b); return 0; }
ftime war vielleicht nicht genau genug, mit gettimeofday bekommst du
Zeiten in microsecs (usecs).Gruß mcr
-
Auch zum zweiten Programm will ich mal nicht so sein.
Du hast in Zeile 48 einen Schreibfehler.
Dazu kommt dann noch, du gibst in dir_a, dir_b nicht das Verzeichnis,
sondern den Dateinamen an.Ich verstehe nicht so ganz, warum du in die Dateien binär schreiben möchtest
und auch anschließend über diese Dateien rechnest.Dieses hier sollte das tun, was du willst:
#include <stdio.h> #include <stdlib.h> void write_mat(double *a, int z, int s, char *dat) { FILE *fp; int i, j; fp = fopen(dat, "w"); for (i=0; i<z; ++i) { for (j=0; j<s; ++j) fprintf(fp, " %6.2f ", a[i*s+j]); fprintf(fp, "\n"); } fclose(fp); } int main(void) { double *a, *b, c; int m, n ,o, i, j, k; char dir_a[256], dir_b[256]; printf("\n\n\n Dieses Programm berechnet fuer zwei Matrizen A und B die\n Multiplikation nach A * B = C .\n\n\n"); printf("\n Anzahl der Zeilen von A: "); scanf("%d",&m); printf("\n Anzahl der Spalten von A: "); scanf("%d",&n); printf("\n Anzahl der Spalten von B: "); scanf("%d",&o); a = malloc(m * n * sizeof(double)); b = malloc(n * o * sizeof(double)); printf("\n\n"); for(i=0;i<m;i++) for(j=0;j<n;j++) { printf("Wert fuer Zeile %d Spalte %d von A eingeben: ",i+1,j+1); scanf("%lf",&a[i*n+j]); } printf("\n\n"); for(i=0;i<n;i++) for(j=0;j<o;j++) { printf("Wert fuer Zeile %d Spalte %d von B eingeben: ",i+1,j+1); scanf("%lf",&b[i*o+j]); } printf("\n\n Verzeichnis fuer die Ausgabe von A eingeben (max. 255 Zeichen):\n\n "); scanf("%s",dir_a); write_mat(a, m, n, dir_a); printf("\n\n Verzeichnis fuer die Ausgabe von B eingeben (max. 255 Zeichen):\n\n "); scanf("%s",dir_b); write_mat(b, n, o, dir_b); printf("\n\n"); for(i=0;i<m;i++) { for(j=0;j<o;j++) { c = 0; for(k=0;k<n;k++) { c += a[i*n+k] * b[k*o+j]; } printf("%6.3f\t",c); } printf("\n"); } printf("\n\n"); free(a); free(b); return 0; }
Gruß mcr
-
Beide deiner Dateien funktioniert.
Bei 1 Programm muss du mehr elemente nemmen um das ergebniss zu sehen, weil dein Computer so schnell ist das er in 0 sec. das ergebniss erechnet.
Ene Anzahl von 10000, kannst du den unterschied sehen.Das 2 Programm läuft auch.
Du giebst die Datei zum speichern falsch ein.
Richtige eingabe: z.B.C:\data1.dat
were richtig. Bei einer falschen eingabe bekommst du ein Laufzeitfehler.
-
ok danke habe ich und tut mir leid für die unannehmlickeiten
Da muss dir nichts leid tun. Es ist eben viel einfacher, wenn man die Einrückungen auch bekommt. Die sind manchmal hilfreicher als der beste Kommentar.
-
ich danke erstmal recht herzerlich wirklich!!!!
nur also kriege jetzt bei dem erstens Prog nen fehler und zwar den hier
fatal error C1083: Datei (Include) kann nicht geöffnet werden: "sys/time.h": No such file or directory
und beim zweiten prog berechnet er von b nur spalten nur sollte da nicht zeile und spalte sein? und den fehler wenn ich z.b. als pfad nur C:\ ist normal und bekommt man auch nicht weg?
-
umrotzer schrieb:
nur also kriege jetzt bei dem erstens Prog nen fehler und zwar den hier
fatal error C1083: Datei (Include) kann nicht geöffnet werden: "sys/time.h": No such file or directory
Welchen Compiler verwendest du? Welches Betriebssystem?
Ich verwende den gcc unter Linux.umrotzer schrieb:
und beim zweiten prog berechnet er von b nur spalten nur sollte da nicht zeile und spalte sein?
Bei mir berechnet das Programm genau das, was es soll. Vielleicht kontrollierst
du es noch einmal.Gruß mcr