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

Wczytywanie liczb z pliku i wypisywanie ich z lekką zmianą

VPS Starter Arubacloud
0 głosów
446 wizyt
pytanie zadane 6 marca 2017 w C i C++ przez Przemko9856 Początkujący (360 p.)

Witam, chciałem napisać program, który pobiera liczby z pliku tekstowego i wypisuje je do nowego pliku tekstowego z lekką zmianą, mianowicie każda cyfra jest oddzielona myślnikiem po czym następuje wypisanie słowne liczby. Problem leży w tym, że program działa tylko do momentu kiedy liczba jest mniejsza od 10, a powyżej już działają tylko myślniki, może ktoś spojrzeć na ten makabryczny kod i wskazać gdzie leży błąd?

 

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
   int i, d,j,s;
   ifstream wej("dane3.txt");
   ofstream wyj("wynik3.txt");
   while (!wej.eof())
   {
      wej>>i;
      if (i<10)
     {
     switch (i)
      {
        case 1: wyj<<i<<" - jeden";    break;
        case 2: wyj<<i<<" - dwa";      break;
        case 3: wyj<<i<<" - trzy";     break;
        case 4: wyj<<i<<" - cztery";   break;
        case 5: wyj<<i<<" - piec";     break;
        case 6: wyj<<i<<" - szesc";    break;
        case 7: wyj<<i<<" - siedem";   break;
        case 8: wyj<<i<<" - osiem";    break;
        case 9: wyj<<i<<" - dziewiec"; break;
      }
      cout << i<<endl;
     }
      if (i>9 && i<100)
      {
        d=i;
        wyj<<d/10<<"-"<<(d%10);

          switch (d)
      {
        case 1: wyj<<d<<" - jeden ";   break;
        case 2: wyj<<d<<" - dwa ";     break;
        case 3: wyj<<d<<" - trzy";     break;
        case 4: wyj<<d<<" - cztery";   break;
        case 5: wyj<<d<<" - piec";     break;
        case 6: wyj<<d<<" - szesc";    break;
        case 7: wyj<<d<<" - siedem";   break;
        case 8: wyj<<d<<" - osiem";    break;
        case 9: wyj<<d<<" - dziewiec"; break;
      }
      cout << d<<endl;
      }
      if (i>99&&i<1000)
      {
        j=i;
        wyj<<j/100<<"-"<<(j%100)/10<<"-"<<(j%10);
         switch (j)
      {
        case 1: wyj<<j<<" - jeden ";   break;
        case 2: wyj<<j<<" - dwa ";     break;
        case 3: wyj<<j<<" - trzy";     break;
        case 4: wyj<<j<<" - cztery";   break;
        case 5: wyj<<j<<" - piec";     break;
        case 6: wyj<<j<<" - szesc";    break;
        case 7: wyj<<j<<" - siedem";   break;
        case 8: wyj<<j<<" - osiem";    break;
        case 9: wyj<<j<<" - dziewiec"; break;
      }
      cout << j<<endl;
      }
      wyj<<endl;
   }
   wej.close();
   wyj.close();
   return 0;
}

 

3 odpowiedzi

+1 głos
odpowiedź 6 marca 2017 przez 10kw10 Pasjonat (22,880 p.)
wybrane 6 marca 2017 przez Przemko9856
 
Najlepsza
if (i>9 && i<100)
      {
        d=i;
        wyj<<d/10<<"-"<<(d%10);
 
          switch (d)
      {
        case 1: wyj<<d<<" - jeden ";   break;
        case 2: wyj<<d<<" - dwa ";     break;
        case 3: wyj<<d<<" - trzy";     break;
        case 4: wyj<<d<<" - cztery";   break;
        case 5: wyj<<d<<" - piec";     break;
        case 6: wyj<<d<<" - szesc";    break;
        case 7: wyj<<d<<" - siedem";   break;
        case 8: wyj<<d<<" - osiem";    break;
        case 9: wyj<<d<<" - dziewiec"; break;
      }

Zaden z tych casow sie nie spelni, bo d jest z przedzialu <10 ; 99>

Tak samo w trzecim przypadku.

komentarz 6 marca 2017 przez Przemko9856 Początkujący (360 p.)
W takim razie musiałbym pisać case 10, case 11 i tak dalej, aż do 99. Tutaj chodzi o to, żeby program jakby "filtrował" każdą liczbę i wypisał np: 256 ---> 2-5-6 dwa-pięć-sześć
komentarz 6 marca 2017 przez 10kw10 Pasjonat (22,880 p.)

troche nie rozumiem po co ci tyle ifow ? co jesli liczba bedzie wieksza od 1000 ?

Zrob to bardziej optymalniej. Albo zamien liczba na stringa i wtedy sprawdzaj od przodu:

std::string number="256";
for(unsigned int i=0;i<number.length();++i)
{
    switch(number[i])
{
  case '0': std::cout<<"zero"; break;
 // itd
}

}

lub dziel modulo:

2564
2564 / 1000 = 2
(2564 / 100) % 10 = 5
(2564 / 10) % 10 = 6
2564 % 10 = 4

 

1
komentarz 6 marca 2017 przez Przemko9856 Początkujący (360 p.)

Dzięki za pomoc. Wykorzystałem ten pierwszy fragment i wyszło mi coś takiego (działa jak chciałem :) )

#include <iostream>
#include <fstream>

using namespace std;

string number,number_drugi;

int main()
{
      ifstream wej("dane3.txt");
      ofstream wyj("wynik3.txt");
      wej>>number;
      wyj<<number;
    for (unsigned int i=0;i<number.length();i++)
  {


        switch(number[i])
     {
        case '0': wyj<<" - zero";       break;
        case '1': wyj<<" - jeden";      break;
        case '2': wyj<<" - dwa";        break;
        case '3': wyj<<" - trzy";       break;
        case '4': wyj<<" - cztery";;    break;
        case '5': wyj<<" - piec";       break;
        case '6': wyj<<" - szesc";      break;
        case '7': wyj<<" - siedem";     break;
        case '8': wyj<<" - osiem";      break;
        case '9': wyj<<" - dziewiec";   break;
     }

  }
  wyj<<endl;
  wej>>number_drugi;
  wyj<<number_drugi;
    for (unsigned int i=0;i<number_drugi.length();i++)
  {


        switch(number_drugi[i])
     {
        case '0': wyj<<" - zero";       break;
        case '1': wyj<<" - jeden";      break;
        case '2': wyj<<" - dwa";        break;
        case '3': wyj<<" - trzy";       break;
        case '4': wyj<<" - cztery";;    break;
        case '5': wyj<<" - piec";       break;
        case '6': wyj<<" - szesc";      break;
        case '7': wyj<<" - siedem";     break;
        case '8': wyj<<" - osiem";      break;
        case '9': wyj<<" - dziewiec";   break;
     }

  }
    return 0;
}

 

komentarz 6 marca 2017 przez 10kw10 Pasjonat (22,880 p.)
Ciesze sie ;)

Taka uwaga: nie korzystaj ze zmiennych globalnych, przerzuc je do maina.

Tak sobie teraz mysle, ze tego case '0' tez bys mogl dac w petle i nie pisac az tyle. Zapoznaj sie z tablica ASCII.
+1 głos
odpowiedź 6 marca 2017 przez mokrowski Mędrzec (155,460 p.)
Nie idź tą drogą. To jest ślepa uliczka. Napisz funkcję która po przyjęciu liczby zwróci string opisu.

Np. dla wywołania

numberToName(56)

zwróci: "pięć-sześć"

W funkcji stwórz vector lub w ostateczności tablicę która będzie zawierała nazwę danej cyfry. Czyli dla indeksu 0 -> "zero", dla 1 -> "jeden". Na podstawie elementu liczby sprowadzonej do 1-pozycyjnej cyfry, buduj napis zwracany z tejże funkcji.

Reszta będzie już bardzo łatwa :-)
komentarz 6 marca 2017 przez Przemko9856 Początkujący (360 p.)
edycja 6 marca 2017 przez Przemko9856
Dzięki za pomoc, siądę przy tym zaraz przy herbatce i potrenuję.
0 głosów
odpowiedź 6 marca 2017 przez mokrowski Mędrzec (155,460 p.)

To co masz niestety nie jest dobrą praktyką.

komentarz 6 marca 2017 przez Przemko9856 Początkujący (360 p.)
Co dokładnie jest nie tak ?
komentarz 6 marca 2017 przez mokrowski Mędrzec (155,460 p.)

Na zachętę... przeanalizuj... 

#include <iostream>
#include <string>

std::string numberToName(unsigned value) {
    static const char * numberToName[] = {
        "zero", "jeden", "dwa", "trzy", "cztery", "pięć",
        "sześć", "siedem", "osiem", "dziewięć"
    };
    std::string answer;

    while(value >= 10) {
        answer = std::string("-") + std::string(numberToName[value % 10]) + answer;
        value /= 10;
    }

    return answer = std::string(numberToName[value]) + answer;
}

int main() {
    for(unsigned i = 0; i < 120; i += 7) {
        std::cout << i << ": " << numberToName(i) << '\n';
    }
}

Edit: Stosowanie jakiegokolwiek kodu powtarzającego się jest jawnym łamaniem zasady DRY.

Podobne pytania

0 głosów
1 odpowiedź 8,827 wizyt
0 głosów
2 odpowiedzi 2,194 wizyt
pytanie zadane 1 lutego 2016 w Rozwój zawodowy, nauka, praca przez Pawel9922 Nowicjusz (160 p.)
+1 głos
0 odpowiedzi 323 wizyt
pytanie zadane 12 marca 2022 w C i C++ przez letmestay Użytkownik (520 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!

...