Znajdywanie indeksow

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

#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;
}

#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");
}

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.

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?

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.

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?

#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");
}

#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

0

Mam taki wymog ze musze uzywac

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

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