Win7 Home 64bit, i3 M350 @ 2.27GHz
- Κώδικας: Επιλογή όλων
Dell@Dell-Laptop /cygdrive/c/unix/mysrc/c/pdp
$ time ./pdp24.exe
-4999990 4999990
real 0m0.686s
user 0m0.031s
sys 0m0.015s
Συντονιστής: konnn
Dell@Dell-Laptop /cygdrive/c/unix/mysrc/c/pdp
$ time ./pdp24.exe
-4999990 4999990
real 0m0.686s
user 0m0.031s
sys 0m0.015s

migf1 έγραψε:stamatiou έγραψε:Δηλαδή να έχω έναν μετρητή i στην αρχή του πίνακα και ένα στο τέλος του πίνακακαι να μετράνε και οι 2 προς το κέντρο; Δεν πολυκαταλαβαίνω το τρόπο λύσης....
Αυτό που είπε ο Σίμος είναι και η δική μου άποψη: http://ideone.com/Oq8aL
Το δοκίμασα μονάχα με τα παραδείγματα εισόδου της εκφώνησης. Το αρχείο input που δίνει, σε εμένα σε Windows το δείχνει ως binary. Κάνε δοκιμές χρόνου, κλπ και φτιάξε το να τυπώνει το αποτέλεσμα σε αρχείο (απενεργοποίησε και την buffer_print() για να μη σου τυπώσει 1.000.000 νούμερα).
for (i=0; !feof(fp) && 1 == fscanf(fp, "%ld", &(*buf)[i]); i++ )
if ( sum < 0 )
istart++;
else
iend--;

stamatiou έγραψε:
Σε αυτό το σημείο:
- Κώδικας: Επιλογή όλων
for (i=0; !feof(fp) && 1 == fscanf(fp, "%ld", &(*buf)[i]); i++ )
Μπορείς να μου εξηγήσεις τι ακριβώς ελέγχεις με το !feof(fp) && 1 == fscanf(fp, "%ld", &(*buf)[i]);
έγραψε:Επίσης για το FCLOSE και το FREE γιατί χρησιμοποιείς ένα do while loop εφόσον ξέρεις πως η συνθήκη θα βγει false;
έγραψε:Off topic:
Μήπως μπορεί κανείς να βρει κανένα καλό tutorial για τον αλγόριθμο merge sort αλλά για C. Τον αλγόριθμο τον έχω καταλάβει αλλά δεν μπορώ να τον υλοποιήσω με κώδικα

migf1 έγραψε:stamatiou έγραψε:
Σε αυτό το σημείο:
- Κώδικας: Επιλογή όλων
for (i=0; !feof(fp) && 1 == fscanf(fp, "%ld", &(*buf)[i]); i++ )
Μπορείς να μου εξηγήσεις τι ακριβώς ελέγχεις με το !feof(fp) && 1 == fscanf(fp, "%ld", &(*buf)[i]);
Το !feof(fp) ελέγχει να μην είναι έχει τελειώσει το αρχείο και το 1 == fscanf(fp, "%ld", &(*buf)[i] ελέγχει να μην έχει αποτύχει η fscanf().έγραψε:Επίσης για το FCLOSE και το FREE γιατί χρησιμοποιείς ένα do while loop εφόσον ξέρεις πως η συνθήκη θα βγει false;
Διότι πρόκειται για macros και όχι για συναρτήσεις (το έχω εξηγήσει με παράδειγμα και στον Ηλία μερικές σελίδες πιο πριν).
Διότι πρέπει να προχωρήσουν οι indexers, να πάνε στον επόμενο αριθμό. Από τη στιγμή που οι αριθμοί είναι ταξινομημένοι σε αύξουσα σειρά, αν το sum βγει αρνητικό σημαίνει πως αναφέρεται στον indexer που είχε ξεκινήσει από την αρχή του buf, ενώ αν είναι θετικό σημαίνει πως αναφέρεται στον indexer που είχε ξεκινήσει από το τέλος του buf.έγραψε:Off topic:
Μήπως μπορεί κανείς να βρει κανένα καλό tutorial για τον αλγόριθμο merge sort αλλά για C. Τον αλγόριθμο τον έχω καταλάβει αλλά δεν μπορώ να τον υλοποιήσω με κώδικα
Πιστεύω πως αν ψάξεις στο google όλο και κάτι θα βρεις.
for (i=0; !feof(fp) && 1 == fscanf(fp, "%ld", &(*buf)[i]); i++ )έγραψε:Διότι πρέπει να προχωρήσουν οι indexers, να πάνε στον επόμενο αριθμό. Από τη στιγμή που οι αριθμοί είναι ταξινομημένοι σε αύξουσα σειρά, αν το sum βγει αρνητικό σημαίνει πως αναφέρεται στον indexer που είχε ξεκινήσει από την αρχή του buf, ενώ αν είναι θετικό σημαίνει πως αναφέρεται στον indexer που είχε ξεκινήσει από το τέλος του buf.

stamatiou έγραψε:
Εδώ:
- Κώδικας: Επιλογή όλων
for (i=0; !feof(fp) && 1 == fscanf(fp, "%ld", &(*buf)[i]); i++ )
γιατί γράφεις fscanf(fp, "%ld", &(*buf)[i]) και όχι fscanf(fp, "%ld", &buf[i]);
έγραψε:Εδώ δεν καταλαβαίνω γιατί αν είναι αρνητικό πρέπει να αυξηθεί το istart ενώ αλλιώς πρέπει να μειωθεί το iend....
έγραψε:Off topic:
Να σε έχει ο Θεός καλά γιατί αν δεν με βοηθούσες στη C θα ήμουν αιώνες πίσω![]()

simosx έγραψε:stamatiou έγραψε:Δηλαδή να έχω έναν μετρητή i στην αρχή του πίνακα και ένα στο τέλος του πίνακακαι να μετράνε και οι 2 προς το κέντρο; Δεν πολυκαταλαβαίνω το τρόπο λύσης....
Υπάρχουν αρκετές επιλογές όταν έχεις όλη τη λίστα των αριθμών σε έναν πίνακα.
Τι θα επέλεγες για να επιλύσεις το πρόβλημα, έχοντας όλους τους αριθμούς σε ένα πίνακα;

simosx έγραψε:simosx έγραψε:stamatiou έγραψε:Δηλαδή να έχω έναν μετρητή i στην αρχή του πίνακα και ένα στο τέλος του πίνακακαι να μετράνε και οι 2 προς το κέντρο; Δεν πολυκαταλαβαίνω το τρόπο λύσης....
Υπάρχουν αρκετές επιλογές όταν έχεις όλη τη λίστα των αριθμών σε έναν πίνακα.
Τι θα επέλεγες για να επιλύσεις το πρόβλημα, έχοντας όλους τους αριθμούς σε ένα πίνακα;
Θα πρότεινα να δοκιμάσεις να επιλύσεις το πρόβλημα με τις δικές σου δυνάμεις. Μπορούμε εδώ να συζητήσουμε σχετικά με το ζήτημα.
Ως πρώτη εργασία προτείνω να φτιάξεις πρόγραμμα που να διαβάζει το αρχείο εισόδου και να βάζει τα νούμερα σε ένα πίνακα.
Μόνο αυτό, ως πρώτο βήμα. Βάζεις και όσα printf() θέλεις ώστε να φαίνεται τι γίνεται κατά την εκτέλεση.
Μόλις το κάνεις, μπορούμε να δούμε πως θα γίνει η επεξεργασία του πίνακα για να εξαχθούν τα ζεύγη των αριθμών.
#include <stdio.h>
int store_buffer(long int **buffer, long int n) {
FILE *input = fopen("operators.in","r");
int i;
for(i = 0; i < n; i++)
fscanf(input,"%ld",&(*buffer)[i]);
return 0;
}
int main(void) {
long int array[5],n;
FILE *input = fopen("operators.in","r");
fscanf(input,"%ld",&n);
store_buffer(&array,n);
for(n = 0; n < 5; n++)
printf("%ld",array[n]);
return 0;
}
basic.c:15: warning: passing argument 1 of ‘store_buffer’ from incompatible pointer type
basic.c:3: note: expected ‘long int **’ but argument is of type ‘long int (*)[5]’

stamatiou έγραψε:note: expected ‘long int **’ but argument is of type ‘long int (*)[5]’

simosx έγραψε:stamatiou έγραψε:note: expected ‘long int **’ but argument is of type ‘long int (*)[5]’
Ναι, δε φαίνεται να ταιριάζουν τα ορίσματα. Άλλο δηλώνεις και άλλο δίνεις στη συνάρτηση.
Προτείνω να τα βάλεις για τώρα όλα στη main(), οπότε δε χρειάζεται να καλέσεις κάποια συνάρτηση.
Αυτό θα απλοποιήσει και τον κώδικά σου, μιας και ανοίγεις παραπάνω το αρχείο δύο φορές.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n,*array,i;
FILE *input;
if(!(input = fopen("operators.in","r"))) {
printf("Could not open input file\n");
return 1;
}
fscanf(input,"%d",&n);
if(!(array = (int *) malloc(n * sizeof(int)))) {
printf("Could not allocate space for array\n");
}
for(i = 0; i < n; i++)
fscanf(input,"%d",&array[i]);
for(i = 0; i < n; i++)
printf("%d ",array[i]);
putchar('\n');
return 0;
}

stamatiou έγραψε:simosx έγραψε:stamatiou έγραψε:note: expected ‘long int **’ but argument is of type ‘long int (*)[5]’
Ναι, δε φαίνεται να ταιριάζουν τα ορίσματα. Άλλο δηλώνεις και άλλο δίνεις στη συνάρτηση.
Προτείνω να τα βάλεις για τώρα όλα στη main(), οπότε δε χρειάζεται να καλέσεις κάποια συνάρτηση.
Αυτό θα απλοποιήσει και τον κώδικά σου, μιας και ανοίγεις παραπάνω το αρχείο δύο φορές.
Ωρίστε:
- Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n,*array,i;
FILE *input;
if(!(input = fopen("operators.in","r"))) {
printf("Could not open input file\n");
return 1;
}
fscanf(input,"%d",&n);
if(!(array = (int *) malloc(n * sizeof(int)))) {
printf("Could not allocate space for array\n");
}
for(i = 0; i < n; i++)
fscanf(input,"%d",&array[i]);
for(i = 0; i < n; i++)
printf("%d ",array[i]);
putchar('\n');
return 0;
}
Σύνολο αριθμών: 10
Οι αριθμοί είναι:
-2 -1 0 1 2 3 4 5 6 9