c++
Metis: C++
http://pastebin.com/KGGBLsAA
Ogółem działa dobrze, ale nie rozumiem dlaczego na początku wrzuca do pliku dwie dziwne liczby:
3435973836
29 sty 14:18
Metis: Dodałem x=x−1 i działa pięknie
29 sty 14:31
Metis: Może mi ktoś wyjasnic co on pobiera, że wyrzuca tę liczbę?
29 sty 14:39
LUKE CAGE: Metis jesteś na PWr ?
29 sty 15:21
Metis: Nie.
29 sty 15:41
29 sty 15:46
Metis: *jak trzeba
29 sty 15:47
Metis: Oraz zamiast min, powinno być max.
29 sty 15:48
Dziadek Mróz: Metis to taki Hugo, tyle że Hugo nic nie rozumiał, a Ty piszesz kod i nie wiesz co on robi
29 sty 15:48
Metis: Wiem

Ale z tymi tablicami jest problem− wypełniają sie jakimiś śmieciami, albo pobieram coś spoza
tablicy
29 sty 15:50
Dziadek Mróz: bo musisz pilnować zakresu. rób sobie debug zmiennych za pomoca wyświetlania cout'em
29 sty 15:57
29 sty 16:12
jc: A ja bym jednak coś poprawił. Dziadek nauczył nas, jak pisać warunek.
Plus kilka innych drobiazgów.
Przy okazji main() jest typu int. Nie pisze się już void w wywołaniu.
Nie wszyscy mają pionowy ekran i czytanie rozciągniętych w pionie kodów nie
jest najłatwiejsze. To odnośnie zbędnych klamerek.
int main(){
int x=0;
int tablica[500];
fstream wej;
wej.open("dane.txt", ios::in);
if (wej.good()) while ( wej ) wej >> tablica[x++];
int min = tablica[0];
for (int i=1; i < x; i++) if (min > tablica[i]) min = tablica[i];
cout <<"Wartosc najmniejsza: "<< min;
}
29 sty 16:37
jc: W jakim celu dodajesz ciągle coś takiego getch(); , potem trzeba to usuwać,
aby dało się skompilować.
29 sty 16:39
Jack: to chyba chodzi zeby dzialalo jak
system("pause")
zeby sie nie zamknelo po kompilacji
29 sty 16:42
jc: A jak działa system("pause") ?
I co nie ma się zamykać po kompilacji?
29 sty 16:46
Metis: getch() dodaje by zatrzymać wiersz poleceń aż do momentu nacisniecia klawisza.
29 sty 16:55
Metis: http://pastebin.com/YbLgf7YH
Ten kod działa, ale deklaruje w Nim stały rozmiar tablicy 500.
W poleceniu podane jest, że ilość liczb jest nieokreślona, co się ze sobą gryzie.
Jak rozwiązać ten problem?
Najlepiej bez tablic z dynamiczną alokacją, a licznikiem.
29 sty 16:59
jc: W ogóle nie musisz zapamiętywać liczb.
int min, x;
if( wej ) cin >> min;
while( wej ) {
cin >> x;
if(x < min) min = x;
}
29 sty 17:04
jc: Oczywiście
int min=0;
int x=0;
if( wej ) wej >> min;
while( wej ) {
wej >> x;
if(x < min) min = x;
}
29 sty 17:06
Metis: Zerknij jeśli możesz na ten problem, który wstawiłem wczesniej.
Najlepiej jakby najpierw sprawdził ile liczb jest w danym pliku.
Nie wiem tylko jak to zrobić bez zapisywania ich do tablicy
29 sty 17:08
jc: "zatrzymać wiersz poleceń" ?
29 sty 17:10
jc: Metis, zwyczajnie, po prostu po odczytaniu liczby zwiększasz licznik o jeden.
Przecież nie musisz zapamiętywać liczb, aby policzyć ile ich jest.
29 sty 17:11
jc: Metis, po co chcesz zapisywać liczby do pliku? Wiele programów po prostu przetwarza
dane, nie zapisując ich. Np. program wyświetlający film, nie zapisuje filmu, tylko czyta
odpowiednie fragmenty; inaczej tylko nowe komputery poradziłyby sobie.
29 sty 17:18
29 sty 17:27
Dziadek Mróz:
jc, on ma zajęcia z tego. Nieważne po co on to pisze, musi umieć to obsłużyć
29 sty 17:27
Dziadek Mróz:
std::ifstream ifs;
ifs.open("plik.txt");
if (ifs) // if (ifs.is_open())
{
int num;
while (ifs >> num) // break na ifs gdy napotka eof i nie wczyta num
{
std::cout << num << std::endl;
}
}
else
{
perror("plik.txt"); // std::cerr << "plik.txt"; (ale bez info co jest przyczyną błędu)
}
29 sty 17:31
jc: Faktycznie pojawiło się zadanie z odwróceniem kolejności elementów.
Tu faktycznie trzeba zapamiętać w ten czy inny sposób dane.
29 sty 17:44
Metis: Napisałem sobie coś takiego:
http://pastebin.com/jnAUZBNB
Ale znowu jakiś problem z tymi tablicami...
Liczenie ilosci liczb działa.
i − ilosc liczb
Pozniej tworze tablice o takiej wielkosci.
A dalej nic z tego.
29 sty 17:57
jc: A co program czyta po pierwszym czytaniu?
Nie wiem, jak to ładnie rozwiązać.
Pewnie zamknięcie pliku i ponowne otwarcie pomoże.
29 sty 18:04
Metis: Własnie próbowałem juz tak, do tego dodałem wyczyszenie flag błedów wej.clear(); i nic.
29 sty 18:05
Metis: Spróbuje je wyczyścić tą tablicę przed.
29 sty 18:06
Metis: i nic
29 sty 18:09
jc:
Otwórz plik
zlicz liczbę elementów
zamknij plik
utwórz tablicę
otwórz plik
wpisz dane do tablicy
zamknij plik
To nie jest ładne, ale działa.
29 sty 18:20
Bartek: Metis gdzie i co Ty właściwie studiujesz?
29 sty 18:22
Dziadek Mróz:
std::ifstream ifs;
std::vector<int> vec;
ifs.open("plik.txt");
if (ifs)
{
int num;
while (ifs >> num)
{
vec.push_back(num);
}
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it)
{
std::cout << (*it) << std::endl;
}
/* lub
for (size_t i = 0; i < vec.size(); i++)
{
std::cout << vec[i] << std::endl;
}
*/
}
else
{
perror("plik.txt");
}
ifs.close();
29 sty 20:18
Dziadek Mróz:
std::ifstream ifs;
stdofstream ofs;
ifs.open("plik1.txt");
int *nums = NULL;
int i = 0;
if (ifs)
{
int num;
while (ifs >> num)
{
i++;
nums = (int *)realloc(nums, i * sizeof(int));
nums[i−1] = num;
}
}
else
{
perror("plik1.txt");
}
ifs.close();
ofs.open("plik2.txt");
if (ofs)
{
for (size_t j = 0; j < i; j++)
{
ofs << nums[j];
}
}
else
{
perror("plik2.txt");
}
ofs.close();
free(nums);
29 sty 21:54
Metis: Dzięki Dziadku, spróbuje to ogarnąc.
29 sty 22:01
Dziadek Mróz:
w pierwszym czytasz do sławnej listy jednokierunkowej std::vector, w drugim czytasz do tablicy
intów powiększając ją o kolejne miejsce po wczytaniu z pliku
29 sty 22:17