Średnia w trzeciej kolumnie z randomowych liczb

0

A wiec mam tablice randomową 4x4,mam policzone min w I kolumnie i max w II kolumnie,lecz średnią w III kolumnie program liczy mi tylko za pierwszym razem dobrze.
Co trzeba zrobić,żeby średnia była liczona od początku i te wartości nie były sumowane?


#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#define W 4 /* liczba wierszy */
#define K 4 /* liczba kolumn */
int main()
  {
   int T[W][K]={};
   int w,k,min,max,val,
  float sum;
   float avg;
  	for(;;)
	{
   
			 sum=0;
			 avg=0;
		   srand(time(NULL));

      for(w=0;w<W;++w,printf("\n"))
        {
			
         for(k=0;k<K;++k)
           {
            T[w][k]=val=rand();
            printf(" %11d",val);
			
           }
			  
	}
	
		
		//Max
		 max=T[w][1];
		 for(int w=0;w<W;++w)
		 {
			 if(T[w][1]>max)
			 {
				 max=T[w][1];
			 }
		

		 }
		 //Min
		 min=T[w][0];
		 	 for(int w=0;w<W;++w)
			{
			 if(T[w][0]<min)
			 {
				 min=T[w][0];
			 }
			}

			 //Srednia
			 
			 	  for(w=0;w<W;++w)
					{
			
						for(k=0;k<K;k++)
						{
			 
						sum+=T[w][2];
            			
						}
			
					}
				  avg=sum/4;
				  if(getchar()!='\n') 
					  return 0;
			  
				  printf("\nWartosc min w pierwszej kolumnie: %d \nWartosc max w drugiej kolumnie: %d \n Srednia arytmetyczna:%.2f\n \n\n<Enter> - kolejne losowanie: ",min,max,avg);
				 
	}
  					 		
	
     
}
   


0

Nie może liczyć dobrze nigdy, ponieważ sumujesz tą kolumnę K-krotnie.

0

Ok,fakt pomyliłem się,edytowane,ale to nadal nie działa;

			 	            for(w=0;w<W;w++)
					{
						sum+=T[w][2];
					}
						avg=sum/4;

dodanie znacznika <code class="c"> - fp

0

Jak masz zliczyć średnią z 4-ch liczb ręcznie to ile razy będziesz dzielić ?
Może uważasz że liczenie za pomocą programu odbywa się wg innego algorytmu?

0

Edytowałem,ale nie wiem co robię źle.

0

Nie dodajesz 4 liczby za każdym razem dzieląc sumę przez ilość dodanych przed tym dodawaniem liczb. Czyli dzielisz 4 razy, w tym za pierwszym razem dzielisz przez zero.

0

Dzielić trzeba RAZ, po zsumowaniu, a nie wewnątrz pętli na sumie częściowej.

0

Edytowałem i nie mam pojęcia,co dalej zrobić póki co...

0

max=T[w][1]; a czemu jest równe to w w tym momencie?
Chodzi o pierwsze wystąpienie, tuż po komentarzu //Max

0

Edit:Danemu wierszowi z 2 kolumny ,czyli T[w][1]-pewien wiersz z pewnej kolumny,który jest potem porównywany.

0

Nie wiem jak ci wytłumaczyć, masz teraz zapisane tak:

         //Max
         max=T[PODSTAW_TU_JAKIS_SMIEC_ZAMIAST_PIERWSZEGO_WIERSZA][1];

Owszem nie dosłownie zaś do tego się sprowadza.

0

A ten max i min to źle działa?bo mi w Visual Studio dobrze działa.Spróbuje jeszcze w innych kompilatorach,ale chyba nie jest źle. Nie wiem o co ci teraz chodzi.MI teraz chodzi o tylko o średnią.Z początku myślałem,że znajdujesz jakąś analogię do średniej,lecz teraz to nie wiem o co kaman.

0

Po poprawkach opisanych tu http://4programmers.net/Forum/Newbie/225184-srednia_w_trzeciej_kolumnie_z_randomowych_liczb?p=990045#id990045 łącznie z komentarzem z sumą powinno być w porządku.

0

Teraz min i max na pewno działa dobrze,lecz nadal ta średnia jest źle liczona.Przez jakiś czas miałem średnią dobrze liczoną,natomiast przy min i max wyskakiwały błędy i dziwnie wyświatlało tabelę.

#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#define W 4 /* liczba wierszy */
#define K 4 /* liczba kolumn */

int main()
{
	int T[W][K] = {};
	int w, k, min, max, val;
	float sum;
	float avg;
	for (;;)
	{
		sum = 0;
		avg = 0;
		srand(time(NULL));
		for (w = 0; w<W; ++w, printf("\n"))
		{
			for (k = 0; k<K; ++k)
			{
				T[w][k] = val = rand();
				printf("%11d", val);
			}

			max = T[w][1];
			for (int w = 0; w<W; ++w)
			{
				if (T[w][1]>max)
				{
					max = T[w][1];
				}
			}

			min = T[w][0];
			for (int w = 0; w<W; ++w)
			{
				if (T[w][0]<min)
				{
					min = T[w][0];
				}
			}

			for (int w = 0; w<W; ++w)
			{
				sum += T[w][2];
			}
			avg = sum / W;
		}

		printf("\n Wartosc min w pierwszej kolumnie: %d \nWartosc max w drugiej kolumnie: %d \n Srednia arytmetyczna:%.2f \n\n<Enter> - kolejne losowanie: ", min, max, avg);
		if (getchar() != '\n') return 0;
	}
}
0

Wychodzi poprawnie,za każdym razem,więc nie wiem czy czysty przypadek?

#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#define W 4 /* liczba wierszy */
#define K 4 /* liczba kolumn */

int main()
{
	int T[W][K] = {};
	int w, k, min, max, val;
	float sum;
	float avg;
	for (;;)
	{
		sum = 0;
		avg = 0;
		srand(time(NULL));
		for (int w = 0; w<W; ++w, printf("\n"))
		{
			for (int k = 0; k<K; ++k)
			{
				T[w][k] = val = rand();
				printf("%11d", val);
			}

			//Max
			max = T[w][1];
			for (int w = 0; w<W; ++w)
			{
				if (T[w][1]>max)
				{
					max = T[w][1];
				}
			}

			//Min
			min = T[w][0];
			for (int w = 0; w<W; ++w)
			{
				if (T[w][0]<min)
				{
					min = T[w][0];
				}
			}
		}

		//Srednia
		for (int w = 0; w<W; ++w)
		{
			sum += T[w][2];
		}
		avg = sum / W;

		printf("\nWartosc min w pierwszej kolumnie: %d \nWartosc max w drugiej kolumnie: %d \nSrednia arytmetyczna z trzeciej kolumny:%.2f \n\n<Enter> - kolejne losowanie: ", min, max, avg);
		if (getchar() != '\n') return 0;
	}
}
0

Teraz to masz kompletnie porąbane. Ile razy na losowanie liczysz min i max ?

2

Andrews czemu nie nazwiesz tych zmiennych jakoś jaśniej i nie dzielisz na funkcje? Tego najlepiej nauczyć się jak najszybciej. jest prościej, przejrzyściej i się tak nie kaleczy. ;)

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

#define     ROWS        4
#define     COLUMNS     4

int column_max(int (*array)[COLUMNS], int ncol) {
    int nrow, max = 0;
    for(nrow=0; nrow<ROWS; nrow++)
        if(array[nrow][ncol]>max)
            max=array[nrow][ncol];
    return max;
}

void fill_array(int (*array)[COLUMNS], int rows, int cols) {
    int nrow, ncol;
    for (nrow=0; nrow<ROWS; nrow++)
        for(ncol=0; ncol<COLUMNS; ncol++)
            array[nrow][ncol] = rand();
}
/* itd... column_min, column_avg */

int main(void) {
    int array[ROWS][COLUMNS]={0};
    srand(time(NULL));
    for (;;) {
        fill_array(array,ROWS,COLUMNS);
        printf("max col 1: %d\n",column_max(array,1));
        /* itd........ */

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