-
Total de itens
884 -
Registro em
-
Última visita
Tudo que vangodp postou
-
você leu o que eu coloquei? busque no google "alocação de matriz dinâmica em C".
-
listas simplesmente encadeadas.
-
int X, Y; printf("X: "); scanf("%d",&X); printf("Y: "); scanf("%d",&Y); printf("\n"); int **tabela= (int*)malloc( X*Y*sizeof(int) ); E quando terminar free(tabela); Se não funcionar avise
-
por quê? kkk
-
isso é devido a alinhamento dos bytes. quando você tem um float f = 1.0 e tenta comparar if ( f == 1.0 ) você está fazendo uma comparação entre um float e um double literal. Para isso funcionar você deveria tratar float como float, para por um exemplo do que falo coisas como float f = 1.0f; são importantes pois você está atribuindo um double a um float quando você faz coisas como float f =1.0;. Quando usamos a notação 1.0 o compilador toma isso como um double, da certo ao atribuilo a um float por que seu programa sabe que você quer atribuir 1.0 a um float e o que acontece nesse caso é uma conversão de tipos implicita, ou seja, não transparente ao programador. Para solucionar esse "problema" você precisa indicar ao compilador que trata-se de que você quer comparar um float com outro float, isso podemos faze-lo de duas formas mas pode que alguma falhe ainda assim, a primeira e que menos recomendo é if ( f == 1.0f ), que ainda assim pode falhar, e a segunda forma que é para mim a melhor, é indicar ao compilador que se trata de um float e não de um double através de uma conversão explicita tipo if ( f==(float)1.1). Vamos ver mais casos: float f = 1.0; //atribuição de um double a um float, acontece uma conversão(CAST) implícita. if ( f == 1.0 ) // comparação entre float e double if ( f == 1.0f) //comparação entre 2 float, porem não são exatos por razões que desconheço e podem falhar. if ( f == (float)1.0) //Esse sim me funciona perfeito. Nos indicamos ao compilador explicitamente que 1.0 se trata de um float literal f = 1; //atribuímos um int literal a um float, acontece a conversão de tipos internamente de forma não transparente(implicitamente). int i = 1.1f; // atribuímos um float literal a um int, como o int não permite armazenar números flotantes acontece uma conversão interna, nesse caso o float perde as partes decimais. int i = "Alo mundo"; Este ultimo caso parece descabelado mas é perfeitamente possível! A string "Alo Mundo" retorna um ponteiro! então se imprimir a i com printf você verá im inteiro, esse inteiro nada mais é que a direção da memória onde esta guardado a literal de string "Alo mundo". Se atribuímos o valor de i a um ponteiro do tipo char podemos imprimir essa variável. Exemplo: int i = "Alo mundo"; char *p = i; printf("%s", p); Neste caso o compilador vai tirar warnings porque tentamos fazer algo descabelado, mas isso poderia ter aplicações. Os avisos desapareceriam com fazer uma conversão de tipos de string a int da seguinte forma: int i = (int)"Alo mundo"; O compilador não se está queixando de que você está atribuindo um string a um int, ele somente te avisa que se você quer fazer isso que ao menos indique com um cast que é sinal de que você sabe perfeitamente o que está fazendo. Assim que não ache descabelado fazer coisas como: float f = (float)1.1; double d = (double)1.1; // neste caso não precisa porque sempre que não for float será double >_< char* p = (char*)"Alo mundo"; Algumas vezes o compilador vai dar avisos, outras não... por exemplo, seria muito chato se cada momento que nós queiramos fazer algo como float f = 1.1 e tirasse um aviso tipo "atribuição de um double a um float sem cast explicito" seria muito chato não é. Bom... busque mais sobre conversões de tipos em C e literais em C. alguns casos podem ser: https://msdn.microsoft.com/pt-br/library/c70dax92.aspx e https://msdn.microsoft.com/pt-br/library/8kc54dd5.aspx O que são literais? Tudo o que não for uma variável. tipo: 1.1, "Ola mundo", (int)3.14, PI São literais por que escrevemos elas no arquivo de código fonte. As variáveis vão armazenadas na memória. Se aprender a depurar seu código poderia ver essas coisas:
-
Não tudo se aprende em aula. Muitos professores estão desatualizados. Sobre tudo os que vão logo colocando o conio para pausar o programa huahuahhauha. Os fóruns são um bom lugar para aprender. passe aqui a diário e de uma olhada nas soluções dos usuários. Em fóruns é onde eu aprendi tudo o que sei >_<. Mas não foi perguntando não... posso contar em uma mão as poucas vezes que fiz perguntas em fóruns. Táh! Um pouco mais, mas não tanto. >_<
-
@Exata0mente Posso lhe dar uns quantos motivos para nunca usar fflush mas o principal é que ele não foi criado para trabalhar com o buffer stdin se não com stdout. Conforme seus criadores ele tem "comportamento indefinido" sobre tudo com strings, ou seja, pode funcionar mas também pode falhar. Recomendaria você ler aqui, sobre tudo por que existem formas mais portaveis de limpar o buffer que funcionam em ambos sistemas: http://forum.imasters.com.br/topic/336835-tutorial-systempause-e-fflushstdin/ Leia incluso a resposta dos usuários, alguns aportam muitas coisas ao tema. >_< você pode usar char buffer[10]; fgets(buffer, 10, stdin); Em vez de gets. Lembre de limpar o buffer posteriormente >_<.
-
Posso lhe dar uns quantos motivos para nunca usar gets mas o principal é que ele pode ler um string de qualquer tamanho, a conseqüência é pode ler textos inclusive maior que seu string. O erro que está ocorrendo é que você esta tratando uma string como se fosse um char quando você usa scanf troque scanf("%80[^\n]", &nome); por scanf("%80[^\n]", nome); //sem & você não deve por & adiante de ponteiros e strings. Um string nada mais é que um ponteiro que aponta para a posição numero 1 da sua seqüencia de caracteres, então ponteiros e strings guardam relação, por isso você não deve por & adiante de ponteiros e strings, lembre disso.
-
Isso é uma matriz >_<, ou também conhecido como vetor bidimensional, ou tambem vetor2D etc, etc.
-
a ver si deixamos claro algumas coisas. Um simples char você reserva um byte em memória, com isso você pode representar qualquer letra da tabela asc2. Resumindo você só pode guardar uma só letra, pode ser qualquer uma das que estão na tal tabela que falei. Por outro lado um vetor é um conjunto de chars. Então isso que você afirma "Para receber os nomes do teclado é necessário armazenar em uma variável do tipo char, porém..." não é certo pois em um só char não é possível armazenar um nome, só uma letra. Se quiser guardar um nome você está obrigado a usar um vetor, ou uma matriz, e essa ultima acho que seria mais apropriado que um vetor. Se um vetor ´´e um conjunto de chars, uma matriz é um conjunto de vetores. Falou? Se você tem que guardar 5 nomes, você precisa de 5 vetores, para usar 5 vetores é muito mais pratico usar uma matriz de 5 vetores. Sorte
-
hmmm posso lhe ajudar meu skype é o mesmo que meu nick.
-
Nenhum usuário vai lhe fazer os deveres vei. Sinceramente se seu maestro anda pedindo coisas algo avançadas e você diz que não aprendeu nada deveria se prantear se programação é o que realmente lhe realiza na vida. Programar exige muita concentração e força de vontade. Se você não está entendendo nada com o que seu professor lhe explica ao menos deveria buscar ajuda externa para não ficar muito atrás. Posso lhe ajudar com duvidas concretas que tenha, podemos implementar pequenos exemplos sobre tudo o que você mencionou, isso certamente lhe ajudaria a entender melhor muitas coisas, más não lhe vou fazer a tarefa por você. Se quiser ajuda no sentido que lhe comentei avise. Sigo o exemplo de "Dê um peixe a um homem e ele comerá uma noite, ensine esse homem a pescar e comerá todas as noites daqui ao resto...". ;)
-
você ta começando agora e já quer usar Qt? Não leva mal não mas eu já levo 4 anos de C++ e Qt ainda me da medo kkkk. Seu professor é um troll. kkk Acho que seu trabalho está perdido, mas para lhe ajudar nos trabalhos futuros lhe recomendo que comece a tocar Qt a diário. E também estar afiado em ponteiros, polimorfismo, POO, heranças... praticamente tudo. Veja vídeos e busque exemplos, e pratique muito. Para a próxima vez não lhe pegar com as calças abaixadas. >_<
-
Seu programa funciona perfeitamente, não vejo problema algum. Da próxima vez que postar algum código siga esses passos: 1º Escolha o botão "CODE" 2º Siga os passos 1, 2 e 3 da imagem abaixo 1 Colar seu código 2 Escolha linguagem C (Vale também para C++) 3 Pulsar inserir para que seu código se veja de uma forma mais amigável, assim você obterá uma maior chance de receber respostas, e mais rápido também.
-
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> int mystrlen ( char *string ); int main ( void ) { char frase [80] = "Maria"; int tamanho; tamanho = mystrlen ( frase ); printf ( "O tamanho da string %s vale %d\n", frase, tamanho ); system ( "pause" ); return ( 0 ); } int mystrlen ( char *frase ) { int count = 0; while ( *frase != NULL ){ frase ++; count ++; } return ( count ); }
-
Então já somos 2 >_< Isso acontece por não ler as normas dos fóruns de programação né. Pra fazer um resumem do que falo seria só se centrar na parte que diz que "não se deve entregar exercícios prontos". E também somente se ajuda naquilo que tiver duvida, ou seja, em pontos concretos do código. Mais resumido ainda é "BOTA SEU CÓDIGO AÍ PARA QUE PODAMOS LHE AJUDAR MANO". Todos os fóruns de programação costumam ter as mesmas normas, mais ainda essa sobre todas.
-
deveria ter postado todo o código. E entre as etiquetas <> para o identado
-
Nessa pagina tem um exemplo de um programa feito com socketes que dado a direção de uma pagina, devolve a direção ip da mesma, ele possui um sistema de comprovação, certamente seria boa alternativa. http://www.binarytides.com/hostname-to-ip-address-c-sockets-linux/ Se você passar tipo www.google.com ele deveria devolver uma ip, caso contrario daria um erro. Seria caso você adaptar ele. Não me pergunte se funciona, pois não tenho linux, e também não sei muito de socketes. É toda a ajuda que posso lhe oferecer.
-
Não entendo. Que tem que ver isso com C/C++?
-
não sei se ras.h funciona en linux porem conio.h e windows.h você teria que substitui-las por outra biblioteca mas não conheço qual alternativas você deveria utilizar porque não programo en linux.
-
normal... o que está acontecendo é um cast interno, ou seja, ao entrar com um numero real o programa descarta a parte fracionaria e fica só com a decimal. Nesse caso acho que o que você poderia fazer é escanear em vez de um %d, escanear a um %f, e fazer algo como if( real%1==0 ){/*É um numero inteiro*/}else{/*É um numero real*/}. Obviamente real deveria ser um numero float ou double, depois de comprova-lo seria possível converter-lhe a um int novamente. É só uma ideia =)
-
Ia responder a mesma coisa que rickayron. Melhor usar o valor de retorno do scanf, lembre que todas as funções retornam valores, esses valores servem para muitas coisas.
-
Em primeiro lugar você está passando um ponteiro a função, e não uma referencia a ponteiro a função, é algo confuso de entender más vamos pensar em simples ponteiros para entender o problema. Se em main eu faço a declaração de um ponteiro tal que: int* p = NULL; E tenho uma função tipo: void func( int* ptr ){....} quando fizer a chamada a essa função dentro de main tipo: func( p ); O que você acha que está enviando a func? Certamente você acha que está enviando a direção de 'p' mas não é assim, na realidade você esta enviando NULL, ou seja que você está enviando o que 'p' está guardando. Vamos esquecer por um momento funções, vamos pensar só em ponteiros e não vamos sair de main por enquanto... Se em main eu tenho... int* p = NULL; E faço int* ptr = p; O que você acha que ptr ta guardando? Fácil! você está fazendo uma copia do valor de p a ptr, é como fazer: int a = 0; int b = a; Entendeu? porque é a mesma coisa o que ta acontecendo quando você envia ptr a seleciona_busca(opcao, ptr);. Pior ainda é que ptr você nem deu um valor, ou seja que ptr é um ponteiro selvagem >_<, pode apontar qualquer coisa. Então resumindo... o que você quer na realidade é manipular o ptr que está dentro de main desde essa função seleciona_busca para que ele aponte a uma outra função, para isso você precisa passar a direção de ptr, e não o valor de ptr. A forma correta de se fazer isso é trocando a declaração: int seleciona_busca(const char* opcao, int (*ptr) (int,int*,int)) {...} por int seleciona_busca(const char* opcao, int (*&ptr) (int,int*,int)) {...} Dessa forma sua função receberá o ponteiro por referencia, não o valor do ponteiro. Nessa hora lhe aconselharia usar um typedef para facilitar a coisas. typedef int ( *ptr2fun ) ( int, int*, int ); int seleciona_busca ( const char* opcao, ptr2fun& ptr ) Ficou bem mais fácil de entender agora não? você está recebendo uma referencia de um ponteiro a função, ou seja, você está recebendo uma referencia de um ponteiro que aponta a função. Veja o exemplo a continuação: #include <iostream> #include <string.h> using namespace std; typedef int ( *ptr2fun ) ( int, int*, int ); //typedef é mais facil ;) int busca_sequencial_iterativa ( int chave, int* vetor, int tamanho ) { cout << "Hello =)" << endl; return 1; } int seleciona_busca ( const char* opcao, ptr2fun& ptr ) { if ( strcmp ( opcao, "BSI" ) == 0 ) { ptr = busca_sequencial_iterativa; } return 0; } int main () { ptr2fun ptr = NULL; seleciona_busca ( "BSI", ptr ); ptr(0, NULL, 0); //agora sim você recebeu a função busca_sequencial_iterativa, ptr aponta a busca_sequencial_iterativa. ;) cin.ignore(); return 0; } Sem typedef: #include <iostream> #include <string.h> using namespace std; int busca_sequencial_iterativa ( int chave, int* vetor, int tamanho ) { cout << "Hello =)" << endl; return 1; } int seleciona_busca ( const char* opcao, int ( *&ptr ) ( int, int*, int ) ) { if ( strcmp ( opcao, "BSI" ) == 0 ) { ptr = busca_sequencial_iterativa; } return 0; } int main () { int ( *ptr ) ( int, int*, int ) = NULL; seleciona_busca ( "BSI", ptr ); ptr(0, NULL, 0); //agora sim você recebeu a função busca_sequencial_iterativa, ptr aponta a busca_sequencial_iterativa. ;) cin.ignore(); return 0; } Falou?
-
[Ajuda] Problema em passagem de ponteiros
pergunta respondeu ao Madaagnol de vangodp em Grupo de Estudos
p q você usa getch para pausar o programa? >_< Basicamente seu erros são 2. 1º Nas funçoes você ta esperando um array de Testes, mas em main você não declarou nenum: isso é um "ÚNICO" teste -> teste teste_main; e isso é um array de 5 testes-> teste teste_main[5]; 2º dentro de fun_mostra trocar esta linha: puts ( teste_mostrando[*tam]->nome ); por esta outra: puts ( teste_mostrando->nome ); você ta usando o valor de tam como índice porem o índice é o i Considere deixar de usar conio para o resto da sua vida hahah. Quando aprendi a programar meu sensei me falou que é um disparate você adicionar uma biblioteca para simplesmente pausar o programa, você pode perfeitamente usar getchar que já está na biblioteca stdio.h, você não precisa de quetch nem conio. Lembre que somos programadores de C, e C==eficiência. ;) Poderia lhe dizer que não usasse o fflush(stdin) nunca mais também, mas certamente não lhe interessa não? Ou sim? http://forum.imasters.com.br/topic/336835-tutorial-systempause-e-fflushstdin/ ...Deveria lhe interessar. >_<