Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα σας,

στο παρακάτω κομμάτι κώδικα στην εύρεση του μέσου όρου τιμών των σταθμών Μ σε Ν ημέρες εάν ο πίνακάς μου α[Μ][Ν] είναι μεγαλύτερος απο 3χ4 μου κρασάρει . Επίσης, στην τελευταία printf πώς θα μπορούσα να προσδιορίσω τον συγκεκριμένο σταθμό του οποίου η τιμή είναι μέγιστη?

Κάθε άποψη ευπρόσδεκτη

Σας ευχαριστώ...

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

main()
{
	int i=0,j=0;
	int M,N;
	int avg;
	float min,max;
	printf("Dwste arithmo stathmon parakolouthisis:\n");
	scanf("%d",&M);
	printf("Dwste to plithos apo tis meres parakolouthisis:\n");
	scanf("%d",&N);
	
	int a[M][N];
	float b[M];

	/*Arxikopoihsh me tyxaioys arithmoys*/
	srand(time(NULL));
	
	for(i=0;i<M;i++)
    	for(j=0;j<N;j++)
    	a[i][j]=40+rand()%211;
    
	/*Ektypwsh pinaka*/
        printf("Ektypwsi pinaka:\n\n");	
        for(i=0;i<M;i++)	
    	   {
          for(j=0;j<N-1;j++)	
    	     printf("%d\t",a[i][j]);
    	     printf("%d",a[i][N-1]);
	      printf("\n");		
	  }	

    	printf("\n");
    	
    /* 1. Mesos oros grammwn tou pinaka*/   
    for(i=0;i<M;i++)
    {
    	for(j=0;j<N;j++)
	    {
		b[i]+=a[i][j];
	    }
    }
    
    printf("Oi meses times metrisewn gia kathe stathmo parakolouthisis einai:\n");
    for(i=0;i<M;i++)
      {
	   b[i]/=N;
	   printf("\n %dos stathmos: %0.2f\t",i+1,b[i]);
      }	
	
	/* 2. Emfanish megalyteris mesis timis metrisewn*/
	printf("\n\n");
	min=max=b[0];
	for(i=0;i<M;i++)
	{
		if(b[i]<min)
			min=b[i];
		if(b[i]>max)
			max=b[i];
	}	
	printf("o %dos stathmos paroysiase th megalyteri mesh timh %0.2f metrisewn",a[i],max);	
	
}   
 
Δημοσ.

Όταν ξεκινάει το πρόγραμμά σου, τι μέγεθος έχει ο πίνακας a και ο πίνακας b;

τον a[Μ][Ν] τον δίνει ο χρήστης και ο b[Μ] είναι οι γραμμές του πρώτου.

  • Moderators
Δημοσ.

Ναι, εγώ άλλο σε ρώτησα. Όταν ο compiler πάει να σου φτιάξει το πρόγραμμα, ξέρει τι μέγεθος είναι αυτοί οι δύο πίνακες; Η απάντηση είναι όχι, και το πρόβλημα που έχεις είναι ότι πρέπει να ξέρει. Αν θες να φτιάξεις δυναμικό πίνακα (με μέγεθος, δηλαδή, που θα αλλάζει κατά την εκτέλεση του προγράμματός σου) πρέπει να χρησιμοποιήσεις τη malloc. Αυτό που θες γίνεται κάπως έτσι:

 

 

int** a;
float* b;
int i;
 
// Διάβασμα M και Ν
 
a = malloc(M * sizeof(int*));
b = malloc(M * sizeof(float));
 
for (i = 0; i < M; i++)
{
    a[i] = malloc(N * sizeof(int));
}
Δημοσ.

 

Ναι, εγώ άλλο σε ρώτησα. Όταν ο compiler πάει να σου φτιάξει το πρόγραμμα, ξέρει τι μέγεθος είναι αυτοί οι δύο πίνακες; Η απάντηση είναι όχι, και το πρόβλημα που έχεις είναι ότι πρέπει να ξέρει. Αν θες να φτιάξεις δυναμικό πίνακα (με μέγεθος, δηλαδή, που θα αλλάζει κατά την εκτέλεση του προγράμματός σου) πρέπει να χρησιμοποιήσεις τη malloc. Αυτό που θες γίνεται κάπως έτσι:

int** a;
float* b;
int i;
 
// Διάβασμα M και Ν
 
a = malloc(M * sizeof(int*));
b = malloc(M * sizeof(float));
 
for (i = 0; i < M; i++)
{
    a[i] = malloc(N * sizeof(int));
}

Τη malloc δεν την έχουμε μάθει ακόμα θα μπορούσα ίσως να δηλώσω ως define size1 100 και size2 100 αλλα αυτό θα έλυνε το πρόβλημα που έχω?

Kercyn αλλάζοντας το πρόγραμμα με define δούλεψε όπως πολύ σωστά είπες το πρόβλημα ήταν στο ότι δεν είχα ορίσει μέγεθος αρχικά.

Στο δεύτερο ερώτημά μου μήπως μπορείς να μου δώσεις και εκεί τα φώτα σου?

Σε ευχαριστώ

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SIZE1 100
#define SIZE2 100

main()
{
	int i=0,j=0;
	int a[SIZE1][SIZE2];
	float b[SIZE1];
	int M,N;
	float min,max;
	printf("Dwste arithmo stathmon parakolouthisis:\n");
	scanf("%d",&M);
	printf("Dwste to plithos apo tis meres parakolouthisis:\n");
	scanf("%d",&N);
	
	
	/*Arxikopoihsh me tyxaioys arithmoys*/
	srand(time(NULL));
	
	for(i=0;i<M;i++)
    	for(j=0;j<N;j++)
    	a[i][j]=40+rand()%211;
    
	/*Ektypwsh pinaka*/
    printf("Ektypwsi pinaka:\n\n");	
    for(i=0;i<M;i++)	
    	{
    		for(j=0;j<N-1;j++)	
    			printf("%d\t",a[i][j]);
    			printf("%d",a[i][N-1]);
			   	printf("\n");		
		}	
    	printf("\n");
    	
    /* 1. Mesos oros grammwn tou pinaka*/   
    b[i]=0;
    for(i=0;i<M;i++)
    {
    	for(j=0;j<N;j++)
	    {
		b[i]+=a[i][j];
	    }
    }
    
    printf("Oi meses times metrisewn gia kathe stathmo parakolouthisis einai:\n");
    for(i=0;i<M;i++)
      {
	   b[i]/=N;
	   printf("\n %dos stathmos: %0.2f\t",i+1,b[i]);
      }	
	
	/* 2. Emfanish megalyteris mesis timis metrisewn*/
	printf("\n\n");
	min=max=b[0];
	for(i=0;i<M;i++)
	{
		if(b[i]<min)
			min=b[i];
		if(b[i]>max)
			max=b[i];
	}	
	printf("o %dos stathmos paroysiase th megalyteri mesh timh %0.2f metrisewn",a[i],max);	
	
}   
Δημοσ.

Κάνε compile με υποστήριξη C99 αν θες να κάνει compile σωστά έτσι όπως ήταν αρχικά, με τις μεταβλητές για μεγέθη δλδ.

http://www.geeksforgeeks.org/variable-length-arrays-in-c-and-c/

 

Επίσης, λίγο άσχετο αλλά, η main πρέπει να επιστρέφει int. Αυτό το στυλ του να μη δίνεις καθόλου τύπους στη συνάρτηση είναι πολύ παλιό και καλό θα ήταν να μη το χρησιμοποιείς καθόλου. Για την C συγκεκριμένα, έχεις δύο standard συντάξεις της main:

 

int main(void)
int main(int argc, char* argv[])

και πρέπει πάντα στο τέλος να επιστρέφει κάτι. Το μηδέν σημαίνει ότι το πρόγραμμα έτρεξε επιτυχώς ενώ οποιαδήποτε άλλη τιμή σημαίνει ότι υπήρξε κάποιο λάθος. Για παράδειγμα:

 

#include <stdio.h>
 
int main(void)
{
    int n;
 
    printf("Give an integer: ");
    if (scanf("%d", &n) != 1) {
        printf("Something terrible happened!\n");
        return 1;
    }
 
    printf("You gave %d\n", n);
    return 0;
}
Δημοσ. (επεξεργασμένο)

Τόση ώρα δε το έβλεπα :P

printf("o %dos stathmos paroysiase th megalyteri mesh timh %0.2f metrisewn",i,max);    
Επεξ/σία από becoming_I

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...