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. Ainda não vai funcionar. O if em: if(strcmp(pess[i].nome,pess[i+1].nome)){ será verdadeiro sempre que strcmp retornar um número diferente de zero, ou seja, sempre que as strings forem diferentes! O que você precisa saber é se a primeira string é maior, ou seja, se ela deverá ser colocada depois da segunda string na lista. Assim o correto seria: if(strcmp(pess[i].nome,pess[i+1].nome)>0){ Teste o programa e diga se funciona!
  2. Na verdade nenhuma das funções precisaria de ponteiro para ponteiro! Basta retornar o novo ponteiro assim como eu fiz na função inserir que fiz lá em cima! Um erro que eu vi agora: o realloc deve utilizar tam e não k! A alocação deveria ficar: newp = (char*) realloc(p, tam * sizeof(char)); //p = tipo realloc(ponteiro, (tamanho original + 1) O motivo de exibir um item a mais é que na função listar o seu for teria que ser: for (k=0; k<tam; k++) Usar o <= é que gera o problema.
  3. Esta lógica de checar até os primos menores que a raiz quadrada do número em teste está errada. Vamos supor que o número em teste seja 21. Sua raiz quadrada é cerca de 4,58, ou seja, precisamos testar apenas 2 e 3 mas 21 é divisível por 7! Assim não adianta nem mesmo utilizar até o próximo número primo além da raiz quadrada pois seria 5. Me confundi... Seria divisível por 3 e portanto saberíamos que não é primo! Foi mal... :)
  4. Você não pode passar um método pois ele só pode ser chamado por um objeto da classe, algo que não irá ocorrer na situação que você disse. Uma alternativa é fazer uma função que apenas irá chamar o seu método: MINHACLASS obj; void minhafuncao(void) { obj.MEUMETODO(); }
  5. Eu entendi o conceito do seu código mas ficou um tanto quanto confuso este monte de ponteiros! :) Um comentário: O que facilitaria muito o código seria, ao invés de as funções receberem ponteiro de ponteiro, retornarem o novo ponteiro. Além disso, funções que não precisam alterar o endeço que o ponteiro está apontando, não precisam receber o ponteiro do ponteiro! Exemplos: 1) Função inserir char * inserir(char *p) { int k; char caractere, *newp; k = tam++; //incrementa tam e insere em k newp = (char*) realloc(p, k* sizeof(char)); //p = tipo realloc(ponteiro, (tamanho original + 1) definindo o tamanho da variavel) printf("\nDe o caractere: "); fflush(stdin); scanf("%c", &caractere); //não ESQUECER DO & NO SCANF NA VÁRIAVEL QUE você ESTA RECEBENDO POR QUE você ESTA RECEBENDO O COMEÇO newp[k] = caractere; printf("%c", caractere); printf("\n\n%c", newp[k]); getch(); return newp; } 2) Função listar void listar(char *p) { int k; printf("%i", tam); for (k=0; k<tam; k++) { printf("posicao %i :%c: ",k ,p[k]); } getch(); } Note que na função inserir o ++tam foi alterado para tam++ pois da forma que estava você sempre está inserindo na próxima posição pois primeiro tam é incrementado e depois ele é atribuído a k. Outra coisa que não entendi no seu código: você quer armazenar caracteres, correto? Porque você aloca memória como int? Isso está incorreto! Utilize char onde está int nos ponteiros. Um último comentário: funções que não retornam nada declare como void! Algumas de suas funções não retornam nada e mesmo assim estão sendo declaradas como char.
  6. Eu tenho duas observações: 1) Em linguagem C é recomendado que se declarem as variáveis no início do bloco, antes de qualquer código de execução. Inclusive até pouco tempo atrás os compiladores geravam um erro nessa situação. 2) Você não pode fazer comparações entre strings diretamente. Assim: pess[i].nome>pess[i+1].nome Não funciona! Utilize strcmp para comparar strings pois esta função retorna zero se as strings forem iguais ou um valor positivo ou negativo para indicar se a string do primeiro parâmetro é maior ou menor que a outra string, respectivamente.
  7. shell("c:\\windows\\notepad.exe"); Note as aspas duplas: se não for desta forma o caracterer após a barra seria interpretado como um caracter especial. Por exemplo: windows\notepad.exe O \n seria interpretado como uma quebra de linha. Não me lembro qual o arquivo .h que deve ser incluído mas dê uma procurada que você acha!
  8. Legal que conseguiu resolver! :) Eu pessoalmente não gosto de fazer desta forma pois fica complicado de entender o código. Uma alternativa seria criar uma estrutura que seria retornada pela função. Esta estrutura conteria os dados necessários, servindo até mesmo para passar como parâmetro a outras funções.
  9. Ao abrir um arquivo para append o ponteiro do arquivo é direcionado ao final do arquivo, independentemente se ele contém dados válidos para você ou não. O que deve ser feito é truncar o arquivo ao remover uma posição e não apenas escrever algum valor para "limpar" os dados antigos. Eu não me lembro como fazer isso agora mas este é o caminho! :)
  10. Você está corretíssimo, cinco já dá para testar o algoritmo! :) Seguem meus comentários: 1) No seu caso você poderia salvar não o número de pontos em menor1 e menor2 mas sim o índice (contador i). Assim você teria acesso aos pontos da mesma forma e também o nome do time. Assim o código para exibir os times rebaixados seria: printf("Primeiro time rebaixado: %s com %d pontos\n", vet[menor1].nome, vet[menor1].pontos); printf("Segundo time rebaixado: %s com %d pontos\n", vet[menor2].nome, vet[menor2].pontos); 2) O else é opcional. Se não for necessário não precisa usar! Eu vi no código que você atribui a variável a ela mesma em campos else, algo desnecessário. 3) A lógica de busca eu deixaria da seguinte forma: menor1 = 0; for(i=0;i<5;i++) { if(vet[i].pontos<vet[menor1].pontos) menor1 = i; } // Não permite que menor1 e menor2 repitam if(!menor1) menor2 = 1; else menor2 = 0; for(i=0;i<5;i++) { // verifica se é o time escolhido em menor1 para não repetir if(vet[i].pontos<vet[menor2].pontos && i!=menor1) menor2 = i; } 4) Outra coisa: a palavra time pode parecer tempo em inglês e dependendo até gerar algum conflito, dependendo das funções que você estiver usando. Use outro nome como equipe, por exemplo. Consegui explicar? :)
  11. Quanto a ser C ou C++, não há problema! Pode ser feito com qualquer uma das duas linguagens. Quanto à conversão: realmente não é algo tão simples mas poderia ser muito facilitado se o formato da string fosse outro. Como você recebe esta string? O formato precisa ser mesmo este? Da forma como está você terá um valor para cada 6 caracteres. O algoritmo deve remover os primeiros dois dígitos ("0x") e converter os outros dois. Segue abaixo o código de uma função que converte um char em seu correspondente em hexa: byte ConvHexToByte(char hex) { hex = toupper(hex); if(hex >= '0' && hex <= '9') return (byte)(hex - '0'); if(hex >= 'A' && hex <= 'F') return (byte)(hex - 'A' + 10); else return (byte)(0); } Assim o loop ficaria: while (palavra!=NULL) { palavra += 2; // Avança para após 0x xRPrint[i] = ConvHexToByte(palavra[0])*16 + ConvHexToByte(palavra[1]); i++; palavra = strtok(NULL, ", "); } Só um detalhe: o código não está alocando memória dinamicamente e portanto haverá um limite para a quantidade de dados em xRPrint. Como sabemos que um valor hexa é representado por 6 caracteres na string, poderíamos utilizar o seguinte código para alocar memória dinamicamente: byte *xRPrint; xRPrint = (byte *)(malloc(strlen(palavra)/6 + 1); Eu não sei o tipo de byte mas deve ser um unsigned char. Se não for avise! Devemos somar 1 pois o último dos valores usará apenas 4 caracteres por não possuir a vírgula e o espaço no final, fazendo o cálculo retornar 1 posição a menos que a realmente necessária. Obs: eu montei todos os códigos agora, não testei nem compilei! Se algo der errado avise.
  12. Mas tem que ser em C++ ou pode ser em C? Você não usou nenhum recurso de C++ neste programa! Quanto ao que está faltando: você deve criar um contador para o número de crianças com menos de 24 meses e que pode ser incrementado quando o usuário digitar a idade.
  13. Olá! Parabéns pela coragem. Eu me formei em engenharia da computação e sei como é difícil! Boa sorte e acredite sempre que você chega lá... :) Quanto ao código: pode postar sim! De preferência entre as tags [ code ] e [ /code ] sem os espaços nos colchetes! Para associar você realmente precisa de uma estrutura. Você sabe como declarar?
  14. Marcelo Utikawa da Fonseca

    C/C++

    Coloca o erro que ajuda!!! :)
  15. Algumas coisas erradas no seu programa: 1) A função main é do tipo int mas não retorna nada! Adicione um return no final. 2) res=aluno(&p1,&p2,&p3); aluno é uma estrutura, não uma função. Pelo jeito isto é que está dando errado! Acho que o que você queria aqui era chamar a função aprovado, não é? aprovado precisa de um parâmetro: ponteiro para estrutura. Assim utilize o operador &. Exemplo: aprovado(&x); 3) res é uma estrutura e não poderia receber o retorno de aprovado que é um int. O que você quer? que aprovado retorne uma estrutura?
  16. Mas o que dá errado? Outra coisa: é realmente necessário que a função receba tantos ponteiros assim?
  17. Como atual é um int e espera-se que atual seja menor que anterior, o resultado da divisão será sempre zero! Para corrigir faça um cast em atual para que ele seja convertido para um double: economia = (1-((double)(atual)/anterior))*100;
  18. Use a função shell Basta passar como parâmetro o caminho para o executável.
  19. Da mesma forma que se você estivesse alterando o registro. A função que grava o registro foi feita por você?
  20. O que acontece quando você tenta usar em outro arquivo? Erro na compilação, ao linkar? Provavelmente o problema está sendo ao linkar. Poste o código que você usa no main para acessar a union.
  21. Parabéns pela sua idéia, o raciocínio de simplesmente não exibir mais o registro excluído é um recurso muito utilizado! Isto deve-se ao fato de que para remover um registro efetivamente pode demorar muito! Imagine um arquivo de 100 MB: se o registro excluído estiver no primeiro MB você teria que mover 99 MB em disco! Não sei que tipo de código você está fazendo mas se cada registro for uma estrutura, por exemplo, crie uma flag que indique que o registro foi excluído. Outra alternativa seria alterar o ID do registro para zero, indicando que ele foi excluído.
  22. Olá! Você não pode usar strlen para isso. Como o próprio nome da função indica, ela serve para retornar o tamanho de uma string (string length). O correto é testar cada posição dentro da string para identificar se é espaço em branco, vogal ou consoante. Dica: lembre-se do conceito da tabela ASCII: as letras estão em ordem alfabética e portanto é possível identificar se um caracter é uma letra utilizando uma comparação como a que esta abaixo: if(ch >= 'a' && ch <= 'z') printf("Caracter %c é letra!\n", ch); Tente fazer algo e poste o que conseguir!
×
×
  • Criar Novo...