-
Posts
1.558 -
Cadastrado em
-
Última visita
Tipo de conteúdo
Artigos
Selos
Livros
Cursos
Análises
Fórum
Tudo que isrnick postou
-
Sim. O espaço da memória que foi alocada para a variável n foi usado por outros programas anteriormente, logo provavelmente já existe um valor nesse espaço de memória, quando você digitou a palavra diretamente ao invés de um número a leitura do scanf falhou, e nenhum valor foi guardado na variável n, o que também significa que o valor que já estava lá não foi modificado. Se esse valor for um número positivo grande o suficiente o seu programa vai funcionar, pois usa esse número para alocar a memória dinamicamente (como não se sabe o quão grande é o número possivelmente uma grande quantidade de memória é alocada), e o processo de criptografia funciona normalmente trabalhando nesse espaço de memória alocado. (Para evitar isso precisaria checar o retorno da função scanf para verificar se teve sucesso na leitura dos dados, e tomar decisões de acordo com o retorno.) Sim, toda string em C acaba em um caractere nulo '\0', indicando onde a string acaba, logo o vetor de char deve ter pelo menos 1 posição a mais que o número de caracteres da string para poder armazenar o caractere nulo. Mas não entendi sua dúvida, o que quer dizer com "porque você não preenche a palavra?" ? A palavra é fornecida pelo usuário no scanf("%s", p); . Sim, free() libera a memória, os valores continuam lá mas agora o espaço da memória pode ser usado para outras coisas e esses valores serão sobrepostos/substituídos. Nessa parte ele está zerando todas as posições da memória antes de desalocar a memória, mas também não entendi o porque isso seria necessário.
-
standard = norma This document is not an ISO International Standard = Este documento não é uma Norma Internacional ISO.
-
N3690 não é um padrão, está escrito logo na primeira página do documento: Fonte: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf N3690 é um documento que foi usado como uma das referências durante o processo de definição da norma C++14: https://isocpp.org/blog/2013/05/new-paper-n3690-programming-languages-c-committee-draft Mas o que consta na norma de fato é o que realmente é válido.
-
A que norma anterior você se refere? Nenhuma das normas da linguagem C++ inclui arrays com comprimento variável na linguagem. Vale notar que C++ não é C com mais recursos, são linguagens diferentes. Sim, o C++ foi criado a partir do C, mas foi padronizado pela primeira vez em 1998 e baseou-se na versão C89/C90 da linguagem C (arrays com comprimento flexível só foram inclusos na versão C99 da linguagem C), e cada uma seguiu seu próprio caminho desde então, logo recursos que existem no C não precisam necessariamente existir no C++.
-
Deveria dar erro se usar -std=c++11, pois aí está especificando que só vai usar recursos padrões da linguagem, sem extensões. Usa-se isso quando não quer que coisas que não façam parte da versão oficial da linguagem funcionem.
-
O compilador que vem incluso na versão do Codeblocks com compilador é o GCC (=MinGW).
-
O compilador deve estar configurado para usar uma versão padrão da linguagem C++, como C++11, acredito que se alterar as configurações do compilador para usar -std=gnu++11 na linha de comando de compilação, que é a versão C++11 da linguagem com extensões GNU, o código deva funcionar. Mas arrays com comprimento variável e comprimento flexível não são parte da versão padrão do C++, estes são recursos da linguagem C que não estão presentes no C++, mas alguns compiladores podem implementá-los e permitir usá-los no C++ (quando o compilador é configurado para isso). Entretanto seria melhor aprender a fazer usando apenas os recursos do C++ para não ter problema quando não tiver essa opção, nesse caso poderia usar ponteiro, new e delete[].
-
Selection Sort ordem crescente - Para cada posição procura (apenas) nas posições subsequentes da lista de items, qual é o item de menor valor, e uma vez encontrado faz a troca de posição se o item de menor valor não estiver na posição atual. Insertion Sort ordem crescente - Cada novo item da lista analisado é inserido na lista de items verificados anteriormente tal que a lista com todos os items já processados se mantenha ordenada, para isso todos os items anteriores maiores que o item atual são movidos em 1 casa para a frente para abrir espaço para inserir o item atual na posição correta da lista já ordenada. Bubble Sort ordem crescente - Percorre a lista várias vezes comparando cada item com o próximo item da lista, e trocando-os de posição se o item atual for maior que o próximo, o que implica que a cada passagem o maior item será movido para o fim da lista, portanto não é preciso ir até o fim da lista nas próximas passagens pois os maiores já vão ficando ordenados no fim da lista, e para de percorrer a lista quando não foi necessário fazer mais nenhuma troca, pois isso indica que a lista já está ordenada.
-
O problema está nos especificadores de tipo usados nas funções scanf() e printf() no seu programa, pois você usou %f que é o especificador para o tipo float, mas o especificador para double é %lf, logo está tentando guardar o tipo errado de dado na variável. E sim, a função modf() trabalha com double apenas. Para float deve usar a função modff(), e para long double usa-se a função modfl(). https://en.cppreference.com/w/c/numeric/math/modf
-
C Função char* precisa retornar char (e não endereço)
isrnick respondeu ao tópico de a.melchiors em C/C#/C++
Na função: char* separa(int numero) { char *r; //Ponteiro r = malloc(100 * sizeof *r); //aloca um vetor de 100 chars strcpy(r, "abcdef"); //guarda a string "abcdef" no vetor apontado pelo ponteiro r return r; //Retorna a referência para o vetor } Onde a função é chamada: char *s; //Ponteiro s = separa(0); //A função retorna um endereço de memória para o vetor de chars /*Imprime a string armazenada no vetor de chars*/ printf("%s\n", s); //libera a memória alocada dinamicamente //quando não precisar mais dela: free(s); -
C Como utilizar as SETAS (cima e baixo) e ENTER do teclado no menu de um programa?
isrnick respondeu ao tópico de ytalopaulo_ em C/C#/C++
Não há uma maneira simples de fazer isso usando as bibliotecas padrão do C, seria necessário usar bibliotecas de terceiros, acredito que a biblioteca curses.h disponibiliza recursos para fazer esse tipo de coisa, ou então seria necessário implementar você mesmo todo o funcionamento do menu, como o @T1000_2015 indicou. Mas a pergunta é se vale a pena fazer isto, pois nesse caso provavelmente seria mais negócio partir para uma interface gráfica ao invés de uma tela no terminal cmd. -
Como foi mencionado pelo @AnsiC e o @Simon Viegas o cálculo para verificar se é um número triangular está errado. Mas quanto a sua dúvida... Assumo que quando falou em usar chaves quis dizer fazer algo assim? for (i = 1; i*(i+1)*(i+2) < n; i++) { if (i*(i+1)*(i+2) == n) printf("%d e' o produto %d*%d*%d\n", n, i, i+1, i+2); } Isso não funciona pois quando i*(i+1)*(i+2) é igual ou maior que n o ciclo for é encerrado, logo quando n é igual a i*(i+1)*(i+2) sai do for então o if dentro do for não é executado e verificado, logo nunca vai executar a linha do printf. Quanto a este for sem chaves: for (i = 1; i*(i+1)*(i+2) < n; i++); O que ele faz é inicializa a variável i com valor 1, e vai incrementando +1 em i enquanto i*(i+1)*(i+2) for menor que n. Logo, a função dele é apenas ir aumentando o valor de i até chegar num número para o qual i*(i+1)*(i+2) é maior ou igual a n. Aí quando o ciclo for acabar basta usar o valor final de i e checar a condição de igualdade para imprimir se o número é ou não triangular (assumindo que seja usada a fórmula correta).
-
Entendo, eu escolheria adaptar essas exceções ao modelo, nesse caso a série tem uma única temporada com todos os episódios, mas tem razão de que o tipo int seria desperdício de memória, mas nesse caso eu escolheria usar um tipo com 16 bits como unsigned short int ou uint16_t, que já atenderia todos os casos. No caso de escolher usar o tipo char também seria necessário mudar o tipo de qtdsEps dentro da struct para char.
-
Tem séries que existem a muito tempo e nunca pararam, tem milhares de episódios, mas não são divididos em temporada, logo não vai caber a quantidade de episódios no tipo char. https://en.wikipedia.org/wiki/List_of_television_programs_by_episode_count
-
Mas no segundo malloc deveria multiplicar pelo tamanho de int, certo? cosmos->qtdsEps = malloc (cosmos->qtdsTemps * sizeof(int));
-
C Função char* precisa retornar char (e não endereço)
isrnick respondeu ao tópico de a.melchiors em C/C#/C++
Aloca memória dinamicamente, e retorna o endereço da memória alocada: char* separa(int numero) { char *r = malloc(sizeof *r); *r = 'a'; return r; } E onde chama a função: char *c; c = separa(0); /*Usa o caractere retornado*/ printf("%c\n", *c); //libera a memória alocada dinamicamente //quando não precisar mais dela: free(c); Mas fazer isso me parece uma complicação desnecessária de algo que deveria ser mais simples, se vai retornar apenas 1 char então deve retornar como char diretamente. Normalmente se retorna ponteiro de char quando o objetivo é retornar o endereço de um vetor de chars que foi alocado dinamicamente, não um único char, então talvez o exercício pede que seja retornado mais do que um único char? -
Primeiro precisamos entender como o conteúdo do seu arquivo .DAT é organizado. O parâmetro numérico 5 na linha: create_dat.exe file1.png myfile.dat 5 Define a capacidade máxima do arquivo .DAT, ou seja pode armazenar até 5 arquivos? Nesse caso o cabeçalho seria algo assim quando tem apenas 1 arquivo? .DAT 5 1 0 //capacidade = 5, quantidade = 1 .PNG 100 768 868 //tamanho = 100, endereço inicial = 768, final = 868 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (Coloquei tudo em forma decimal ao invés de indicar cada byte por simplificação.) Se não é assim, como seria?
-
Os índices [ i ] sumiram pois originalmente o código foi postado sem usar o botão Code < > , depois o tópico foi editado e o código foi colocado no lugar correto, mas aí já estava sem os índices. Pra o código aparecer corretamente é preciso colocar o código original, contendo os [ i ], no fórum usando o botão Code < >.
-
O problema é que no segundo for j começa com valor 0, mas seguindo a lógica do algoritmo usado j deveria começar igual a i, assim ele não troca novamente as posições que já estão ordenadas. Inicializar o vetor aux não afeta o resultado, essa não é a causa.
-
Tem um ; no fim da linha do if que não deveria estar lá: if (strcmp(vetor[i], vetor[j]) > 0); Aqui está como poderia ficar usando bubble sort: #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { system ("title NOME EM ORDEM CRESCENTE THIAGO"); int i,j,cont=0; char aux[10]; char vetor[10][10] = {"Andre","Maria","Marcio","Bruno","Henrique","Zoraide","Daniel","Danilo","Zuleica","Adriano"}; for (i=0; i<10; i++) { for (j=0; j<9; j++) { if (strcmp(vetor[j], vetor[j+1]) > 0) { strcpy(aux, vetor[j]); strcpy(vetor[j], vetor[j+1]); strcpy(vetor[j+1], aux); } } } printf("vetor em ordem:\n\n"); for (i=0; i<10; i++) { printf("%s\n",vetor[i]); } return 0; }
-
O problema está aqui: strcpy(aux[10],vetor[i]); strcpy(vetor[i],vetor[j]); strcpy(vetor[j],aux[10]); Deveria ser: strcpy(aux,vetor[i]); strcpy(vetor[i],vetor[j]); strcpy(vetor[j],aux);
-
Precisa usar um algoritmo de ordenação, o algoritmo mais usado por iniciantes é o bubble sort, e funciona da mesma forma que com números, só muda que ao invés de comparar números agora compara strings. Para comparar strings seguindo a ordem alfabética usa-se a função strcmp() da biblioteca string.h. E postei aqui uma explicação de como funciona: E outra função da biblioteca string.h necessária é a strcpy() que serve para copiar strings para um vetor de chars, assim: char vet1[] = "abcd"; char vet2[10]; char vet3[10]; strcpy(vet2, "123456789"); //guarda a string "123456789" em vet2 strcpy(vet3, vet1); //guarda a string "abcd" de vet1 em vet3
-
Escolhe um post como melhor resposta.
-
A função se comporta assim: se strcmp(str1, str2) > 0 então str1 > str2 se strcmp(str1, str2) < 0 então str1 < str2 se strcmp(str1, str2) == 0 então str1 == str2 O que também implica que: se strcmp(str1, str2) >= 0 então str1 >= str2 se strcmp(str1, str2) <= 0 então str1 <= str2 se strcmp(str1, str2) != 0 então str1 != str2 Comparações podem ser interpretadas como uma operação de subtração, nesse caso strcmp(str1, str2) pode ser entendido como str1 - str2. Se fossem números ao invés de strings que tipo de valores resultariam nessa subtração quando str1 é maior que str2? E se str1 é menor que str2? E quando são iguais? Daí você obtém todos os resultados acima só seguindo essa lógica, e não precisa decorar.
-
Substitua: comando = getchar(); Por: scanf(" %c%*c", &comando); Observe que na string de especificadores coloquei espaço antes do %c para descartar caracteres vazios (espaço, tabulação, nova linha, etc), assim o %c só captura o primeiro caractere não-vazio encontrado. E o * no %*c serve para descartar o que for lido, ou seja lê algo mas não guarda em uma variável, então depois de de 1 caractere com %c ele lê e descarta outro caractere, no caso isso serve para eliminar o caractere nova linha '\n' que é inserido quando o usuário aperta Enter. Para entender melhor qual é o problema leia esses posts:
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