PROBLEMA Chisura programma c++

Ciccio&Bombo

Nuovo Utente
18
1
Salve a tutti,
ho iniziato da poco a studiare seriamente c++ con il libro Programming: Principles and Practice di Stroustrup. Uno dei tanti esercizi creati apposta un po' stupidi per far imparare al lettore è questo:
Codice:
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;


//

int main()
{
   string nome;
   string friendName;
   char friendSex;
   int age=0;
   cout<<"Inserire il nome della persona a cui si vuol scrivere: ";
   cin>>nome;
   cout<<"Dear "<<nome<<", \n";
   cout<<"   How are you?\nI'm fine. I miss you.\nInserire il nome di un altro/a amico/a: ";
   cin>>friendName;
   cout<<"Have you seen "<<friendName<<" lately?\nInserire il sesso dell'amico/a (m/f): ";
   cin>>friendSex;
   if(friendSex=='m')
       cout<<"If you see "<<friendName<<" please ask him to call me.";
   if(friendSex=='f')
       cout<<"If you see "<<friendName<<" please ask her to call me.";
   cout<<"\nInserire l'eta' del destinatario: ";
   cin>>age;
   if(age>0 && age<110)
       cout<<"I heard you just had a birthday and you are "<<age<<" years old.\n";
   else
       cout<<"You're kidding!\n";
   if(age<12)
       cout<<"Next year you will be "<<age+1<<endl;
   if(age==17)
       cout<<"Next year you will be able to vote.\n";
   if(age>70)
       cout<<"I hope you are enjoying retirement.\n";
   cout<<"Yours sincerely, __ Leonardo\n";

   system("PAUSE");
   return 0;
}
Stroustrup consiglia di aggiungere agli headers la linea:
inline void keep_window_open() { char=ch; cin>>ch; }

per far utilizzare keep_window_open() al posto di system("PAUSE")/getchar(). Non essendo una persona che usa ciò che non conosce, ho provato ad usare uno di questi ultimi due, il primo includendo cstdlib e il secondo conio.h(credo siano le librerie giuste).
Ci sono 2 problemi:
1. A quanto pare il programma funziona tranquillamente senza le due librerie, MA se toglo tutti gli headers l'editor mi segna system/getchar come errato(oltre agli altri comndi), ma solo, ripeto, se rimuovo tutti gli headers
2. Il comportamento di system("PAUSE") mi sembra alquanto imprevedibile, eseguendo un programma funziona, ma magari se lo modifico leggermente(ex tolgo l'ultimo '\n') mi dà "Premere un tasto per continuare" e POI l'ultimo comando(ex cout).
getchar() invece non funziona proprio in questo programma, in altri si.

Uso eclipse con MinGW, non avrei alcun problema a tornare a keep_window_open(), ma mi piacerebbe sapere perchè succede quel che succede.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,208
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Ci sono 2 problemi:
1. A quanto pare il programma funziona tranquillamente senza le due librerie, MA se toglo tutti gli headers l'editor mi segna system/getchar come errato(oltre agli altri comndi), ma solo, ripeto, se rimuovo tutti gli headers
2. Il comportamento di system("PAUSE") mi sembra alquanto imprevedibile, eseguendo un programma funziona, ma magari se lo modifico leggermente(ex tolgo l'ultimo '\n') mi dà "Premere un tasto per continuare" e POI l'ultimo comando(ex cout).
getchar() invece non funziona proprio in questo programma, in altri si.

Non ho ben compreso il primo quesito. La funzione che riporta Stroustrup l'ha scritta lui, quindi se la copi così com'è, non necessiti di headers, ad eccezione di quelli necessari per eseguire il suo codice. Sul suo sito si può trovare del codice completo: http://www.stroustrup.com/Programming/std_lib_facilities.h
Se rimuovi tutti gli header non potrà compilare non trovando gli header delle funzioni che utilizzi.

Per quanto riguarda la seconda domanda, solitamente si evita il system('pause') in quanto non è proprio portabile (funziona sotto Windows/DOS). Il funzionamento è anche complesso: semplificando, il pause è un comando che viene eseguito lanciando una nuova shell (eseguendo un sottoprocesso); in seguito il controllo torna al tuo programma.

Se levi l'ultimo new line dalla stringa avrai il messaggio "Premere un tasto per continuare" in coda al precedente testo stampato; in pratica non andrà a capo e non avrai spazi.
Per utilizzare getchar devi includere <cstdio>. In C++ puoi usare cin.get().
 
  • Mi piace
Reazioni: fabio93

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!