Program: "Przestawianie wyrazów"

0

No więc mam takie sobie zadanie do zrobienia.

Zadeklarować 8 tablic 30-znakowych. Za pomocą samodzielnie stworzonej funkcji wprowadzać do nich słowa, po jednym słowie do każdej tablicy. Następnie:...

nie ważne co następnie :D. Teraz się męcze z samą funkcją do wpisywania. O to co wymodziłem w DEV-C++

#include <stdio.h>
#include <conio.h>
void wprowadz(char tab[])
{
int k;
k=0;
do
{
scanf("%c", tab[k]);
k=k+1;
}
while(tab[k]!=0);
}
main()
{
char tab_1[30], tab_2[30], tab_3[30], tab_4[30], tab_5[30], tab_6[30], tab_7[30], tab_8[30];
printf("wprowadz pojedynczo litery pierwszego slowa, nie przekraczajacego 29 liter\n");
printf("jako ostatni znak wpisz 0 (zero) jako znak ze to koniec slowa\n");
wprowadz(tab_1);
//tutaj będzie powtórka printF'ów i wywołania funkcji dla kolejny tabel na słów następnych (w sumie 8 ich będzie)
getch();
}

Kompilator na tym etapie nie wywala jakichś błędów i uruchamia program, tylko że po wrowadzeniu pierwszej litery wywala mi błąd krytyczny programu. OCB?

0

Daj w tej funkcji w while warunek k < 30 oraz w scanf daj ampresand przed tab[k], czyli tak &tab[k], reszta funkcji raczej spoko, ale pamietaj, ze jak wczytujesz znak po znaku i nacisniesz enter, czy inny znak to tez sie wczyta gdzies ;p

0
void wpisz(char *Tablica)
{
    cin>>Tablica;
}
void wypisz(char*Tablica)
{
    cout<<Tablica<<endl;
}

int main()
{
    char Tablica[8][30];
    for(int i=0;i<8;i++)
        wpisz(Tablica[i]);
    for(int i=0;i<8;i++)
        wypisz(Tablica[i]);
    return 0;
}
0
t0m_k-tmp napisał(a)

Daj w tej funkcji w while warunek k < 30 oraz w scanf daj ampresand przed tab[k], czyli tak &tab[k], reszta funkcji raczej spoko, ale pamietaj, ze jak wczytujesz znak po znaku i nacisniesz enter, czy inny znak to tez sie wczyta gdzies ;p

Święta makrelo, taki błąd, taki wstyd i że kompilator tego nie wykrył!!! :D Oczywiście zapomniałem o "&", a warunek o badaniu czy argument tabeli nie jest zerem jest po to by nie musieć wypełniać wszystkich pól :P, raczej w języku polskim nie używa się słów z 30 literami :D

Teraz mam taki dziwniejszy problem, bo "program" pobiera tylko 4 znaki i kończy po nich pobieranie (przechodzi do kolejnej tablicy).

Sid_ dzięki, ale napisałeś tu wersje z poleceniami których jeszcze na oczy nie widziałem i nie potrafił bym tego powtórzyć :P

0

Bo jak porownujesz po swojemu to zauwaz, ze w ogóle powinno Ci wyjsc z petli po jednym obiegu , poniewaz pobierasz znak do tab[k], nastepnie k += 1 i sprawdzasz czy tab[k] == 0, mysle ze tyle Ci wystarczy do rozwiazania tego.

0

void wprowadz(char tab[])
{
int k;
k=0;
scanf("%c", &tab[k]);
while(tab[k]!=0)
{
k=k+1;
scanf("%c", &tab[k]);
}
}

najpierw wczytuje pierwszą znak do tabeli, sprawdza warunek, wczytuje kolejny znak ++k, sprawdza warunek itd. Problem taki jest że zapętla się w nieskończoność, nawet po w pisaniu iluś tam zer, to chodzi o to co pisałeś

ale pamietaj, ze jak wczytujesz znak po znaku i nacisniesz enter, czy inny znak to tez sie wczyta gdzies

że enter którym potwierdzam to zero też się wczytuje jako część elementu tabeli?

Po tym napisałem wersje

void wprowadz(char tab[])
{
int k;
k=0;
while(k<30)
{
scanf("%c", &tab[k]);
k=k+1;
}
}

i pętla się robi tylko i wyłącznie 15 razy.

Bardzo mi zależy na pierwotnym warunku badania wprowadzonego znaku do tabeli bo to bez sensu będzie wpisywanie 30 znaków jakichś dla zapełnienia wszystkiego, a przypominam że 8 razy będę musiał coś takiego wprowadzać.

0

Liczylem na to, ze troche pomyslisz i sam wpadniesz na rozwiazanie ;p

do {
 ...
} while(tab[k-1] != 0xA);      // patrz tablica ASCII
0

void wprowadz(char tab[])
{
int k;
k=0;
do
{
scanf("%c", &tab[k]);
k=k+1;
}
while(tab[k-1] != 0xA);
}

Coś takiego? Działa tylko raz i idzie dalej.

0
OlmerPL napisał(a)

void wprowadz(char tab[])
{
int k;
k=0;
do
{
scanf("%c", &tab[k]);
k=k+1;
}
while(tab[k-1] != 0xA);
}

Coś takiego? Działa tylko raz i idzie dalej.

Tak cos takiego, ale co Ci dziala tylko raz ? jeden znak pobiera, czy co ? Raz wywolujesz funkcje, wiec moze dlatego tylko jedno slowo pobiera ;p

0

Tylko jeden znak pobiera w ramach tej funkcji, tak jakby po pierwszym scanie pętla się kończyła. Kończy się pętla, to się kończy funkcja i program w main() idzie dalej

P.S. ale dziś cię wymęczę :D

0

Daj caly kod przed wywolaniem tej funkcji, bo pewnie cos wczesniej pobierasz, akceptujac enterem i enter siedzi w buforze, a co za tym idzie enter trafia do tab[0] i petla sie konczy, bo jest w tab[0] enter.

0

#include <stdio.h>
#include <conio.h>
void wprowadz(char tab[])
{
int k;
k=0;
do
{
scanf("%c", &tab[k]);
k=k+1;
}
while(tab[k-1] != 0xA);
}
main()
{
char tab_1[30], tab_2[30], tab_3[30], tab_4[30], tab_5[30], tab_6[30], tab_7[30], tab_8[30];
char zdanie[255];
int i, j, l;
printf("wprowadz pojedynczo litery pierwszego slowa, nie przekraczajacego 29 liter\n");
printf("jako ostatni znak (trzydziesty) wpisz 0 (zero) jako znak ze to koniec slowa\n");
wprowadz(tab_1);
printf("11111111111"); //znacznik "bezpieczeństwa" między kolejnymi wywołaniami funkcji
printf("wprowadz pojedynczo litery drugiego slowa, nie przekraczajacego 29 liter\n");
printf("jako ostatni znak (trzydziesty) wpisz 0 (zero) jako znak ze to koniec slowa\n");
wprowadz(tab_2);
//jeszcze sześć razy wywołanie funkcji, ale to nie ważne
j=0;
i=0;
//dalej są już dalsze działania wymagające gotowych tabel tab_1 tab_2 itd. czyli nie istotne teraz
getch();
}

Edit: to pobieranie jednego znaku do tabeli robi sie przed znacznikiem bezpieczeństwa

0

U mnie dziala bez zarzutu.

wprowadz pojedynczo litery pierwszego slowa, nie przekraczajacego 29 liter
jako ostatni znak (trzydziesty) wpisz 0 (zero) jako znak ze to koniec slowa
asdsfsdfjkskfjdlfj
11111111111wprowadz pojedynczo litery drugiego slowa, nie przekraczajacego 29 liter
jako ostatni znak (trzydziesty) wpisz 0 (zero) jako znak ze to koniec slowa
jaksldjaskljdkasd

wpisujesz byle co i enter konczy wpisywanie, a tu masz napisane, ze 0 ma konczyc to daj warunek tab[k-1] != 48 i tyle, wtedy zerem zakonczysz, mozesz jeszcze dopisac na poczatku:

setbuf(stdin, 0);         // wyczysci bufor wejscia
0

Ostatnie już (rozkminiłem o co chodziło). Mamy osiem tablic tab_1, tab_2,... tab_8. Mamy je wpisać w LOSOWEJ kolejności z spacjami pomiędzy poszczególnymi tablicami w tablice "zdanie". Są to tablice elementowe. Samo wpisanie w nie losowej kolejności mam zapisane tak:
strcat(zdanie,tab_1);
strcat(zdanie," ");
strcat(zdanie,tab_2);
strcat(zdanie," ");
strcat(zdanie,tab_3);
strcat(zdanie," ");
strcat(zdanie,tab_4);
strcat(zdanie," ");
strcat(zdanie,tab_5);
strcat(zdanie," ");
strcat(zdanie,tab_6);
strcat(zdanie," ");
strcat(zdanie,tab_7);
strcat(zdanie," ");
strcat(zdanie,tab_8);

Jakieś pomysły jak je wymieszać? Mój pomysł opiera się na liczbach losowych, ale ilość mieszanek dla poszczególnych wyników jest... ogromna :D

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