wczytywanie danych do tablicy

Odpowiedz Nowy wątek
2019-07-26 16:48
0

Witam, mam problem, wczytuje dane do tablicy o max. poj. 100, liczba -1 oznacza koniec wprowadzania danych, dziala, jednak musze przerobic program, poniewaz powinien przyjmowac takie lancuchy jak np. 0 1 -1 0 -1 i dopiero ostatnia liczbe traktowac jako koniec wprowadzania danych. Moze ktos pomoc?

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

    for(int i=0; i<size; ++i)
    {
        if(scanf("%d", &(*(tab+i))) == 1)
        {   
            if(*(tab+0) == stop_value)
            {
                return 0;
            }
            sizeD++;

            if(*(tab+i) == stop_value)
            {

                sizeD--;
                break;
            }
        }else return -1;     
    }
    return sizeD;
}

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

wywolanie w mainie :

int main()
{
    int T[100];
    int *tab = T;
    int size = 0;

    printf("Podaj liczby:\n");
    size = read_vector(tab, 100, -1);
.......
edytowany 1x, ostatnio: simonsoft, 2019-07-26 16:49

Pozostało 580 znaków

2019-07-26 16:56
0

lub odwrotnie if( (tab+i-1)== -1 && (tab+i)==NULL)

Pozostało 580 znaków

2019-07-26 17:03
0
bezil napisał(a):

lub odwrotnie if( (tab+i-1)== -1 && (tab+i)==NULL)

nie dziala

Pozostało 580 znaków

2019-07-26 17:15
sig
0

Chodzi ci o drugie wystąpienie -1 czy też -1 coś innego -1? bo to 2 różne rzeczy są. Ew można zrobić tak że będzie wczytywać dopóki nie nastąpi "koniec pliku" w przypadku wpisywania z palca symulujesz go przez ctrl + z pod Windows ew ctrl + d pod Linuksem.

Pozostało 580 znaków

2019-07-26 17:17
0
sig napisał(a):

Chodzi ci o drugie wystąpienie -1 czy też -1 coś innego -1? bo to 2 różne rzeczy są. Ew można zrobić tak że będzie wczytywać dopóki nie nastąpi "koniec pliku" w przypadku wpisywania z palca symulujesz go przez ctrl + z pod Windows ew ctrl + d pod Linuksem.

Po prostu zeby bralo wszystkie liczby oprocz ostatniej liczby stop_value ktora wynosi -1 czyli np.
Input -> 1 2 3 -1 0 5 -1
Output -> -1 0 1 2 3 5
sortowanie juz mam

Pozostało 580 znaków

2019-07-26 17:22
0

nie mozesz tego zrobic po prostu pomijając ostatni element tablicy, ktorym bedzie -1?

Pozostało 580 znaków

2019-07-26 17:41
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;
}

i dopiero ostatnia liczbe traktowac jako koniec wprowadzania danych.

Może rozwiniesz na jakiej podstawie ostatnie -1 ma być ważniejsze od pierwszego -1? To jest sprzeczne z sensem stop_value.
Najwyraźniej masz inne kryterium końca wczytywania danych, którego nie potrafiłeś nam wyjaśnić.

Jeśli to jest zadanie z serwisu typu SPOJ main.edu.pl hackerrank itp, to lepiej podaj link do zadania.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 3x, ostatnio: MarekR22, 2019-07-26 17:47

Pozostało 580 znaków

2019-07-29 20:14
0

dziekuje wszystkim, jestem nad morzem na wakacjach i jak znajde chwilke to zupdatuje posta co i jak.

:-D I jak, woda ciepła? - au7h 2019-07-29 22:29

Pozostało 580 znaków

2019-07-30 09:50
0

Woda zimna, ale o to wlasnie chodzi ze da sie schlodzic :D, dzisiaj bede cisnal

Pozostało 580 znaków

2019-08-21 10:33
0

Dziala, dzieki.
Pojawil sie nowy problem, chodzi o przepelnienie tablicy, jesli dam wiecej argumentow niz rozmiar tablicy, rozwalaja mi program bo przy pobieraniu kolejnych danych program wyswietla 3 liniki kodu, zamiast po kazdej czekac na wpisany argument. Probowalem fflush(stdin) po scanf ale nie dziala, wie ktos jak temu zaradzic?

int read_vector(int *array, int array_size, int stop_value)
{
    if(array == NULL || array_size <= 0 ) return -1;
    int sizeD = 0;

    while (sizeD < array_size)
    {
        int read = scanf("%d", &(*(array + sizeD)));
        if ((read <= 0) ) return -1;
        if (read != 1 || *(array+sizeD) == stop_value) break;
        ++sizeD;
    }
    return sizeD;
}
printf("Podaj wektor: \n");
    array_size = read_vector(array, 150, 0);

    fflush(stdin);
    if(array_size <= 0)
    {
        printf("Not enough data available");
        exit(3);
    }
    else
    {
        printf("Podaj przesuniecie: \n");
        read = scanf("%d", &positions_to_shift);

        if (read <= 0)
        {
            printf("Incorrect input");
            exit(1);
        }
        else
        {
            printf("Podaj kierunek przesuniecia: \n");
            int read2 = scanf("%d", &kierunek);
            fflush(stdin);
            if(read2 <= 0 || (kierunek != 1 && kierunek != 2))
            {
                printf("Incorrect data input");
                exit(2);
            }
        }
    }
Podaj wektor: ⏎
55 19 60 64 55 16 59 14 14 19 62 34 11 45 78 6 96 64 43 40 ( ... wiecej niz 150...) 0⏎
Podaj przesuniecie: 
Podaj kierunek przesuniecia: 
Incorrect data input 8⏎
edytowany 2x, ostatnio: simonsoft, 2019-08-21 10:38

Pozostało 580 znaków

2019-08-21 15:55
0

pomocy

Nie wiem jak innym, ale mi osobiście chciałoby się chociaż na to zerknąć gdybyś wrzucił kompletny kod w jednym poście, bo sklejać go z różnych postów mi się nie chce ;) w poście wyżej nie widzę nawet maina :p - knifer0 2019-08-21 19:12

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