Ir ao conteúdo
  • Cadastre-se

Lucca Rodrigues

Membro Pleno
  • Posts

    1.081
  • Cadastrado em

  • Última visita

Tudo que Lucca Rodrigues postou

  1. @nagatonie Limite a entrada. Leia as letras e armazene em uma string, e depois leia os dígitos e armazene em um inteiro. Basta testar o retorno da scanf() pra saber se tudo foi lido e gravado corretamente: #include <stdio.h> #include <string.h> typedef struct { char letras[4]; int digitos; } PLACA; int main() { PLACA placas[5]; printf("Digite a placa de um veiculo no formato XXX9999:\n"); if((scanf("%3[a-zA-Z]%4d", placas[0].letras, &placas[0].digitos) == 2) && (strlen(placas[0].letras) == 3)) { printf("\nTudo nos conformes :)"); } else { printf("\nPlaca incorreta :("); } return 0; } Se o usuário digitar abc0001 ou abc1 vai dar no mesmo. Se quer ter certeza que ele digitou 4 números, então leia uma string para os dígitos também, mas dessa vez usando scanset para números somente, e por fim avalie o tamanho da string com strlen() da mesma forma já feita acima
  2. @.if Vetor é só um conjunto contíguo de blocos de memória, e daí você pode alocar estática ou dinamicamente... // alocacao estatica int x[10]; // alocacao dinamica int* x = (int*)malloc(10*sizeof(int)); De ambas as formas, reservamos 10 espaços do tamanho de int para uso, e como o nome já diz, se eu precisar mudar o tamanho do vetor dinâmico x, eu posso x = (int*)realloc(x, 15*sizeof(int)); Aliás, se o tamanho do vetor for uma variável, a declaração de um vetor estático pode não ser efetivada, embora C99 permita esse tipo de coisa. Sobre esse programa que mostrou, alguns comentários devem esclarecer #include <stdio.h> int main() { /* O valor apontado por string eh o elemento na posicao 0 da string "0011001". */ char *string = "0011001"; /* printf("%c", *string); imprime '0'. O * significa valor apontado pelo ponteiro. Mude o valor na posicao 0 da string e veja o que imprime. */ char num1 = 0; printf("Uns = "); /* Strings são vetores de char terminados em um caractere nulo ('\0' ou 0), e 0 eh falso, entao o controle eh transferido pra fora do loop quando chegar ao fim da string. */ while(*string) { /* Se o valor apontado pelo ponteiro string for '1', incrementa num1. */ if (*string=='1') ++num1; /* Incrementa o ponteiro para que possa apontar para a posicao seguinte na memoria e consequentemente, para o proximo valor na string. */ string++; } printf("%d", num1); return 0; }
  3. @Mario3210 Se não precisa mais dos dados, então chame free(). Você pode chamar malloc() novamente mais tarde se precisar.
  4. @Mario3210 Basta identificar que valores devem ser removidos do vetor dinâmico e chamar realloc(). Algo como: v = (float*)malloc(tam*sizeof(float)); //... v = (float*)realloc(v, (tam-x)*sizeof(float)); // Sendo x a quantidade de valores removidos Claro que após identificar os valores que devem ser removidos, você deve copiar os valores subsequentes para a posição que antecede os mesmos. Só então chame realloc()
  5. @codigo rápido Especificadores de formato. O parâmetro é format, como a documentação sugere: int snprintf( char *buffer, size_t count, const char *format [, argument] ... ); Função. E sim, se são muitas variáveis, vai dar uma string de meio metro Acho que não vale a pena, e nem sei se dá pra criar um novo especificador assim pra ser sincero, pelo menos não da forma que sugeriu Quer omitir certa parte da string format na chamada da função? Pode fazer o seguinte, por exemplo: const char* formato = "%lli\t%i\t%s\t"; char buffer[tamanho]; snprintf(buffer, tamanho, formato "mais alguns especificadores...", a, b, c, d, e... muitas variaveis); formato e quaisquer strings lá vão ser concatenadas, e não precisa ficar tudo numa linha só.
  6. @Frank Charles Peach como vai? Tem o enunciado da questão?
  7. @Maxavam Seu programa não tem indentação, fica meio ruim pra ler. Acredito que o problema é o fato de você não ter fechado a chave da main. Você também não incluiu a conio.h pra poder usar a getch(), e é melhor usar getchar() nessa ocasião... while(getchar() != '\n'); Evita você ter que incluir 1 biblioteca pra usar 1 função que por sinal não é necessária Indentando, fica bem melhor: int main() { int i; int n; float custo_t = 0.0f; struct pizza vet[100]; printf("Entre com o numero de pizzas: "); scanf("%d%*c", &n); for (i = 0; i < n; i++) { printf("Entre com o sabor da pizza %d: ", i+1); scanf("%9s%*c", vet[i].sabor); printf("Entre com o tamanho da pizza %d (M/G): ", i+1); scanf("%c%*c", &vet[i].tam); printf("Entre com a distancia para entrega da pizza %d: ", i+1); scanf("%f%*c", &vet[i].dist); custo_t += custo_pizza(&vet[i]); } printf("\nO custo total %c de R$%.2f\n\n", 130, custo_t); while(getchar() != '\n'); return 0; } E podemos notar alguns problemas: Que sabores vocês têm no menu? Aliás, onde está o menu? A distância é em que unidade? Metros, km, milhas? Se o usuário inserir um número de pizzas maior que 100, você terá um problema. Use alocação dinâmica, vai que ele quer umas 1000 pizzas sei lá A função custo_pizza só avalia se a pizza é de muçarela?
  8. @kailane Atribua, por exemplo, o valor do primeiro elemento (índice 0) do vetor à uma variável: chamarei de `menor`. Com um loop você pode comparar `menor` com os demais valores do vetor: caso `menor` > determinado valor, atribua tal valor à `menor`
  9. @SuporteComunista A sintaxe do for é essa: for ( init-expression ; cond-expression ; loop-expression ) statement No programa, temos: O índice `i`, cujo valor é inicialmente 1, é incrementado até a condição se tornar falsa, ou seja, quando `i` atingir valor 4. O que ocorre dentro do loop é a cobrança de dados (idade e altura): E a análise desses dados: E no final, são impressos os resultados: Faça e se tiver dificuldades, poste aqui o que tentou fazer.
  10. Com fins didáticos, posto aqui um exemplo em C para Windows que fiz. #include <stdio.h> #include <string.h> #include <Windows.h> void GotoXY(int x, int y) { HANDLE hCon; COORD dwPos; dwPos.X = x; dwPos.Y = y; // Obtendo um identificador para a saída padrão hCon = GetStdHandle(STD_OUTPUT_HANDLE); /* SetConsoleCursorPosition() define a posição do cursor no buffer da tela do console */ SetConsoleCursorPosition(hCon,dwPos); } void Combinacoes(char* str, int combQtd) { // Quantidade de caracteres de str int elemQtd = strlen(str); // Quantidade de linhas de combinações int elemTotal = elemQtd; // Quantidade de caracteres impressos int elemDisp; // Controlar o cursor no eixo Y int inc = 0; // elemQtd^combQtd for(int i = 0; i < (combQtd - 1); i++) elemTotal *= elemQtd; elemDisp = elemTotal; for(int i = 0; i < combQtd; i++) { for(int j = 0; inc < elemTotal; j++) { // Reinicia o valor de j if(j == elemQtd) j = 0; for(int k = 0; k < (elemDisp/elemQtd); k++) { // Move o cursor GotoXY(i, inc++); // Imprime o caractere putchar(str[j]); } } // Nova coluna, novo ciclo de impressão elemDisp /= elemQtd; inc = 0; } } int main() { Combinacoes("abc", 3); return 0; } Na saída: aaa aab aac aba abb abc aca acb acc baa bab bac bba bbb bbc bca bcb bcc caa cab cac cba cbb cbc cca ccb ccc Como pode ver, não é complexo
  11. @nndxo A macro _countof faz o que você precisa: #define _countof(array) (sizeof(array) / sizeof(array[0])) Está definida na stdlib.h. `v` foi declarada na lista de parâmetros de len(), então sizeof te dá o tamanho de int*.
  12. Pelo Code:Blocks, os comandos adicionados às opções de linker ao criar um projeto Win32 GUI Project são por padrão -lgdi32 -luser32 -lkernel32 -lcomctl32. Se há um diferencial, provavelmente seria este. No mais, estou usando Debug mode, etc...
  13. @kisne Confuso... Seria um circuito LC ou o que? Aliás, é possível editar o texto de todas as editbox, inclusive a do resultado. Talvez você pudesse adicionar o estilo ES_READONLY para que o usuário não possa editar o que não deve. Adicione também algumas informações aí na janela para saber de que se trata essa calculadora. E como @kgin disse, chamou uma tal ftoa() em vez da atof(). Compilou usando o que? Aqui funcionou normalmente, mas não entendi ainda o que está sendo calculado
  14. @LuanGabri3l Essa ferramenta online como muitas outras disponíveis por aí gera um conjunto de x combinações de n itens. Se não é isso o que buscava, seria interessante exemplificar o que quer então. Bem, arranjo com repetição é aquilo mesmo... Se não é isso, exemplifique ou descreva o que seria.
  15. @LuanGabri3l Você está procurando um software ou algoritmo? E não, não é um algoritmo complicado. Nesse link tem um gerador de arranjos. Só precisei pesquisar por arranjos com repetição online
  16. @Gustavo Tavares Isobe Poste o código usando o botão code: // Fica assim Não recomendo postar arquivos para baixar, é inconveniente... Se tem o enunciado exemplificando, poste também.
  17. @Maxavam Com scanf(), basta determinar a quantidade de caracteres a serem lidos e armazenados na string depois do % no especificador: scanf("%30s%*c", str[i]); o %*c é para ler e descartar o caractere '\n' digitado ao teclar Enter. Com fgets(), a quantidade de caracteres a serem armazenados (contando com o caractere nulo) deve ser o segundo argumento passado na chamada da função, como no exemplo de @kgin.
  18. @Maxavam Que espera que eu faça com essa informação? Iniciante até eu sou, mas enfim... Tem dúvidas? Questionamentos? Afinal, te mostrei como fazer o que não estava conseguindo, e o colega @kgin te mostrou um exemplo completo, se tem dúvidas não hesite em perguntar, o fórum é pra isso
  19. @Maxavam Disse que a dificuldade era a validação... Para ler uma string use scanf(), fgets() ou qualquer outra função. Você já está usando em seu programa. Mostrei como pode verificar se a string começa com 'b', e não é nada difícil, ao menos leu?
  20. @Maxavam Deixe espaço para o caractere nulo: char str[5][31]; Aliás: você tem que avaliar uma determinada string ou 5 strings? Basta comparar: if(str[indice][0] == 'b' || str[indice][0] == 'B') puts("Comeca com a letra b"); `indice` depende de qual string se está avaliando. Um exemplo: #include <stdio.h> int main() { char str[5][31] = { "alface", "batata", "estojo", "relogio", "bola" }; puts("As seguintes palavras comecam com b:"); for(int i = 0; i < 5; i++) if(str[i][0] == 'b' || str[i][0] == 'B') puts(str[i]); return 0; } Na saída: As seguintes palavras comecam com b: batata bola
  21. @alexandrecasa Como eu disse no outro tópico, você vai precisar incluir a time.h se quiser usar time(), e também a stdlib.h para usar srand() e rand(). E novamente o enunciado não menciona um intervalo para rand(), então basta gerar um número dentro dos limites de inteiro. Aliás: Se `numero[i]` não for < 5 nem > 5, então será 5, você não precisa fazer essa última verificação: if(numero[i] < 5) menor++; else if(numero[i] > 5) maior++; else igual++;
  22. @alexandrecasa Vai precisar incluir a time.h se quiser usar time(), e também a stdlib.h para usar srand() e rand(). Então podemos dizer que o intervalo é de INT_MIN até INT_MAX, já que não foi especificado. Se você fizer: // rand() % ((maior - menor) + 1) + menor rand() % ((INT_MAX - INT_MIN) + 1) + INT_MIN; vai receber uma mensagem de erro: INT_MAX - INT_MIN obviamente causa overflow, o resultado é UINT_MAX. Em vez disso, poderia usar o seguinte: int randint(void) { // Assumindo que srand() ja foi chamada return ((rand() % 2) ? (rand()) : ((-rand()) - 1)); } Se rand() % 2 for 0 e rand() retornar por exemplo RAND_MAX, randint() retorna INT_MIN, ou quem sabe SHRT_MIN, vai depender já que RAND_MAX ≤ INT_MAX. De qualquer forma, isso tende a te dar valores grandes, e baseado no exemplo do enunciado: Acho que você poderia gerar valores de 0 a 9 mesmo Como eu havia dito: rand() % ((maior - menor) + 1) + menor Então seria: rand() % 10; Veja: #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int i, j; int vetorX[5], vetorY[8], vetorZ[13]; srand(time(NULL)); printf("Vetor 1:"); for(i = 0; i < 5; i++) { vetorX[i] = rand() % 10; printf(" %d", vetorX[i]); } printf("\nVetor 2:"); for(i = 0; i < 8; i++) { vetorY[i] = rand() % 10; printf(" %d", vetorY[i]); } for(i = 0; i < 5; i++) vetorZ[i] = vetorX[i]; for(j = 0; j < 8; j++) vetorZ[j+5] = vetorY[j]; printf("\nVetor 3:"); for(i = 0; i < 13; i++) printf(" %d", vetorZ[i]); return 0; } E na saída: É interessante sempre formatar como no exemplo do enunciado
  23. @Gabbie1 Acredito que sua intenção com isso era verificar o resto da divisão dos elementos do vetor `vet` com valores partindo de 2 até o valor de `vet` - 1, mas veja que você está incrementando um índice `i` que está sendo usado para indexar o vetor `vet`, e também esse índice `i` não é incrementado até atingir o valor de `vet` - 1, mas sim até atingir o valor de `tam`. Aliás, o vetor deve ter espaço para 10 elementos, e você terá que atribuir 0 à `cont` sempre que precisar avaliar outro valor de `vet`. Você pode usar dois loops, veja: #define tam 10 #include <stdio.h> int main (void){ int vet[tam], cont; for (int i = 0; i < tam; i++) { printf ("Insira um numero maior que 1: "); scanf ("%d%*c", &vet[i]); } puts("\nNumeros primos encontrados:"); for (int i = 0; i < tam; i++) { cont = 0; for (int j = 2; j < vet[i]; j++) { if (vet[i] % j == 0) cont++; } if (cont == 0) printf("Numero: [%d] | Posicao no vetor: [%d]\n", vet[i], i); } return 0; }
  24. @Matheus Marcelino Basta ler o que o erro diz: Se `tabela` fosse um const char*, então poderia apontar para o início daquela string, mas como é char, a atribuição é outra: tabela[l][c] = 'X'; Sendo 'X' um caractere: char. Aliás: não há nada para ser executado depois de default, então você pode omitir o break. Inclusive a função retorna aí se o controle for transferido para default, então de nada serve o break.

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!