• 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ą

Aruba Cloud - Virtual Private Server VPS
0 głosów
572 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 (158,200 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 (158,200 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 (158,200 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ź 9,722 wizyt
0 głosów
2 odpowiedzi 2,452 wizyt
pytanie zadane 1 lutego 2016 w Rozwój zawodowy, nauka, praca przez Pawel9922 Nowicjusz (160 p.)
+1 głos
0 odpowiedzi 391 wizyt
pytanie zadane 12 marca 2022 w C i C++ przez letmestay Użytkownik (520 p.)

93,327 zapytań

142,325 odpowiedzi

322,396 komentarzy

62,657 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...