Ir para conteúdo
Fórum Script Brasil

Marcelo Utikawa da Fonseca

Membros
  • Total de itens

    297
  • Registro em

  • Última visita

Tudo que Marcelo Utikawa da Fonseca postou

  1. Isso acontece pois, após o cin >> n, resta uma quebra de linha no buffer de entrada. Assim, a próxima leitura recebe o \n como primeiro caracter e já retorna. Como foi retirado o \n que havia no buffer, a próxima leitura funciona normalmente. Para resolver esse problema, coloque esse código após o cin: while(getchar() != '\n'); Lembre-se de incluir o header stdio.h no projeto: #include <stdio.h> Abraços, Marcelo Utikawa da Fonseca
  2. Olá! Esse programa não é simples. Não sei qual sei conhecimento na linguagem e por isso vou considerar que você já tem um conhecimento razoável... Antes de começar, Q usa as tags code da seguinte forma: (code) Código (/code) Apenas troque os parênteses por colchetes. Sobre o programa: eu desenvolveria o código em dois arquivos independentes: baralho.c e paciencia.c. Eles teriam os códigos referentes ao controle do baralho (definição de cartas, listas de cartas, etc) e a lógica do jogo em si. Assim o baralho.c poderia até ser usado em outros jogos, ser usado tanto por programas gráficos como para console, entre outras vantagens. O baralho seria uma lista de cartas e que conteria todas elas. O jogo teria uma lista para cada posição (as pilhas dos ases, as pilhas de cartas ordenadas, a pilha de descartes e a pilha das cartas ainda não sorteadas). Depois que você tiver a lógica de controle do baralho funcionando com funções como adicionar e remover cartas de listas, embaralhar e etc, a lógica do jogo em si será apenas mover cartas ente as listas segundo as regras do jogo. Você entendeu esse princípio? Do que foi dito,o que você sabe fazer? Abraços, Marcelo Utikawa da Fonseca
  3. Olá! Ótima resposta Pedro, é isso mesmo! :) Apenas para complementar: nesse caso eu usaria o switch. Ficaria muito mais fácil para ler o código, simplificando a sua manutenção: #include <iostream> #include <stdlib.h> #include <conio.h> using namespace std; int main (void) { int a; cout << "DGT a hora que você inicia: "; cin >> a; switch(a) { case 7: case 8: case 9: case 10: case 11: case 12: cout << "Seu turno e das 5hs as 12,59hs" << endl; break; case 13: case 14: case 15: case 16: case 17: case 18: case 19: case 20: cout << "Seu turno e das 13hs as 20,59hs" << endl; break; case 21: case 22: case 23: case 24: case 1: case 2: case 3: case 4: case 5: case 6: cout << "Seu turno e das 21hs as 6:59hs" << endl; break; default: cout << "hora inválida!" << endl; break; } getch(); return 0; }
  4. Isso acontece pois você deve coincidir o número de níveis do vetor/matriz com o ponteiro. Assim, uma matriz com dois níveis deve ser atribuída para um ponteiro de dois níveis. Exemplo: int matriz[5][100]; int **p; p = matriz; Se sua matriz tem 3 níveis e o ponteiro tem 1, você precisa tirar dois níveis da matriz: char matriz[3][5][20]; int *p; p = matriz[2][4]; Ficou mais claro? Resta alguma dúvida? Abraços, Marcelo Utikawa da Fonseca
  5. Ótimo! :) Mas seria bom se você pudesse explicar onde estava o erro pois assim se mais alguém passar por algo parecido saberá o que pode ser... Abraços, Marcelo Utikawa da Fonseca
  6. Oi! Seguem meus comentários: 1) Esse programa não era para ser em pascal??? :blink: 2) Pelo enunciado você deveria interromper ao receber uma idade negativa. Para isso bastaria um if após ler a idade, saindo do for com um break. 3) Para ler o sexo você informa que deve ser digitado m ou f. Isso significa que é uma letra e não um texto. Assim use %c no scanf: scanf ("%c", &sexo); Além disso você não precisa criar as variáveis m e f. Você quer comparar com um caracter e não uma variável! Para comparar com um caracter, use aspas simples: 'm' ou 'f' ao invés de simplesmente m ou f. 4) Para o departamento você informou para digitar o número correspondente portanto leia um número! scanf ("%d", &curso); Mude a declaração de curso para int ao invés de char. E remova as declarações das variáveis com os nomes dos departamentos. Se você quer comparar uma string, além de usar aspas duplas como "informatica" ou "recursohumanos", ainda é necessário usar uma função como strcmp: if(strcmp(texto, "recursohumanos") == 0) Faça essas alterações, teste o novo programa e qualquer coisa avise! Abraços, Marcelo Utikawa da Fonseca
  7. Olá! Pode ter certeza que esse erro é na lógica. Não acredito que seja problema em compilador ou pc... Se você disse que grava o txt, então a atribuição está correta. Coloque aqui o código que você usa para exibir o conteúdo do CORRELA, provavelmente o erro está nele! E eu já tive uns problemas bizarros com ponteiros e, no fim, era um erro em outro ponteiro (que estava apontando erroneamente para o endereço que eu estava tendo problema) que estava corrompendo os dados. Portanto avalie todo o código entre a geração do txt e o ponto em que o problema acontece... Abraços, Marcelo Utikawa da Fonseca
  8. Boa arde! O seu problema é com a variável ginicio. Em main() você declarou como: no *ginicio; O primeiro problema é que você não inicializou a variável e portanto possui lixo. Ao acessar esse ponteiro você pode ir para qualquer endereço de memória e vai causar erro no seu programa. Além disso, quando você passou a variável pela função PercorreGrafoAmplitude, você usou o operador &, fazendo com que fosse passado para a função não o endereço que está nesse ponteiro mas sim o endereço da variável do ponteiro. O correto seria chamar PercorreGrafoAmplitude sem o &: PercorreGrafoAmplitude(ginicio); Outra coisa é que a variável ginício não recebe valor em nenhum lugar então você sempre vai receber a mensagem "grafo vazio"... Abraços, Marcelo Utikawa da Fonseca
  9. Bom dia! Pelo que pude ver a alocação de CORRELA e seu retorno pelas funções estão corretos. Eu não consigo testar agora pois não estou no pc. Existe uma lógica complexa até a atribuição. Seu programa realmente atinge o ponto em que CORRELA é atribuído? Outra coisa: há um erro no seu código e acredito que é o que está causando o problema: no segundo trecho de seu código em que é feita a atribuição em CORRELA inicia o vetor em 1 e vai até 6 quando o correto seria de 0 a 5. Abraços, Marcelo Utikawa da Fonseca
  10. Olá! Para fazer essa busca você precisa, para cada posição dá frase, varrê-la novamente buscando o caracter repetido. Isso quer dizer que, dentro do for, você precisa de outro for. for(i=0; i<=99; i++) { soma=0; for(j=0; j<=99; j++) { if(frase[i] == frase[j]) { if(i<j) break; // não permite repetir else if(i>j) soma++; // não soma a própria posição } } if(soma>0) { printf("caracter %c repete %e vezes\n", frase[i], soma); } } Uma observação: o loop deveria terminar quando encontrasse o caracter nulo (valor zero). Só não faço para não entregar a resposta inteira mas deixo a dica... :P Abraços, Marcelo Utikawa da Fonseca
  11. Ae cara! Parabéns! B) Durante esse fim de semana vou dar uma olhada nesse programa e tratar direitinho. Com certeza eu vou aprender com ele também! :) Para quem está aprendendo sozinho está indo bem rápido! Abraços, Marcelo Utikawa da Fonseca
  12. Olá! O cliente e o jogo são independentes? o cliente que inicia o jogo também? Eles não podem ser uma coisa só, com o jogo rodando em uma thread do cliente? Abraços, Marcelo Utikawa da Fonseca
  13. Olá! Uma coisa que nunca devia ser feita e que é muito comum de se ver é o código: fflush(stdin); Isso é errado! A função fflush é definida apenas para streams de saída! O uso em streams de entrada é imprevisível. Assim pode até funcionar em alguns ambientes mas nada garante isso. Uma alternativa é sempre usar o fgets para ler o buffer e então usar o sscanf para varrer o buffer lido. Para limpar o buffer de teclado pode-se usar: __fpurge(stdin); Isso funciona no Linux/BSD/MacOSX. Para windows eu não tenho certeza o que é o correto. Outra coisa que deve ser evitada é o uso do gets. Como ele não tem controle sobre a quantidade de dados que serão lidos, é muito fácil de gerar estouro no buffer. Para resolver esse problema, use sempre fgets no lugar de gets. Veja o seu código abaixo com a minha solução. Eu criei uma função que usa a fgets para ler o buffer e excluir os espaços e quebras do final. Em seguida você pode usar o sscanf para ler o valor: #include <stdio.h> #include <stdlib.h> #include <string.h> #define BUFFER_SIZE 1024 struct cadastro { char nome[20]; int dataNasc[3]; int salario; }; char * ReadStdIn(char *destino, int size) { int i; char buffer[BUFFER_SIZE]; fgets(buffer, BUFFER_SIZE, stdin); for(i = strlen(buffer)-1; i >= 0; i--) { switch(buffer[i]) { case '\r': case '\n': case ' ': buffer[i] = 0; default: // Terminou. Devemos interroper o loop i = 0; } } if(destino != NULL && size > 0) { strncpy(destino, buffer, size-1); destino[size-1] = 0; } return destino; } int main(void) { char inbuff[BUFFER_SIZE]; struct cadastro emp[3]; int i; //Contador // Ler dados para a strcut for (i = 0; i < 3; i++) { printf ("Digite o nome: "); ReadStdIn(emp[i].nome, sizeof(emp[i].nome)); printf ("Digite a data de nascimento: "); ReadStdIn(inbuff, BUFFER_SIZE); sscanf (inbuff, "%d/%d/%d", &emp[i].dataNasc[0], &emp[i].dataNasc[1], &emp[i].dataNasc[2]); printf ("Digite o seu salário: "); ReadStdIn(inbuff, BUFFER_SIZE); sscanf (inbuff, "%d", &emp[i].salario); } // Escreve o que foi lido for (i = 0; i < 3; i++) { printf ("%s\n", emp[i].nome); printf ("%0d/%0d/%0d\n", emp[i].dataNasc[0], emp[i].dataNasc[1], emp[i].dataNasc[2]); printf ("%d\n\n", emp[i].salario); } return 0; } Qualquer dúvida é só avisar! :) Abraços, Marcelo Utikawa da Fonseca
  14. Que bom que resolveu! E parabéns pela atitude de vir aqui dizer a solução! :) Abraços, Marcelo Utikawa da Fonseca
  15. Olá! Eu não conheço nenhuma biblioteca para isso mas como não gosto de ver perguntas sem resposta vou tentar ajudar... :) Eu procurei e não achei nada. É bem provável que não exista algo pronto... Mas se você quiser aprender sobre o formato e desenvolver o programa por si mesmo, esses dois links devem ajudar: Página da Wikipedia falando sobre o formato: http://pt.wikipedia.org/wiki/EXE Um PDf muito bem feito explicando sobre o formato para que você possa criar um programa para ler o arquivo .exe: http://www.fergonez.net/files/tut_win32_exe.pdf Abraços, Marcelo Utikawa da Fonseca
  16. Obrigado pelo comentário! Só não entendi sobre a parte de interpretar o argv... Pode explicar melhor? :rolleyes: Abraços, Marcelo Utikawa da Fonseca
  17. Sim, concordo com você sobre a questão da engenharia reversa. E me pareceu que o que está sendo feito não é problema realmente, esse o motivo de eu comentar que ia tentar ajudar. Esse código não compila, falta muita coisa. E são nomes meio genéricos, por isso imaginei que era código gerado. Esse código em si não diz muita coisa... O txt também não diz muito mais pode existir uma relação entre eles e só eu entendendo como funciona a comunicação poderia tentar decifrar o enigma... :P Assim que eu conseguir ler o fórum tento entender o que precisa ser feito. E como os dados são enviados para o servidor? Existe um programa, é isso? Se puder me explicar o procedimento e um servidor em que possa ser feito o teste me fale que eu faço uns testes aqui! :) Como eu nunca joguei ragnarok eu nem tenho idéia de como pode funcionar. Mas essas coisas assim complicadas é que são mais legais de fazer!! :rolleyes: Um último comentário sobre o egoísmo:infelizmente muitos ainda pensam apenas em si... Eu acho que sempre devemos ajudar com conhecimento pois ele se multiplica! Quando dividimos dinheiro, cada um fica com metade. Quando dividimos o conhecimento, não perdemos nada! Edit: Eu estive lendo o fórum para entender o que eram esses programas e que formato e dados estão no arquivo.txt. sobre o programa: entendi que oopenkore é um programa para controlar um bot no ragnarok e o servidor mudou a forma de comunicação, embaralhando os dados. E pelo que percebi também, eu não vou conseguir reproduzir aqui pois precisaria rodar o jogo e esses programas em paralelo. Assim o que vou poder fazer é esclarecer alguns pontos para que você tenha ao menos por onde começar. O que me parece é que o primeiro código foi extraído da versão anterior e o segundo foi da versão nova. O .txt são os pacotes ordenados conforme definidos pelo segundo código. No .txt estão o PacketID e o Length do pacote. Existem duas funções que são chamadas pela função do código: sub_58B360 e sub_58B510. Ambas são parecidas e parecem funcionar de modo semelhante. Pelo código os protótipos das funções podem ser: void sub_58B360(void *this, PacketMap *pm, PacketEntry *pe); void sub_58B510(void *this, int PacketID, int Length, int MinLength, int ReplayFactor); Já a estrutura PacketEntry pode ter sido declarada como: struct PacketEntry { int PacketID; int Length; int MinLength; int ReplayFactor; }; A principal diferença entre as duas funções é que uma recebe os dados diretamente e a outra através da estrutura. A sub_58B360 também recebe esse PacketMap (que pelo código não dá para saber o que é) e parece ser uma versão mais nova da sub_58B510. Essas duas funções parecem ser métodos da classe CPacketLengthExMgr (mesma classe da função do código em si) devido a este ponteiro void com o nome de this. Isso é o que eu consegui descobrir pelo código e o texto, espero que te ajude! Abraços, Marcelo Utikawa da Fonseca
  18. Eu estava mesmo imaginando que fosse algo relacionado a engenharia reversa e como eu não queria falar nada sobre algo ilegal então apenas fiz as perguntas. Eu li um pouco do fórum mas agora não vou conseguir ver mais... Pelo que entendi existe o kore e está sendo desenvolvido o openkore, é isso? Se der ainda hoje eu lei mais o fórum e tento entender o problema para tentar alguma solução. Se não der hoje, amanhã eu vejo! Abraços e boa sorte! Marcelo Utikawa da Fonseca
  19. Olá! Parabéns pelo blog, parece ser excelente o conteúdo! Eu li apenas as descrições pois agora não vou conseguir assistir os vídeos mas todos os assuntos são muito relevantes para quem está aprendendo a linguagem. Alguns assuntos interessantes seriam ponteiros, fgets ao invés de gets ou scanf, funções recursivas e operações com arquivos. Eu não vou fazer nenhuma vídeo aula mas se quiser ajuda para desenvolver algum assunto eu posso ajudar! Abraços, Marcelo Utikawa da Fonseca
  20. Boa tarde! Esse código não significa muita coisa... Parece até ter sido gerado automaticamente por algum descompilador ou algo do gênero... O que você precisa exatamente? Qual o conteúdo desses arquivos .txt e o que você tem que gravar neles? Se conseguir explicar isso os códigos podem até ser desnecessários... :) Edit: agora que eu vi o paste do .txt mas também não ajudou muita coisa... Você sabe o que são aqueles dados? Abraços, Marcelo Utikawa da Fonseca
  21. Uma função recursiva é uma função que chama a ela mesma. Por exemplo: int somar(int n) { if(n < 2) { return 1; } else { return n + somar(n-1); } } Esta função chama a si mesma. A cada chamada, n é diminuído em 1. Assim, quando n valer 1 ou menos (apenas proteção para caso a função for chamada como somar(0), por exemplo), ela retorna 1. Assim, cada função vai retornando o valor que tinha de n, somado ao resultado da chamada anterior. No caso dessa função chamada inicialmente como somar(3), o encadeamento e o resultado seria: somar(3) => retornar 3 + somar(2) somar(2) => retornar 2 + somar(1) somar(1) => retornar 1 Assim os valores de retorno seriam: somar(1) retorna 1 somar(2) retorna 2 + somar(1) = 2 + 1 = 3 somar(3) retorna 3 + somar(2) = 3 + 3 = 6 Assim, o retorno de somar(3) é 6. Um cuidado que deve ser tomado ao criar funções recursivas é garantir que ela sempre retorne em algum momento ao invés de sempre chamar a ela mesma. Se não tomar cuidado, o programa irá travar! Já para o seu caso será uma função parecida com esta somar. A diferença é que, ao invés de retornar apenas uma soma, deve retornar o valor da multiplicação. Por exemplo: suafuncao(1) deve retornar 1*3 suafuncao(2) deve retornar 2*3 + suafuncao(1) suafuncao(3) deve retornar 3*3 + suafuncao(2) E assim por diante... Não vou falar mais para não entregar o resultado!!! :rolleyes: Abraços, Marcelo Utikawa da Fonseca
  22. Olá! Seu programa não está seguindo o enunciado. No caso ele pediu para você criar 3 variáveis, uma de cada tipo. Exemplo: char c; int i; float f; Pediu também para criar os ponteiros para estas variáveis: char *p_char = &c; int *p_int = &i; flat *p_float = &f; E então você deve exibir o conteúdo das variáveis pelos ponteiros. Exemplo para o char: printf("char = %c\n", *p_char); Para alterar o valor das variáveis você deve fazer conforme abaixo: *p_char = 'c'; Como p_char aponta para a variável ch, o código acima alterou o seu conteúdo indiretamente. Para exibir o endereço da variável, usamos o %p no printf, exatamente como você já fez. Monte o programa conforme eu expliquei e coloque o resultado. Se tiver mais alguma dúvida é só falar! :) Abraços, Marcelo Utikawa da Fonseca
  23. Olá rocco Eu não havia compilado pois em casa eu uso apenas o linux para programar. Por isso que poderia haver algum engano como realmente houve. No vetor Profissionais eu havia dito para ser Profissionais[9][] e não apenas Profissionais[9]. De qualquer forma o correto seria *Profissionais[9] ou mesmo *Profissionais[]. Isso acontece pois me esqueci que apenas a primeira dimensão pode ser indefinida. Normalmente eu uso ponteiros como eu falei agora então por isso que me confundi. Quanto às minhas outra recomendações, estão corretas. Sobre String1 e String2: as chaves não são necessárias. Você utilizaria as chaves apenas se fosse colocar caracter por caracter como abaixo: char String[] = { 'r', 'o', 'c', 'c', 'o', 0 }; Se for atribuir a string diretamente, não precisa. Talvez o erro que ocorreu com String1 e String 2 é que, como passou a ser um vetor simples, você deveria ter alterado seu printf de: textcolor(LIGHTBLUE);gotoxy(8,10); printf("%s", String1 [0]); textcolor(LIGHTBLUE);gotoxy(8,11); printf("%s", String2 [0]); Para: textcolor(LIGHTBLUE);gotoxy(8,10); printf("%s", String1 ); textcolor(LIGHTBLUE);gotoxy(8,11); printf("%s", String2 ); Sobre o for, realmente não faz loop. Veja seu for: for (i = 0; i < 1; i++){ Você inicializa o i com zero e fala para ocorrer o loop enquanto i for menor do que 1, ou seja, executa apenas 1 vez. O erro que você comentou que ocorre se tira o for é que, quando você comentou ele, a variável i deixou de ter seu valor carregado em zero e esse é que foi o problema. Retire o for mas carregue zero em i e verá que funciona normalmente... E como eu disse, são recomendações para melhorar seu programa. Se não ajudei, desculpe! Abraços, Marcelo Utikawa da Fonseca
  24. Mas qual a sua dúvida? O que você sabe fazer? Faça um programa e coloque aqui para que seja possível orientar como terminá-lo!
  25. Boa tarde! Legal o seu programa. Como eu já te falei, ótima iniciativa divulgar programas prontos! Com certeza ajuda muitos... :) Eu queria fazer alguns comentários sobre o seu programa. Existem pontos que você podia melhorar ele. Inicialmente com relação à declaração dos vetores. O seu programa declara 4 vetores: char String1[] [66] = {"Uma Empresa Construtora resolveu aumentar os salários de alguns"}; char String2[] [55] = {"Profissionais em 10%, tecle Enter para ver como ficou:"}; int Salario[5] [5] = {{900},{1200},{1500},{1700},{1900}}; char Profissionais[][22] = {"Ajudante", "Pedreiro", "Carpinteiro", "Armador", "Telhadista", " Salários Atuais","Salários Atualizados", "Tecle Enter", "PROGRAMA VETORES" }; Todos seus vetores foram declarados com duas dimensões, ou seja, têm dois pares de colchetes. Isso significa que eles são listas de vetores. Por exemplo: int Salario[5] [5] = {{900},{1200},{1500},{1700},{1900}}; Você definiu que Salario será 5 listas com 5 itens cada. Durante o seu programa você usa apenas Salario[0] e Salario[1]. Assim você tem 3 itens em cada Salario que não são utilizados e podem ser descartados. Portanto seu programa poderia declarar Salario assim: int Salario[5] [2] = {{900},{1200},{1500},{1700},{1900}}; Outra coisa que você fez é declarar vetores sem dimensão como no caso de: char String1[] [66] = {"Uma Empresa Construtora resolveu aumentar os salários de alguns"}; Isso significa que, o tamanho do vetor declarado como [] será definido pelo número de itens utilizados na inicialização. Como a sua inicialização passa apenas 1 item (o texto entre chaves), então será um vetor de apenas 1 elemento. Assim não há necessidade de declarar esse vetor com duas dimensões. Além disso, a dimensão informada ([66]) refere-se ao tamanho da string e é complicado ficar contando as letras para saber o que colocar. Para evitar isso, pode ser utilizada o recurso de não definir a dimensão do vetor nesse caso, ficando assim: char String1 [] = "Uma Empresa Construtora resolveu aumentar os salários de alguns"; O mesmo pode ser feito para String2. Para profissionais você também usou o recurso de não definir o tamanho de uma dimensão porém ainda existe o problema de definir o tamanho para caberem as letras das strings, além do nulo no final. Isso pode te gerar problemas! O ideal é que você definisse a dimensão que informa o número de itens e deixar o tamanho das strings sem dimensão. Assim poderia declarar da seguinte forma: char Profissionais[9][] = {"Ajudante", "Pedreiro", "Carpinteiro", "Armador", "Telhadista", " Salários Atuais","Salários Atualizados", "Tecle Enter", "PROGRAMA VETORES" }; Mais uma coisa: o ideal é que você declare um outro vetor para os textos no final desse array. Se você quiser aumentar uma profissão iria te dar bastante trabalho pois ia ter acertar a posição dos textos "Tecle Enter" e "PROGRAMA VETORES" no programa ou colocar a profissão depois desses textos, o que também daria trabalho pois o for ia exibir os textos como profissões. Finalmente: o seu for que exibe as profissões na verdade não está fazendo o loop. Ele já retorna falso na segunda passagem! Assim ele não tem utilidade. E internamente ao for você está duplicando as chamadas a printf e incrementando o i, variável do for. Assim você poderia mudar o código para que o for fizesse o loop, evitando a duplicidade. O loop ficaria assim: for (i = 0; i < 5; i++){ // Este for percorre cada posição na matriz Salario e permite que printf imprima seus valores Sleep(800); gotoxy(8,8+(i*2)); printf("%s %d\t\t %d\t\t\t%d", Profissionais [i], Salario[i] [0], Salario[i] [1], Salario[i] [0] + Salario[i] [1]); } textcolor(LIGHTGREEN);gotoxy(33,20); printf("%s", Profissionais [7]); gotoxy(33,21); Perceba que usei o i como índice de Profissionais também. Eu também usei o i para calcular o valor de y. Como a cada aumento em i tinha que aumentar y em 2, multipliquei i por 2 e somei 8, gerando o resultado esperado. Espero que meus comentários tenham te ajudado! :) Abraços, Marcelo Utikawa da Fonseca
×
×
  • Criar Novo...