Ir para conteúdo
Fórum Script Brasil

Jonathan Queiroz

Membros
  • Total de itens

    3.718
  • Registro em

  • Última visita

Tudo que Jonathan Queiroz postou

  1. if(a==B) return 1; Quando a for igual a B, você deve retornar 0 ao invés de 1. Ao retornar 1, o a função sempre retornará 1 a mais que a soma. Já para evitar que o número inicial seja contado, você deve chamar a função com a+1 ao invés de a. O código pode ficar assim: if(a<b) printf("A soma e: %d\n", soma(a + 1, b)); else{ temp=a; a=b; b=temp; printf("A soma e: %d\n", soma(a + 1, b)); }
  2. O problema não ocorre porque a tentativa de acessar o membro protected é feita pela classe "avô". A classe classic tem acesso aos atributos protected da classe antenna, mas só tem acesso aos valores do próprio objeto. Ou seja: classic::testFunc(){ Npt=5; //isso funciona, pois está trabalhando com um atributo do mesmo objeto (this->Npt) antenna a; a.Npt=10; //isso não funciona, pois trabalhamos com um atributo de outro objeto (a.Npt) } Recomendo a leitura desse artigo: Proteção dos membros protected. A solução é, ao invés de você tentar ler os atributos de inAnt, passar esse objeto para o construtor de cópia da classe antenna, pois o construtor tem acesso a qualquer propriedade da mesma classe. O seu código ficar assim: class antenna { public: // constructors antenna(const int inNpt, char * inType); antenna(); ~antenna(){}; // protected member varibles protected: vector<double> * sub_reflector; vector<double> * main_reflector; int Npt; char * Type; }; class omnidirectional : public antenna { public: omnidirectional(antenna); ~omnidirectional(){}; protected: vector<double> P1, P2, Q; double Wa, Vs, Ds, Vm, Dm, Db, Zb, Gama, thetaE; }; omnidirectional::omnidirectional(antenna x) :antenna(x) //chama o construtor de cópia de antenna { } // class classic omnidirectional antennas; class classic : public omnidirectional { public: classic(antenna inAnt, double inWa, double inVs, double inDm, double inDb, double inZb, double inLb, double inGama); classic(); ~classic(){}; }; classic::classic(antenna inAnt, double inWa, double inVs, double inDm, double inDb, double inZb, double inLb, double inGama) :omnidirectional(inAnt) //construtor de omnidirectional { Wa = inWa * inLb; Vs = inVs * inLb; Dm = inDm * inLb; Db = inDb * inLb; Zb = inZb * inLb; Gama = inGama * pi/180; } Não sei se seu código está realmente assim ou se adaptou para postar, mas acho que não faz muito sentido passar um objeto antenna para a classe classic, já que ela não deriva diretamente de antenna, e sim de omnidirectional. Acho que faria mais sentido passar um objeto da classe omnidirectional para o construtor de classic ao invés de um antenna.
  3. Como assim não consegue fazer a verificação de vetor? O código que postei não funciona?
  4. De nada, qualquer coisa posta aí! Obs.: O tópico foi marcado como Resolvido.
  5. Aqueles "%i", "%s" etc. só servem para indicar que tipo de variável deve ser lida. Em C++ isso não é necessário, basta utilizar o cin. Ao invés de malloc/free você pode alocar memória assim: char* vetor_de_caracteres=new char[50]; //aloca espaço para 50 caracteres (semelhante ao malloc) int* vetor_de_int = new int[30]; //aloca espaço para 30 inteiros //... delete[] vetor_de_caracteres; //libera o espaço anteriormente alocado (semelhante ao free) delete[] vetor_de_int; //libera o espaço do vetor de inteiros Qualquer dúvida posta aí.
  6. Acontece que ao utilizar a classe std::vector o iterador já é um ponteiro para o objeto, portanto o * era realmente necessário. O problema é que o seu iterador é, na verdade, uma variável da classe Renovaveis**, pois it é um ponteiro para o valor armazenado no vetor (portanto, um ponteiro para um Renovaveis*). Tente deixar seu código assim: if((**it).getId()==id) Ou: if((*it)->getId()==id)
  7. Jonathan Queiroz

    Diferenças.

    O que o Miltonp tentou explicar é que as funções printf e scanf são funções da linguagem C e as funções std::cin e std::cout são da linguagem C++. A linguagem C foi a primeira a ser criada, e a C++ foi criada para ser um super-conjunto da linguagem C (na prática não é, mas a maioria dos códigos C são válidos em C++). Portanto, as funções printf e scanf podem ser utilizadas em C++, mas geralmente ao programar em C++ utiliza-se as funções cin/cout, que fazem parte da STL (biblioteca padrão de C++).
  8. De nada, qualquer coisa posta aí.
  9. Sim, tanto faz, mas não faz muito sentido exibir os dados para o usuário na ordem inversa à que ele cadastrou. Desculpe, realmente não tinha visto essa modificação. Na verdade é um loop sim, e o objetivo de usar o break é justamente evitar que ele tente continuar a contagem e se perca. O problema é que seu código estava utilizando um while ao invés de um if para comparar os assuntos, o que não faz muito sentido. Dessa forma, o break apenas parava o for mais interno, e não o for para percorrer os assuntos. Troque: for(Lst=Lista.begin(); Lst!=Lista.end(); Lst++){ while(!strcmp(ass,Lst->getAssunto())){ Lista.erase(Lst); break; } } Por:for(Lst=Lista.begin(); Lst!=Lista.end(); Lst++){ if(!strcmp(ass,Lst->getAssunto())){ Lista.erase(Lst); break; } } Obs.: Seu código ainda estava usando List.back(), alterei novamente para Lst.
  10. Seu código apresenta vários erros (aqui não chegou nem a compilar). Você está utilizando o Dev-Cpp? Se sim, recomendo fortemente que procure outra IDE. O principal problema do seu código é porque estava utilizando matriz[i,j], enquanto o correto é matriz[j]. Além disso, como não é possível passar uma matriz bidimensional de tamanho A x B como parâmetro para uma função sem informar o valor de B, tive que alterar a declaração da função mostra_matriz. Para facilitar, criei duas variáveis globais com o tamanho da sua matriz (size1 e size2). A sua função main estava sendo declarada como void, o que não é correto (alguns compiladores até aceitam, mas no final o código é gerado como se fosse int) Também as mensagens que ficassem mais organizadas. Por exemplo, coloquei um espaçamento na função mostra_matriz entre cada coluna, acrescentei uma mensagem informando a posição atual ao preencher os valores e mostrei as matrizes somente após o usuário preencher todas. Segue o código corrigido: #include<iostream> using namespace std; //Tamanho da matriz (size1 x size2) const int size1=2, size2=3; /*MOSTRA A MATRIZ*/ void mostra_matriz(int matriz[size1][size2]){ int i, j; for (i=0; i < size1; i++){ cout << endl; for (j=0; j < size2; j++){ if(j!=0) cout << " - "; cout << matriz[i][j]; } } } int main(){ int mat1[size1][size2]; int mat2[size1][size2]; int mat3[size1][size2]; int i, j; /* INSERE OS DADOS NA MATRIZ 1*/ for (i=0; i<size1; i++){ for (j=0; j<size2; j++){ cout << "\n Insira um numero na matriz1 (" << i << "x" << j << ")"; cin >> mat1[i][j]; } } /* INSERE OS DADOS NA MATRIZ 2*/ for (i=0; i<size1; i++){ for (j=0; j<size2; j++){ cout << "\n Insira um numero na matriz2 (" << i << "x" << j << ")"; cin >> mat2[i][j]; } } /* MULTIPLICAÇÃO ENTRE AS MATRIZES*/ for (i=0; i<size1; i++){ for (j=0; j<size2; j++){ mat3[i][j] = mat1[i][j]*mat2[i][j]; } } //Mostra as matrizes cout << endl << "****MATRIZ 1****"; mostra_matriz(mat1); cout << endl << "****MATRIZ 2****"; mostra_matriz(mat2); cout << endl << "****MATRIZ 3****"; mostra_matriz(mat3); //Retorno return 0; }
  11. O código os seguintes problemas: Você ainda está utilizando push_front ao invés de push_back para inserir as mensagens (isso não é um erro, mas a ordem vai ficar invertida)O código que você postou no #post 11 não está utilizando alocação dinâmica.Você não alocou memória para o assunto, ou seja, a variável ainda apontava para o assunto da última mensagem inserida.Você não estava parando o loop após remover o item desejado da lista.Em relação aos primeiros 2 problemas, acho que foi porque você postou o código errado. O código da função main pode ficar assim: int main(){ char *msg,*ass; int opcao; opcao = 1; while(opcao!=6){ Mensagem m; ifstream Msg("Mensagem.txt",ios::in); cout << "Escolha uma opcao: \n1 - Inserir Msg \n2 - Remover Msg \n3 - ordenalor por assunto \n4 - Mostrar Mensagens \n5 - juntar Filas \n6 - Sair" << endl; cin >> opcao; cin.get(); switch(opcao){ case 1: ass=new char[30]; msg=new char[50]; cout << "Digite um assunto: " << endl; cin.getline(ass, 30); cout << "Digite uma mensagem: " << endl; cin.getline(msg, 50); //m = new Mensagem(); m.setAssunto(ass); m.setCorpo(msg); Lista.push_back(m); break; case 2: cout << "Digite o assunto para remover a mensagem" << endl; ass=new char[30]; cin.getline(ass, 30); for(Lst=Lista.begin(); Lst!=Lista.end(); Lst++){ if(!strcmp(ass,Lst->getAssunto())){ Lista.erase(Lst); break; } } delete[] ass; //limpa a memória break; case 3: Lista.sort(); break; case 4: for(Lst=Lista.begin(); Lst!=Lista.end(); Lst++){ cout << "Assunto: " << Lst->getAssunto() << endl; cout << "Mensagem: " << Lst->getCorpo() << endl; } break; case 5: char LinhaMsg[150]; while(!Msg.eof()&& Msg!=NULL) { Msg.getline(LinhaMsg, 150); char *token; token = new char[strlen(LinhaMsg)]; strcpy(token,LinhaMsg); strcpy(ass,strtok(token,";")); strcpy(msg,strtok(NULL, ";")); m.setAssunto(ass); m.setCorpo(msg); Lista2.push_front(m); } Msg.close(); Lista.merge(Lista2); break; case 6: system("pause"); break; } } };
  12. De nada, qualquer coisa posta aí. Obs.: O tópico foi marcado como Resolvido
  13. Há dois erros nesse código. O primeiro é que você esqueceu um "}" ali: for(lin=0; lin<N; lin++) { for(col=0; col<M; col++) printf("c[%d][%d] = %lf ", lin, col, c[lin][col]); printf("\n\n"); O correto é: for(lin=0; lin<N; lin++) { for(col=0; col<M; col++) printf("c[%d][%d] = %lf ", lin, col, c[lin][col]); } printf("\n\n"); O segundo é que a função main precisa de um retorno (0 caso não ocorram erros). Troque: return; Por: return 0; Poste aí se funcionou ou não.
  14. Ao invés de Lista.back().metodo() tente utilizar Lst->metodo().
  15. Não cheguei a testar o código, mas os loops estão sendo executados enquanto o contador for maior que a quantidade de elementos (i>elementos, j>elementos). O correto é utilizar i<elementos e j<elementos. Poste aí se funcionou ou não.
  16. Esse erro deu em que linha? Poste também o código que está utilizando.
  17. Pra mim a classe std::string é mais fácil, mas aí é você quem decide. Quanto a declaração, ao invés de char[50] use char* mesmo. No código que postei usando malloc já estava assim. A parte do SQL Injection não entendi muito bem.
  18. Você pode criar uma variável indicando se já se passaram 30 segundos e utilizar a setTimeout para chamar uma função quando se passar esse tempo. Exemplo: onload=function(){ //varável indicando se o tempo já passou var tempo_passado=false //modifica a variável após 30s setTimeout( function(){ //função a ser chamada após 30s tempo_passado=true //já se passaram 30s } ,30*1000 //tempo em ms ) //função a ser executado quando clicar no botão document.getElementById("link").onclick=function(){ if(tempo_passado==false) return false //se o tempo não passou, retorna "false", cancelando assim o efeito do click } }
  19. Sim, mais ou menos isso. Mas ao invés de modificar o código do botão você pode atribuir o evento via Javascript. Algo assim: onload=function(){ var botao=document.getElementById("botao") botao.onkeydown=function(){ //a função keydown do botão aqui } botao.onkeyup=function(){ //a função keyup do botão aqui } } Mas lembre-se de fazer as alterações para verificar se o shift está pressionado, aquilo era apenas pseudo-código. Se não souber fazer a verificação poste aqui que lhe ajudo.
  20. Sim, você também pode utilizar o new. O código ficaria assim: ass=new char[30]; msg=new char[50]; Na minha opinião se uma variável pode ser modificada com setters ela pode se tornar pública. A única exceção é quando você precisa fazer algo no momento em que ela for alterada. Mas se seu professor quer assim, tudo bem. Obs.: Outra opção, ao invés de vetores de caracteres, é utilizar a classe std::string.
  21. #include<iostream.h> O correto é #include <iostream> (sem o .h) Pelo visto você está utilizando o Dev-Cpp. Essa IDE é bem desatualizada, recomendo que utilize outra. Para verificar se o código já foi digitado, basta percorrer todo o vetor e verificar se o novo valor coincide com algum dos códigos cadastrados. Exemplo: bool cadastro_repetido; do{ //Obtém o código cout<<"\n\nCodigo: "; cin>>vetcod[i]; fflush(stdin); //Verifica se está repetido cadastro_repetido=false; for(unsigned int x=0;x<i;x++){ if(vetcod[x]==vetcod[i]){ //está repetido cout << "O codigo esta repetido"; cadastro_repetido=true; } } }while(cadastro_repetido); Obs.: Ao utilizar std::cout aquelas chamadas à função fflush não são necessárias.
  22. Por que não pode utilizar struct ou mesmo deixar os atributos públicos? De qualquer maneira, o problema é que você está sempre utilizando o mesmo vetor de caracteres (aquele declarado no início da função main) para gravar os dados. Uma solução é utilizar a alocação dinâmica para as strings ou mesmo a classe std::string. A função main pode ficar assim: int main(){ char*ass,*msg; int opcao; opcao = 1; while(opcao!=6){ Mensagem m; ifstream Mensagem("Mensagem.txt",ios::in); cout << "Escolha uma opcao: \n1 - Inserir Msg \n2 - Remover Msg \n3 - ordenalor por assunto \n4 - Mostrar Mensagens \n5 - juntar Filas \n6 - Sair" << endl; cin >> opcao; cin.get(); switch(opcao){ case 1: ass=(char*)malloc(30); msg=(char*)malloc(50); cout << "Digite um assunto: " << endl; cin.getline(ass, 30); cout << "Digite uma mensagem: " << endl; cin.getline(msg, 50); m.setAssunto(ass); m.setCorpo(msg); Lista.push_back(m); break; case 2: cout << "Digite o assunto para remover a mensagem" << endl; cin.getline(ass, 30); for(Lst=Lista.begin(); Lst!=Lista.end(); Lst++){ while(!strcmp(ass,Lst->getAssunto())){ Lista.erase(Lst); } } break; case 3: Lista.sort(); break; case 4: for(Lst=Lista.begin(); Lst!=Lista.end(); Lst++){ cout << "Assunto: " << Lst->getAssunto() << endl; cout << "Mensagem: " << Lst->getCorpo() << endl; } break; case 5: char LinhaMsg[150]; while(!Mensagem.eof()&& Mensagem!=NULL) { Mensagem.getline(LinhaMsg, 150); char *token; token = new char[strlen(LinhaMsg)]; strcpy(token,LinhaMsg); strcpy(ass,strtok(token,";")); strcpy(msg,strtok(NULL, ";")); m.setAssunto(ass); m.setCorpo(msg); Lista2.push_front(m); } Mensagem.close(); Lista.merge(Lista2); break; case 6: system("pause"); break; } } };
  23. Poste o que você já fez, assim fica mais fácil ajudar.
  24. Jonathan Queiroz

    Exercicio c++

    Para verificar se o número negativo você deve verificar se é menor que 0 (quantidade<0). Como a quantidade também não pode ser 0, verifique se ele é menor ou igual a zero (quantidade<=0). Você pode utilizar um loop que é executado enquanto a quantidade é inválida. Algo assim: do{ cout<<endl<<"Digite a quantidade:"; cin>>quantidade; }while(quantidade<=0); Deixo a tarefa de limitar o número de tentativas a 3 com você. Obs.: Ao invés de declarar a variável como float você poderia ter declarado como int.
  25. Ao invés de utilizar a função gets é preferível utilizar a função fgets. Obs.: O tópico foi marcado como Resolvido.
×
×
  • Criar Novo...