• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program szukający najmniejszej i najwiekszej liczby z liczb podanych w pliku

VPS Starter Arubacloud
0 głosów
2,882 wizyt
pytanie zadane 7 listopada 2015 w C i C++ przez Aisekai Nałogowiec (42,190 p.)
#include <cstdlib>
#include <iostream>
#include <fstream>
 
using namespace std;
 
main()
{
      fstream plik;
      long x;
      long max,maxp,min,minp,nr_linii;
      nr_linii=maxp=minp=1;
 
      string linia;
      plik.open("liczby.txt", ios::in);
      if(plik.good()==false)
      {
                            cout<<"Plik nie istnieje"<<endl;
                            exit(0);
      }
      while(getline(plik,linia))
      {
                               x=atol(linia.c_str());
                               if(nr_linii==1)
                               {
                                             max=x;
                                             min=x;
                               }
                               else
                               {
                                   if(x>max)
                                   {
                                            max=x;
                                            maxp=nr_linii;
                                   }
                                   if(x<min)
                                   {
                                            min=x;
                                            minp=nr_linii;
                                   }
                               }
                               nr_linii++;
 
      }
      cout<<"Najmniejsza liczba to: "<<min<<" Znajduje się w: " <<minp << "wierszu"<<endl;
     cout<<"Najwieksza liczba to: "<<max<<" Znajduje się w: " <<maxp << "wierszu"<<endl;
     plik.close();
    system("PAUSE");
    return EXIT_SUCCESS;
}

Witam. Próbowałem napisać program który z pliku wyszukiwał największej i najmniejszej liczby, podawał ją na końcu i wers w którym się znajduje. Program działa na liczbach 1,2,3 etc. ale ja mam w pliku liczby zapisane binarnie (tzn tylko 1 i 0, wydaje mi się że nie trzeba ich zamieniać na system dziesiętny) i niektóre z nich mają ponad 255 cyfr (int odpada). Po odpaleniu programu wyświetla mi że największa liczba nie należy do liczb z pliku. Pomoże ktoś żeby podawał dobre liczby i wersy? 

2 odpowiedzi

+1 głos
odpowiedź 7 listopada 2015 przez niezalogowany
Metoda @furas'a ma sens, tylko że wymaga większej precyzji, bo może się zdarzyć sytacja:

1001 1010

Wtedy mamy identyczną długość liczb, a także identyczną ilość powtórzeń '1', musisz liczyć ilość powtórzeń '1' z uwzględnieniem miejsca na którym '1' się znalazło, np przez przypisanie wag do liczb i ich sumowania.
komentarz 7 listopada 2015 przez furas Maniak (53,800 p.)
Przy takiej samej długości tekstów porównywałbym je za pomoca np. strcmp("1001", "1010") i powinno mi uwzględniać miejsca jedynek.

Obawiam się tylko sytuacji gdy liczby mają zera na początku bo wtedy 00001 jest dłuższe od 10 ale ma mniejszą wartość.
komentarz 7 listopada 2015 przez Aisekai Nałogowiec (42,190 p.)
A jak nadać wagę tym liczbom?
komentarz 7 listopada 2015 przez niezalogowany
Tylko, że strcmp nie po to powstało więc nie musi to zawsze zwracać dobrego wyniku.

Prosta sprawa, numerujemy pozycje od 1 od najmłodszego bitu i mnożmy je razy wartość (0 lub 1):

a) 1001 waga: 1*1 + 2*0 + 3*0 + 4*1 = 5

b) 1010 waga: 0*1 + 2*1 + 3*0 + 4*1 = 6

a < b, co jest prawdą (9 < 10). Musiałbyś jeszcze sprawdzić czy to działa dla wszystkich liczb, ale raczej nie ma powodu żeby nie działało.
komentarz 7 listopada 2015 przez furas Maniak (53,800 p.)
edycja 7 listopada 2015 przez furas

strcmp powstało do sprawdzania tekstow a jak zostawić liczby binarne jako tekst to niczym to się nie różni od porównywania zwykłego tekstu skadającego się z liter.

strcmp("0", "1") zwraca -1 bo "0" jest wcześniej w alfabecie niż "1"
strcmp("1", "0") zwraca +1 bo "1" jest póżniej w alfabecie niż "0"

Podobnie będzie dla dłuższych liczb - będzie porównywać znak po znaku.

Oczywiście takie działanie sprawdza się gdy obie liczby binarne są tej samej długości (o czym wspominam od początku) bo wtedy porównuje liczbę jednostek jednej liczby z liczbą jednostek drugiej liczby a liczbę dwójek jednej liczby z liczbą dwójek drugiej liczby. Przy tekstach różnej długości może porównywać liczbę jednostek jednej liczby z liczbą dwójek drugiej liczby co prowadzi do błędu.

---

EDIT: dla pewności napisałem poniższy kod aby jednak sprawdzić czy się nie mylę ;)  

Otrzymuje poprawne wyniki (o ile teksty są tej samej długości).
 

#include <stdio.h>
#include <string.h>

void porownaj(const char* a, const char* b)
{
    int wynik = strcmp(a, b);
    
    if(wynik < 0)
        printf("%s < %s\n", a, b);    
    else if(wynik > 0)
        printf("%s > %s\n", a, b);
    else
        printf("%s == %s\n", a, b);     
}

int main()
{
  porownaj("0", "1");
  porownaj("1", "0");
  porownaj("10", "01");
  porownaj("1010", "1001");
  porownaj("1001", "1010");
  porownaj("1001", "1001");

  return 0;
}

 

komentarz 7 listopada 2015 przez niezalogowany
Czyli raczej ten sposób wymagałby dodania zer przed liczbę, tak aby wszystkie były tej samej długości, co mówiąc szczerze jest pozbawione sensu, bo wymagałoby znalezienia maximum długości liczby, ale również dodania zer przed maximum n-1 liczb.

Pomysł z wagami nie ma takiego problemu.
komentarz 7 listopada 2015 przez furas Maniak (53,800 p.)
Jeśli żadna liczba nie ma zer na początku to sama długość tekstu świadczy czy jedna liczba jest większa od drugiej. Liczba "10" jest dłuższa i większa od "1" i "0". Liczba "100" jest dłuższa i większa od "11", "10", "1", "0" itd.

Problem stanowi tylko czy na pewno każda liczba w pliku nie ma zer na początku bo wtedy trzeba napisać własną funkcje strcmp, która by porównywała znaki w tekscie od końca.
komentarz 7 listopada 2015 przez niezalogowany
Mimo wszystko: musisz móc jakoś przechować reprezentację tej liczby, aby móc ją porównać z kolejnymi liczbami, u ciebie aby zaoszczędzić nieco obliczeń należy przechowywać rozmiar liczby + całą liczbę, porównywanie stringu jest coraz bardziej wymagające wraz ze wzrostem długości liczby (nie da się ukryć, że porównywanie 100 znaków wymaga więcej zasobów niż 10).

Nie mówię, że twój sposób jest zły, ale od pewnego miejsca wymaga bardziej skomplikowanego kodu, czy też kombinowania aby na pewno działał, a oto nie chodzi w programowaniu.
komentarz 7 listopada 2015 przez furas Maniak (53,800 p.)
To fakt, że muszę przechowywać długi tekst i jego długość ale przy zamianie tekstu na liczbę i tak musiałbym ten tekst gdzieś przechować po wczytaniu a przed zamianą na wartość liczbową - chyba, że zastosować metodę wczytywania po jednym znaku oraz mnożenia poprzedniego wyniku przez 2 i dodawanie wczytanego znaku.

Porównanie samej długości tekstów było by jednak szybsze niż zamiana tekstu na wartość liczbową - tak więc część porównań załatwiło by szybciej.

Zaletą tekstowej metody jest możliwość porównywania liczb o dowolnej liczbie cyfr bo nie ogranicza mnie pojemność liczb int.

Jedyny problem to zera na początku ale zrobienie własnego strcmp, które porównuje od konca do początku nie było by dużym zadaniem.

Tak więc nie uważam go ani za zły ani za bardziej skomplikowany :)

Po prostu jest to inny sposób podejścia do problemu i w pewnych sytuacjach może się okazać przydatniejszy a w innych nie.

Tak więc mamy dwa sposoby do wyboru.
komentarz 7 listopada 2015 przez niezalogowany
W moim wypadku int też cię nie ogranicza, chyba że maszy cyfry składające się z ~3000 bitów.

Żeby stwierdzić jak jest faktycznie to można napisać przykładowe implementacje i zobaczyć, które rozwiązania są lepsze w jakiej dziedzinie ;)
komentarz 8 listopada 2015 przez furas Maniak (53,800 p.)

można napisać przykładowe implementacje

Prawdę mówiąć - nie chce mi się :) Zostawiłbym to innym jeśli będą zainteresowani.

0 głosów
odpowiedź 7 listopada 2015 przez furas Maniak (53,800 p.)
A te liczby binarne mają jakieś zera na początku ? Bo jeśli nie to mozesz je potraktowac jako zwykły tekst i wtedy dłuższy tekst znaczy większą liczbę. A jak teksty są tej samej długości to standardowa funkcja do porównywnywnaia tekstów też powinna Ci odpowiedzieć, która liczba jest większa.
komentarz 7 listopada 2015 przez Aisekai Nałogowiec (42,190 p.)
Chyba naprawiłem, zamiast zmiennych long i atol dałem zmienną double i atof i działa
komentarz 7 listopada 2015 przez furas Maniak (53,800 p.)

double to liczba rzeczywista, która jest przechowywana w postaci przybliżenia :)

W pewnych przypadkach to przybliżenie może powodować niepoprawne wyniki.

komentarz 7 listopada 2015 przez Aisekai Nałogowiec (42,190 p.)
Porównywanie tekstu to jest z length tak?
komentarz 7 listopada 2015 przez furas Maniak (53,800 p.)
określenie długości tekstu to jest `length`, a porównywanie tekstu znak po znaku to jest `strcmp`

Podobne pytania

0 głosów
3 odpowiedzi 20,705 wizyt
+1 głos
1 odpowiedź 1,658 wizyt
0 głosów
0 odpowiedzi 298 wizyt
pytanie zadane 1 czerwca 2020 w PHP przez bulgotnik86 Gaduła (3,040 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...