spacje z dowolnej ilosci na jedną

0
  1. Napisz program, który - przepisując wejście na wyjście - będzie zastępować jednym znakiem odstępu każdy ciąg złożony z jednego lub kilku takich znaków ?
plejer napisał(a):

ad.1

 
#include<stdio.h>
main()
{
int a,b,c;
while(c!=EOF){
c=getchar();
if(c==' '){
        for(b=getchar();b==' ';b=getchar()){
        ;
    }
    putchar(c);
    putchar(b);
}
else{
putchar(c);
}
}
}

dlaczego gdy wpiszę ciąg znaków np. xxx zx to ostatecznie b=z bo jeśli tak to po przejściu do drugiej pętli b=' ' warunek się zgadza więc nadal w tym samym for b=' ' a to już nie nie możliwe bo były dwie spacje a c "wykorzystał" jedną z nich ale tak musi być skoro potem jest b=z warunek się nie zgadza więc idziemy dalej i mamy c=' ' b=z c=x.

1
  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Wywal niepotrzebne zmienne
  3. Naprawdę nie rozumiem o co pytasz, o jakie z chodzi?

W kodzie masz dwa problemy:

  1. Może się okazać że przy starcie niezainicjalizowane c ma wartość EOF
  2. Jeżeli przekierowujesz dane z pliku oraz ostatnim znakiem w pliku będzie spacja to wyświetlisz EOF na końcu.

Przeanalizuj to:

#include <stdio.h>

int main()
  {
   for(int ch,sp=EOF;(ch=getchar())!=EOF;sp=ch) if((ch!=' ')||(ch!=sp)) putchar(ch);
   return 0;
  }
0

Tak jeszcze można:

#include<stdio.h>

int main()
{
    const char* phrase = "    Grzesiek  Karolina Wislawa    Czesiek     Maciek Zbychu ";
    unsigned i = 0;
    for(; phrase[i] != '\0'; ++i){
        if(phrase[i] == ' ' && phrase[i+1] == ' ' && phrase[i+1] != '\0') continue;
        putchar(phrase[i]);
    }
    return 0;
}
1
grzesiek51114 napisał(a):

Tak jeszcze można:

#include<stdio.h>

int main()
{
    const char* phrase = "    Grzesiek  Karolina Wislawa    Czesiek     Maciek Zbychu ";
    unsigned i = 0;
    for(; phrase[i] != '\0'; ++i){
        if(phrase[i] == ' ' && phrase[i+1] == ' ' && phrase[i+1] != '\0') continue;
        putchar(phrase[i]);
    }
    return 0;
}
  1. phrase[i] != '\0' - można zapisać jako phrase[i]
  2. warunek phrase[i+1] == ' ' && phrase[i+1] != '\0' można skrócić do phrase[i+1] == ' ' - bo jak jest równy spacji to na 100% nie jest zerem
  3. używasz continue; zamiast odwrócić warunek? jakiś bezsens.
  4. Twoje rozwiązanie przewiduje uprzednie załadowanie całego napisu do pamięci co w C nie jest takie hop-siup.
0

Sam mam skompilowany program który działa ale nie rozumiem tego kodu nie chodzi mi o kongretne z bo to może być ciąg: NIEROZUMIEM TEGO i po wyjsciu z na wejściu pętli for do b przypisana jest już druga spacja ale po prawej znowu jest przypisanie nowej litery T ale że warunek był spełniony to znowu powinno być przypisane E warunek nie spełniony i b zostaje jako E a to nie możliwe bo program działa dobrze więc to dla mnie dziwne tak jakby
i=0;
for(i++;i<5;i++)
; i na wyjściu i było 4 a jednak i jest równe 5 i tu tak samo T powinno być pominięte i b=E . Nie wiem jak inaczej to wytłumaczyć o co mi chodzi kod mojego autorstwa

#include<stdio.h>
main()
{
int b,a;
while((a=getchar())!=EOF)
{
    putchar(a);
           if(a==' ')
                 {
                while((b=getchar())==' ')
                         ;
                  if (b != EOF)
                      putchar(b);
                         }

}
}
 
3

Zacznij od sformatowania tego kodu, tragicznie to wygląda. Zmienna b jest zbędna, wystarczy a.

Kod działa następująco:

  1. Wczytaj a
  2. Jeśli nie udało się wczytać ⟶ KONIEC
  3. Wypisz a
  4. Jeśli a jest różne od spacji przejdź do punktu 1)
  5. Dopóki możesz wczytać b i b jest równe spacji
  6. Jeśli udało się wczytać b, wypisz b
  7. idź do punktu 1)
1

"zgłupiając" troszkę kod @_13th_Dragon

funkcja pobierz_znak() zwraca(znak)
  zwroc getchar();
wystarczy;


funkcja pobiera(znak &pobrany) zwraca(stan)
  znak koniec_pliku = EOF;
  pobrany = pobierz_znak();
  zwroc pobrany != koniec_pliku;
wystarczy;
  

program("@13th_Dragona") to
  znak spacja = ' ', znak = spacja, stary_znak = znak;
  
  dopoki pobiera(znak) rob
    jezeli znak != spacja || znak != stary_znak to
      wypisz << znak;
    wystarczy;
    
    stary_znak = znak;
  wystarczy;

wystarczy;

http://ideone.com/yy1rHr

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