Zapisanie liczb wprowadzonych przez użytkownika

0

Chciałbym napisać program, który będzie pobierał liczby od użytkownika i dodawał je do tablicy, tak długo aż ten nie poda liczby 100. Z tego co się orientuję to rozmiar tablicy trzeba zdefiniować na początku, więc jak rozwiązać ten problem?

4

Dynamiczna alokacja i realloc

0

Przeczytałem, napisałem 2 programy, które robią to samo i działają tak jak oczekiwałem. Teraz mam pytanie co powinno się poprawić w tym kodzie, bo działać działa, ale czy wszystko jest ok to już nie wiem.

#include <stdio.h>
#include <stdlib.h>


int main(void){
    int rozmiar=0, i;
    int *tablica;
    tablica = (int*) malloc(rozmiar * sizeof(*tablica));

    do{
        rozmiar++;
        scanf("%d", &tablica[rozmiar-1]);
    }while(tablica[rozmiar-1]!=100);

    for(i=0; i<rozmiar; i++){
        printf("%d ", tablica[i]);
    }

    printf("\n%d", rozmiar);
    return 0;
}
#include <stdio.h>
#include <stdlib.h>


int main(void){
    int rozmiar=0, j;
    int *tablica;
    tablica = (int*) malloc(sizeof(*tablica));

    do{
        tablica=realloc(tablica, (rozmiar+1)*sizeof(*tablica));
        scanf("%d", &tablica[rozmiar]);
        rozmiar++;
    }while(tablica[rozmiar-1]!=100);

    for(j=0; j<rozmiar; j++){
        printf("%d ", tablica[j]);
    }
    
    printf("\n%d", rozmiar);
    return 0;
}
0

W pierwszym programie masz UB - alokujesz 0 bajtów a korzystasz z otrzymanego wskaźnika.

Drugi wydaje się poprawny.

0

Dalej mam z tym problem. Teraz dodałem instrukcję sortowania, ale to działa, albo nie działa. Np. przy wprowadzeniu 3 1 2 100 wyrzuca błąd.
Można to naprawić jeśli wpisałbym w pętli do while

tablica=realloc(tablica, 111*(rozmiar+1)*sizeof(*tablica));

, ale to raczej nie jest najpiękniejsza i poprawna metoda. Jak to należy poprawić i z czego wynika ten błąd?

#include <stdio.h>
#include <stdlib.h>

void sortuj(int j, int i, int tablica[],int min,int max, int rozmiar){
    for(j=0;j<rozmiar;j++){
        for(i=0; i<rozmiar; i++){
            if(tablica[i]>tablica[i+1]){
                min=tablica[i+1];
                max=tablica[i];
                tablica[i]=min;
                tablica[i+1]=max;
            }
        }
    }
}

int main(void){
    int rozmiar=0, j, min, max, i;
    int *tablica;
    tablica = (int*) malloc(sizeof(*tablica));

    do{
        tablica=realloc(tablica, (rozmiar+1)*sizeof(*tablica));
        scanf("%d", &tablica[rozmiar]);
        rozmiar++;
    }while(tablica[rozmiar-1]!=100);

    sortuj(j, i, tablica, min, max, rozmiar);

    for(j=0; j<rozmiar; j++){
        printf("%d ", tablica[j]);
    }

    printf("\n%d", rozmiar);
    return 0;
}
0

Może się przyda:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
	char *data;
	size_t capacity;
	size_t size;
	const size_t element_size;
} vector;

vector vector_init(size_t initial_capacity, size_t element_size) {
	if(!initial_capacity) {
		initial_capacity = 1;
	}
	vector result = {
		malloc(initial_capacity*element_size),
		initial_capacity,
		0,
		element_size
	};
	return result;
}

char *vector_get(vector *vec, size_t idx) {
	return vec->size > idx
		? vec->data + idx*vec->element_size
		: NULL;
}

void vector_reserve(vector *vec, size_t size) {
	if(vec->capacity >= size) {
		return;
	}
	
	vec->capacity = size;
	vec->data = realloc(vec->data, vec->capacity*size);
}

void vector_push(vector *vec, void *data) {
	if(vec->size >= vec->capacity) {
		vector_reserve(vec, vec->capacity*2);
	}
	
	memcpy(vec->data + vec->size*vec->element_size, data, vec->element_size);
	vec->size += 1;
}

size_t vector_size(vector const *vec) {
	return vec->size;
}

size_t vector_capacity(vector const *vec) {
	return vec->capacity;
}

void vector_free(vector *vec) {
	free(vec->data);
}

int main(void) {
	int initial_capacity = 0;
	vector vec = vector_init(initial_capacity, sizeof(int));
	int i = 10;
	
	while(i --> 0) {
		vector_push(&vec, &i);
	}
	
	printf("vector size:     %d\n", vector_size(&vec));
	printf("vector capacity: %d\n", vector_capacity(&vec));
	printf("vector values:\n");
	for(i = 0; i < vector_size(&vec); ++i) {
		printf("  vec[%d]: %d\n", i, *(int*)vector_get(&vec, i));
	}
	vector_free(&vec);
	return 0;
}

output:

vector size:     10
vector capacity: 16
vector values:
  vec[0]: 9
  vec[1]: 8
  vec[2]: 7
  vec[3]: 6
  vec[4]: 5
  vec[5]: 4
  vec[6]: 3
  vec[7]: 2
  vec[8]: 1
  vec[9]: 0

http://ideone.com/T7XzYM

0

Może kiedyś mi się to przyda, ale w tej chwili chciałbym rozwiązanie obecnego problemu ;)

EDIT:

Dobra mam, dla potomnych:
W drugiej pętli for czytając od góry powinno być

for(i=0; i<rozmiar-1; i++)

.
Gdy nie było -1 to program porównywałby ostatni element z nieistniejącym elementem tablicy i stąd błędy.

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