Επισκέπτης Δημοσ. 16 Νοεμβρίου 2019 Δημοσ. 16 Νοεμβρίου 2019 Καλησπέρα σας, Έχω μία απορία όσον αφορά τη παρακάτω εργασία διότι έχω ξεκινήσει να κάνω C και βρήκα αυτήν την εργασία στο διαδίκτυο και έχω πάθει ένα μίνι εγκεφαλικό!! Περιμένω να δω αν κάποιος έχει καμία ιδέα πως βγαίνει!! Γράψτε ένα πρόγραμμα στη C το οποίο: 1. Θα δημιουργεί με κλήση της συνάρτησης rand() δύο (2) ταξινομημένους κατ’ αύξουσα σειρά μονοδιάστατους πίνακες Μ και Ν στοιχείων αντίστοιχα, τους οποίους και θα τους εμφανίζει στη οθόνη. Το εύρος τιμών των στοιχείων του πίνακα είναι στο διάστημα [100-999]. Προσέξτε, το πρόγραμμα θα φροντίζει ο κάθε πίνακας να διατηρεί ταξινομημένα τα στοιχεία του όταν δίδονται τιμές για αυτά από τη συνάρτηση rand() – Δηλαδή δεν θα «γεμίζουμε» πρώτα τον πίνακα και μετά θα κάνουμε ταξινόμηση των στοιχείων του. Επίσης, θα φροντίζει ώστε να μην υπάρχουν διαδοχικά στοιχεία που να είναι ίσα μεταξύ τους. 2. Το πρόγραμμα σας στη συνέχεια θα δημιουργεί ένα τρίτο πίνακα, ο οποίος θα περιέχει ταξινομημένα τα στοιχεία των 2 αρχικών (ταξινομημένων) πινάκων. Στην περίπτωση που ένα στοιχείο είναι κοινό και στους δυο πίνακες, τότε αυτό θα εμφανίζεται μόνο μια φορά στον τρίτο πίνακα. Αυτός ο τρίτος πίνακας θα πρέπει προφανώς να έχει αριθμό στοιχείων ικανό να χωρέσει και τους 2 αρχικούς πίνακες (διάσταση τουλάχιστον Μ+Ν). Το πρόγραμμα σας θα εμφανίζει στο τέλος το νέο πίνακα αντίστροφα (στοιχεία φθίνουσα σειρά). Προσοχή ξανά: δεν θα δημιουργείται ο νέος πίνακας απλά ενώνοντας τους δύο αρχικούς και μετά να γίνεται ταξινόμηση των στοιχείων του. Θα φροντίζετε ο νέος πίνακας να διατηρείται ταξινομημένος καθώς καταχωρούνται σε αυτό τα στοιχεία των δυο αρχικών πινάκων.
Predatorkill Δημοσ. 16 Νοεμβρίου 2019 Δημοσ. 16 Νοεμβρίου 2019 Τι εχεις προσπαθησει μεχρι τωρα; Παρεθεσε κωδικα αλλιως ερχεται bingo
Επισκέπτης Δημοσ. 16 Νοεμβρίου 2019 Δημοσ. 16 Νοεμβρίου 2019 (επεξεργασμένο) Έχω κάνει το εξής με βοήθεια φίλου, το μόνο θέμα είναι ότι μόνο αν βάλω το 100 σαν τιμή στο Ν βγαίνει κάποιο αποτέλεσμα! Οτιδήποτε άλλο κι αν βάλω δε μου βγάζει αποτέλεσμα!! (Έχω ασχοληθεί με το 1ο ζητούμενο) #include <stdio.h> #include <stdlib.h> #include <time.h> #define size 100 main() { int i,j,temp; int a,b; int swapped,pos,N=0; printf("Dwse mou to plithos tou N:\n"); scanf("%d",&N); srand(time(NULL)); for(i=0;i<N;i++) a=100+rand()%900; while(1){ swapped=0; for(i=0;i<N-1;i++){ if(a>a[i+1]){ temp=a; a=a[i+1]; a[i+1]=temp; swapped=1; } } if(swapped==0){ break; } } printf("["); for(i=1;i<N;i++) printf("%d, ",a); printf("%d]",a[i-1]); } Επεξ/σία 16 Νοεμβρίου 2019 από Επισκέπτης
vaggelisdan Δημοσ. 16 Νοεμβρίου 2019 Δημοσ. 16 Νοεμβρίου 2019 Φίλε μου, χωρίς προσβολή αλλά τα έχεις μπερδέψει αρκετά. Άλλο ένας πίνακας με ακέραιους (int array) και άλλο ένας απλός ακέραιος (int). Το a σου την μια φορά του συμπεριφέρεσαι σαν int (όπως και έχεις ορίσει) και την άλλη σαν πίνακα. Επίσης, αφού το μέγεθος N δεν το ξέρεις πριν ξεκινήσει το πρόγραμμα, πρέπει να δεσμεύσεις χώρο δυναμικά για τον πίνακα.
k33theod Δημοσ. 17 Νοεμβρίου 2019 Δημοσ. 17 Νοεμβρίου 2019 (επεξεργασμένο) Θα πρόσπαθήσω να σου εξηγήσω τι πρέπει να κάνεις. Για την δημιουργία των πινάκων ορίζεις τους δύο πίνακες και τους δίνεις αρχικές τιμές. Οτιδήποτε και να δώσεις ως αρχική τιμή εκτός 100-999 είναι οκ μπορείς να δώσεις 0 πχ. Κρατάς σε μεταβλητή το πόσα στοιχεία έχει ο πίνακάς σου. Ξεκινάει από 0 και φτάνει στο μήκος του πίνακα. Για κάθε στοιχείο που διαλέγει η rand κάνεις binary search στα ήδη υπάρχοντα στοιχεία στον πίνακα γιατί ο πίνακας είναι sorted και αν η τιμή είναι ήδη στο πίνακα κάνεις continue για να πάρεις νέα τιμή εάν όχι την κάνεις insert στην θέση lowerbound του binary search και αυξάνεις τα στοιχεία του πίνακα κατά 1. Οι υλοποίησεις των αλγορίθμων που δίνω είναι από τυχαία αναζήτηση από το google. Binary search https://hackr.io/blog/binary-search-in-c insert value in a sorted array https://www.geeksforgeeks.org/search-insert-and-delete-in-a-sorted-array/ Αφού έχεις του δύο πίνακες με m και n στοιχεία ορίζεις τον τρίτο πίνακα με μήκος m+n και τον αρχικοποιείς όπως τους άλλους ο αλγόριθμος που χρειάζεσαι τώρα λέγετε merge https://www.w3schools.in/c-program/merge-two-arrays/ Εάν δώσεις κώδικα σε code frame plz θα χαρώ να βοήθησω. Επεξ/σία 17 Νοεμβρίου 2019 από k33theod
k33theod Δημοσ. 20 Νοεμβρίου 2019 Δημοσ. 20 Νοεμβρίου 2019 (επεξεργασμένο) Έχω κάνει την άσκηση του φίλου για να θυμηθώ αλγόριθμους και έχω 1 bug το οποίο δεν μπορώ να βρώ από που έρχεται. Εάν κανένας μπορεί να βοήθησει. Το bug είναι το εξής όταν γεμίζω τον δεύτερο πίνακα μετά το τελευταίο στοιχείο του μου μηδενίζει το πρώτο στοιχείο του 1ου πίνακα. Εάν δηλαδή σβήσω την γραμμή με το comment bug recover παίρνω λάθος αποτέλεσμα. F&^K το βρήκα. #include<stdio.h> #include<time.h> #include<stdlib.h> int binary_search(int arr[], int start, int end, int item); void insert (int arr[], int n, int index, int value); void merge(int arr1[], int m, int arr2[], int n ,int target[]); void print_array(int arr[], int n); void print_array_reversed(int arr[], int n); void randomize_array(int arr[], int size, int from, int to); int main () { int const from =100; int const to = 300; int const size1=15; int const size2 =10; int const size3 =size1+size2; int a[size1]={0}; int b[size2]={0}; int c[size3]={0}; srand(time(NULL)); randomize_array(a, size1, from, to); printf ("\nPinakas 1 me %d stoixeia\n\n", size1); print_array(a, size1); int temp = a[0];//bug bug bug bug bug randomize_array(b, size2, from, to); a[0]=temp;//bug recover bug recover bug recover printf ("\nPinakas 2 me %d stoixeia\n\n", size2); print_array(b, size2); merge(a, size1, b, size2, c); printf ("\nPinakas c me %d stoixeia\n\n", size3); print_array(c, size3); printf ("\nPinakas c me %d stoixeia reversed order\n\n", size3); print_array_reversed(c, size3); getchar(); return 0; } int binary_search(int arr[], int start, int end, int item) { int middle =0; while (start <= end) { middle = start + (end - start)/2; if (arr[middle] == item) return -1;//Για την άσκηση μόνο κανονικά return middle else if (arr[middle] < item) start = middle + 1; else end = middle - 1; } return start;//Για την άσκηση μόνο κανονικά return -1 } void insert (int arr[], int n, int index, int value) { while (n>=index) { arr[n+1]=arr[n]; n--; } arr[index] = value; } void merge(int arr1[], int m, int arr2[], int n ,int target[]) { int i=0, j=0, k=0; while (i<m && j<n) { if (arr1[i] < arr2[j]) //κανονικά <= { target[k] = arr1[i]; i++; k++; } else if (arr1[i]==arr2[j]) //Για την άσκηση μόνο { target[k] = arr1[i]; j++; k++; i++; } else { target[k] = arr2[j]; j++; k++; } } while (i<m) { target[k] = arr1[i]; i++; k++; } while (j<n) { target[k] = arr2[j]; j++; k++; } } void print_array(int arr[], int n) { int i = 0; while (i<n) { printf("%d\t",arr[i]); i++; } printf("\n"); } void print_array_reversed(int arr[], int n) { int i = n-1; while (i>=0) { printf("%d\t",arr[i]); i--; } printf("\n"); } void randomize_array(int arr[], int size, int from, int to) { int i = 0; int item = 0; int position =0; while (i<size) { item = from+rand()%(to-from); position = binary_search(arr, 0, i-1, item); if (position!=-1) { insert (arr, i, position, item); i++; } } } Βρέθηκε παιδιά sorry. Επεξ/σία 22 Νοεμβρίου 2019 από k33theod
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα