Pobieranie macierzy z pliku txt i działanie na danych z pliku

0

napisz progprogram który odczytuje kwadratowa macierz o nieznanym rozmiarze. dla elementów leżących na parzystym iloczynie indeksów np mac[1][2], mac[2][2] znajduje srednia tych elemetów oraz mediane i je wyswietla
dane zostaja zapisane w strukturze która przechowuje:
rozmiar macierzy RxR
wskaźnik do danych
wartość średniej oraz mediany tych elementów

program ma posiadać
a funkcje do odczytu pliku; rozmiar macierzy nalezy wyciagnąć z ilości liczb zapisanych w pliku
b zabezpieczenie przed nieprawidłową nazwą pliku
c funkcję liczącą średnią oraz mediane

Niestety nie mogę uruchomić programu:(

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

using namespace std;

double open_file(FILE*, double**);
float average(int, double**);
float median(int, double**);

struct data{
	double s_matrix;
	float average;
	float median;
	double **matrix;
};

int main()
 {
	int n;
	double **matrix;
	FILE *pFile;
	data dat;
	dat.s_matrix=open_file(pFile, matrix);
	cout << dat.s_matrix << endl;
	dat.average=average(n, matrix);
	cout << dat.average << endl;
	dat.median=median(n, matrix);
	cout << dat.median << endl;
	dat.matrix=matrix;
	cout << dat.matrix;
	fclose(pFile);
	system("PAUSE");
	return 0;
}

double open_file(FILE* pFile, double** matrix)
{
	int temp,n , i, j;
	fpos_t pos;
	pFile=fopen("kolos.txt", "r");
	fgetpos(pFile, &pos);
	while(!feof(pFile))
	{
		fscanf(pFile, "%i", &temp);
		n++;
	}
	fsetpos(pFile, &pos);
	n=sqrt(n);
	matrix= (double**)malloc(sizeof(double*)*n);
	for(i=0; i<n; i++)
		matrix[i]=(double*)malloc(sizeof(double)*n);
	for(i=0; i<n; i++)
	{
		for(j=0; j<n; j++)
			fscanf(pFile, "%i", &matrix[i][j]);
	}
	return n;
}

float average(int n, double** matrix)
{
	int i, j, Up=0, Down=0;
	for(i=0; i<n; i++)
	{
		for(j=0; j<n; j++)
		{
			
	 		Up+=matrix[i][j];
		
		}	
	}
	Down=i*j;
	return Up/Down;
}

float median(int n, double** matrix)
{
	int i, j, k=0, temp;
	float median;

	for(i=0; i<n; i++)
	{
		for(j=0; j<n; j++)
		{
			if(!((i*j)%2))
			{
				if(!n%2)
				{
					k++;
					if((k+1)==n/2)
						temp=matrix[i][j];
					else if(k==n/2)
					{
						median=(*matrix[i]+temp);
						median=median/2;
					}
				}
				else if(n%2)
				{
					k++;
					if(k==(n/2)+1)
					  median=matrix[i][j];
				}
			}
		}	
	}
	return median;
}
0

Dodam tylko, że kompilator nie wykazuje błedów i to mnie blokuje:(

0

Niestety nie mogę uruchomić programu:(

Mógłbyś coś więcej napisać? Na przykład piszesz w C with cout a nie C++ oraz używasz jednocześnie stdio i iostream, co powoduje zazwyczaj same problemy

0

Program kompiluje się bez błędów, po uruchomieniu, no właśnie, nie uruchamia się:(

0
//#include <iostream> // jak używasz scanfów i malloców to po kiego cout?
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
 
//using namespace std; to do cout'a by;lo potrzebne, teraz już nie

/* // Niema co robić tych deklaracji jeżeli można zwyczajnie przeneść funkcje 
double open_file(FILE*, double**);
float average(int, double**);
float median(int, double**);
*/
 
struct data
  {
   //double s_matrix; // Czy spodziewasz się rozmiaru np -2.5 wiersza i tyle samo kolumn?
   unsigned size,cols;
   //float average; // niema sensu zapisywać tego w strukturze
   //float median; // niema sensu zapisywać tego w strukturze
   //double **matrix; // nie musisz trzymac macierzy jako wduwymiarowej, wewnetrzna reprezentacja może być jedowymiarowa
   double *matrix;
  };

//double open_file(FILE* pFile, double** matrix) // masz wczytać strukturę z pliku, więc podaj nazwę pliku oraz strukturę
struct data read_file(const char *FileName)
  {
   struct data ret; // to będziemy zwracać
   FILE *pFile; // tu deklarujemy bo na zewnątrz nie jest potrzebna
   fpos_t pos;
   //int temp,n , i, j; // nazywaj zmienne z większym sensem
   unsigned i;
   double temp;

   //pFile=fopen("kolos.txt", "r");
   pFile=fopen(FileName,"r");
   fgetpos(pFile,&pos);
   // nie była zainicjalizowana zmienna "n" - zawierala śmiecie
   //while(!feof(pFile)) to zapóznione sprawdzenie
   //  {
   //   fscanf(pFile, "%i", &temp);
   //   n++;
   //  }
   ret.size=0;
   while(fscanf(pFile,"%d",&temp)==1) ++ret.size;
   fsetpos(pFile,&pos);
   ret.cols=(unsigned)sqrt(ret.size);
   ret.matrix=(double*)malloc(sizeof(double*)*ret.size); // tylko jedno przydzielenie potrzebujesz
   //for(i=0; i<n; i++) // preferuj ++i od i++
   //              matrix[i]=(double*)malloc(sizeof(double)*n); // to już nie potrzebne
   //for(i=0; i<n; i++)
   //  {
   //   for(j=0; j<n; j++)
   //                     fscanf(pFile, "%i", &matrix[i][j]); // ma być %f lub %lf
   //  }
   for(i=0;i<ret.size;++i) fscanf(pFile,"%lf",ret.matrix+i); // matrix+i == &matrix[i]
   fclose(pFile);
   return ret; // tu zwracamy całą strukturę
  }
 
//float average(int n, double** matrix) // niema co przekazywać osobno, przekaż całość
double average(struct data *data)
  {
   //     int i, j, Up=0, Down=0; //niepotrzebnie mnożysz zmienne
   //     for(i=0; i<n; i++) // preferuj ++i od i++
   //     {
   //             for(j=0; j<n; j++) // preferuj ++i od i++
   //             {
   //                      Up+=matrix[i][j];
   //              }        
   //     }
   //     Down=i*j;
   //  return Up/Down;
   unsigned i;
   double ret=0;
   for(i=0;i<data->size;++i) ret+=data->matrix[i];
   return ret/data->size;
  }
 
//float median(int n, double** matrix) // niema co przekazywać osobno, przekaż całość
double median(struct data *data)
  {
   // to coś jest bez sensu cokolwiek to liczy - tylko nie medianę
   //     int i, j, k=0, temp;
   //     float median;
 
/*  
        for(i=0; i<n; i++) // preferuj ++i od i++
        {
                for(j=0; j<n; j++) // preferuj ++i od i++
                {
                        if(!((i*j)%2)) // preferuj &1 zamiast %2
                        {
                                if(!n%2) // preferuj &1 zamiast %2
                                {
                                        k++; // preferuj ++i od i++
                                        if((k+1)==n/2) // preferuj n>>1 zamiast n/2
                                                temp=matrix[i][j];
                                        else if(k==n/2) // preferuj n>>1 zamiast n/2
                                        {
                                                median=(*matrix[i]+temp);
                                                median=median/2;  // preferuj n/=2 zamist n=n/2;
                                        }
                                }
                                else if(n%2) // preferuj &1 zamiast %2
                                {
                                        k++;
                                        if(k==(n/2)+1) // preferuj n>>1 zamiast n/2
                                          median=matrix[i][j];
                                }
                        }
                }        
        }
        return median;
*/
   return 0;
  }

void print(struct data *data)
  {
   unsigned i,x;
   for(i=0;i<data->size;printf("\n"))
     {
      for(x=0;x<data->cols;++x,++i)
        {
         printf("%6.1lf",data->matrix[i]);
        }
     }
  }

int main()
  {
   //     int n;
   //     double **matrix;
   //     FILE *pFile;
   data dat;
   
   //  dat.s_matrix=open_file(pFile, matrix);
   dat=read_file("kolos.txt");
   //     cout << dat.s_matrix << endl;
   printf("Rozmiar %d, kolumn %d\n",dat.size,dat.cols);
   //     dat.average=average(n, matrix);
   //     cout << dat.average << endl;
   printf("Srednia wynosi %lf\n",average(&dat));
   //     dat.median=median(n, matrix);
   //     cout << dat.median << endl;
   printf("Mediana wynosi %lf\n",median(&dat));
   //     dat.matrix=matrix;
   //     cout << dat.matrix; // to niczego nie wydrukuje
   print(&dat);
   // fclose(pFile); // zmieanna jest w open_file
   //system("PAUSE"); zamiast tego zatrzymamy środkami języka C
   getchar();
   return 0;
  }
0

Dzięki za pomoc. Mam tylko problem, bo program dobrze czyta rozmiar macierzy, ale nie zczytuje danych z pliku.

0

Pokaż jak u ciebie wygląda plik i pokaz kod którym próbujesz go wczytać.

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

struct dane{
    unsigned rozm, kol;
    double *matrix;
};

struct dane odczyt(const char *FileName)
  {
   struct dane x;
   FILE *pFile;
   fpos_t pos;
   unsigned i;
   double temp;
 
   pFile=fopen(FileName,"r");
   fgetpos(pFile,&pos);
   x.rozm=0;
   while(fscanf(pFile,"%d",&temp)==1)
   ++x.rozm;
   fsetpos(pFile,&pos);
   x.kol=(unsigned)sqrt(x.rozm);
   x.matrix=(double*)malloc(sizeof(double*)*x.rozm);
   for(i=0;i<x.rozm;++i) fscanf(pFile,"%f",x.matrix+i);
   fclose(pFile);
   return x;
  }
 

double srednia(struct dane *dane)
  {
   unsigned i;
   double a=0;
   for(i=0;i<dane->rozm;++i) a+=dane->matrix[i];
   return a/dane->rozm;
  }
/*
float mediana(struct dane *dane)
{
	return 0;
}*/
void print(struct dane *dane)
  {
   unsigned i,j;
   for(i=0;i<dane->rozm;printf("\n"))
     {
      for(j=0;j<dane->kol;++j,++i)
        {
         printf("%f",dane->matrix[i]);
        }
     }
  }
     
     
int main()
  {
   dane d;
 
  
   d=odczyt("k.txt");
   printf("Rozmiar %d\n",d.rozm);
   
   printf("Srednia wynosi %f\n",srednia(&d));
   
   print(&d);
   
   getchar();
   return 0;
  } 
0

Ma ktoś pomysł co jest nie tak?:(

0

Juz wiem co jest nie tak.:)

fsetpos i fgetpos działają niepoprawnie. Zastąpiłem je fseek i wszystko hula:)

Aha. Zrobiłem też mediane. wrzucam, bo może komuś się przyda. Jeszcze raz dziękuje za pomoc:)

 int mediana(struct dane dane)

{

    int *tab;

    int i,j,k=0,temp;

    tab=(int*)malloc(dane.rozm*sizeof(int));

    for(i=0;i<(dane.kol);i++) 

    {

                            for(j=0;j<(dane.kol);j++,k++) 

                            {

                            tab[k]=dane.matrix[i][j];

                            }

   

   }

   

   for (i=0;i<(dane.rozm);i++)

   {

       for (j=0;j<((dane.rozm)-1);j++)

       {

                 if (tab[j]>tab[j+1])

                 {

                                        temp=tab[j+1];

                                        tab[j+1]=tab[j];

                                        tab[j]=temp;

                 }

       }

   }

   if ((dane.rozm)%2==0)

   {

        temp=((tab[dane.rozm/2]+tab[dane.rozm/2+1])/2);

   }

   else

   {

        temp=tab[dane.rozm/2];

   }

   return temp;

}

 
0

Uwierz mi, fsetpos i fgetpos działają poprawnie .

0

zmieniłem jeszcze coś. alokacja jest podojna na int'ach a nie na double, moze to pomoglo.

0

w takim razie co jest nie tak? bo jak ja zmienilem fpos na fseek to wszystko dziala

1

Nie zawsze będą podawane gotwoce na tym forum, ale, że nie miałem nic do roboty, to łap:

main.cpp

//napisz progprogram który odczytuje kwadratowa macierz o nieznanym rozmiarze. dla elementów leżących na parzystym iloczynie indeksów np mac[1][2], mac[2][2] znajduje srednia tych elemetów oraz mediane i je wyswietla
#include "Header1.h"

int main( )
{
	Matrix m;
	m.SetMatrixToFile( "dupa.txt" );
	cout << "Mediana: " << m.GetMedian( ) << endl;

	m.at( 0, 1 ) = 12;
	m.at( 1, 0 ) = 15;

	m.Present( );

	m.GetMatrixFromFile( "dupa.txt" );
	cout << "Mediana: " << m.GetMedian( );

	getchar( );
	getchar( );
	return 0;
}

Header.h

#pragma once
#include <iostream>
#include <fstream>
using namespace std;

class Matrix
{
private:
	double	*m_array;
	int		 m_size;
	int		 m_cols;

public:
	Matrix( );
	Matrix( const Matrix& other );
	~Matrix( );

	void GetMatrixFromFile( const char* fileName );
	void SetMatrixToFile( const char* fileName );

	double GetMedian( );
	double& at( int row, int col );

	void Present( );
};

Source.cpp

#include "Header1.h"

Matrix::Matrix( )
{
	m_array = 0;
}

Matrix::Matrix( const Matrix& other )
{}

Matrix::~Matrix( )
{
	if( m_array )
		delete [] m_array;
}

double& Matrix::at( int row, int col )
{
	return m_array[ row * m_cols + col ];
}

int compare (const void * a, const void * b)
{
  return ( *( double* )a - *( double* )b );
}

double Matrix::GetMedian( )
{
	double *temp = new double[ m_size ];
	copy( m_array, m_array + m_size, temp );

	qsort( ( void * )temp, m_size, sizeof( double ), compare );

	cout << "****************\n";
	for( int i = 0; i < m_size; ++i )
		cout << temp[ i ] << " ";
	cout << "\n****************\n";

	double median;
	if( m_size % 2 )
	{
		median = temp[ m_size / 2 ];
	}
	else
	{
		median = ( temp[ m_size / 2 - 1 ] + temp[ m_size / 2 ] ) / 2;
	}

	delete [] temp;
	return median;
}

void Matrix::GetMatrixFromFile( const char* fileName )
{
	ifstream in ( fileName );

	in >> m_size >> m_cols;

	m_array = new double[ m_size ];

	int i = 0;
	while( in >> m_array[ i++ ] );

	in.close( );
}

void Matrix::SetMatrixToFile( const char* fileName )
{
	ofstream out ( fileName );

	cout << "Ilosc kolumn: ";
	cin >> m_cols;
	
	cout << "Ilosc wierszy: ";
	int rows;
	cin >> rows;

	m_size = rows * m_cols;

	m_array = new double[ m_size ];

	out << m_size << " " << m_cols << "\n";

	for( int i = 0; i < rows; ++i )
		for( int j = 0; j < m_cols; ++j )
			if( ( i * j ) % 2 || ( i == 0 && j == 0 ) )
			{
				cout << "Podaj wartosc dla pola[ " << i << " ][ " << j << " ]: ";
				cin >> at( i, j );
			}
			else
			{
				//Tutaj jakaś średnia której nie zrozumiałem ;]
				at( i, j ) = 0;
			}

	for( int i = 0; i < m_size; ++i )
		out << m_array[ i ] << " ";

	out.close( );
}

void Matrix::Present( )
{
	cout << "****************\n";
	for( int i = 0; i < m_size; ++i )
		cout << m_array[ i ] << " ";
	cout << "\n****************\n";
}

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