Hej, mam problem. Nie wiem czemu program nie chce wypisywać mi tablicy dynamicznej z elementami mniejszymi niż średnia arytmetyczna. Identycznie zrobiona jest funkcja do wypisywania elementów większych. Program po kompilacji wyrzuca też błąd. Czy ktoś mógłby rzucić okiem na poniższy kod? Z góry dziękuje :) Generalnie program z tablicy N elementowej ma wypisywac 2 tablce dynamiczne z elementami wiekszymi niz srednia i mniejszymi. A potem sortowac je.
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <string>
#include <limits>
#include <cctype>
#include <limits>
#include <fstream>
#include <iomanip>
using namespace std;
/* wymiary tablic */
#define N 12
/* liczba elementow w wierszu przy drukowaniu */
#define K 3
/* granice przedzialow */
#define D 0
#define G 50
static void usage(const char *name)
{
if (name) {
cout << "\tUsage:\t" << name << endl;
}
exit(EXIT_FAILURE);
}
static int A[N]; /* tablica A */
int wczytajLosowe(int tab[], int n, int d, int g, int *i_b, int *i_c)
{
int i = 0;
float suma = 0, srednia = 0;
if (g < d)
return -1;
else if (g == d) {
while (i < n) {
tab[i] = 0;
++i;
}
*i_b = n;
*i_c = n;
}
else {
while (i < n) {
tab[i] = d + rand() % (g - d + 1);
++i;
}
}
for (int i = 0; i < n; i++) {
suma = suma + tab[i];
}
srednia = suma / n;
while (i < n) {
/* overflow */
if (tab[i] > srednia) {
(*i_b)++;
}
else {
(*i_c)++;
}
++i;
}
return 0;
}
void wypisz_po_k(int tab[], int n, string naglowek)
{
if (!naglowek.empty())
cout << naglowek << endl;
int i = 0;
while (i < n) {
cout << "\t";
cout << setw(3) << tab[i];
++i;
if (i % K == 0)
cout << endl;
}
cout << endl;
}
int kopiuj_wieksze(int tab[], int n, int tab2[], int i_b)
{
int i = 0, j_b = 0, suma = 0, srednia = 0;
for (int i = 0; i < n; i++) {
suma = suma + tab[i];
}
srednia = suma / n;
while (i < n) {
/* overflow */
if (tab[i] > srednia) {
tab2[j_b++] = A[i];
}
++i;
}
return 0;
}
int kopiuj_mniejsze(int tab[], int n, int tab3[], int i_c)
{
int i = 0, j_c = 0, suma = 0, srednia = 0;
for (int i = 0; i < n; i++) {
suma = suma + tab[i];
}
srednia = suma / n;
while (i < n) {
/* overflow */
if (tab[i] < srednia) {
tab3[j_c++] = A[i];
}
++i;
}
return 0;
}
/* Sortuj poprzez wstawianie. Rosnaco (najmniejsze na poczatku. */
void Sortowanie(int tab[], int n)
{
int k;
for (int i = 0; i < n; i++)
{
k = i;
for (int j = i + 1; j < n; j++)
if (tab[j] < tab[i])
k = j;
swap(tab[k], tab[i]);
}
}
int main(int argc, char* argv[])
{
int ret = -1, *B = NULL, *C = NULL, i_b = 0, i_c = 0; /* status bledu, tablica parzytych >= 0, parzystych <0, liczba parzystych >= 0 i parzystych < 0 */
/* Krok 0. Walidacja + info */
cout << "\nKrok 0\n";
if (argc > 1) {
usage(argv[0]);
}
cout << "\tProgram wywoluje sie bez argumentow.\n";
cout << "\tW kroku 1 program wczytuje liczby calkowite losowe do tablicy A wymiaru [" << N << "], przy czym tablica A zawiera liczby z przedzialu [" << D << ", " << G << "]\n";
cout << "\tW kroku 2 tablica jest drukowana na std::cout wierszami, po [" << K << "].\n";
cout << "\tW kroku 3 elementy większe od sredniej z tablicy A kopiowane sa do tablicy B, elementy mniejsze z tablicy A kopiowane sa do tablicy C...\n";
cout << "\tW kroku 4 wszystkie 3 tablice sa drukowane\n";
cout << "\tW kroku 5 tablice B i C sa sortowane algorytmem Insertion Sort o zlozonosci O(n^2)\n";
cout << "\tW kroku 6 tablice B i C sa drukowane\n";
/* Krok 1. Wczytaj liczby losowe do tablic */
cout << "Krok 1\n";
srand(time(0));
ret = wczytajLosowe(A, N, D, G, &i_b, &i_c);
if (ret < 0) {
cout << "\tBlad wczytywania liczb losowych do tablicy A " << endl;
exit(EXIT_FAILURE);
}
/* Krok 2. Drukowanie wierszami */
cout << "Krok 2\n";
wypisz_po_k(A, N, "\tTablica A");
cout << endl;
/* Krok 3. kopiuj parzyste */
cout << "Krok 3\n";
B = new int[i_b]();
if (!B) {
cout << "\tBlad alokacji tablicy B" << endl;
exit(EXIT_FAILURE);
}
ret = kopiuj_wieksze(A, N, B, i_b);
if (ret < 0) {
cout << "\tBlad kopiowania liczb losowych do tablic B i C " << endl;
delete[] B;
exit(EXIT_FAILURE);
}
cout << "Krok 3\n";
C = new int[i_c]();
if (!C) {
cout << "\tBlad alokacji tablicy C" << endl;
exit(EXIT_FAILURE);
}
ret = kopiuj_mniejsze(A, N, C, i_c);
if (ret < 0) {
cout << "\tBlad kopiowania liczb losowych do tablic B i C " << endl;
delete[] B;
exit(EXIT_FAILURE);
}
/* Krok 4. wypisz */
cout << "Krok 4\n";
wypisz_po_k(A, N, "\tTablica A");
wypisz_po_k(B, i_b, "\tTablica B");
wypisz_po_k(C, i_c, "\tTablica C");
/* Krok 5. sortuj */
cout << "Krok 5\n";
Sortowanie(B, i_b);
Sortowanie(C, i_c);
/* Krok 6. wypisz */
cout << "Krok 6\n";
wypisz_po_k(B, i_b, "\tTablica B");
wypisz_po_k(C, i_c, "\tTablica C");
delete[] B;
delete[] C;
system("pause");
return EXIT_SUCCESS;
}