Περί 1ου θέματος στο hellenico.gr

Γενικά θέματα για το διαγωνισμό. Ερωτήσεις, προτάσεις και ό,τι άλλο ταιριάζει.
Απάντηση
George
Δημοσιεύσεις: 7
Εγγραφή: Παρ Οκτ 12, 2018 6:20 pm

Περί 1ου θέματος στο hellenico.gr

Δημοσίευση από George » Πέμ Οκτ 25, 2018 9:29 pm

Καλησπέρα σε όλους. Έχοντας γνωρίσει σε ένα βαθμό τα βασικά της C++, αποφάσισα να λύσω το 1ο πρόβλημα στο hellenico.gr (χαλασμένο χρονόμετρο). Η λύση που υπέβαλλα είναι η εξής :

#include <iostream>
#include <sstream>
#include <string>
#include <fstream>

void seeIfSingleDigit(int& test, std::string& true_test)
{
if (test < 10)
{
switch (test)
{
case 1:
true_test = "01";
break;
case 2:
true_test = "02";
break;
case 3:
true_test = "03";
break;
case 4:
true_test = "04";
break;
case 5:
true_test = "05";
break;
case 6:
true_test = "06";
break;
case 7:
true_test = "07";
break;
case 8:
true_test = "08";
break;
default:
true_test = "09";
break;
}
}
else
true_test = std::to_string(test);
}

int main()
{
std::ifstream inputFile;
inputFile.open("time.in");
std::string prototype_FI{};
std::getline(inputFile, prototype_FI);
inputFile.close();
for (int i{}; i < prototype_FI.length(); ++i)
{
if (prototype_FI == ':')
prototype_FI = ' ';
}
std::stringstream ss;
ss.str(prototype_FI);
int hours{}, mins{}, secs{};
ss >> hours >> mins >> secs;
hours *= 2;
mins *= 2;
secs *= 2;
if (secs >= 60)
{
secs -= 60;
++mins;
}
if (mins >= 60)
{
mins -= 60;
++hours;
}
std::string true_hours{};
std::string true_mins{};
std::string true_secs{};

seeIfSingleDigit(hours, true_hours);
seeIfSingleDigit(mins, true_mins);
seeIfSingleDigit(secs, true_secs);

std::ofstream outputFile;
outputFile.open("time.out");
outputFile << true_hours;
outputFile << ':';
outputFile << true_mins;
outputFile << ':';
outputFile << true_secs;
outputFile.close();
return 0;

}

Ωστόσο, δέχομαι τη παρακάτω σειρά από compile-errors (ή, για να το θέσω κελύτερα, ένα compile-error πολλές φορές):

queue/93943.cpp:1:1: error: stray '\377' in program
queue/93943.cpp:1:1: error: stray '\376' in program
queue/93943.cpp:1:4: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:6: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:10: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:12: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:14: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:16: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:18: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:20: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:22: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:24: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:28: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:32: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:34: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:36: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:38: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:40: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:42: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:44: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:48: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:50: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:52: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:56: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:58: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:60: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:62: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:64: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:68: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:70: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:72: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:74: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:76: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:80: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:82: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:84: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:88: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:90: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:92: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:96: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:98: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:100: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:102: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:104: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:106: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:108: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:112: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:114: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:116: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:118: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:120: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:122: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:124: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:126: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:128: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:130: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:132: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:1:134: warning: null character(s) ignored [enabled by default]
queue/93943.cpp:2:1: warning: null character(s) ignored [enabled by default]
... και η λίστα συνεχίζεται για πολύ ακόμα, με το ίδιο error
Είναι η πρώτη φορά που συναντώ το null character error, και θα το εκτιμούσα αν μπορούσε να με κατατοπίσει κάποιος σχετικά με αυτό, αλλά και άλλα προβλήμετα που βλέπει στον κώδικά μου.
Ευχαριστώ εκ των προτέρων!

Άβαταρ μέλους
switch
Δημοσιεύσεις: 28
Εγγραφή: Σάβ Δεκ 05, 2015 11:46 am

Re: Περί 1ου θέματος στο hellenico.gr

Δημοσίευση από switch » Πέμ Οκτ 25, 2018 11:58 pm

Κατάφερες μα βγάλεις άκρη με τα αρχεία. Ωραία.

Τώρα αν θέλεις να επισυνάψεις κώδικα σε ένα μήνυμα πάτα το κουμπάκι που γράφει CODE λίγο πιο πάνω και γράψε τον κώδικα ανάμεσα στα
[cοde]...κώδικας εδώ...[/cοde]
για να μην χάνονται τα tabs (indendation).

Οταν δηλώνεις μεταβλητές, δεν χρειάζεται να βάζεις το null statement

Κώδικας: Επιλογή όλων

{}
π.χ. στα

Κώδικας: Επιλογή όλων

	std::string prototype_FI{};
	for(int int i{};i<...)
αρκεί

Κώδικας: Επιλογή όλων

   std::string prototype_FI;
   for(int i=0;i<...)
Τώρα στο συγκεκριμένο σφάλμα που παίρνεις:
α) ο κώδικας σου είναι συντακτικά ορθός (και σίγουρα παίρνει κάποια τεστ cases-σου ξέφυγε μια λεπτομέρεια)
β) τα σφάλματα σου λένε ότι ξεκινάνε από τη γραμμή 1 και οι πρώτοι 4 χαρακτήρες είναι λάθος και μετά ανά δυο χαρακτήρες ο ένας είναι λάθος.
Αυτό σημαίνει ότι το αρχείο σου έχει 4 bytes header και έχει double byte characters, Είναι δηλαδή αποθηκευμένο με μορφή unicode 16 bit (ούτε καν utf8). Πρέπει να το αποθηκεύσεις με μορφή ASCII για να το ανεβάσεις στο hellenico.
Είναι προφανώς κάποιο πρόβλημα στο hellenico που δεν έχει σωστή υλοποίηση unicode (λόγω της ηλικίας του) αλλά δεν χρειάζεται να στέλνεις unicode (και προτείνω να μην βάζεις ούτε σχόλια με ελληνικούς χαρακτήρες στο hellenico).

Σημείωση: στα unicode files, υπάρχει προαιρετικά ένα 4 byte header που δείχνει τον τύπο του αρχείου (wikipedia will further help you) και μετά αν είναι 16bit characters, υπάρχει ένα '\0' (NULL) και ακολουθεί ο χαρακτήρας ASCII ή ένα μη μηδενικό byte που ακολουθείται από ένα ακόμα byte που μαζί ορίζουν τον 16bit character. Σε utf8 τα περιττά '\0' δεν υπάρχουν.

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

υγ1. μπορείς να διαβάσεις και ακεραίους από τα αρχεία κειμένου,
π.χ.

Κώδικας: Επιλογή όλων

int hours,mins,secs;char colon;
inputFile >> hours >> color >> mins >> colon >> secs;
στο colon θα αποθηκευτεί το ':' που μας είναι άχρηστο

υγ2. ίσως σε βολέψουν και οι fscanf/fprintf

George
Δημοσιεύσεις: 7
Εγγραφή: Παρ Οκτ 12, 2018 6:20 pm

Re: Περί 1ου θέματος στο hellenico.gr

Δημοσίευση από George » Παρ Οκτ 26, 2018 6:58 pm

switch έγραψε:Κατάφερες μα βγάλεις άκρη με τα αρχεία. Ωραία.

Τώρα αν θέλεις να επισυνάψεις κώδικα σε ένα μήνυμα πάτα το κουμπάκι που γράφει CODE λίγο πιο πάνω και γράψε τον κώδικα ανάμεσα στα
[cοde]...κώδικας εδώ...[/cοde]
για να μην χάνονται τα tabs (indendation).

Οταν δηλώνεις μεταβλητές, δεν χρειάζεται να βάζεις το null statement

Κώδικας: Επιλογή όλων

{}
π.χ. στα

Κώδικας: Επιλογή όλων

	std::string prototype_FI{};
	for(int int i{};i<...)
αρκεί

Κώδικας: Επιλογή όλων

   std::string prototype_FI;
   for(int i=0;i<...)
Τώρα στο συγκεκριμένο σφάλμα που παίρνεις:
α) ο κώδικας σου είναι συντακτικά ορθός (και σίγουρα παίρνει κάποια τεστ cases-σου ξέφυγε μια λεπτομέρεια)
β) τα σφάλματα σου λένε ότι ξεκινάνε από τη γραμμή 1 και οι πρώτοι 4 χαρακτήρες είναι λάθος και μετά ανά δυο χαρακτήρες ο ένας είναι λάθος.
Αυτό σημαίνει ότι το αρχείο σου έχει 4 bytes header και έχει double byte characters, Είναι δηλαδή αποθηκευμένο με μορφή unicode 16 bit (ούτε καν utf8). Πρέπει να το αποθηκεύσεις με μορφή ASCII για να το ανεβάσεις στο hellenico.
Είναι προφανώς κάποιο πρόβλημα στο hellenico που δεν έχει σωστή υλοποίηση unicode (λόγω της ηλικίας του) αλλά δεν χρειάζεται να στέλνεις unicode (και προτείνω να μην βάζεις ούτε σχόλια με ελληνικούς χαρακτήρες στο hellenico).

Σημείωση: στα unicode files, υπάρχει προαιρετικά ένα 4 byte header που δείχνει τον τύπο του αρχείου (wikipedia will further help you) και μετά αν είναι 16bit characters, υπάρχει ένα '\0' (NULL) και ακολουθεί ο χαρακτήρας ASCII ή ένα μη μηδενικό byte που ακολουθείται από ένα ακόμα byte που μαζί ορίζουν τον 16bit character. Σε utf8 τα περιττά '\0' δεν υπάρχουν.

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

υγ1. μπορείς να διαβάσεις και ακεραίους από τα αρχεία κειμένου,
π.χ.

Κώδικας: Επιλογή όλων

int hours,mins,secs;char colon;
inputFile >> hours >> color >> mins >> colon >> secs;
στο colon θα αποθηκευτεί το ':' που μας είναι άχρηστο

υγ2. ίσως σε βολέψουν και οι fscanf/fprintf
Καλησπέρα σας, ευχαριστώ που πήρατε το χρόνο να απαντήσετε και σε αυτό, αλλά και στο άλλο thread που είχα κάνει σχετικά με file I/O. Σε εκείνο το παράδειγμα με το "Διάβασε(Ν)", που μου απαντήσατε ότι είναι το αντίστοιχο "inputFile >> N", ακόμα δεν καταλαβαίνω πώς ωφελεί το πρόγραμμά μου, καθώς το Ν στο εκάστοτε πρόβλημα υποτίθεται αντιστοιχεί στον αριθμό των μεταβλητών στην πρώτη γραμμή, αλλά με το εν λόγω extraction operation απλά βάζω στο Ν την πρώτη μεταβλητή στο stream. Τέλος πάντων, νομίζω βρήκα έναν τρόπο να διαβάσω έναν απροσδιόριστο αριθμό μεταβλητών έτσι κι αλλιώς, που έχει να κάνει με vector σε loop, οπότε δεν είναι ανάγκη να ασχοληθείτε περισσότερο με αυτό. Όσο για το ότι ο κώδικάς μου για κάποιο λόγο λειτουργεί με UTF-16 αντί για ASCII όπως είπατε, δεν έχω ιδέα πώς έγινε αυτό :) . Πέρα από αυτό, μερικά concepts ακόμα με δυσκολεύουν, όπως π.χ.το null termination των strings, οπότε πιστεύω πώς χρειάζομαι περισσότερο διάβασμα γενικότερα. Και πάλι, ευχαριστώ για την απάντησή σας.

Άβαταρ μέλους
switch
Δημοσιεύσεις: 28
Εγγραφή: Σάβ Δεκ 05, 2015 11:46 am

Re: Περί 1ου θέματος στο hellenico.gr

Δημοσίευση από switch » Παρ Οκτ 26, 2018 7:18 pm

Έστω αρχείο test.in

Κώδικας: Επιλογή όλων

10
12 67 889 22 33 44 456 -34 778 23


διάβασμα Ν στοιχείων:

Κώδικας: Επιλογή όλων

     int n;
     int array[20];  
     int main(){
               ...ανοιγμα αρχείου infile
               infile >> n;
               for(int i=0;i<n;i++)
                        infile >> array[i];
              ....
              return 0;
    }
ή

Κώδικας: Επιλογή όλων

     int n;
     vector<int> array;  
     int main(){
               ...ανοιγμα αρχείου infile
               infile >> n;
               for(int i=0;i<n;i++){
                        int x;
                        infile >> x;
                        array.push_back(x);
               }
              ....
              return 0;
    }
πριν ασχοληθείς με τα strings δες τους πίνακες ακεραίων για να καταλάβεις απο τι αποτελούνται και πως είναι οργανωμένα (πίνακες είναι και τα strings).
Πάντως η class string της C++ δεν θέλει και πολλά να κάνεις για το nul terination. Τα κάνει μονη της.

Αν θέλεις κάνε εγγραφή στο pdp31 (pdp.gr) ώστε να σου έρχονται ενημερώσεις για κάποια δωρεάν μαθήματα που γίνονται Αθήνα και Θεσσαλονίκη.

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

Σαν βγεις στον πηγαιμό για την Ιθάκη, να εύχεσαι να ναι μακρύς ο δρομος... όπως ελεγε ο Καβάφης

Απάντηση