Wartości liczby wyświetlane pionowo za pomocą znaku #

0

No napisałem sobie taki program, jak się go odpali to widać co ma robić, nie mam siły pisać bo póżno
No i teraz jak zrobić warunek, aby program się kończył w odpowiednim momencie,
bo sobie tak tymaczasowo napisałem aby program robił te instrukcje 100 razy, no wiecie o co chodzi

#include <stdio.h>

void write(int tab[], int n)
{
    printf("\nElementy tablicy:\n\n");
    int j = 0, i = 100;
    while (i--) { //o tutaj

        if (tab[j - 1] <= 0)
            printf("\t");
        while (tab[j++] > 0 && j < n + 1) {
            printf("#\t");
            tab[j - 1] -= 1;
        }
        if (j == n + 1) {
            j = 0;
            printf("\n");
        }
    }
}
int main(void)
{
    int tab[5] = { 1, 2, 3, 4, 5 };

    for (i = 0; i < 5; i++) {
        printf("Podaj liczbe nr %d: ", i + 1);
        scanf("%d", &tab[i]);

        write(tab, 5);

        return 0;
    }

ojoj, był mały błądek, ale naprawiłem, no i czekam na odp :)

0

aby program się kończył w odpowiednim momencie

sprecyzuj, co masz na mysli przez odpowiedni moment?

uzyj break; zeby wyjsc z petli w dowolnym momencie albo zmien warunek w while

0

Albo chodzi o break; albo w przypadku void puste return;

Jak zwykle nie wiadomo o co chodzi w kolegi przypadku ;-)

0

ja też nie wiem, o co chodzi, no właśnie, o to chodzi, że nie wiem kiedy zakońćzyć program, nie mam jak tego zrobić, program ma się zakończyć, jak wszystkie liczby zostaną wypisane(czyli w tablicy każdy element będzie miał wartość 0), no ale nie będe za każdym krokiem pętli tego sprawdzał

0

Napisz co chcesz zrobić.

0

ale, jak to nie rozumiesz, mam pętle, while (i--) { //o tutaj jakbym dał while(1), to wszystko by się wykonało prawidłowo, wyświetliły by się #, tylko, że nic by tej pętli nie zatrzymało, a więc w nieskończonośc by wypisywała \t i \n, przy pętli i =100 --, program wykona się 100 razy , np. aby wyświetlić #.PO PROSTU: zobacz jak wygląda program jak w miejsce i wstawisz 20, potem 200, dla wszystkich elementów tablicypotrzebuje n- iteacji, ale nie wiem jak określić to n

0

e, wszystko musz sam napsiać,zrobiłem jak umiałem

#include <stdio.h>tv

void write(int tab[], int n)
{
    printf("\nElementy tablicy:\n\n");
    int j = 0, i;
    while (1) { //o tutaj

        while (tab[j++] > 0 && j < n + 1) {
            printf("#\t");
            tab[j - 1] -= 1;
        }
        if (j == n + 1) {
            j = 0;
            printf("\n");
            for (i = 0; i < n; ++i)
                if (tab[i] != 0)
                    break;
                else if (i == n - 1)
                    return 0;
        }
        if (tab[j - 1] <= 0)
            printf("\t");
    }
}
int main(void)
{
    int tab[5];
    int i;
    for (i = 0; i < 5; i++) {
        printf("Podaj liczbe nr %d: ", i + 1);
        scanf("%d", &tab[i]);
    }
    write(tab, 5);

    return 0;
}

0

mam pytanie, coś jest nie tak, w codeblocks, program działa prawidłowo, i wyświetla prawdiłowo # , a w devc++ nie, skopiowałem ten sam kod, i są złe wyniki, wszystko sprawdziłem kilka razy, kod jest idenytczny, może ktoś sprawdzić czy mu działa?
Bez nazwy.jpg

0

To zadanie nie jest aż tak trudne, jak wynika to z Twojego kodu.

Najpierw pobierz liczby od użytkownika - do tego napisz sobie osobną funkcję, żeby kodu nie zaciemniać. Następnie znajdź wartość maksymalną w tablicy - ona będzie określać liczbę wierszy do wyświetlenia, a więc liczbę iteracji pętli. Skoro liczba iteracji jest znana, wystarczy Ci pętla for - ona będzie pętlą główną.

Teraz przyda się druga pętla, która będzie służyła do iterowania po elementach tablicy - liczba elementów jest znana, więc znów wystarczy pętla for. W tej pętli sprawdzaj, czy bieżący element tablicy jest większy od iteratora pętli głównej - jeśli tak to wyświetlasz #, a jeśli nie to spację, a następnie wyświetlasz tabulator.

Pierwsze dwie linijki poniższego to pseudokod (to zapisz sam), natomiast pętle są poprawne:

tab = get_numbers();
max = get_max(tab);

for(row = 0; row < max; row++)
{
  for(col = 0; col < 5; col++)
    printf(row < tab[col] ? "#" : " ", "\t");
  
  printf("\n");
}

Tyle wystarczy, aby wyświetlić wszystkie słupki.

0

no dobra :( zrobiłem tak jak napisałeś

#include <stdio.h>
void get_number(int* tab, int n)
{
    int i = 0;
    for (i = 0; i < n; ++i) {
        printf("Podaj %d liczbe:", i + 1);
        scanf("%d", &tab[i]);
    }
}
int get_max(int tab[], int n)
{
    int max = 0, i;
    for (i = 0; i < n; ++i)
        if (tab[i] > max)
            max = tab[i];
    return max;
}
void writesign(int tab[], int max, int colum)
{
    int row, col;
    printf("\n\nWartosci tablicy:\n");
    for (row = 0; row < max; row++) {
        for (col = 0; col < colum; col++) {
            printf(row < tab[col] ? "#" : " ");
            printf("\t");
        }

        printf("\n");
    }
}
int main(void)
{
    int tab[5];
    int row, max;
    get_number(tab, 5);
    max = get_max(tab, 5);
    writesign(tab, max, 5);

    return 0;
}

Tak jak napisałeś, jak wykonać taką funkcjętab = get_numbers(); jak można zrobić taką funkcję, przypisanie tab czego?
tak w ogóle, to teraz powypisywałem się dużo więcej

1

Tak jak napisałeś, jak wykonać taką funkcjętab = get_numbers(); jak można zrobić taką funkcję, przypisanie tab czego?

Napisałem Ci, że dwie pierwsze linijki to pseudokod - tablicę wypełnij sobie tak jak chcesz.

tak w ogóle, to teraz powypisywałem się dużo więcej

Bo podzieliłeś go na więcej funkcji - dzięki temu jest nieco czytelniej, choć i tak nie najlepiej.

  • zmienne możesz deklarować w nagłówku pętli, więc je tam zadeklaruj,
  • zmienne row i col w funkcji main są zbędne - usuń je,
  • wartość maksymalna ma służyć jedynie do wyświetlenia słupków ze znaków #, więc powinna ona być pobierana w funkcji writesign, a nie gdzieś indziej i przekazywana w parametrze (czyli do każdej funkcji masz przekazać jedynie tablicę oraz jej rozmiar - nic więcej),
  • podczas wyświetlania znaków # lub spacji oraz znaku tabulatora, używasz dwóch instrukcji printf, przez co musisz je grupować - użyj jednej instrukcji (tak jak pokazałem), zapis będzie krótszy, prostszy i nie trzeba będzie grupowania.
0

nie moge w nagłówku pętli, stary kopilator, czy coś, przecież do funkcji przesyłam tylko długość tablicy-ty patrzysz na prawidłowy kod?, nie moge użyć tego printf(row < tab[col] ? "#" : " ","\t"); bo w ogóle nie wyświetla się wtedy \t

0

nie moge w nagłówku pętli [...]

Nie możesz zapisać nagłówka pętli z jednoczesną deklaracją zmiennej? Dla przykładu:

for(int x = 0; x < 5; x++)

Nie widzę tu nic nadzwyczajnego - kompilator na pewno skompiluje taki kod, jeśli zapiszesz go poprawnie.

przecież do funkcji przesyłam tylko długość tablicy-ty patrzysz na prawidłowy kod?

Tak, na ten z Twojego ostatniego posta, w którym podałeś kod. I widzę tam to:

void writesign(int tab[], int max, int colum)

No jak byk widzę trzy parametry.

nie moge użyć tego printf(row < tab[col] ? "#" : " ","\t"); bo w ogóle nie wyświetla się wtedy \t

Mój błąd. Jednak nic nie stoi na przeszkodzie, aby trochę pomyśleć i sobie dopisać \t w obu literałach:

printf(row < tab[col] ? "#\t" : " \t");

PS: Po raz któryś z kolei cenzor na forum koloruje Ci w postach błąd wogóle - ucz się na błędach. Już nie wspomnę o tym, że post z ortograficznymi błędami powinieneś edytować i poprawić te błędy.

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