Ir ao conteúdo
  • Cadastre-se

Kyul

Membro Pleno
  • Posts

    23
  • Cadastrado em

  • Última visita

  1. A definição de quadrado perfeito é tal que: raiz_quadrada(n²) = n, sendo n >= 1. Alguns exemplos são: raiz_quadrada(2² = 4) = 2, raiz_quadrada(9 = 3²) = 3, etc. Veja se concorda comigo: uma abordagem seria testar todos os números entre a e b, elevando ao quadrado e verificando se eles são números decimais, certo. Isso resolve seu problema. Mas, tem uma maneira mais inteligente de se fazer isso. De uma pensada melhor.
  2. @iandl99 Tranquilo. Então, a função "printf" imprime uma saída formatada. O que isso quer dizer? Bem, quando você tem uma variável e precisa mostrar o valor dela, isto é, imprimir ela na tela (que é a saída padrão - standard output ou stdout), você precisa de que alguma coisa faça isso. Em linguagens de programação existem funções prontas para lidar com este tipo de problema. Imagine você ter de escrever o código que faça isso? Na primeira vez que eu fui programar, eu imaginei a complexidade que seria pra fazer isso na mão, sem usar as funções que a linguagem oferece. Pois bem, dito isso, a linguagem C tem funções para lidar com este tipo de problema. Essas funções se encontram... Ora, vejam... No header stdio.h - Standard Input/Ouput, que em PT-BR significa entrada e saída padrão. Por padrão, nos sistemas operacionais a entrada padrão é o teclado, e a saída, como dito acima, é o monitor do seu PC. Vou descrever o que a printf faz: Ela joga um texto (que é conhecida como string no mundo da programação) formatado na saída padrão. Mas o que é formatado? Suponha que você queira imprimir o conteúdo de uma variável que guarda um caractere (letra), no seu caso, 'A', 'B' ou 'C', na tela. Os caracteres são representados por um número nos sistemas operacionais (dê uma olhada em ASCII). Isso significa que o caractere 'A' é representado tanto quanto um símbolo (a letra 'A') como um número (65 em ASCII). Logo eu posso imprimir de duas formas para o usuário: "Resposta = A" ou "Resposta = 65". A função printf me permite fazer isso, da seguinte maneira. Imprimir como letra: printf("Resposta = %c", resposta); Imprimir como número: printf("Resposta = %d", resposta); Perceba que a mesma variável pode ser mostrada na tela de duas formas diferentes, e é isso que o printf faz. Ele pega esse texto (string) que você coloca ("Resposta = %d"), formata ela, utilizando o segundo argumento que você passou (a variável resposta), ficando: "Resposta = 65", e joga na tela para o usuário ver. Perceba, ainda, que dependendo de como nós queremos mostrar o conteúdo da variável resposta, seja como número (65) ou como letra ('A'), depende daquele comandinho ali (%d ou %c). Existe uma lista de como você deseja apresentar o conteúdo de alguma variável na tela. Aqui vai algumas opções das mais utilizadas: %d, é utilizada para apresentar como valores inteiros (geralmente utilizada para variáveis do tipo int) %f é utilizada para apresentar os valores como números decimais (utilizada para variáveis do tipo float) %c é utilizada para apresentar um único caractere (a letra 'A', 'B', 'c', '@', etc.), que são geralmente utilizadas para variáveis do tipo char %s é utilizada para apresentar um texto ("Hello World!", "The black fox jumps above the lake"), que são utilizadas para vetores (arrays) do tipo char. Esse último que eu citei, para textos, o tipo seria algo assim: char frase[40] = "Essa eh uma string em C"; // String ou "texto" em C /* Perceba que o 40 ali, indica a quantidade de letras, incluindo espaço e caracteres especiais (@, #, &, $) que a string vai ter */ AVISO: Eu descrevi um uso superficial da função printf, mas o uso vai mais além do que eu te expliquei. Qualquer dúvida é só escrever.
  3. Tem alguns problemas com o código que você postou: Estão faltando alguns ponto-e-vírgulas; Falta fechar uma chave no último else; O tipo float é utilizado para armazenar números decimais (exemplo: 3.1415, 1.41, 0.921546, etc.) e não é feito para guardar para guardar caracteres (como 'A', 'B' e 'C'). Para isso, você pode utilizar int ou char. É mais semântico (faz mais sentido) e eficiente (ocupa menos espaço na memória principal), se utilizar char, para caracteres; Você não está imprimindo o valor da variável resposta. Portanto, nada é mostrado depois da leitura de x e y.
  4. @iandl99 Qual problema você está tendo exatamente?
  5. Kyul

    C++ Função Rotina em C++

    Sim, foi o que expliquei na resposta acima: Aqui, não dá pra fazer algumas coisas que você faz com um ponteiro em um array. Esse exemplo é um deles. Note que "algumas" aqui significa quase todas as coisas que você faz com ponteiro, por isso, sim, concordo com você, não é uma mão dupla em alguns casos. kkkk Eu sei que você não tava dando sua opinião, mas o que eu quis dizer aqui, talvez não tenha ficado bem colocado, é que você me falou sobre a aritmética de endereços envolvendo ponteiros, que é o que o compilador faz por debaixo dos panos.
  6. Kyul

    C++ Função Rotina em C++

    @kgin Olá. O livro descreve apenas superficialmente o que são vetores (arrays) e matrizes e está correto. Mas você já se perguntou o porquê de podermos acessar o elemento de um vetor alocado dinamicamente do mesmo modo que um vetor "estático"? Por exemplo, o trecho de código a seguir ilustra o que eu quis dizer: int *p = malloc(sizeof(int) * 4); int q[4]; for(int i = 0; i < 4; i++) p[i] = (i + 1); /* Aqui nos somamos 4 bytes a cada iteração, uma vez que eh um pointeiro para inteiro e, na arquitetura x86_64 um inteiro, geralmente, tem tamanho de 4 bytes; Aqui, nos poderiamos usar p[i], também; */ for(int i = 0; i < 4; i++) { printf("%d ", *(p + i)); } printf("\n"); /* Do mesmo modo, podemos tratar o tipo array. Neste caso fazemos o incremento da mesma maneira. Aqui também poderiamos usar q[i]. */ for(int i = 0; i < 4; i++) { printf("%d ", *(q + i)); } printf("\n"); free(p); Logo, neste caso, nós podemos enxergar os arrays como ponteiros e vice-versa. Porém, não é possível mudar o endereço no qual um array aponta. Se você tentar fazer isso: *(p++) = 1; *(q++) = 1; printf("p: %d, %d\n", p[0], p[1]); printf("q: %d, %d\n", q[0], q[1]); Você não vai nem mesmo compilar, pois o array é um tipo (o compilador vai te dizer isso), e o que você pode tirar disso é que ele é constante, ou seja, você nunca pode mudar o endereço no qual ele aponta, que é o endereço do primeiro elemento do array. Mas você deve estar se perguntando, por que pensar dessa maneira? A resposta é porque é importante saber como as coisas são implementadas de fato. Isso pode te ajudar a resolver alguns problemas, inclusive de segurança. Fui infeliz na escolha das palavras, é verdade, mas o que eu queria enfatizar aqui é que se você for atribuir uma matriz à um ponteiro de ponteiro, o compilador (ao menos o GCC) fala que você está tentando uma atribuição entre tipos incompatíveis int (*)[] à um int **. De fato, não me expressei bem. Bem, matriz é uma abstração, assim como int, char, double, pois no fundo, no fundo, são bytes e você pode dar qualquer significado à eles. Ponteiros são variáveis utilizadas para manipulação de endereços de memória. Você dá a utilidade necessária para eles. E, sim, o que você falou eu concordo, um N-D array pode ser alocado com um único ponteiro se assim preferir, no fundo, o compilador, ou você, faz os cálculos de endereços de memória para acessar tais elementos. O único livro que peguei pra pegar algumas coisas de C foi o livro dos próprios criadores da linguagem (Denis Ritchie e Brian Kernigham), então não tenho referência de um livro pra essa linguagem. A maioria das coisas que aprendi foi com a referência do compilador GNU para a linguagem e Assembly.
  7. Kyul

    C++ Função Rotina em C++

    Se você não conhece, ou não gosta, de trabalhar com ponteiros, uma solução seria: void func(int mat[][6]) { // faz a multiplicacao conforme o problema. } Deste modo a função altera a matriz original, ou seja, ela não cria uma cópia da mesma, pois estamos passando-a por referência. AVISO: vetores (arrays) na linguagem C e C++ são ponteiros constantes. Matrizes, especificamente, são um vetor de ponteiros (array of pointers). Acredito que essa informação não mude de compilador para compilador. Por este motivo, no retorno da função, a matriz original é alterada. Experimente fazer o seguinte: #include <stdio.h> void f(int a) { a = 10; } void h(int a[1]) { a[0] = 10; } void main() { int a = 1, b[1] = { 1 }; f(a); h(b); printf("a: %d\n", a); printf("b: %d\n", b[0]); } Pergunta: Por que a variável "a" não alterou o seu valor e a variável "b" alterou? Resposta: A variável "b" é um ponteiro! Caso queira criar um cópia para não alterar a matriz original, você deve, obrigatoriamente, mexer com ponteiros duplos. Daí, a declaração de função muda para: int **func(int mat[][6]) { int **my_pointer = NULL; /* Aqui você deve declarar um ponteiro pra pointeiro (int **) e fazer a alocação dinâmica de memória */ return my_pointer; } Deste modo, você preserva a sua matriz o original, neste caso a mat[][6], e retorna o resultado em uma matriz. Acredito que a solução dada por @devair1010 seria multiplicar o elemento da diagonal principal pela linha correspondente, porém, a forma que ele escreveu não faz isso. Da maneira como foi dada a solução, a função dele retorna sempre o primeiro elemento de "mat". Assim, outra maneira de resolver isso seria: void func(int mat[2], const int linha) { /* Aqui você escreverá um loop que fará a iteração na linha. O parâmetro "linha", seria a posição do elemento da diagonal principal da linha em questão */ return 0; } int main(int argc, char *argv[]) { for(int i = 0; i < LINHAS; i++) { func(mat[i], i); } return 0; } Desse modo, você altera a matriz original também. Qualquer dúvida é só escrever que te ajudo.
  8. Olá, é um erro de sintaxe. O "main", é obrigatoriamente com M. E a classe "Program" tem de ser, obrigatoriamente, public
  9. Olá. Qual parte do problema você está tendo dificuldade? Poste aqui e eu vou te ajudando.
  10. Que tipo de problemas você está tendo, exatamente? Concordo em partes o que o colega acima disse. Mas vamos lá. Volto a repetir aqui que seria uma boa você dar uma olhada em uma documentação de quem implementa a linguagem C, para conhecer como se manipula um arquivo. Não sei se você sabe algo de inglês, mas uma possível documentação que você poderia ler seria essa: https://www.gnu.org/software/libc/manual/html_node/I_002fO-on-Streams.html Embora seja uma documentação para o compilador GNU para a linguagem C, essas informações se aplicam no seu caso também, pois, provavelmente, você está rodando em ambiente Windows com MingW, ou algo parecido. Então, como não sei qual o problema que você tá tendo, vou apontar um aviso aqui: a flag "r+b", permite que você leia ou escreva no arquivo, mas ela não cria o arquivo em si, o arquivo deve existir para funcionar como esperado. Outro aviso que deixo aqui é que para manipular arquivos binários: quando for escrever, OBRIGATORIAMENTE, você deve utilizar a flag "wb", ou alguma variante do tipo. Mas para ler, você não é obrigado a utilizar o "b" nas flags. Isso porque você está lendo bytes (0's e 1's), e salvando-os na memória exatamente como você os pegou. Então, tanto faz se você utiliza o "b" ou o não. Uma outra dica: "structs", geralmente, tendem a consumir mais memória do que o esperado. Por exemplo: Qual seria o tamanho (sizeof) da struct abaixo? struct t_test { char c; int d; }; Se você respondeu 5, errou. Isso varia de arquitetura para arquitetura, mas, geralmente, na arquitetura i386 (ou x86_64, ou ainda, mais conhecida como x86), "int" tem tamanhos de 4 bytes e "char" de 1 byte, MAS... Para melhorar o acesso a memória o compilador insere gaps ("buracos") entre as variáveis da "struct" para que o processador necessite fazer menos acessos à memória para acessar o dado. As variáveis "int" devem ficar em endereços múltiplos de 4 (por conta dos 4 bytes). Não vou me estender nesse assunto por aqui, esse não é o foco, mas se quiser saber mais, procure sobre alinhamento de memória. Eu disse isso tudo, porque você pode estar ocupando mais espaço no seu arquivo do que precisa. Na "struct" que eu dei como exemplo, ao invés de cada dado guardado no arquivo ocupar 5 bytes, vão ocupar 8 bytes.
  11. O que você vai precisar saber: "structs" e manipulação de arquivos (leitura e escrita). Qualquer dúvida relacionada aos tópicos que te indiquei, poste aqui e eu vou te ajudando nas suas dúvidas.
  12. @Pedro Penna , que tipo de espelhamento você se refere?. Pois tem o horizontal, vertical, em relação à diagonal principal e em relação à diagonal secundária. Ex. de espelhamento horizontal: | 1 2 3 | | 3 2 1 | | 4 5 6 | -----> | 6 5 4 | | 7 8 9 | | 9 8 7 | Perceba que os elementos da coluna do meio permanecerão na mesma posição. Ex. de espelhamento vertical: | 1 2 3 | | 7 8 9 | | 4 5 6 | -----> | 4 5 6 | | 7 8 9 | | 1 2 3 | Perceba que os elementos da linha do meio, permanecerão na mesma posição. Não escreverei os outros exemplos aqui, pois a resposta ficaria um pouco grande e, porque eu acho que o espelhamento que você procura é o horizontal.
  13. Em qual parte você precisa de ajuda? Sabe começar?
  14. Olá, primeiramente gostaria de alertar três coisas em seu código: 1ª: Nunca use a função "gets". Ela não tem proteção contra Buffer Overflow, que é um tipo de vulnerabilidade que seu código tem. Ao invés dessa função, utilize "fgets", por exemplo. 2ª: Utilize a função "strncmp" ao invés da função "strcmp", pelo mesmo motivo acima. 3ª: Você não está "desalocando" a memória previamente alocada com o "malloc", isso pode dar Memory Leak, bem como ocasionar problemas de segurança no seu código. O seu problema está justamente na comparação feita por "strcmp". Essa função espera (tem argumentos) dois ponteiros para "char" (comumente conhecido como strings, mas eu não gosto de ver ponteiros dessa maneira, atreladas à um tipo específico), e o que você está passando para ela, é um ponteiro para "char", e um "char". Além disso, gostaria de te perguntar: você acha realmente necessário utilizar uma função que compara "strings", ou seja, um vetor de "chars", nesse caso? Pense um pouco... Você só tá comparando caractere por caractere.
  15. Qual o problema que ele descreve? Porque na imagem que você postou, não tem nada sobre esse problema. Além disso, você salvou o arquivo e compilou depois de ter salvo? Porque na imagem que você postou, falta salvar o arquivo.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!