Znajdywanie indeksow

Odpowiedz Nowy wątek
2019-08-24 20:09
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");
}
edytowany 4x, ostatnio: simonsoft, 2019-08-24 20:28
nie używaj pseudo hakerskiego *(tab+i) tylko czytelnego tab[i] - AnyKtokolwiek 2019-08-25 20:05

Pozostało 580 znaków

2019-08-24 21:15
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, 2019-08-24 21:16
2019-08-24 22:12
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?

Pozostało 580 znaków

2019-08-24 22:13
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.

Pozostało 580 znaków

2019-08-25 14:22
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

edytowany 2x, ostatnio: simonsoft, 2019-08-25 14:52

Pozostało 580 znaków

2019-08-25 20:08
0

Mam taki wymog ze musze uzywac

Pozostało 580 znaków

2019-08-25 20:17
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


01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110
edytowany 1x, ostatnio: stivens, 2019-08-25 20:19

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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