[C] Justowanie tekstu

0

Witam,

mam problem... musze napisać program... który justuje tekst... spędziłem nad tym cały dzisiejszy i wczorajszy dzień.. niby coś tam mam, ale niezbyt mnie to zadowala...

Zadanie:

Podajemy np. 5 i 40, gdzie 5 lewy margines, 40 to numer końca wiersza. Wprowadzamy tekst... i program go justuje na zasadzie dodawania spacji, raz od lewej strony raz od prawej.

Proszę jeżeli ktoś może podać przykładowy program albo wskazówkę do tego jak to napisać i czego użyć będę bardzo wdzięczny.

Ważne jest to, że program ma byc napisany w C.

0
isso napisał(a)

Podajemy np. 5 i 40, gdzie 5 lewy margines, 40 to numer końca wiersza. Wprowadzamy tekst... i program go justuje na zasadzie dodawania spacji, raz od lewej strony raz od prawej

brzmi raczej jak wysrodkowanie..

0

tak czy inaczej ma byc to justowanie :) i w dalszym ciagu prosze o pomoc.

0

najbardziej lopatologiczne podejscie:
dla kazdej linii tekstu, sprawdzasz jej aktualna dlugosc, obliczasz roznice miedzy faktycznym miejscem na nia (dlugosc 'ekranu' minus marginesy L/P) oraz jej dlugoscia, liczba ktora zostaje to ilosc brakujacych bialych znakow ktore trzeba w te linie 'wstrzelic'.
wstrzeliwywanie realizujesz po poprzez rownomierne dokladnanie owych N spacji w miejsca, gdzie w linii juz spacje sa. trzeba pokombinowac zeby sie ladnie rozlozylo, np. znalezc istniejaca spacje, dolozyc jedna, znalezc nastepna, dolozyc tutaj, znalezc nastepna(..) az sie skoncza. a jak sie nie skoncza tylko linia sie soknczyla -- nawrot i od poczatku to samo, az do wyczerpania..
potem te linie uzupelniasz o N spacji marginesow L/P z przodu i z tylu..
i tyle
..a jak pokombinujesz, to pewnie tez znajdziesz ladniejsze rozwiazania..

edit: to zaklada ze kazda linia sie zmiesci mimo marginesow. jak sie nie zmiesci -- to by trzeba bylo jeszcze wrapping robic.. ale o tym mowy nie bylo

0

Justować w trybie tekstowym się praktycznie nie da, próby wstawiania spacji pomiędzy tekst dają mierne wyniki, a to co opisałeś to zwykłe środkowanie, które można zrealizować na 1001 sposobów, od najtrywialniejszych do bardziej zamotanych.

Tu masz troszkę bardziej zamotaną wersję, która wynik środkowania umieszcza w nowym buforze, użycie memset i skakania po wskaźnikach powoduje, że jest stosunkowo wydajna.

char* srodkuj(char* bufor, const char* text_do_srodkowania, int max_len) {
    int len = strlen(text_do_srodkowania);
    int a = (max_len-len) / 2;
    memset(bufor, ' ', a);
    strcpy(bufor+a, text_do_srodkowania);
    memset(bufor+a+len, ' ', max_len-a-len);
    return bufor;
    }

#define MAX_LEN 80
char bufor[MAX_LEN+1] = {0,};

int main() {
    printf("%s", srodkuj(bufor, "Hello world!", 79) );
    return 0;
    }
0

Oj. Ranides, nie ta liga !

LEWY/PRAWY - pozycja lewego/prawego marginesu (od lewej krawędzi ekranu)

  1. Liczysz ilość miejsca między marginesami MIEJSCE = PRAWY - LEWY
  2. Liczysz ilość miejsca jakie zajmie tekst ZAJETE = strlen(tekst)
  3. Liczysz ile wolnego miejsca zostaje między marginesami po wpisaniu tekstu WOLNE = MIEJSCE - ZAJETE
  4. Liczysz pozycje pierwszego znaku tekstu, czyli lewy margines plus połowa wolnego miejsca. Druga połowa będzie za wyrazem. POZYCJA = LEWY + WOLNE/2
  5. W pętli od 1 do POZYCJA wypisz po jednej spacji na ekran
  6. Wypisz tekst na ekran
for(int i = L + (R - L - strlen(tekst)) / 2; i > 0; i--) putchar(' ');
puts(tekst);
0

adf88, ranides.. ale to jest SRODKOWANIE, a nie JUSTOWANIE:))

w Ruby'm to np. moze byc tak:

test = 'Narrator zwraca sie do Litwy, a nastepnie do Matki Boskiej. Wspominajac ojczyzne prosi Boza Rodzicielke o opieke i cudowne "powrocenie na ojczyzny lono". Tymczasem jednak przenosi sie wspomnieniami do kraju dziecinstwa, charakteryzujac specyfike przyrody nadniemenskiej.'

def injectSpaces!(text, number)
  text.gsub!(/\s+/) { |white| (number-=1) >= 0 ? white+' ' : white } while number > 0
  text
end

def justify(text, width, mleft = 0, mright = 0)
  lines = text.scan(/.{1,#{width -= mleft+mright}}\b/)
  last = lines.pop
  indent = ' ' * mleft
  lines.collect { |line| indent + injectSpaces!(line.gsub!(/^\s*|\s*$/,''), width - line.length) }.
    push(indent + last.gsub!(/^\s*|\s*$/,'') )
end

puts justify(test, 80, 5, 5)

zostaje tylko przetlumaczyc <evil>

0
quetzalcoatl napisał(a)

adf88, ranides.. ale to jest SRODKOWANIE, a nie JUSTOWANIE:))

aha, no tak. hehe

      1. jak poprzednio
  1. Liczysz odstęp między literami ODSTEP = WOLNE / ZAJETE
  2. W pętli od 1 do LEWY wpisz na ekran po jednej spacji
  3. Teraz trzeba wypisać "[litera][odstęp][litera][odstęp] ..." :
    W pętli od i=0 do ZAJETE-2
    6a. wypisz i-ty znak tesktu
    6b. w pętli od 1 do ODSTEP wypisz na ekran po jednej spacji
  4. wypisz ostatnią literę tekstu
0

nie miedzy literami.. tylko wyrazami.. miedzy literami to troche paskudnie wyjdzie na konsoli:)))

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.