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

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

Δημοσ.

γεια σας,εχω ενα μεγαλο προβλημα που δν εχω ιδεα πως να το λυσω,καθομαι επι 1 ωρα και διωρθωνω τον κωδικα μηπως και βγει κατι αλλα δεν,
ο κωδικας τρεχει μια χαρα μεχρι το σημειο που υπαρχει η while με minptr και max ptr (θα βαλω και σχολιο στον κωδικα)
αν βαλω πχ ενα διαστημα 5 με 15 Min και max και αρχιζω να εισαγω τιμες,θα δεχθει μια δυο τιμες και θα γινει ενα μπαχαλο,μπορει να δεχεται οτι ναναι,δεν δεχεται τιμες που θα επρεπε να εισαχθουν
υπαρχει καποιο λαθος στην συνθηκη της while η σε εκεινο το κομματι κωδικα???
ευχαριστω εκ τον προτερων για οποιαδηποτε απαντηση

εχω ανεβασει και screenshot με το προβλημα που υπαρχει
απο κατω ειναι το τι ζηταει η ασκηση αλλα δν εχει πολυ σημασια
(θα διαβάζονται και θα αποθηκεύονται στον πίνακα arr1 10 ακέραιοι. Θα πρέπει να γίνεται έλεγχος ότι κάθε ακέραιος που εισάγεται είναι στο διάστημα [min,max]. Αν δεν είναι, τότε θα ζητείται να ξαναεισαχθεί μέχρι να δοθεί αριθμός στο σωστό διάστημα)

#include <stdio.h>
#include <stdlib.h>
#define TEN 10


int main() {
int min = 0, max = 1 , *minptr, *maxptr, i, *temp; //Varibable assignment
int arr1[TEN], arr2[TEN], *arr1ptr, *arr2ptr; //Varibable assignment
int MO,sum,sub,*MOptr,*sumptr,*subptr;
minptr = &min; // pointers assignment
maxptr = &max; // pointers assignment
MOptr= &MO; // pointers assignment
sumptr= ∑ // pointers assignment
subptr= ⊂ // pointers assignment
arr1ptr = &arr1[1]; // pointers assignment
arr2ptr = &arr2[1]; // pointers assignment
printf(" Enter a min value \n"); //The user should enter a minimum value
scanf("%d", &minptr); //read value
printf(" Enter a max value \n"); //The user should enter a maximum value
scanf("%d", &maxptr); //read value
while (maxptr == minptr){ //checking if minimum and maximum values are equal
printf("You entered the same value,Enter two different values for min and max\n"); //The user should enter different values
printf(" Enter a min value \n"); //The user should enter a minimum value
scanf("%d", &minptr); //read value
printf(" Enter a max value \n"); //The user should enter a maximum value
scanf("%d", &maxptr); //read value
}
while (maxptr < minptr){ //checking if minimum value is bigger than maximum value
temp = maxptr; //swaping values with a temp variable for help
maxptr = minptr; //swaping values with a temp variable for help
minptr = temp; //swaping values with a temp variable for help

}
printf("maxptr is : %d minptr is : %d \n", maxptr, minptr); //print the maximum and minimum values

// APO EDW KAI KATW EINAI TO SHMEIO POY E3IGW
for(i = 0; i < TEN ; i++){
printf("Enter an element\n");
scanf("%d", &arr1ptr + i);
while(arr1ptr +i <= minptr || arr1ptr +i >= maxptr)
{
printf("The value you enter must be bewteen min and max \n");
scanf("%d", &arr1ptr + i);
}
}
return 0;
}

post-328379-0-95551600-1512508956_thumb.png

Δημοσ.

Αν ενεργοποιούσες τα warnings του compilers, θα έβλεπες ότι σε προειδοποιεί για τις γραμμές 53 και 57. Η scanf θέλει δείκτη σε int, αλλά εσύ της δίνεις δείκτη σε δείκτη σε int. Παίρνεις την διεύθυνση του δείκτη. Το ίδιο για τα minptr και maxptr. Πέτα όλα αυτά τα *ptr και χρησιμοποίησε κατευθείαν '&min', '&max' και '&arr1'.

Δημοσ.

Α, κατάλαβα... Τα συλλυπητήρια μου.

Μπορω να σε ρωτησω κατι αλλο ασχετο?

οταν θελω να σε εναν 2d πινακα  char να διαβασω ενα στοιχειο αλλα δεν πρεπει να ειναι μεγαλυτερο απο καποιο αριθμο χαρακτηρων και μετα πρεπει να κανω και ελεγχο,αυτο γινεται με strings?  (πχ 10)

δλδ πρεπει να γραψω την scanf ετσι η γινεται κ αλλιως?

και αν ειναι ετσι,ο ελεγχος πως μπορει να γινει? με καποιο j που να μετραει ποσους χαρακτηρες περιλαμβανει το string?

 

for(i=0; i < 5 i++
scanf(" %10s",&names[i])

Δημοσ.

Αφού έχεις ορίσει του δείκτες μετά πρέπει να χρησιμοποιήσεις το όνομα του όπου χρειάζεται δείκτης και το * όπου θες την τιμή του

δηλαδή

scanf("%d", minptr); //To όρισμα είναι ήδη pointer
printf(" Enter a max value \n"); //The user should enter a maximum value
scanf("%d", maxptr); //ομοίως
while (*maxptr == *minptr){ //Πρέπει να συγκρίνεις τιμές και όχι pointers
κλπ κλπ

Ελπίζω να μην τα λεώ λάθος :-)

Ο mo καλό είναι να είναι float.

Δημοσ.

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

// Για τον φιλαράκο στο insomnia με αγάπη
// αυτό είναι το διάλλειμά μετά απο 12 ώρες διάβασμα
// για την πτυχιακή μου 

int main() {
    int min = 0;
    int max = 1;
    int arr1[10];
    int arr2[10];

    int *minptr = &min;
    int *maxptr = &max;
    int *arr1ptr = arr1;
    int *arr2ptr = arr2;

    int *temp = 0;


    do {
        printf("Δώσε 2 αριθμούς min και max \"%%d %%d\": ");
        scanf("%d %d", minptr, maxptr);
        if( *minptr == *maxptr )
        {
            printf("Έδωσες ίδιους αριθμούς για min και max.. Πάλι από την αρχή!\n");
            continue;
        }
        if ( *minptr > *maxptr )
        {
            printf("Δεν μπορείς να διαβάσεις ρε παπάρα? min και μετά max λέμε\n");
            temp = minptr;
            minptr = maxptr;
            maxptr = temp;
            break;
        }
        break;
    } while (1);

    printf("Πληκρολόγησε 10 αριθμούς με την σειρά..\n");
    int i = 0;
    do{
        scanf("%d", arr1ptr);
        if ( *arr1ptr < *minptr || *arr1ptr > *maxptr )
        {
            printf("Ο αριθμός που έδωσες είναι έξω από τα όρια του [min,max] διαστήματος..\n");
            continue;
        }
        arr1ptr++;
        i++;
    } while ( i < 10 );

    return 0;
}

Κάνει ακριβώς όλα όσα ζητάει το screenshot σου εως την 3η βουλίτσα, σου άφησα την 4η για πάρτη σου. Κάτσε και κατάλαβε τον κώδικα μου γιατί αν δεν καταλάβεις και έτσι που τον έγραψα καθαρά και χωρίς πολλά πολλά δεν έχεις ελπίδα.

 

Ο κώδικας που έδωσες εδώ ηταν χάλια μάυρα με το συμπάθιο, παντού βασικά λάθη κατανόησης και των πιο βασικών λειτουργιών των δεικτών.

Α και φιλαράκι, ΣΤΑΜΑΤΑ σε παρακαλώ να βάζεις σχόλια σε ΚΑΘΕ γραμμή κωδικα.

 

Κυριολεκτικά χίλλιες φορές καλήτερα να μην δω κανένα σχόλιο σε κώδικα παρά η κάθε γραμμή να λεεί τι κάνει, ποίος σου είπε να το κάνεις αυτο ο καθηγητής σου? Πες του να πάει να κόψει καμία βόλτα με τις @@ του.

Δημοσ.

1. Οι πίνακες ξεκινάνε από το στοιχείο μηδέν στην C. Άρα αυτό είναι μάλλον λάθος:

arr1ptr = &arr1[1]; // pointers assignment
arr2ptr = &arr2[1]; // pointers assignment

γιατί οι δείκτες θα δείχνουν στην δεύτερη θέση, πρέπει να γράψεις αυτό για να δείχνουν στην πρώτη θέση

arr1ptr = &arr1[0]; // pointers assignment
arr2ptr = &arr2[0]; // pointers assignment

2. Η scanf θέλει να δεχτεί μια διεύθυνση για όρισμα, έτσι ώστε να πάει να γράψει εκεί την τιμή που πατήθηκε: Άρα αυτό είναι λάθος:

 scanf("%d", &minptr); //read value

Ή θα γράψεις:

 scanf("%d", minptr); //read value

μιας και το minptr είναι δείκτης σε μια θέση μνήμης που περιέχει έναν ακέραιο. ή θα γράψεις:

 scanf("%d", &min); //read value

Και οι δύο κλήσεις το ίδιο "αποτέλεσμα" θα έχουν, αφού πρόκειται για την ίδια θέση μνήμης.

Το ίδιο και για το maxptr

 

3.

while (maxptr == minptr){ //checking if minimum and maximum values are equal

ΌΧΙ. Το maxptr και το minptr είναι δείκτες, Το περιεχόμενο τους είναι θέσεις μνήμης, εκεί που δείχνουν δηλαδή. Στην συνθήκη αυτή  συγκρίσεις αν το περιεχόμενο τους είναι ίδιο, αν δείχνουν δηλαδή στην ίδια θέση μνήμης. Το περιεχόμενο τους δεν θα είναι ποτέ ίδιο, καθώς λες

minptr = &min; // pointers assignment
maxptr = &max; // pointers assignment

τους δίνεις δηλαδή να δείχνουν σε διαφορετικές θέσεις μνήμης. Εκεί θες να τσεκάρεις αν αυτό στο οποίο δείχνουν είναι ίδιο, δηλαδή

while (*maxptr == *minptr){ //checking if minimum and maximum values are equal

Και πάλι μετά, μέσα στην while διαβάζεις με λάθος τρόπο. 

 

4.

while (maxptr < minptr)

Και πάλι, συγκρίνεις θέσεις μνήμης. Δεδομένου ότι λες αυτό:

int min = 0, max = 1 , *minptr, *maxptr, i, *temp; //Varibable assignment
...
minptr = &min; // pointers assignment
maxptr = &max; // pointers assignment

Το min και το max αποθηκεύονται σε θέσεις μνήμης που λέγεται Stack memory. Η stack memory ανάλογα με το σύστημα στο οποίο τρέχεις "μεγαλώνει" "προς τα κάτω". Από την στιγμή που πρώτα δηλώνεις το min, το min θα είναι σε μεγαλύτερη διεύθυνση από το max, άρα το minptr θα έχει ως περιεχόμενο μια διεύθυνση που είναι μεγαλύτερη από αυτήν την του maxptr. Άρα η while συνθήκη υποθέτω ότι εκτελείται ΠΆΝΤΑ, άσχετα με τις τιμές του min και max.

 

5.

temp = maxptr; //swaping values with a temp variable for help
maxptr = minptr; //swaping values with a temp variable for help        
minptr = temp; //swaping values with a temp variable for help 

Δεν αλλάζεις τις πραγματικές τιμές, το min και το max θα έχουν τις τιμές που είχαν εξ'αρχής. Απλά το minptr θα δείχνει στο max, και το maxptr θα δείχνει στο min. Αν πραγματικά θες να αλλάξεις τιμές, πρέπει να χρησιμοποιήσεις το * πριν τον δείκτη και να πάρεις την τιμή εκεί που δείχνουν οι δείκτες. 

 

6.

        scanf("%d", &arr1ptr + i);
        while(arr1ptr +i <= minptr || arr1ptr +i >= maxptr){
            printf("The value you enter must be bewteen min and max \n");
            scanf("%d", &arr1ptr + i);
        }

Και πάλι παίζεις με δείκτες και όχι με την θέση μνήμης στην οποία δείχνουν.

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

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

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

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

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

Σύνδεση

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

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