Program z wypisywaniem tylko liczb.

0

/*Zad. 1. Dany jest ciąg elementowy znaków zakończony gwiazdką. Napisz program, który przepisze ten ciąg następująco:
przepisze wszystkie cyfry,
grupy znaków spacji przepisze jako jedną spację,
pozostałe znaki będą piminięce.
Nie potrafie zrobic tego pominiecia i wyswietlenia tylko cyfr.

Przykładowe dane:
Wejście: 123…55xxc..yyyy….*
Wyjście: 123.55.
*/

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
		
   int i=0;
    int koniec;
    char znak;
char znaki[100];
    cout<<"Podawaj kolejne znaki: ";

    do
    {
         cin>>znak;
         znaki[i]=znak;
         i++;
    } while(znak!='*');
    koniec=i-1;
    cout<<"\nWszystkie elementy to: ";
    for (int j=0; j< koniec; j++)
    {
        cout<< znaki[i] << " ";
        i++;
    }
    

    
    
    
    cout<<endl;
    system("pause");
    return 0;
} 
1

W tym zadaniu tablica jest nie potrzebna. Zadanie polega na wczytywaniu danych "znak-po-znaku" i wg. wymagań kopiowanie ich na wyjście lub ich pominięcie. W bibliotece cctype mamy funkcję isdigit(char) która sprawdza czy znak jest cyfrą. Więc wynika z tego taki zapis:

if(isdigit(c)) std::cout.put(c); // jeśli znak jest cyfrą to wypisz na wyjściu

Mamy też sprawdzić czy nie napotkaliśmy ciągu spacji:

if(c == ' '){
  std::cout.put(' ');
  do { std::cin.get(c); } while(c == ' '); // pobieramy wszystkie spacje, petla pobiera o jeden znak "za duzo" wiec ...
  std::cin.putback(c); // ... wrzucamy znak który nie był spacją do strumienia 
}
0

Nie wiem jak to zaimplementowac w ten program ;/.

0

Warto na początku zrozumieć czym jest buforowanie wejścia. Gdy wpisujemy np. znaki 123...5362.* to do programu dostają się one dopiero po naciśnięciu klawisza ENTER. W tego typu zadaniach preferowane jest korzystanie z tego zjawiska, oczywiście rozwiązanie z tablicą również może podziałać ale nie jest to perfekcyjny "algorytm". Wspomniałem o wczytywaniu danych "znak-po-znaku" czyli budujemy taką pętlę która pobiera znaki i kończy gdy wczytamy '*'(gwiazdkę), wygląda to zazwyczaj tak:

// pobieranie znaku wrzucamy bezpośrednio w warunek pętli co pozwala np. przechwycić koniec pliku(EOF)
// łączymy to z warunkiem przechwytującym znak gwiazdki
// więc zapis ten oznacza: wczytuj znaki aż do *(gwiazdki)
while(std::cin.get(c) && c != '*'){
  // sprawdź czy jest to cyfra, jeśli tak pokazujemy ją
  if(isdigit(c)) std::cout.put(c);
  else if(c == ' '){  // jeśli jest to spacja
    std::cout.put(' '); // pokaz jedna spacje
    do { std::cin.get(c); } while(c == ' '); // dotąd aż z wejścia pobieramy spacje
    std::cin.putback(c); // ostatni znak musimy wrzucić z powrotem do strumienia, gdyż nie jest on spacją
  }
}

Tzw. Buforowane wejście powoduje, że pętla zachowuje się jakbyśmy przechodzili po elementach wprowadzonego ciągu jw. 123...5362.* - i w kolejnych iteracjach wczytamy 1, 2, 3 itd.

pozdrawiam.

1

@davemajster, zamiast:

    do { std::cin.get(c); } while(c == ' '); // dotąd aż z wejścia pobieramy spacje
    std::cin.putback(c); // ostatni znak musimy wrzucić z powrotem do strumienia, gdyż nie jest on spacją

można użyć bardziej koszernego:

    while(std::cin.peek()==' ') std::cin.get();

1 użytkowników online, w tym zalogowanych: 0, gości: 1