Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.

isrnick

Membros Plenos
  • Total de itens

    1.596
  • Registro em

  • Última visita

  • Qualificações

    0%

Reputação

935

3 Seguidores

Informações gerais

  • Cidade e Estado
    Sao Paulo
  • Sexo
    Masculino
  1. @giu_d Sim, eu até postei um código num tópico demonstrando que as notações de ponteiro e de vetores são intercambiáveis e valem em todas as situações:
  2. @Josesousa Sim, esta notação (*ponteiro)[n] criar 1 ponteiro que aponta para um arranjo/vetor inteiro, ao invés de apontar para apenas 1 variável como num ponteiro normal, assim se você incrementa sobre o ponteiro estará incrementando proporcionalmente ao tamanho do arranjo, logo passa a apontar para o próximo arranjo (nesse caso a próxima linha da matriz). Ex: - linha 1 e coluna 0: (*(ponteiro + 1))[0] ou ponteiro[1][0] adicionado 8 minutos depois Bom meu programa não faz nada, só aloca e libera uma matriz. Mas em todos os lugares que testei compila e roda sem problemas, que erro deu?
  3. @Josesousa Corrigi o nome da função. Mas como foi mencionado o enunciado do exercício pede que seja feito usando ponteiro para ponteiro. Então fica aí pra aprender um método diferente com algumas vantagens se desejar.
  4. Na verdade se entender que caracteres não números, não precisa consultar a tabela ASCII: int num = 5; char numC = (char)(num + '0'); Assim não precisa saber o número decimal correspondente do caractere na tabela ASCII.
  5. Eu prefiro usar ponteiro para arranjo ( (*ponteiro)[n] ), ao invés de ponteiro de ponteiro ( **ponteiro ): #include <stdio.h> #include <stdlib.h> int (*nova_matriz(int nlinhas, int ncolunas))[] { int (*matriz)[ncolunas] = NULL; matriz = malloc(nlinhas * sizeof *matriz); if (matriz == NULL){ printf("\nERRO: Memoria livre insuficiente!\n"); exit(EXIT_FAILURE); } return matriz; } int main() { int (*matriz)[5]; matriz = nova_matriz(4, 5); /*Faz algo com a matriz de 4 linhas x 5 colunas*/ free(matriz); return 0; } Assim só precisa usar 1 free para liberar a matriz inteira, e usando 1 único malloc a matriz inteira é armazenada em um lugar continuo da memória. Com vários mallocs cada um deles reserva espaço em um lugar diferente da memória então a matriz fica fragmentada em vários lugares perdendo desempenho, e também aumenta a chance de vazamento de memória.
  6. Primeiro faça uma função para multiplicar matrizes, depois chame essa função várias vezes, sempre multiplicando a matriz pelo resultado da multiplicação anterior.
  7. Segundo o enunciado ( https://www.urionlinejudge.com.br/judge/pt/problems/view/2668 ) deseja-se obter o K-ésimo dígito menos significativo da parte inteira de XN, não o mais significativo. Usar pow(X, N) não vai funcionar pois N pode ter valor 1000000000 (109), então a potência vai ficar grande demais para calcular e armazenar numa variável. O truque nesse exercício é notar que K vai de 1 até 4 apenas, então no máximo vai obter o quarto dígito menos significativo, então não precisa obter o valor de XN, mas apenas calcular os 4 dígitos menos significativos desse número, ou seja vai multiplicando por X e se ficar maior que 5 dígitos inteiros elimina do número o que for maior que isso e continua multiplicando apenas os dígitos menos significativo por X. E = 1; for (i = 0; i < N; i++){ E *= X; if (E > 99999) E -= floor(E/100000) * 100000; } E não precisa transformar em string, basta ir dividindo a parte inteira por 10 até chegar no K-ésimo dígito, e usar o resto da divisão por 10 para obter apenas o dígito. f = (int)floor(E); for(i = 0; i < K-1; i++) f /= 10; d = f % 10;
  8. Precisa fornecer o caminho completo? Não dá pra colocar um caminho relativo? Por exemplo colocar "." ou talvez ".\" como caminho, ao invés de "C:\Users\Paulo Llimona\Dropbox\", se os 2 arquivos estão na mesma pasta. adicionado 42 minutos depois Pesquisando achei essa indicação de usar a função INDIRETO pra abrir o arquivo na mesma pasta: INDIRETO("'arquivo.xlsx'#$Planilha1.A1") ou numa subpasta da pasta atual: INDIRETO("'.\subpasta\arquivo.xlsx'#$Planilha1.A1")
  9. Não sei se deu pra entender como ele funciona, é meio complicado, tem que passar a string como parâmetro na primeira chamada da função, e depois passar NULL como parâmetro nas chamadas seguintes da função para continuar procurando do ponto onde parou na mesma string que chamou na primeira vez.
  10. Usando strtok fica fácil: #include <stdio.h> #include <string.h> int main() { char frase[100], p_busca[100], *palavra; int cont=0; printf("Digite uma frase qualquer em letras minusculas: "); scanf(" %99[^\n]", frase); printf("Digite uma palavra qualquer em letras minusculas: "); scanf(" %99s", p_busca); for (palavra = strtok(frase, " "); palavra != NULL; palavra = strtok(NULL, " ")){ if (strcmp(palavra, p_busca) == 0){ cont++; } } printf("\n\nA palavra '%s' aparece %d vezes na frase.", p_busca, cont); return 0; }
  11. Fiz usando strtok() usando o caractere de espaço " " como separador de tokens na string, assim ele separa cada palavra da frase (nesse caso a função substitui o espaço ' ' pelo caractere nulo '\0', e retorna o endereço de memória do início da palavra). E então basta usar strcmp para comparar a palavra encontrada com a string "de", e incrementar o contador se forem iguais. #include <stdio.h> #include <string.h> int main() { char frase[100], *palavra; int cont=0; printf("Digite uma frase qualquer em letras minusculas: "); scanf(" %99[^\n]", frase); for (palavra = strtok(frase, " "); palavra != NULL; palavra = strtok(NULL, " ")){ if (strcmp(palavra, "de") == 0){ cont++; } } printf("\n\nA palavra 'de' aparece %d vezes na frase.", cont); return 0; }
  12. Entendi. Funções de leitura de string sempre colocam o '\0' após os caracteres de string automaticamente, não precisa fazer manualmente (certifique-se de que o vetor de caracteres que vai armazenar a string sempre seja grande o suficiente para armazenar todos os caracteres da string mais o caractere nulo '\0'). Obs: No caso do fgets() ele captura até o caractere nova linha '\n' que é digitado pelo usuário quando ele aperta Enter, então costuma-se remover manualmente esse caractere substituindo-o pelo caractere nulo '\0'. Funciona assim: //Cria um ponteiro que aponta para uma posição de //memória antes da posição apontada pelo ponteiro p: char *limit = p - 1; //Faz p apontar para a posição final do vetor: p += n; //Vai decrementando 1 de p, e enquanto p for //maior que a posição limite, coloca valor 0 //na posição do vetor. while (limit < --p){ *p = 0; } free (p); Mas @AnsiC agora que prestei atenção nesse código tem um problema pois p acaba com valor igual ao valor de limit, que é igual a p original menos 1, então free(p) vai estar liberando o lugar errado da memória. Certo?
  13. Não está multiplicando por um vetor, está multiplicando pelo tamanho da variável *vet, ou seja em sizeof *vet esse asterisco não é uma multiplicação, sizeof é uma palavra chave reservada da linguagem, e serve para obter o tamanho em bytes de algo, nesse caso como *vet é do tipo int o resultado é o tamanho de int (normalmente int tem 4 bytes). A vantagem de fazer assim, ao invés de usar sizeof(int), é que não precisa checar qual o tipo do ponteiro vet, então se mudar o tipo de vet, (por exemplo declarar a variável como double *vet;) o malloc não precisa ser alterado, pois vai funcionar corretamente usando o tamanho certo.
  14. @giu_d Correto, e também deveria checar se houve sucesso ao alocar memória: int *aloca_vetor(int n) { int *vet = NULL; vet = malloc(n * sizeof *vet); if (vet == NULL){ printf("\nERRO: Falhou ao tentar alocar memoria! Nao ha memoria livre suficiente!\n"); exit(EXIT_FAILURE); } return vet; }

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×