Problema C Matrice

Salut, nu prea are legatura ce urmeaza cu webdev-ul dar este ceva “ruda” ( nu de salam ).

Am primit la facultate tema o problema, cerinta suna ceva de genul:
“Se da o matrice de minim 4x4, sa se gaseasca primul maxim si primul minim din matrice, apoi sa se stearga linia si coloana fiecaruia, apoi sa se mai repede inca o data acesti pasi (gasire minim, maxim, stergere)” Ideea e ca trebuie folosit alocarea dinamica si realocarea.

Si vreau o parere, cred ca m-am complicat ‘putin’ la functia de stergere. Si nu prea stiu din punct de vedere a eficientei cum este. :slight_smile:

Code:

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

void print_array(int **array, int n, int m)
{
    printf("------------------------");
    printf("\n");
        
    for ( int i = 0 ; i < n ; i ++ ){
        for ( int j = 0 ; j < m ; j ++ )
            printf ("%d " , array[i][j]);
            printf ("\n");
    }
}

void maximum(int *max, int ***array, int *i_poz_max, int *j_poz_max, int n, int m)
{
    *max = *array[0][0];
    *i_poz_max = 0;
    *j_poz_max = 0;

    for ( int i = 0 ; i < n ; i ++ )
        for ( int j = 0 ; j < m ; j ++ )
            if ( *max < (*array)[i][j] ){
                *max = (*array)[i][j];
                *i_poz_max = i;
                *j_poz_max = j;
            }
}

void minimum(int *min, int ***array, int *i_poz_min, int *j_poz_min, int n, int m)
{
    *min = *array[0][0];
    *i_poz_min = 0;
    *j_poz_min = 0;

    for ( int i = 0 ; i < n ; i ++ )
        for ( int j = 0 ; j < m ; j ++ )
            if ( *min > (*array)[i][j] ){
                *min = (*array)[i][j];
                *i_poz_min = i;
                *j_poz_min = j;
            }
}

int del(int ***array, int *n, int *m, int *i_poz_max, int *j_poz_max, int *i_poz_min, int *j_poz_min)
{	
    //Dif line & dif col
    if ( *i_poz_max != *i_poz_min && *j_poz_max != *j_poz_min ){
        if ( *j_poz_max > *j_poz_min ){

            // - Delete Max col -
            for ( int k = *j_poz_max ; k < *m-1 ; k ++ ){
                for ( int i = 0 ; i < *n ; i ++ )
                    (*array)[i][*j_poz_max] = (*array)[i][*j_poz_max+1];
            *j_poz_max += 1;
            }

            //- Realloc col - 
            *m -= 1 ;
            for ( int i = 0 ; i < *n ; i ++ )
                (*array)[i] = (int*)realloc((*array)[i], (*m) *sizeof(int));

            // - Delete Min col -
            for ( int k = *j_poz_min ; k < *m-1 ; k ++ ){
                for ( int i = 0 ; i < *n ; i ++ )
                    (*array)[i][*j_poz_min] = (*array)[i][*j_poz_min+1];
            *j_poz_min += 1;
            }

            //- Realloc col - 
            *m -= 1 ;
            for ( int i = 0 ; i < *n ; i ++ )
                (*array)[i] = (int*)realloc((*array)[i], (*m) *sizeof(int));
        }

        else{

            // - Delete Min col -
            for ( int k = *j_poz_min ; k < *m-1 ; k ++ ){
                for ( int i = 0 ; i < *n ; i ++ )
                    (*array)[i][*j_poz_min] = (*array)[i][*j_poz_min+1];
            *j_poz_min += 1;
            }

            //- Realloc col - 
            *m -= 1 ;
            for ( int i = 0 ; i < *n ; i ++ )
                (*array)[i] = (int*)realloc((*array)[i], (*m) *sizeof(int));

            // - Delete Max col -
            for ( int k = *j_poz_max ; k < *m-1 ; k ++ ){
                for ( int i = 0 ; i < *n ; i ++ )
                    (*array)[i][*j_poz_max] = (*array)[i][*j_poz_max+1];
            *j_poz_max += 1;
            }

            //- Realloc col - 
            *m -= 1 ;
            for ( int i = 0 ; i < *n ; i ++ )
                (*array)[i] = (int*)realloc((*array)[i], (*m) *sizeof(int));
        }

        if ( *i_poz_max > *i_poz_min ){

            // - Delete Max line- 
            for ( int k = *i_poz_max ; k < * n-1 ; k ++ ){
                for ( int j = 0 ; j < *m ; j ++ )
                    (*array)[*i_poz_max][j] = (*array)[*i_poz_max+1][j];
            *i_poz_max += 1;
            }

            // - Realloc line -
            *n -= 1 ;
            (*array) = (int**)realloc((*array), (*n) *sizeof(int*));

            // - Delete Min line -
            for ( int k = *i_poz_min ; k < * n-1 ; k ++ ){
                for ( int j = 0 ; j < *m ; j ++ )
                    (*array)[*i_poz_min][j] = (*array)[*i_poz_min+1][j];
            *i_poz_min += 1;
            }

            // - Realloc line -
            *n -= 1 ;
            (*array) = (int**)realloc((*array), (*n) *sizeof(int*));

        }

        else{

            // - Delete Min line -
            for ( int k = *i_poz_min ; k < * n-1 ; k ++ ){
                for ( int j = 0 ; j < *m ; j ++ )
                    (*array)[*i_poz_min][j] = (*array)[*i_poz_min+1][j];
            *i_poz_min += 1;
            }

            // - Realloc line -
            *n -= 1 ;
            (*array) = (int**)realloc((*array), (*n) *sizeof(int*));

            // - Delete Max line- 
            for ( int k = *i_poz_max ; k < * n-1 ; k ++ ){
                for ( int j = 0 ; j < *m ; j ++ )
                    (*array)[*i_poz_max][j] = (*array)[*i_poz_max+1][j];
            *i_poz_max += 1;
            }

            // - Realloc line -
            *n -= 1 ;
            (*array) = (int**)realloc((*array), (*n) *sizeof(int*));
        }

        return 0;
    }

    //Same line & dif col
    if ( *i_poz_max == *i_poz_min && *j_poz_max != *j_poz_min ){

        // - Delete same line - 
        for ( int k = *i_poz_max ; k < *n-1 ; k ++ ){
            for ( int j = 0 ; j < *m ; j ++ )
                (*array)[*i_poz_max][j] = (*array)[*i_poz_max+1][j];
        *i_poz_max += 1;
        }

        // - Realloc line -
        *n -= 1 ;
        (*array) = (int**)realloc((*array), (*n) *sizeof(int*));

        
        if ( *j_poz_max > *j_poz_min ){

            // - Delete Max col -
            for ( int k = *j_poz_max ; k < *m-1 ; k ++ ){
                for ( int i = 0 ; i < *n ; i ++ )
                    (*array)[i][*j_poz_max] = (*array)[i][*j_poz_max+1];
            *j_poz_max += 1;
            }

            //- Realloc col - 
            *m -= 1 ;
            for ( int i = 0 ; i < *n ; i ++ )
                (*array)[i] = (int*)realloc((*array)[i], (*m) *sizeof(int));

            // - Delete Min col -
            for ( int k = *j_poz_min ; k < *m-1 ; k ++ ){
                for ( int i = 0 ; i < *n ; i ++ )
                    (*array)[i][*j_poz_min] = (*array)[i][*j_poz_min+1];
            *j_poz_min += 1;
            }

            //- Realloc col - 
            *m -= 1 ;
            for ( int i = 0 ; i < *n ; i ++ )
                (*array)[i] = (int*)realloc((*array)[i], (*m) *sizeof(int));
        }

        else{

            // - Delete Min col -
            for ( int k = *j_poz_min ; k < *m-1 ; k ++ ){
                for ( int i = 0 ; i < *n ; i ++ )
                    (*array)[i][*j_poz_min] = (*array)[i][*j_poz_min+1];
            *j_poz_min += 1;
            }

            //- Realloc col - 
            *m -= 1 ;
            for ( int i = 0 ; i < *n ; i ++ )
                (*array)[i] = (int*)realloc((*array)[i], (*m) *sizeof(int));

            // - Delete Max col -
            for ( int k = *j_poz_max ; k < *m-1 ; k ++ ){
                for ( int i = 0 ; i < *n ; i ++ )
                    (*array)[i][*j_poz_max] = (*array)[i][*j_poz_max+1];
            *j_poz_max += 1;
            }

            //- Realloc col - 
            *m -= 1 ;
            for ( int i = 0 ; i < *n ; i ++ )
                (*array)[i] = (int*)realloc((*array)[i], (*m) *sizeof(int));
        }

        return 0;

    }
    
    // Same col & dif line
    if( *j_poz_max == *j_poz_min && *i_poz_max != *i_poz_min){

        // - Delete Same col -
        for ( int k = *j_poz_max ; k < *m-1 ; k ++ ){
            for ( int i = 0 ; i < *n ; i ++ )
                (*array)[i][*j_poz_max] = (*array)[i][*j_poz_max+1];
        *j_poz_max += 1;
        }

        //- Realloc col - 
        *m -= 1 ;
        for ( int i = 0 ; i < *n ; i ++ )
            (*array)[i] = (int*)realloc((*array)[i], (*m) *sizeof(int));

        if ( *i_poz_max > *i_poz_min ){

            // - Delete Max line- 
            for ( int k = *i_poz_max ; k < * n-1 ; k ++ ){
                for ( int j = 0 ; j < *m ; j ++ )
                    (*array)[*i_poz_max][j] = (*array)[*i_poz_max+1][j];
            *i_poz_max += 1;
            }

            // - Realloc line -
            *n -= 1 ;
            (*array) = (int**)realloc((*array), (*n) *sizeof(int*));

            // - Delete Min line -
            for ( int k = *i_poz_min ; k < * n-1 ; k ++ ){
                for ( int j = 0 ; j < *m ; j ++ )
                    (*array)[*i_poz_min][j] = (*array)[*i_poz_min+1][j];
            *i_poz_min += 1;
            }

            // - Realloc line -
            *n -= 1 ;
            (*array) = (int**)realloc((*array), (*n) *sizeof(int*));

        }

        else{

            // - Delete Min line -
            for ( int k = *i_poz_min ; k < * n-1 ; k ++ ){
                for ( int j = 0 ; j < *m ; j ++ )
                    (*array)[*i_poz_min][j] = (*array)[*i_poz_min+1][j];
            *i_poz_min += 1;
            }

            // - Realloc line -
            *n -= 1 ;
            (*array) = (int**)realloc((*array), (*n) *sizeof(int*));

            // - Delete Max line- 
            for ( int k = *i_poz_max ; k < * n-1 ; k ++ ){
                for ( int j = 0 ; j < *m ; j ++ )
                    (*array)[*i_poz_max][j] = (*array)[*i_poz_max+1][j];
            *i_poz_max += 1;
            }

            // - Realloc line -
            *n -= 1 ;
            (*array) = (int**)realloc((*array), (*n) *sizeof(int*));
        }

        return 0;
    }

}


void main()
{
    int **array;
    int n, m, i, j;
    int max, min;
    int i_poz_max, j_poz_max;
    int i_poz_min, j_poz_min;


    printf ("Introduceti numarul de linii = ");
    scanf ("%d" , &n);

    printf ("Introduceti numarul de coloane = ");
    scanf ("%d" , &m);

    array = (int**)malloc(n * sizeof(int*));
    for ( i = 0 ; i < n ; i ++ )
        array[i] = (int*)malloc(m * sizeof(int));

    printf ("Introduceti elementele matricii \n");

    for ( i = 0 ; i < n ; i ++ )
        for ( j = 0 ; j < m ; j ++ )
            scanf ("%d" , &array[i][j]);

    maximum(&max, &array, &i_poz_max, &j_poz_max, n, m);
    minimum(&min, &array, &i_poz_min, &j_poz_min, n, m);
    del(&array, &n, &m, &i_poz_max, &j_poz_max, &i_poz_min, &j_poz_min);
    print_array(array, n, m);
    maximum(&max, &array, &i_poz_max, &j_poz_max, n, m);
    minimum(&min, &array, &i_poz_min, &j_poz_min, n, m);
    del(&array, &n, &m, &i_poz_max, &j_poz_max, &i_poz_min, &j_poz_min);
    print_array(array, n, m);

    for( int i = 0 ; i < n ; i ++ )
        free ( array[i] );
    free ( array );

}

Și eu cred că te-ai complicat mult prea tare la funcția de ștergere, de eficiență îmi e greu să vorbesc, deoarece îmi e greu să urmăresc toate if-urile alea cu atâtea i_poz_min i_poz_max etc etc, te felicit pentru ambiție :laughing:. Trebuia să continui cu “spartul” problemei în probleme mai mici ca și cum ai făcut cu minimum și maximum, trebuia să faci la fel și cu funcția aceea de ștergere. Este mult prea lungă și poate că unele chestii se repetă (am zis poate pentru că nu m-am uitat peste ea prea mult).

Legat de codul tău, vreau să-ți spun doar să fii atent cu indentările și acoladele. Văd că-ți place să nu pui acolade dacă este doar o înstrucțiune, dar atunci indentează măcar frumos codul:

for ( int i = 0 ; i < n ; i ++ ){
    for ( int j = 0 ; j < m ; j ++ )
        printf ("%d " , array[i][j]);
        printf ("\n"); //asta face parte din a doua bucla? 
}

        //alt exemplu
        for ( int k = *j_poz_max ; k < *m-1 ; k ++ ){
            for ( int i = 0 ; i < *n ; i ++ )
                (*array)[i][*j_poz_max] = (*array)[i][*j_poz_max+1];
        *j_poz_max += 1;
        }

Deci, eu cred că așa ar trebui să arate:

  • find_minim
  • find_maxim
  • delete_row
  • delete_column
  • search_and_delete - aici combinăm cele 4 funcții de mai sus, și facem o verificare dacă minimul și maximul au coloane / rânduri comune ca să știm ce ștergem.

Și rezolvarea mea aici:

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

void delete_column(int **matrix, int *n, int *m, int column) {
    int i, j;

    for(i = 0; i < (*n); i++) {
        for(j = column; j < (*m) - 1; j++) {
            matrix[i][j] = matrix[i][j + 1];
        }
        matrix[i] = realloc(matrix[i], ((*m) - 1) * sizeof(int));
    }
    *m = *m - 1;
}

void delete_row(int **matrix, int *n, int *m, int row) {
    int i, j;

    for(i = row; i < (*n) - 1; i++) {
        matrix[i] = matrix[i + 1];
    }
    matrix = realloc(matrix, ((*n) - 1) * sizeof(int*));

    *n = *n - 1;
}

void find_min(int **matrix, int n, int m, int *min_i, int *min_j) {
    int i, j;
    *min_i = 0;
    *min_j = 0;
    int min = matrix[0][0];
    for(i = 0; i <  n; i++) {
        for(j = 0; j < m; j++) {
            if(matrix[i][j] < min) {
                min = matrix[i][j];
                *min_i = i;
                *min_j = j;
            }
        }
    }
}

void find_max(int **matrix, int n, int m, int *max_i, int *max_j) {
    int i, j;
    *max_i = 0;
    *max_j = 0;
    int max = matrix[0][0];
    for(i = 0; i <  n; i++) {
        for(j = 0; j < m; j++) {
            if(matrix[i][j] > max) {
                max = matrix[i][j];
                *max_i = i;
                *max_j = j;
            }
        }
    }
}


void search_and_delete(int **matrix, int *n, int *m) {
    int min_i, min_j, max_i, max_j;

    find_min(matrix, *n, *m, &min_i, &min_j);
    find_max(matrix, *n, *m, &max_i, &max_j);

    printf("Minimul este: %d \n", matrix[min_i][min_j]);
    printf("Maximul este: %d \n", matrix[max_i][max_j]);


    delete_row(matrix, n, m, min_i);
    //daca sunt row-uri diferite
    if(min_i != max_i) {
        //daca rowul deja sters este mai mic ca si cel care trebuie sters, atunci il reducem cu 1
        //pentru ca matricea a fost redimensionata deja
        if(min_i < max_i) {
            max_i--;
        }
        delete_row(matrix, n, m, max_i);
    }

    delete_column(matrix, n, m, min_j);
    if(min_j != max_j) {
        if(min_j < max_j) {
            max_j--;
        }
        delete_column(matrix, n, m, max_j);
    }
}

void read_matrix(int ***matrix, int *n, int *m) {
    int i, j;

    printf("linii = ");
    scanf("%d", n);

    printf("coloane = ");
    scanf("%d", m);

    *matrix = (int**) malloc(*n * sizeof(int*));
    for(i = 0; i < *n; i++) {
        (*matrix)[i] = (int*) malloc(*m * sizeof(int));
    }

    printf("elementele: \n");

    for(i = 0; i < *n; i++) {
        for(j = 0; j < *m; j++) {
            scanf("%d", &(*matrix)[i][j]);
        }
    }
}

void print_matrix(int **matrix, int n, int m) {
    printf("\nMatrix is: \n");
    int i, j;

    for(i = 0; i < n; i++) {
        for(j = 0; j < m; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}


int main()
{
    int **matrix;
    int n, m;

    read_matrix(&matrix, &n, &m);
    print_matrix(matrix, n, m);

    search_and_delete(matrix, &n, &m);
    print_matrix(matrix, n, m);

    search_and_delete(matrix, &n, &m);
    print_matrix(matrix, n, m);

    int i;
    for(i = 0; i < n; i++) {
        free(matrix[i]);
    }
    free(matrix);

    return 0;
}

Ha
Eu m-am chinuit 3 ore si tu ai reusit mult mai eficient in 10 minute :wink: .
Esti tare, multumesc de ajutor, cred ca am sa refac problema, dar nu cred ca mai am timp, maine trebuie s-o predau si imediat plec la munca.

Oricum iti multumesc, initial eu am pornit sa fac o problema asemanatoare pentru ca nu intelesesem bine cerinta. Ea arata asa:

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

void print_array(int **array, int n, int m)
{
	printf("------------------------");
	printf("\n");
		
	for ( int i = 0 ; i < n ; i ++ ){
		for ( int j = 0 ; j < m ; j ++ )
			printf ("%d " , array[i][j]);
			printf ("\n");
	}
}

void maximum(int *max, int ***array, int *i_poz, int *j_poz, int n, int m)
{
	*max = *array[0][0];
	*i_poz = 0;
	*j_poz = 0;

	for ( int i = 0 ; i < n ; i ++ )
		for ( int j = 0 ; j < m ; j ++ )
			if ( *max < (*array)[i][j] ){
				*max = (*array)[i][j];
				*i_poz = i;
				*j_poz = j;
			}
}

void minimum(int *min, int ***array, int *i_poz, int *j_poz, int n, int m)
{
	*min = *array[0][0];
	*i_poz = 0;
	*j_poz = 0;

	for ( int i = 0 ; i < n ; i ++ )
		for ( int j = 0 ; j < m ; j ++ )
			if ( *min > (*array)[i][j] ){
				*min = (*array)[i][j];
				*i_poz = i;
				*j_poz = j;
			}
}

void del(int ***array, int *n, int *m, int *i_poz, int *j_poz)
{
	/* - Delete col - */
	for ( int k = *j_poz ; k < *m-1 ; k ++ ){
		for ( int i = 0 ; i < *n ; i ++ )
				(*array)[i][*j_poz] = (*array)[i][*j_poz+1];
	*j_poz += 1;
	}

	/* - Realloc col - */
	*m -= 1 ;
	for ( int i = 0 ; i < *n ; i ++ )
		(*array)[i] = (int*)realloc((*array)[i], (*m) *sizeof(int));

	/* - Delete line - */
	for ( int k = *i_poz ; k < * n-1 ; k ++ ){
		for ( int j = 0 ; j < *m ; j ++ )
			(*array)[*i_poz][j] = (*array)[*i_poz+1][j];
	*i_poz += 1;
	}

	/* - Realloc line - */
	*n -= 1 ;
		(*array) = (int**)realloc((*array), (*n) *sizeof(int*));
}


void main()
{
	int **array;
	int n, m, i, j;
	int max, min;
	int i_poz, j_poz;


	printf ("Introduceti numarul de linii = ");
	scanf ("%d" , &n);

	printf ("Introduceti numarul de coloane = ");
	scanf ("%d" , &m);

	array = (int**)malloc(n * sizeof(int*));
	for ( i = 0 ; i < n ; i ++ )
		array[i] = (int*)malloc(m * sizeof(int));

	printf ("Introduceti elementele matricii \n");

	for ( i = 0 ; i < n ; i ++ )
		for ( j = 0 ; j < m ; j ++ )
			scanf ("%d" , &array[i][j]);

	maximum(&max, &array, &i_poz, &j_poz, n, m);
	del(&array, &n, &m, &i_poz, &j_poz);
	print_array(array, n, m);

	minimum(&min, &array, &i_poz, &j_poz, n, m);
	del(&array, &n, &m, &i_poz, &j_poz);
	print_array(array, n, m);
	
}

De la aceasta am modificar numai functia de stergere.

Revin cu a 2 a problema, poate ma poti ajuta

Cerinta:
Se da un sir cu numere reale, sa se puna intr-un alt sir numerele cu partea fractionara cea mai mica si in altul cu partea fractionara cea mai mare.

Am facut o mica functie care afla partea intreaga, dar problema este dupa ce afla minimul si maximul.
Am folosit acel debug si am vazut ca in unele momente din 5.22 face partea intreaga 0.2200000006 in alte rulari 0.220000000001 si asa valoarea din max/min este diferita de cea din momentul comparatiei.

Am cautat pe net functia pentru asa ceva si am gasit modf(), dar tot asa face.
Ai idee cum as putea rezolva?

Arata asa:

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

void fract(float x, float *fract_part)
{
	*fract_part = x - (int)x;
}


void main()
{
	float *queue, *queue_max, *queue_min, max, min, fract_part;
	int n, max_n = 0, min_n = 0;

	printf("Lungimea cozii = ");
	scanf("%d" , &n);

	queue = (float*)malloc(n * sizeof(float));
	for ( int i = 0 ; i < n ; i ++ )
		scanf("%f" , &queue[i]);
	 
	fract(queue[0], &fract_part);
	max = fract_part;
	min = fract_part;

	for ( int i = 1 ; i < n ; i ++ ){
		fract(queue[i], &fract_part);
		if ( max < fract_part )
			max = fract_part;

		if ( min > fract_part )
			min = fract_part;
	}

	for ( int i = 0 ; i < n ; i ++ ){
		fract(queue[i], &fract_part);
		if ( max == fract_part ){
			max_n++;
		}

		if ( min == fract_part ){
			min_n++;
		}

	}

	queue_max = (float*)malloc(max_n * sizeof(float));
	queue_min = (float*)malloc(min_n * sizeof(float));

	int w = 0;
	int v = 0;

	for ( int i = 0 ; i < n ; i ++ ){
		fract(queue[i], &fract_part);
		if ( max == fract_part ){
			queue_max[w] = queue[i];
			w++;
		}
		if ( min == fract_part ){
			queue_min[v] = queue[i];
			v++;
		}
	}
	
	printf("------------------------- \n");
	printf("Coada principala = "); 
	for ( int i = 0 ; i < n ; i ++ )
		printf("%.2f ", queue[i]);
	printf("\n");

	printf("Coada maximului = "); 
	for ( int i = 0 ; i < max_n ; i ++ )
		printf("%.2f ", queue_max[i]);
	printf("\n");

	printf("Coada minimului = "); 
	for ( int i = 0 ; i < min_n ; i ++ )
		printf("%.2f ", queue_min[i]);
	printf("\n");

}

include math.h ca sa poti face comparatii corecte?

Disclaimer: n-am mai scris C din facultate.

Salut,
eu am scos:
int i,
int j,
int k,
…din loop si leam declarat in afara LOOP-ului si am inclus math.h.
De asemenea am inlocuit:
void main cu int main si am adaugat return 0;, iar programul ruleaza la mine.
Eu sunt incepator in C, poate “la mine ruleaza”, nu inseamna rezolvarea care o astepti, insa programul functioneaza.
cam asa arata:

Lungimea cozii = 5
2
7
2
4
4

Coada principala = 2.00 7.00 2.00 4.00 4.00
Coada maximului = 2.00 7.00 2.00 4.00 4.00
Coada minimului = 2.00 7.00 2.00 4.00 4.00

Nu stiu daca asa ar trebui sa fie,
.
L.E:
acum observ ca daca adaugi -std=c99 la compilare merge si fara sa faci acele modificari.
Toate bune.

Sunt numere cu virgula

Incearca asa
5
2.44 6.32 7.44 9.21 0.32

trebuie sa afiseze asa:

Coada principala = 2.44 6.32 7.44 9.41 0.32
Coada maximului = 2.44 7.44
Coada minimului = 6.32 0.32

Dar nu afiseaza asa, daca introduci aceleasi valori de mai multe ori e posibil sa primesti rezultate diferite

De ce? Pai can face partea frac el ia 0.44 din 2.44 dar el n proximeaza la 2 zecimale
In memorie variaza valoarea 0.440000001 sau 0.44000000002, asa am vazut cand am facut Debug.

In C partea zecimala in baza 10 nu poate fi reprezentata foarte exact, deoarece cand se reprezinta in baza 2, poate sa fie un numar irational. De aia se cauta egalitatea pana la un anumit ordin de marime. un anumit numar de zecimale exacte.

La link-ul de mai sus este o rutina care ajuta in aceasta problema

#include <ieee754.h>

int flt_equals(float a, float b, int sigfigs)
{
union ieee754_float *pa, *pb;
unsigned int aexp, bexp;
float sig_mag;

if (a == b)
    return 1;
pa = (union ieee754_float*)&a;
pb = (union ieee754_float*)&b;
aexp = pa->ieee.exponent;
bexp = pb->ieee.exponent;
if (aexp != bexp || pa->ieee.negative != pb->ieee.negative)
    return 0;
pa->ieee.exponent = pb->ieee.exponent = IEEE754_FLOAT_BIAS;
sig_mag = pow(10, -(float)sigfigs);
if (fabs(a-b) < sig_mag/2)
    return 1;
return 0;

}
Sper sa iti fie de ajutor. Eu nu m-am mai uitat pe cod C de vreo 15 ani… dar stiu ca de probleme legate de rotunjire m-am lovit si in PHP. In PHP am rezolvat simplu. Am rotunjit la cate zecimale am avut nevoie, insa inainte de a rotunji, am hacuit prin cast la string.
Pe tine, probabil ca te va ajuta mai mult articolul ala si studiul problemei mai in detaliu.

Din cate vad, totusi, tu citesti numerele alea de la tastatura. Ai putea sa le citesti caracter cu caracter si sa validezi ca-s numere. Ca poate unul iti baga litere sau alte simboluri.
Vei avea practic cate un string pe care-l spargi dupa punct in doua stringuri. Unul e partea intreaga, altul e partea fractionara.
Salvezi ciorba asta intr-un struct. Apoi sortezi array-ul de struct dupa partea fractionara. Apoi iti tiparesti ce si cum ai nevoie.
Ideea e ca in felul asta lucrezi cu string, nu cu float. Cand sortezi, sortezi CHAR, sau INT, nu float, iar in felul asta scapi de problemele de rotunjire.

Imi poate spune si mie cineva de e gresit in citirea asta din fisier?
Asa treburi cimplicate sunt in C… in C++ din 2 comenzi era gata

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

void main()
{ 
	int **matrice, n, m;
	FILE *fisier ;

	fscanf(fisier , "%d %d", &n , &m);
	fisier = fopen("Reource Files/fisier.txt", "r");
	matrice = (int**)malloc(n* sizeof(int*));
	for ( int i = 0 ; i < n ; i ++ )
		matrice[i] = (int*)malloc(m * sizeof(int));


	for ( int i = 0 ; i < n ; i ++ )
		for ( int j = 0 ; j < m ; j ++ )
			fscanf(fisier, "%d" , &matrice[i][j]);

	for ( int i = 0 ; i < n ; i ++ ){
		for ( int j = 0 ; j < m ; j ++ )
			printf("%d " , matrice[i][j]);
	printf("\n");
	}

	fclose(fisier);
}

Nu am timp să mă uit și să încerc pentru că sunt pe fugă, dar, vezi să deschizi prima data fișierul apoi să citești din el, nu invers.

fscanf(fisier , "%d %d", &n , &m);
fisier = fopen("Reource Files/fisier.txt", "r");

Ai grijă că în C(nu știu până la ce versiune), declararea de variabile în for nu se poate:

for ( int i = 0 ; i < n ; i ++ )
//trebuie
int i;
for(i = 0; i < n; i++) 

Asta a fost ce mi-a sărit în ochi așa la prima vedere, mai verifică și tu codul

Nici asa :slight_smile:

Ai reușit? Verifică pas cu pas unde întâmpini problema, sunt 20 de linii de cod, poți să iei pas cu pas, linie cu linie să vezi unde este problema?

Nu-ți deschide fișierul? De ce nu-ți deschide fișierul?
Nu-ți citeste? Nu-ți printează? Nu-ți alocă memorie? Pune mesaje, printf peste tot.

Ți-am specificat în primul reply să ai mare atenție la indentări deoarece o să te încurci la un moment dat, vorbesc despre for-ul acesta:

for ( int i = 0 ; i < n ; i ++ ){
	for ( int j = 0 ; j < m ; j ++ )
		printf("%d " , matrice[i][j]);
printf("\n"); /*trebuie sa fie la acelasi nivel cu for */
            /*nu este asa grav, dar este bine sa nu-ti formezi un obicei urat */
}

Încearcă programul acesta, care la fiecare pas are un mesaj, vezi până unde îți merge, vezi ce eroare îți dă :smile: :
(programul funcționează, este testat)

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

int main()
{
    int **matrice, n, m;
    int i, j;
    FILE *fisier ;


    printf("Incerc sa deschid fisierul \n");
    fisier = fopen("fisier.txt", "r");

    if(fisier == NULL) {
        printf("Eroare la fisier: %s! \n", strerror(errno));
        fflush(stdout);
        exit(1);
    }

    printf("Incer sa citesc din fisier \n");
    fscanf(fisier , "%d %d", &n , &m);
    printf("Am citit: n= %d m= %d \n\n", n, m);

    printf("Aloc matricea \n");
    matrice = (int**)malloc(n* sizeof(int*));
    for (i = 0 ; i < n ; i ++ )
        matrice[i] = (int*)malloc(m * sizeof(int));


    printf("Citesc matricea \n");
    for (i = 0 ; i < n ; i ++ )
        for (j = 0 ; j < m ; j ++ )
            fscanf(fisier, "%d" , &matrice[i][j]);

    printf("Matricea este: \n");
    for (i = 0 ; i < n ; i ++ ){
        for (j = 0 ; j < m ; j ++ ) {
            printf("%d " , matrice[i][j]);
        }
        printf("\n");
    }

    fclose(fisier);

    return 0;
}

Da am reusit, scuze ca nu am postat. E putin ciudata citirea din fisier in C.

Cand rulezi trebuie sa “citesti numele fisierului” si el automat cauta acel fisier in Resource Files.

La mine arata asa:

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

int par(int x)
{
	if ( x % 2 == 0 )
		return 1;
	return 0;
}

void main()
{
	FILE *fisier1, *fisier2;
	char nume[255];
	int n1, **matrice1;
	int n2, **matrice2;
	int count_matrice1 = 0, count_matrice2 = 0 ;

	gets(nume);
	if(!(fisier1=fopen(nume,"r")))
		printf("eroare la deschidere");
	else
	{
		fscanf(fisier1,"%d", &n1);
		matrice1 = (int**)malloc(n1*sizeof(int*));
		for ( int i = 0 ; i < n1 ; i ++ )
			matrice1[i]=(int*)malloc(n1*sizeof(int));

		for ( int i = 0 ; i < n1 ; i ++ )
			for ( int j = 0 ; j < n1 ; j ++ )
				fscanf(fisier1,"%d",&matrice1[i][j]);
	}

fclose(fisier1);


gets(nume);
	if(!(fisier2=fopen(nume,"r")))
		printf("eroare la deschidere");
	else
	{
		fscanf(fisier2,"%d", &n2);
		matrice2 = (int**)malloc(n2*sizeof(int*));
		for ( int i = 0 ; i < n2 ; i ++ )
			matrice2[i]=(int*)malloc(n2*sizeof(int));

		for ( int i = 0 ; i < n2 ; i ++ )
			for ( int j = 0 ; j < n2 ; j ++ )
				fscanf(fisier2,"%d",&matrice2[i][j]);
	}

fclose(fisier2);

	for ( int i = 0 ; i < n1 ; i ++ )
			for ( int j = 0 ; j < n1 ; j ++ )
				if ( i % 2== 0 && par(matrice1[i][j]) == 1 )
					count_matrice1++;

	for ( int i = 0 ; i < n2 ; i ++ )
			for ( int j = 0 ; j < n2 ; j ++ )
				if ( i % 2== 0 && par(matrice2[i][j]) == 1 )
					count_matrice2++;

	if (count_matrice1 > count_matrice2)
		printf("Matricea 1 are mai multe elemente pare");
	else
		if ( count_matrice1 < count_matrice2)
			printf("Matricea 2 are mai multe elemente pare");
		else
			if ( count_matrice1 == count_matrice2)
			printf("Matricile 1 si 2 au acelasi numar de elemente pare");
}