Średnia liczb z tablicy o powiększającym się rozmiarze

0

Witam. Nie wiem gdzie jest błąd w moim programiku.
Stworzyłem tablice która pobiera liczby od użytkownika. Im więcej użytkownik podaje liczb tym tablica zwiększa swój rozmiar. Program kończy działanie po podaniu litery.
Następnie program ma zsumować wszystkie liczby, i wyliczyć średnią. I problem jest z tym, że średnią liczb źle oblicza.

#include <iostream>
#include <string>
#include<conio.h>
#include<stdio.h>
#include<cstdlib>
using namespace std;
int main(){
	int suma=0;
	int rozmiar=1;
	int tab[rozmiar];
	for(int i=0; i<rozmiar; i++){
		cout<<"Podaj "<<i+1<<" liczbe: ";
		cin>>tab[i];
		if(cin.good()){
			cin.clear();
			cin.sync();
			rozmiar++;
		}
		else if(!(cin.good())){
			break;
		}
	}
	cout<<"=-=-=-=-=-=-=-=-=-=-=-=-";
	for(int i=0; i<rozmiar; i++){
		cout<<tab[i]<<endl;
	}
return 0;
}
0
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
using namespace std;

template<class Result, class InputIterator>
Result sum(InputIterator begin, InputIterator end) {
	Result sum = Result();
    for_each(begin, end, [&](const Result& elem) { sum += elem; });
    return sum;
}

template<class Result, class InputIterator>
Result average(InputIterator begin, InputIterator end) {
    return sum<Result>(begin, end) / (end - begin);
}
 
 
int main() {
    vector<int> numbers;
    copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(numbers));
    const int avg = average<int>(numbers.begin(), numbers.end());
    cout << "Srednia: " << avg << endl;
    return 0;
}

// Edit: drobne poprawki.
// Edit2: Wrzucam wersje uproszczona, zgodnie ze wskazowka @Oak.

#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <numeric>
using namespace std;

template<class Result, class InputIterator>
Result average(InputIterator begin, InputIterator end) {
    return accumulate(begin, end, Result()) / (end - begin);
}
 
 
int main() {
    vector<int> numbers;
    copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(numbers));
    const int avg = average<int>(numbers.begin(), numbers.end());
    cout << "Srednia: " << avg << endl;
    return 0;
}
0

Prosiłbym raczej o propozycje zmodyfikowania mojego kodu, a nie napisania całego. Zacząłem sprawdzać co jest grane z liczbami zapisanymi w tablicy. Sama tablica jest powodem błędu. Jak jako użytkownik podaje 21 znaków, pierwsze 20 to liczby 1-20, a 21-temu elementowi podaje jakąś literę, żeby zakończyło pobieranie, i wyświetlę sobie całą tablicę, to 8-a, 11-a liczba jest błędnie wyświetlona. Obojętnie co wpiszę, to ten element podaję błędną wartość liczbową . Czemu tak jest?

0

Czemu tak jest?

Ano temu, ze nie masz pojecia jak dzialaja tablice. Alokujesz tylko 1 element, a mazesz po tym jakby bylo nieskonczenie wielkie, wiec bardzo prawdopodobne jest otrzymywanie 'losowych' wynikow.

Prosiłbym raczej o propozycje zmodyfikowania mojego kodu

Tam nie ma zbytnio co poprawiac.

Btw. Z tego co widze, to od roku zadajesz pytania na mniej-wiecej takim samym poziomie. Nie myslales, zeby jakis tutorial/ksiazke/whatever przeczytac?

0

Tak sie tablic o zmiennej liczbie elementów nie alokuje.
Tworzysz tablice o rozmiarze 1 a w pętli już przy drugiej iteracji wychodzisz poza zakres.
Na poczatek popróbuj z normalną tablica.
Warunek tez jest zly, bo nie czyscisz flagi błędu po napotkaniu litery.

0

książkę kupiłem, ale nie bardzo mi ona pomaga. Ściągnąłem parę pdf-ów, ale jakoś nie mogę znaleźć takiego, który by mi odpowiadał. Ciągle coś nie jest dla mnie jasne po jakimś okresie czytania. Jedno dobrze wytłumaczą, a nie które nie wystarczająco. To co, nie można zwiększać ilości elementów tablicy za pomocą inkrementacji, w miarę potrzeby użytkownika? I źle, że kombinuje?

0

Mozna, ale nie przez inkrementacje i w zaden sposob nie bedzie prostsze od uzycia wektora, ktory robi to za nas.

0

Można, ale musiałbyś wiedzieć co to wskaźnik.
Jak tak bardzo Ci zależy na rozszerzaniu kontenera, to użyj vectora.

0

Co do wskaźników, to pojęcie mam, chociaż czasem gubię się w tych gwiazdkach. Proxima myślisz, że można to zrobić za pomocą wskaźników? Skoro podałeś również taką propozycję.
do wektorów jak dla mnie to chyba jeszcze za wcześnie.
klasy struktury wskaźniki mam już za sobą. Vectorów jakoś przełknąć na razie nie mogę.

0

Naucz sie wskaznikow i dynamicznego alokowania pamieci oraz poczytaj o stercie i nie bedzie problemow ;)

1
#include <iostream>
#include <cstdlib>
using namespace std;

int main()
  {
   size_t rozmiar=0;
   int *tab=NULL;
   while(true)
     {
      cout<<"Podaj "<<(++rozmiar)<<" liczbe: ";
      int value;
      if(!(cin>>value)) break;
      tab=(int*)realloc(tab,rozmiar*sizeof(int));
      tab[rozmiar-1]=value;
     }
   cin.clear();
   cin.sync();
   for(int i=0;i<rozmiar;++i) cout<<tab[i]<<endl;
   free(tab);
   return 0;
  }
2
#include <stdio.h>
#include <stdlib.h>

typedef struct {
	int *arr;
	unsigned nalloc;	/* na ile elementow mamy zaalokowanej pamieci */
	unsigned nfree;		/* indeks nastepnego wolnego miejsca */
} d_arr;

d_arr *d_arr_init(unsigned nalloc) {
	d_arr *arr = malloc(sizeof(d_arr));
	arr->arr = malloc(nalloc * sizeof(int));
	arr->nalloc = nalloc;
	arr->nfree = 0;
	return arr;
}

void d_arr_add(d_arr *d, int val) {
	unsigned id = d->nfree;
	unsigned alloc = d->nalloc;
	if(id>=alloc) {
		unsigned new_alloc = alloc * 2;
		d->arr = realloc(d->arr,new_alloc * sizeof(int));
		d->nalloc = new_alloc;
	}
	d->arr[id] = val;
	++(d->nfree);
}

void d_arr_free(d_arr *d) {
	free(d->arr);
	free(d);
	d = NULL;
}

double d_arr_avg(d_arr *d) {
	unsigned i, nof_elems = d->nfree;
	long long int sum = 0;
	for(i=0;i<nof_elems;++i)
		sum += d->arr[i];
	double ret = sum / (double)nof_elems;
	return ret;
}

int main(void) {
	d_arr *arr = d_arr_init(10);
	int tmp;
	while(1) {
		if(!scanf("%d",&tmp))
			break;
		d_arr_add(arr,tmp);
	}
	printf("srednia: %.4f\n",d_arr_avg(arr));
	d_arr_free(arr);
	return 0;
}

od siebie wrzucę jeszcze prymitywnie w C ;]

0

zawsze powtarzam początkującym ze trzeba trenować trenować i jeszcze raz trenować a wtedy zaczniesz zauważać postępy i mniej błędów oczywiści przy tak banalnych zagadnieniach jakie nam tu pokazałeś

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