Duvida - C++

RPortela

Power Member
boas,

estou agora a dar c++ em bases de programação (12º ano) em modo "Win32 console aplication" ou seja, é uma aplicação de consola e queria saber o que preciso de fazer para que a "janela" se feche automaticamente, ou seja, encerrar o programa.

eu tenho a opção de encerrar o programa que quando é escolhida chama a função sair(); definida previamente.

usando a mesma logica do system("cls") para limpar o ecrã, exprimentei usar o seguinte codigo:

Código:
void sair() {
       system("exit");
 }

contudo este codigo nao funciona, alguem me sabe ajudar?
sff

cumprimentos
 
Basta a função main terminar.

Suponho que seja algum programa daqueles com menu em que vais escolhendo as opções e executando diversas funções..., e isso deve estar dentro de um ciclo, certo?

Então quando verificares a escolha da função sair simplesmente sais do ciclo e deixas o main terminar, ou então return no local que valida a tecla escolhida (este return terá de ser dentro do main).

Se isto não ajudar, coloca aqui o código, sff.

abraços, HecKel
 
boas

o codigo que tenho neste momento é o seguinte:

Código:
#include "stdafx.h"
#include "iostream"

using namespace std;

void fechar() {
system("exit") [COLOR=Red]=> Aqui está o erro[/COLOR]
}

void menu_perimetro() {
    \\codigo do menu perimetro }

void menu_area() { 
    \\codigo do menu area }

void menu_volume() { 
   \\codigo do menu volume }

void menu_principal() {
    int op;
    cout << "-------------------------------------------" << endl;
    cout << "---- Escolha uma das seguintes opcoes: ----" << endl;
    cout << "---- 1-Calcular area                            ----" << endl;
    cout << "---- 2-Calcular Perimetro                     ----" << endl;
    cout << "---- 3-Calcular Volume                        ----" << endl;
    cout << "-------------------------------------------" << endl;
    cin >> op;
    if (op == 1) { menu_area(); }
    else if (op == 2) { menu_perimetro(); }
    else if (op == 3) { menu_volume();}
    else if (op == 4) { fechar();}
    else { cout << "Inseriu uma opcao errada!" << endl; }
    return = 4;
}



int main()
{
    menu_principal();
}


ainda vai ser adicionado muito codigo ate estar concluido, isto é para um trabalho escolar, nao quero que me façam o programa apenas que "deiam" uma pequena ajuda.

eu vou tentar explicar um pouco melhor, o que eu quero é que quando seja premida a tecla 4 (da opção 4) o programa seja encerrado automaticamente, sem qualquer pedido de confirmação nem nada do género, apenas que encerre.

cumprimentos
 
boas

o codigo que tenho neste momento é o seguinte:

Código:
#include "stdafx.h"
#include "iostream"

using namespace std;

[COLOR=MediumTurquoise]/*void fechar() {
system("exit") [/COLOR][COLOR=MediumTurquoise]=> Aqui está o erro
}*/[/COLOR]

void menu_perimetro() {
    \\codigo do menu perimetro }

void menu_area() { 
    \\codigo do menu area }

void menu_volume() { 
   \\codigo do menu volume }

void menu_principal() {
    int op;
    cout << "-------------------------------------------" << endl;
    cout << "---- Escolha uma das seguintes opcoes: ----" << endl;
    cout << "---- 1-Calcular area                            ----" << endl;
    cout << "---- 2-Calcular Perimetro                     ----" << endl;
    cout << "---- 3-Calcular Volume                        ----" << endl;
    cout << "-------------------------------------------" << endl;
    cin >> op;
    if (op == 1) { menu_area(); }
    else if (op == 2) { menu_perimetro(); }
    else if (op == 3) { menu_volume();}
    [COLOR=MediumTurquoise]//else if (op == 4) { fechar();}
    [COLOR=Lime]else if (op == 4) { return; }[/COLOR]
[/COLOR]     else { cout << "Inseriu uma opcao errada!" << endl; }
    return = 4;
}



int main()
{
    menu_principal();
}
ainda vai ser adicionado muito codigo ate estar concluido, isto é para um trabalho escolar, nao quero que me façam o programa apenas que "deiam" uma pequena ajuda.

eu vou tentar explicar um pouco melhor, o que eu quero é que quando seja premida a tecla 4 (da opção 4) o programa seja encerrado automaticamente, sem qualquer pedido de confirmação nem nada do género, apenas que encerre.

cumprimentos

Alterei-te o programa ligeiramente, meti a cian os comentários que adicionei (para saberes como estava) e adicionei aquela linha a verde.

Basicamente o que acontece é que ao escolheres a opção 4 entras no if, como já entrava, e depois retorna, sai daquela função dando-a como concluida.

Como deves saber quando uma função termina o "cursor" do programa volta para o local onde a chamou, naquele caso a linha do main onde chamas a função e continua o programa sequêncialmente. Só que no teu caso não tens mais nada a seguir ao menu_principal(); logo a função main também termina.

Tal como te tinha dito antes, em C/C++ para um programa terminar basta que a função main termine :)

Julgo que não dei nenhuma calinada, no entanto o teu programa está a precisar de um ciclo senão só consegues executar uma função, sempre que quiseres fazer mais alguma operação terás de voltar a abrir o programa :)

Espero que tenha ajudado ;)

abraços, HecKel
 
Experimenta, System.exit(0); Deve funcionar em C++. Porque o metodo é do JAVA.
Ou então, exit(0) com a biblioteca importada-> stdlib.h

Não é bom terminar programas de forma abrupta com exit. É melhor mesmo com fim de ciclo, ou metodos/funções terminadas, no caso o main().

Cumps

PS: Heckel, não te falta em -> else if (op == 4) { return 0; } ?
C++ pouco ou nada sei.
 
Última edição:
por que razão a função 'menu_principal' é do tipo 'void' e está a fazer um 'return 4'?

e já agora podias meter um 'return 0' no fim da 'main'.
 
boas,

ja testei todas essas soluções e nenhuma me resolveu o problema :'(

pareçe que vou ter de esqueçer isso.

já agora, tenho o visual c++ 2005 express edition e quando compilo o meu programa ele dá.me os seguintes erros:

'trabalho bp.exe': Loaded 'C:\Documents and Settings\Ricardo\Ambiente de trabalho\Programa C++\trabalho bp\debug\trabalho bp.exe', Symbols loaded.
'trabalho bp.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', No symbols loaded.
'trabalho bp.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', No symbols loaded.
'trabalho bp.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_f75eb16c\msvcr80d.dll', No symbols loaded.
'trabalho bp.exe': Loaded 'C:\WINDOWS\system32\msvcrt.dll', No symbols loaded.
'trabalho bp.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_f75eb16c\msvcp80d.dll', No symbols loaded.
'trabalho bp.exe': Loaded 'C:\WINDOWS\system32\apphelp.dll', No symbols loaded.
'trabalho bp.exe': Loaded 'C:\WINDOWS\system32\version.dll', No symbols loaded.
'trabalho bp.exe': Loaded 'C:\WINDOWS\system32\advapi32.dll', No symbols loaded.
'trabalho bp.exe': Loaded 'C:\WINDOWS\system32\rpcrt4.dll', No symbols loaded.
The program '[3480] trabalho bp.exe: Native' has exited with code 0 (0x0).

como poderei corrigir isto?

e tambem como poderei "pausar" o programa? ou seja, o programa e executado, mostra um valor no ecrã e nao fechar logo essa janela;
neste momento ele mostra o output do programa na janela e fecha-a automaticamente, e não é isso que quero, quero que tenha o habitual texto "Press any key to continue".

obrigado a todos pela vossa ajuda.

cumprimentos
 
A função main() é sempre do tipo int. No fim metes "return x;" para o programa terminar. X é um inteiro qualquer. 0 é usado para denotar que o programa terminou com sucesso e qualquer outro valor denota erro. Alguns compiladores dão warnings quando o programa termina com um valor diferente de 0.

Para pausar o programa durante a sua execução usa a função usleep(int milliseconds). Atenção que isso pára mesmo o programa.

Em alternativa, se queres forçar o utilizador a pressionar uma tecla para o programa continuar, usa a função kbhit:

http://www.cprogramming.com/fod/kbhit.html

Para matar o programa à força (normalmente nunca se usa), podes recorrer à chamada exit():

http://www.cplusplus.com/ref/cstdlib/exit.html

podes usar também o _exit(), mas este é muito mau porque mata LOGO tudo, sem guardar quaisquer informações que ainda não tenham sido escritas. Por exemplo, info que esteja no buffer do disco rígido sem ter sido escrita ainda é perdida.
 
Última edição:
boas
o codigo que tenho neste momento é o seguinte:

Código:
#include "stdafx.h"
#include "iostream"

using namespace std;

void fechar() {
system("exit") [COLOR=Red]=> Aqui está o erro[/COLOR]
}

ainda vai ser adicionado muito codigo ate estar concluido, isto é para um trabalho escolar, nao quero que me façam o programa apenas que "deiam" uma pequena ajuda.
eu vou tentar explicar um pouco melhor, o que eu quero é que quando seja premida a tecla 4 (da opção 4) o programa seja encerrado automaticamente, sem qualquer pedido de confirmação nem nada do género, apenas que encerre.

cumprimentos

Boas porrtela,

eu não sei se alguém deu este exemplo mas normalmente quando quero terminar os programas eu utilizo a seguinte experção:

- exit(1);
- exit(2);
- exit(3);

Experimenta um deles, penso que assim consegues. .
 
boas

o codigo que tenho neste momento é o seguinte:

Código:
#include "stdafx.h"
#include "iostream"

using namespace std;

void fechar() {
system("exit") [COLOR=Red]=> Aqui está o erro[/COLOR]
}

void menu_perimetro() {
    \\codigo do menu perimetro }

void menu_area() { 
    \\codigo do menu area }

void menu_volume() { 
   \\codigo do menu volume }

void menu_principal() {
    int op;
    cout << "-------------------------------------------" << endl;
    cout << "---- Escolha uma das seguintes opcoes: ----" << endl;
    cout << "---- 1-Calcular area                            ----" << endl;
    cout << "---- 2-Calcular Perimetro                     ----" << endl;
    cout << "---- 3-Calcular Volume                        ----" << endl;
    cout << "-------------------------------------------" << endl;
    cin >> op;
    if (op == 1) { menu_area(); }
    else if (op == 2) { menu_perimetro(); }
    else if (op == 3) { menu_volume();}
    else if (op == 4) { fechar();}
    else { cout << "Inseriu uma opcao errada!" << endl; }
    return = 4;
}



int main()
{
    menu_principal();
}


ainda vai ser adicionado muito codigo ate estar concluido, isto é para um trabalho escolar, nao quero que me façam o programa apenas que "deiam" uma pequena ajuda.

eu vou tentar explicar um pouco melhor, o que eu quero é que quando seja premida a tecla 4 (da opção 4) o programa seja encerrado automaticamente, sem qualquer pedido de confirmação nem nada do género, apenas que encerre.

cumprimentos

Não sei se é casual ou não mas esqueceste-te de por o ';' depois de 'system ("exit")', exatamente aqui:

Código:
void fechar() {
system("exit") [COLOR=Red][B];[/B][/COLOR]=> Aqui está o erro
}
 
Sim falta o ;
Mas como eu já tinha dito e o PaNcRoNi também o disse, pra terminar o programa de forma abrupta é apenas exit(inteiro); em que o parametro é um valor sentinela, por norma uso 0. Anyway, a melhor maneira de terminar é mesmo usando a metodologia do heckel.
 
para mim eu fazia o seguinte:


[...]
int menu_principal() {
int op;
cout << "-------------------------------------------" << endl;
cout << "---- Escolha uma das seguintes opcoes: ----" << endl;
cout << "---- 1-Calcular area ----" << endl;
cout << "---- 2-Calcular Perimetro ----" << endl;
cout << "---- 3-Calcular Volume ----" << endl;
cout << "-------------------------------------------" << endl;
cin >> op;
return op; // A função retorna o numero introduzido


void main()
{
int num;
num=menu_principal(); // num fica com a opção escolhida
if (num==4)
{
return 0;
}
[...]
}


Experimenta assim...
 
Não tem muita lógica uma função escrever para o monitor. Uma função tem como objectivo tratar algo e retornar um resultado, aí apenas escreves para o monitor e retornas o valor inserido..., e curiosamente é a função main que vai tratar esse valor?

O que sugeriste funciona, mas teria MUITO mais lógica fazer o inverso, o main criar o menu (dentro de um ciclo, dá jeito para o programa possibilitar a execução das outras funções) e consoante o valor recebido tratar aí cada função.

abraços, HecKel
 
Não tem muita lógica uma função escrever para o monitor. Uma função tem como objectivo tratar algo e retornar um resultado, aí apenas escreves para o monitor e retornas o valor inserido..., e curiosamente é a função main que vai tratar esse valor?

O que sugeriste funciona, mas teria MUITO mais lógica fazer o inverso, o main criar o menu (dentro de um ciclo, dá jeito para o programa possibilitar a execução das outras funções) e consoante o valor recebido tratar aí cada função.

abraços, HecKel


Concordo com o HecKel. Uma função em programação (para além da main()) deve ser interpretada como uma função matemática: em matemática passamos um determinado valor para a expressão analítica (domínio da função) e a própria função via indicar como varia esse valor (chama-se a essa variação contra-domínio de uma função). Assim, em C++ deves tentar que uma função seja usada como uma sub-rotina do programa para tratar um valor específico de uma forma específica. Portanto, tudo o que seja impressão no monitor (salvo raras excepções) deves deixar para a main().

Já agora, porque é que se considera a função main() exclusicamente do tipo int? A maior dos livros e tutoriais que li consideram-na sempre como void.

Vá, cumps;)
 
Que grande desenterro...

Quanto à tua questão, sinceramente não sei justificar com exactidão, mas tenho ideia que sendo a função main a principal do programa e que terminando esta o programa termina, julgo que tem sentido retornar um valor para o Sistema saber que a função terminou correctamente. No entanto isto é a minha interpretação, pode estar bem longe da verdade.

O que é certo, é que o facto de main() ser int é uma noção definida nos standards de C.
 
Que grande desenterro...

Quanto à tua questão, sinceramente não sei justificar com exactidão, mas tenho ideia que sendo a função main a principal do programa e que terminando esta o programa termina, julgo que tem sentido retornar um valor para o Sistema saber que a função terminou correctamente. No entanto isto é a minha interpretação, pode estar bem longe da verdade.

O que é certo, é que o facto de main() ser int é uma noção definida nos standards de C.
Confirmo que é essa a justificação.
 
eu tb tenho aki um pekeno problema o k tenho de fazer é isto
xxxxx
x x
x x
x x
xxxxx
( isto n ta a dar mas a intençao e k a culona da direta fika alinhada com o ultimo x de cim e baixo. e isso k eu n consigo fazer)
dado um numero de 1 a 9 deve fazer isto. eu ja fiz td. mas so consigo por um espaço no meio. kome e k faço para ajustar o espaço.


aki ta o k fiz

#include <iostream>
using namespace std;
char x;
int i;
int n;
int main()
{

cout << "\nDe-me um numero inteiro entre 1 e 9:"<< endl;
cin >> n;
while(n<1){
cout << "\nDe-me um numero inteiro entre 1 e 9:"<< endl;
cin >> n;}
while(n>9){
cout << "\nDe-me um numero inteiro entre 1 e 9:"<< endl;
cin >> n;}
for(i=0;i<n;i++){
cout << "x";
}
for(i=1;i<=n-2;i++){
cout << "\nx" << " " << "x";
}
cout << endl;
for(i=1;i<=n;i++){
cout << "x";
}

system("pause");
return(0);
}
 
Última edição:
Só uma sugestão: quando copiares código feito por ti para colocares num post, coloca-o com o seguinte formato:


[code]
//código do programa
[/code]


Torna a leitura mais fácil. :)
 
Última edição:
#include <iostream>
using namespace std;
char x;
int i;
int n;
int main()
{

cout << "\nDe-me um numero inteiro entre 1 e 9:"<< endl;
cin >> n;
while(n<1){
cout << "\nDe-me um numero inteiro entre 1 e 9:"<< endl;
cin >> n;}
while(n>9){
cout << "\nDe-me um numero inteiro entre 1 e 9:"<< endl;
cin >> n;}
for(i=0;i<n;i++){
cout << "x";
}
for(i=1;i<=n-2;i++){
cout << "\nx" << " " << "x";
}
cout << endl;
for(i=1;i<=n;i++){
cout << "x";
}

system("pause");
return(0);
}

Boas, coloca esse "\nx" antes do for a bold e o "x\n" depois, e deves obter o resultado pretendido. Já agora, podes juntar os ciclos todos que tens para processar o input num só ciclo do while por exemplo.
 
Back
Topo