Jump to content
Fórum Script Brasil

KaL

Membros
  • Posts

    14
  • Joined

  • Last visited

About KaL

KaL's Achievements

0

Reputation

  1. Simples ^^ Olha o nome da tua função: sorteiaPocisao Olha o nome agora da chamada da função: sorteiaPosicao Coloque-os iguais. Não sei se o teu código está funciona, mas quanto ao erro de compilação, é isso.
  2. KaL

    Script

    Para fazer com que o script permaneça perguntando o valor, basta usar um while. No caso, usaremos o do-while, que executará a pergunta ao menos 1x e permanecerá executando até ser encontrado um valor satisfatório (p < 250). Quanto ao erro no seu script (não ocorre abaixo) é simples: ele entrará sempre no cin >> pr, e mostrará a mensagem caso o if seja verdadeiro, caso contrário ele vai ao pause sem usar o pr para nada. Há o uso desnecessário de memória também, criando 2 objetos que poderiam ser resumidos em apenas 1. O p é usado para ler o input e depois você usa o pr com a mesma função, quando poderia reusar o p. Veja: #include <iostream> using namespace std; int main() { int p = 0; cout << "Digite o tamanho do HD do seu computador: "; do { cin >> p; if (p>250) cout << "Mentira! Digite o tamanho verdadeiro: "; }while (p>250); cout << "Agora sim, seu mentiroso!" << endl; system("PAUSE"); getchar(); }
  3. KaL

    Função virtual

    O que é exatamente esse comando? O que o diferencia da superposição de métodos na herança? Quando deve ser usado?
  4. KaL

    Herança de Classe

    Sim, há superposição. O objeto/método B substitui o respectivo do A. Por exemplo: class Base { public: void exemplo(); } class Filha : public Base { public: void exemplo(); } int main { Filha obj; obj.exemplo(); obj.Base::exemplo(); } Na primeira chamada do obj, ele instanciará o método exemplo da classe Filha; enquanto na segunda chamada, o método da classe Base será executado.
  5. Simples, o teu exercício diz que 100% (1L) de gasolina faz X KM, enquanto o álcool faz os mesmos X KM usando 125% (1,25L) Então você pega o valor da gasolina (tGasolina) e vê se é maior ou menor que o valor do álcool (tAlcool (100%) + tAlcool/4 (+25%). Sendo a gasolina maior, o álcool está mais em conta, e vice-versa. Sendo iguais você pode optar. Os litros não servem de nada para ver o melhor, apenas para saber quanto você economizará (ou gastará a mais), então multiplica-se o valor da gasolina e do álcool pelos litros para saber o total gasto (só para não ter que criar uma variável nova, ou realizar uma nova operação para saber o valor hipotético gasto em cada combustível). Tendo os valores gastos, você faz uma subtração: tGasolina(100%) - tÁlcool(125%) temos: um valor positivo, negativo ou 0. A partir disso, você apaga a parte do if e return da função calc e substitui por um returno com o valor da subtração. Daí basta interpretar na main: 0 = ambos tem o mesmo preço e desempenho. - = a gasolina está em conta (o preço do álcool para andar o mesmo percurso que a gasolina é maior) + = a gasolina está em conta (o preço da gasolina para andar o mesmo percurso que o álcool é maior)
  6. Estou meio sem tempo agora, então vai uma parcial pra te ajudar. #include <stdio.h> #include <stdlib.h> int calc(float gasolina, float alcool, float litros); int main (){ float precoGasolina, precoAlcool, litros; printf ("Informe o preço da Gasolina\n"); scanf_s ("%f", &precoGasolina); fflush(stdin); printf ("Informe o preço do Alcool\n"); scanf_s ("%f", &precoAlcool); fflush(stdin); printf ("Informe a quantidade de Litros que deseja abastecer\n"); scanf_s ("%f", &litros); fflush(stdin); int melhor = calc(precoGasolina, precoAlcool, litros); if(melhor == 2) printf("A gasolina esta mais em conta.\n"); else if(melhor == 0) printf("O alcool esta mais em conta.\n"); else printf("Ambos estao equivalentes.\n"); system("pause"); } int calc(float gasolina, float alcool, float litros) { float tGasolina = (gasolina*litros); float tAlcool = (alcool*litros); if(tGasolina > (tAlcool + (tAlcool/4))) return 0; else if (tGasolina == (tAlcool + (tAlcool/4))) return 1; else return 2; } Agora é só você fazer a diferença para mostrar a economia. E não se esqueça que o scanf deve ter um endereço e você não o fez nesta linha: "scanf ("%f", &litros);" []'s
  7. KaL

    Função

    Não vou ficar criando função pra ti hein...você que tem que procurar aprender, leia algumas apostilas pra começar! #include <stdio.h> #include <stdlib.h> int primo(int num) { int resto, cont = 0; for (int i=1; i<=num; i++) { resto = num % i; if (resto == 0) cont += 1; } return cont; } int main() { int num = 0; int buscaNum = 0; printf("Digite quantos numeros primos a buscar:\n"); scanf_s("%d", &num); for(int i=0; i < num; i++) { buscaNum++; while(primo(buscaNum) != 2) buscaNum++; printf("%d ", buscaNum); } system("pause"); } Fica por tua conta a interpretação agora...
  8. KaL

    Funções Winsock

    Qual seria o mais indicado para uma aplicação async com threadpools (para multiplos clients em single-thread)?
  9. KaL

    Funções Winsock

    Qual a diferença em usar as funções "normais", usar as funções com prefixo "WSA" e usar as funções com sufixo "Ex" ? Por exemplo, uma função "normal": accept(). A mesma função WSA: WSAAccept(). E com Ex: AcceptEx(). O que muda entre elas? E em desempenho, qual funciona melhor? A lista delas está aqui: http://msdn.microsoft.com/en-us/library/ms...4(v=VS.85).aspx
  10. KaL

    Ajuda com script

    Coloque um timer de sleep de 1h e o evento após o timer (o código ficará parado até a contagem terminar) e coloque tudo isso dentro de um while(true), assim, quando o evento terminar, ele começará a contagem de novo e assim sucessivamente. Daí vai de ti o que fazer com o código e um jeito para parar (manualmente ou com retorno do evento usando um break, sei lá). Se os eventos forem diferentes, crie um for e atribua por exemplo, cada evento a um valor i. Mantendo-os caso deseje, dentro do while(true), assim eles reiniciarão quando todos terminarem. Lembrando que com o for você deve deixar o timer e o evento dentro do escopo do for.
  11. KaL

    Função

    Refiz a função pra você: #include <stdio.h> #include <stdlib.h> int primo(int num) { int resto, cont = 0; for (int i=1; i<=num; i++) { resto = num % i; if (resto == 0) cont += 1; } return cont; } int main() { int num; printf("Digite o numero a ser verificado:\n"); scanf_s("%d", &num); if (primo(num) == 2) printf ("PRIMO\n"); else printf ("N PRIMO\n"); system("pause"); } Você cometeu alguns erros bobos. A função "primo" tem que ser de algum tipo (no caso int), quando não for void, ela deve retornar um valor (no caso "cont"). As variáveis que só uma função usará, devem ser declaradas dentro dela (resto e cont) e não na main, pois o que estiver fora da main, não as identificará. Atribua um parâmetro a função primo para que ela trabalhe com este parâmetro (num, número a ser verificado). As funções devem começar por { e terminar por }, você apenas as terminou Oo else if (resto!=0) { cont=cont; } Isso é totalmente desnecessário, ele só entrará no if caso o resto seja 0, então bastava colocar else (if resto!=0 está implícito, caso contrário ele acessaria o if resto = 0). O conteúdo também é totalmente desnecessário, não há necessidade de atribuir a uma variável ela mesma, ela não se modifica "do nada". else if (cont!=2) printf ("N PRIMO"); A mesma coisa do anterior, o if está implícito, basta colocar o else. Quanto ao for, você deve declarar a variável no primeiro parâmetro: int i = 1; não i = 1; sei que você o declarou na main, mas como eu disse, o valor só será reconhecido pela função caso ele seja enviado como parâmetro (ou caso seja global, declarado antes de todas as funções, mas seria desnecessário uma vez que o i é apenas usado pelo for()) Você também deve estipular o valor a ser calculado (num) na main, ele não vai ler do nada ou sortear um valor qualquer. Defina-o previamente ou de qualquer outro modo (coloquei para ser digitado como um exemplo para te auxiliar). Sobre o if da main, ele deve conter a função, e não a função fora do escopo (a não ser que você atribua a uma variável, por exemplo: int retorno = primo(num); e depois use o retorno no if). Com if(primo(num)) ele executa a função if usando o parâmetro num e retorna um número, que se for 2 entra no controlador if(primo(num) == 2) ou se não for vai para o else. Acho que é só isso ^^ Sugiro que você busque alguma apostila para entender melhor a sintaxe da linguagem. Victor.
  12. Certo, obrigado pela ajuda :)
  13. Obrigado! Consegui colocar os sockets para funcionar, mas surgiu uma dúvida enquanto eu tentava mudar o script. A função bind do server apenas lê endereços internos? Quando eu coloco um IP WAN no getaddrinfo() ele dá erro no bind (nº 10049). Como teria que fazer para poder colocar um endereço configurável? Aqui o pedaço do código: hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_flags = AI_PASSIVE; // Resolve the server address and port iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); if ( iResult != 0 ) { printf("getaddrinfo failed with error: %d\n", iResult); WSACleanup(); return 1; } // Create a SOCKET for connecting to server ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); if (ListenSocket == INVALID_SOCKET) { printf("socket failed with error: %ld\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return 1; } // Setup the TCP listening socket iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen); if (iResult == SOCKET_ERROR) { printf("bind failed with error: %d\n", WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); return 1; }
  14. Boa noite, estou tentando estabelecer uma comunicação client-server em C++ para aprender a usar sockets (para uma aplicação futura a ser desenvolvida), estou usando a library da Microsoft (http://msdn.microsoft.com/en-us/library/sb27wehh.aspx) para começar, entretanto estou meio "empacado". Como minha aplicação é um tanto quanto grande e será feita para múltiplas conexões, tentei fazer sem usar o TcpClient/Listener, pois no próprio artigo de sockets, eles são indicados apenas para aplicações pequenas. Meu objetivo é criar uma comunicação SingleThreaded (vários sockets dentro de um Thread) non-blocking server. Anteriormente programei em java, então sei que é possível usar um sistema com threadpool para as sockets, possibilitando usar apenas uma thread. Meu código para o server #using <System.dll> using namespace System; using namespace System::Text; using namespace System::IO; using namespace System::Net; using namespace System::Net::Sockets; using namespace System::Collections; Socket^ ConnectSocket( String^ server, int port ) { Socket^ s = nullptr; IPAddress^ address = IPAddress::Parse(server); IPEndPoint^ endPoint = gcnew IPEndPoint( address,port ); s = gcnew Socket( endPoint->AddressFamily,SocketType::Stream,ProtocolType::Tcp ); s->Bind(endPoint); s->Listen(1); array<Byte>^bytesReceived = gcnew array<Byte>(256); String^ data = nullptr; Int32 i; while ( true ) { Console::Write( "Waiting for a connection... " ); s->Accept(); if(s->Connected) Console::WriteLine( "Connected!" ); data = nullptr; // Loop to receive all the data sent by the client. while ( i = s->Receive( bytesReceived, bytesReceived->Length, static_cast<SocketFlags>(0)) ) { // Translate data bytes to a ASCII String*. data = Text::Encoding::ASCII->GetString( bytesReceived, 0, i ); if(data->Equals("exit") || data->Equals("Exit")) { s->Close(); break; } Console::WriteLine( "Received: {0}", data ); array<Byte>^msg = Text::Encoding::ASCII->GetBytes( "Connection received, type exit to disconnect." ); // Send back a response. s->Send(msg,0, msg->Length, static_cast<SocketFlags>(0)); continue; } } } int main() { String^ host = "127.0.0.1"; int port = 7777; ConnectSocket( host, port ); } Para client #using <System.dll> using namespace System; using namespace System::Text; using namespace System::IO; using namespace System::Net; using namespace System::Net::Sockets; using namespace System::Collections; void ConnectSocket( String^ server, int port ) { Socket^ s = nullptr; IPAddress^ address = IPAddress::Parse(server); IPEndPoint^ endPoint = gcnew IPEndPoint( address,port ); s = gcnew Socket( endPoint->AddressFamily,SocketType::Stream,ProtocolType::Tcp ); s->Connect( endPoint ); if(s->Connected) Console::WriteLine("Worked"); array<Byte>^bytesSent = gcnew array<Byte>(256); array<Byte>^bytesReceived = gcnew array<Byte>(256); while(s != nullptr) { // Send request to the server. bytesSent = Text::Encoding::ASCII->GetBytes(Console::ReadLine()); s->Send( bytesSent, bytesSent->Length, static_cast<SocketFlags>(0) ); // Receive the server home page content. int bytes = 0; String^ data = nullptr; do { bytes = s->Receive( bytesReceived, bytesReceived->Length, static_cast<SocketFlags>(0) ); data = String::Concat( data, Encoding::ASCII->GetString( bytesReceived, 0, bytes ) ); } while ( bytes > 0 ); } } int main() { String^ host = "127.0.0.1"; int port = 7777; ConnectSocket( host, port ); } Obs.: Usei os métodos com block pois não consegui colocar os Async (não encontrei exemplos dos parâmetros das funções). Tentei usar também os sockets com winsock (como este: http://scriptbrasil.com.br/forum/index.php?showtopic=152286), mas o Visual C++ dá um montão de erros no compilador: "error LNK2028: unresolved token (0A000028) "extern "C" char * __stdcall inet_ntoa(struct in_addr)" ([email protected]@[email protected]@@Z) referenced in function "int __cdecl main(void)" ([email protected]@$$HYAHXZ)" (parcial do erro). A parte do server funciona até eu ligar o client. Então o server trava e dá uma exceção na linha 28 (s->Accept()) alegando que não podem haver envios ou recebimentos pois não há conexão. Enquanto isso o client fica online normalmente (sem apresentar erros) e a o controlador da linha 16 (if(s->Connected) é executado, afirmando que há conexão. Estou com Win 7 64 bits e Visual Studio 2010. Alguém pode me dar uma mãozinha com isso? ;) Se possível me mostrar algum caminho para montar a execução single-threaded non-blocking também!
×
×
  • Create New...