Znajdywanie indeksow

Znajdywanie indeksow
simonsoft
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 5 lat
  • Postów:159
0

Siemka mam problem, bo nie wiem jak podejsc do tego zadania.
Program pobiera tablice znakow, po czym uzytkownik jest pytany o wartosc do znalezienia i wyswietla indeksy szukanej wartosci. Problem tkwi w tym ile razy mam wywolac funkcje, bo za kazdym razem zwraca mi ona numer indeksu szukanej wartosci, a jesli sie powtorzy? Na jakiej podstawie mam sprawdzac czy wykonac ponownie funkcje? Czy mam zapisywac efekt funkcji find do tablicy? Wiem, ze tam display vector potem wywoluje z tablicy ktorej nic nie robilem, ale chodzi mi tylko o to ile razy funkcje find wykonywac

Kopiuj
#include <stdio.h>
#include <stdlib.h>
#include "vector_utils.h"

int main()
{
    int element, tab1[100], wynik[100];
    int *vec = tab1, *wyn = wynik;

    printf("Podaj liczby: ");
    int size = read_vector(vec, 100, 0);
    if(size == -1)
    {
        printf("Incorrect input");
        exit(1);
    }
    if(size == 0)
    {
        printf("Not enough data available");
        exit(3);
    }

    printf("Podaj element ktory chcesz znalezc: ");
    int el = scanf("%d", &element);

    int efect = find(vec, size, element);

    if(size == 1)
    {
        printf("Incorrect input");
        exit(1);
    }

    display_vector(wyn, size);

    return 0;
}

Kopiuj
#include <stdio.h>
#include <stdlib.h>
#include "vector_utils.h"

int read_vector(int* tab, int size, int stop_value)
{
    if(tab == NULL || size <= 0 ) return -1;

    int sizeD = 0;

    while (sizeD < size)
    {
        int read = scanf("%d", &(*(tab + sizeD)));

        if ((read <= 0)) return -1;
        if (read != 1 || *(tab+sizeD) == stop_value) break;

        ++sizeD;
    }
    return sizeD;
}

int find(const int* tab, int size, int to_find)
{
    if(tab == NULL || size <= 0) return 1;

    static int j = 0;

    for(int i = j; i < size; i++)
    {
        if(*(tab + i) == to_find)
        {
            j = i;
            return j;
        }
    }

    return 0;
}

void display_vector(const int* tab, int size)
{
    if(tab == NULL || size <= 0) return;

    for(int i=0; i<size; i++)
    {
        printf("%d ", *(tab+i));
    }
    printf("\n");
}

edytowany 4x, ostatnio: simonsoft
AK
nie używaj pseudo hakerskiego *(tab+i) tylko czytelnego tab[i]
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:5 minut
  • Postów:4883
0

Jeżeli wyszukiwane elementy są typu int, oraz operujemy na ustalonej tablicy T (tak wygląda Twój przykład), to można stworzyć dodatkowa tablicę, C, o długości tablicy wyszukiwania, wypełnioną elementami length(T) + 1. W przypadku udanego szukania, znaleziono element 5 pod indeksem 4, do C wpisujemy 4 pod indeksem 5, a w przypadku nieudanego szukania wpisujemy pod danym indeksem len(T). Szukanie elementu, np 10, zaczynamy od sprawdzenia C(10), jeśli jest to length(T) + 1 , to musimy szukać w T (i, oczywiście zapisać rezultat), w innym przypadku zwracamy wynik.


edytowany 2x, ostatnio: lion137
tajny_agent
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad rok
  • Postów:1340
0

@lion137: To zadziała tylko dla tablic, gdzie T[i] = i && i >= 0.

@simonsoft:
Przyjmując tablicę tab [10, 20, 50, 30, 40]:
Wywołania find(tab, 5, 20), find(tab, 0, 152900) oraz find(NULL, 0, 0) zwrócą 1. Skąd będziesz widział czy to oznacza błąd czy poprawny indeks szukanej liczby?

Wywołanie find(tab, 5, 30) zwróci 3, a jeśli później wywołasz find(tab, 5, 20) dostaniesz 0 mimo, że taka liczba znajduje się w tablicy, bo szukanie będzie rozpoczęte od indeksu zapamiętanego z poprzedniego wywołania.

Wywołanie find(tab, 5, 100) zwróci 0. Skąd będziesz wiedział czy to oznacza poprawny indeks czy brak liczby w tablicy?


"I love C++. It's the best language in the world right now for me to write the code that i need and want to write"
~ Herb Sutter
Delor
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
0
simonsoft napisał(a):

Na jakiej podstawie mam sprawdzac czy wykonac ponownie funkcje? Czy mam zapisywac efekt funkcji find do tablicy? Wiem, ze tam display vector potem wywoluje z tablicy ktorej nic nie robilem, ale chodzi mi tylko o to ile razy funkcje find wykonywac

Nie możesz zmieniać elementów tablicy ale możesz operować na wskaźnikach na te elementy (oraz pamiętać je pomiędzy wywołaniami funkcji). Pamiętać możesz też wartość do wyszukiwania, aktualny rozmiar, ... (inne wartości które Ci pomogą).
Funkcja find powinna resetować zapamiętane wartości jeżeli otrzyma wskaźnik na tablicę.
W przypadku null powinna przejść od razu do operacji na poprzednich danych.

simonsoft
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 5 lat
  • Postów:159
0

Dziala, ale nie wiem o co chodzi z tym ze jak NULL jako tab dostanie to ma wykonywac dzialania na poprzednich danych, nie powinno byc ze na nastepnych? Nie rozumiem o co z tym chodzi totalnie.

Edit. Juz chyba kumam ze wtedy ma brac tablice z poprzedniego uruchomienia funkcji, ale w takim razie mam stworzyc druga tablice i przypisac wartosci z pierwszej i jak bedzie NULL w pierwszej, to uzyc drugiej?

Kopiuj
#include <stdio.h>
#include <stdlib.h>
#include "vector_utils.h"

int read_vector(int* tab, int size, int stop_value)
{
    if(tab == NULL || size <= 0 ) return -1;

    int sizeD = 0;

    while (sizeD < size)
    {
        int read = scanf("%d", &(*(tab + sizeD)));

        if ((read <= 0)) return -1;
        if (read != 1 || *(tab+sizeD) == stop_value) break;

        ++sizeD;
    }
    return sizeD;
}

int find(const int* tab, int size, int to_find)
{
    if(size <= 0) return -2;

    static int j = 0;

    for(int i = j; i < size; i++)
    {
        if(*(tab + i) == to_find)
        {
            j++;
            return i;
        }else j++;
    }

    return -1;
}

void display_vector(const int* tab, int size)
{
    if(tab == NULL || size <= 0) return;

    for(int i=0; i<size; i++)
    {
        printf("%d ", *(tab+i));
    }
    printf("\n");
}

Kopiuj
#include <stdio.h>
#include <stdlib.h>
#include "vector_utils.h"

int main()
{
    int element, efect = 0, i = 0, tab1[100], wynik[100];
    int *vec = tab1, *wyn = wynik;

    printf("Podaj liczby: ");
    int size = read_vector(vec, 100, 0);
    if(size == -1)
    {
        printf("Incorrect input");
        exit(1);
    }
    if(size == 0)
    {
        printf("Not enough data available");
        exit(3);
    }

    printf("Podaj element ktory chcesz znalezc: ");
    int el = scanf("%d", &element);

    if(el == 0)
    {
        printf("Incorrect input");
        exit(1);
    }

    do
    {
        efect = find(vec, size, element);
        if(efect != -1 && efect != -2)
        {
            *(wyn + i) = efect;
            i++;
        }
    }while(efect != -1 && efect != -2);

    if(i == 0)
    {
        printf("Nothing to show");
        return 0;
    }
    if(efect == -2)
    {
        printf("Incorrect input");
        exit(1);
    }


    display_vector(wyn, i);

    return 0;
}

Teraz mi w testach SIGSEGV wyskakuje jak NULLA wprowadze jako tab, jak z tym postapic?

screenshot-20190825142703.png

edytowany 2x, ostatnio: simonsoft
simonsoft
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 5 lat
  • Postów:159
0

Mam taki wymog ze musze uzywac

stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:minuta
1

Jezeli tab != null to zapisz sobie wskaznik do statycznej zmiennej pomocniczej

Jesli tab == null to powinienes miec poprzednia tablice w tej zmiennej pomocniczej (uwaga nie musisz jej tam miec! zlosliwy input moze na dzien dobry nulla wrzucic)

size tez musisz "cachowac" statycznie


λλλ
edytowany 1x, ostatnio: stivens
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)