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
#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
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
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 geo
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