matematykaszkolna.pl
program Benny: #include<stdio.h> #include<conio.h> main() { FILE *f1, *f2; f1=fopen("liczby.txt", "r"); f2=fopen("ladne.txt", "w+"); char a[30]; while(!feof(f1)) { fgets(a,30,f1); fputs(a,f2); } fclose(f1); fclose(f2); getch(); } Czemu mi to nie działa?
22 lip 14:26
Benny: Tutaj już mi wypisuje, ale same zera #include<stdio.h> #include<conio.h> main() { FILE *f1, *f2; f1=fopen("liczby.txt", "r"); f2=fopen("ladne.txt", "w+"); int a; while(!feof(f1)) { fscanf(f1,"%d",&a); fprintf(f2,"%d\n",a); } fclose(f1); fclose(f2); getch(); }
22 lip 15:04
asdf: uwielbiam pytania typu "dlaczego mi to nie działa?"....a byś może tak pokazał zawartość plików, które masz, serio − przyda się. Nikt tu nie jest wróżbitą Maciejem...
22 lip 17:11
Benny: Zapomniałem dopisać, sorry. Przykładowa zawartość pliku liczby.txt: 12 0 13 −17
22 lip 17:13
Maciej wróżbita: asdf czy ty masz jakiś problem?
22 lip 17:26
jc: Zmień instrukcję while na następującą: while( fscanf(f1,"%d",&a) ) fprintf(f2,"%d\n",a);
22 lip 17:41
jc: Nic nie zmieniaj ! Twój program działa poprawnie.
22 lip 17:43
Benny: #include<stdio.h> #include<conio.h> main() { FILE *f1, *f2; f1=fopen("liczby.txt", "r"); f2=fopen("ladne.txt", "w+"); int a; while(!feof(f1)) { if(fscanf(f1, " %d", &a) == 1) { fprintf(f2, "%d\n", a); } } if(fscanf(f1, " %d", &a) == 1){ fprintf(f2, "%d\n", a); } fclose(f1); fclose(f2); getch(); } Mam teraz tak. Po skompilowaniu nic mi nie wypisuje do pliku. Dlaczego?
22 lip 18:07
jc: Dziwne, Twój program u mnie działa ... Dopisałem instrukcję wypisującą dodatkowo wynik na ekranie oraz dopisałem wyjście z pętli w przypadku błednych danych (bez tego program mógł chodzić bez końca). O, widzę, że zrobiłeś to samo emotka #include<stdio.h> int main() { FILE *f1, *f2; f1=fopen("liczby.txt", "r"); f2=fopen("ladne.txt", "w+"); int a; while(!feof(f1)){ if(!fscanf(f1,"%d",&a)) break; fprintf(f2,"%d\n",a); printf("%d\n",a); } fclose(f1); fclose(f2); return 0; }
22 lip 19:51
Benny: Po otwarciu plików dałem warunek w razie, gdyby f1==0 lub f2==0 wypisze komunikat no i się tak dzieję. Czemu?
22 lip 19:56
Benny: Dobra chyba znalazłem błąd. Mój plik nazywał się liczby.txt, a że był to już plik tekstowy to czytało go pewnie liczby.txt.txt emotka
22 lip 20:01
Benny: Jak mam zrobić, aby np. pierwszej liczbie przypisać jakąś zmienną, aby je wszystkie zsumować?
22 lip 20:06
jc: Wprowadź nową zmienną. Nadaj jej na początku wartość zero. A potem dodawaj do niej kolejne liczby. int suma = 0; // przed pętlą .... s += a; // to umieść w pętli
22 lip 20:13
jc: Oczywiście suma += a; Napisałem s, bo zwykle używam liter na oznaczenie zmiennych (informatycy często używają nazw, czasem dośc długich; nie jestem informatykiem).
22 lip 20:17
Benny: Nie o to mi chodziło, ale sam sobie odpowiedziałem. Moja zmienna a jest zmienną całkowitą, więc to oczywiste, że traktuje ją jako liczbę, a nie znak emotka
22 lip 20:19
jc: Teraz nie zrozumiałem. Myślałem, że chcesz dodać wszystkie liczby w pliku ...
22 lip 20:24
Benny: Tak chciałem zrobić. Trochę namieszałem, ale jest ok. Zmienną suma dałem jako float, bo później liczę średnią arytmetyczną.
22 lip 20:27
jc: W takim razie coś wtrące. Użwaj raczej typu double. Procesor wykonuje działania na takim typie. Typu float można użyć w dużej tablicy dla oszczędności miejsca.
22 lip 20:31
Benny: #include <stdio.h> #include<math.h> int main() { int a; int i=0; double suma=0; double geo; double iloczyn=1; FILE *f1, *f2; f1 = fopen("liczby.txt", "r"); f2 = fopen("ladne.txt", "w+"); if(f1==0 || f2==0) printf("Nie udało się otworzyć pliku"); while(!feof(f1)) { i++; if(fscanf(f1, " %d", &a) == 1) fprintf(f2,"%d %d\n",i,a); suma+=a; if(a<0) geo=−1; else geo=1; iloczyn*=a; } printf("srednia arytmetyczna wynosi %f\n", suma/i); if(geo==1) printf("srednia geometryczna wynosi %f", pow(iloczyn,1/i)); else printf("srednia geometrczna jest niemozliwa do policzenia"); fclose(f1); fclose(f2); return (0); } Nie wiem co teraz jest źle z tą średnią geometryczną. Zastanawiam się co byłoby, gdyby plik był pusty. Od razu przypisze do średniej geometrycznej 1?
22 lip 20:45
jc: Domyślam się, że jeśli choć raz pojawi się liczba ujemna, to mamy otrzymać komunikat: średnia niemożliwa do policzenia. Zamiast if(a<0) geo=−1; else geo=1; napisz if(a<0) geo = 0; // lepiej zero, zero oznacza fałsz a na początku programu napisz int geo = 1; // liczba różna od zera oznacza prawdę (w miejsce double geoemotka Potem pisz raczej tak: if( geo ) .... a nie if( geo == 1) ...
22 lip 21:03
Benny: Ok tylko czemu, jeśli już może liczyć tą geometryczną to zawsze jest równa 1?
22 lip 21:19
Benny: Jest w ogóle coś takiego jak iloczyn*=a?
22 lip 21:19
Mariusz: W uproszczeniu jest to skrót zapisu iloczyn=iloczyn*a; W Pascalu nie ma takich skrótów i musiałbyś napisać iloczyn:=iloczyn*a
22 lip 21:25
jc: Jest dużo więcej takich skrótów: +=, −=, *=, /=, |=, &=, ... Co więcej, w wielu językach stosuje się takie skróty (C++, java, javascript, Python, ...).
22 lip 21:30
Benny: Coś mi źle to liczy. Nie dość, że zeruje mi iloczyn to na dodatek podaje, że średnia geometryczna jest równa 1.
22 lip 21:30
Benny: Dobra zmieniłem double iloczyn na int iloczyn i teraz mi go liczy, ale nadal problem jest z tą średnią.
22 lip 21:31
jc: zamień pow(iloczyn,1/i) na pow(iloczyn,1.0/i) Jeśli a i b są typu int, to a/b oznacza dzielnie całkowite, czyli dla i > 1, będzie to zero.
22 lip 21:32
Benny: Właśnie tak myślałem, że te inty coś mogą popsuć. Dzięki
22 lip 21:35
Dziadek Mróz: To nie są skróty tylko skrócona notacja
23 lip 07:52
Mariusz: Możesz albo jeden z czynników dać jako typ double albo rzutować na typ double innego pomysłu nie mam
23 lip 11:41