Ir ao conteúdo

isrnick

Membro Pleno
  • Posts

    1.558
  • Cadastrado em

  • Última visita

Tudo que isrnick postou

  1. O seu teste ficaria assim: #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int contadores[26] = {0}; char c = 'G'; int i = c - 'A'; // contadores é um vetor, você precisa indicar a posição entre os colchetes: contadores[i]++; /* Podemos obter o caractere da i-ésima posiçao do vetor somando 'A' a posição e obter a quantidade usando/acessando a posição do vetor. Veja: */ printf("O caractere %c repete %d vez(es).\n", i + 'A', contadores[i]); return 0; }
  2. Sim, usando map no C++ ficaria um pouco mais simples, mas o @28guga28 quer fazer o programa em C. Mas não muda muita coisa, um vetor normal nesse caso já atende. Primeiro é preciso entender que char é um tipo de inteiro, ou seja chars são números inteiros, o menor inteiro da linguagem C com no mínimo 8 bits, se você mandar imprimir um char no printf usando %d vai ser impresso um número inteiro. Quando se usa o %c no printf o que ele faz é usar uma tabela para converter o número inteiro para o caractere correspondente, ou seja existem tabelas de caracteres em que cada caractere corresponde a um número, uma bem simples e bem conhecida é a tabela ASCII, mas existem muitas tabelas diferentes com muito mais caracteres, mas elas costumam estender a ASCII que contém os caracteres básicos (letras, números, espaço, nova linha, operadores matemáticos, etc). Então, você poderia consultar a tabela, e usá-la para atribuir um número para a variável char e imprimir com %c para obter o caractere. Os caracteres que representam os números de '0' a '9' por exemplo correspondem aos números 48 até 57 na tabela, e as letras minúsculas de 'a' até 'z' vão de 97 a 122, e as maiúsculas de 65 até 90. Mas não se preocupe, você não vai ter que sair decorando tabelas, ou consultar tabelas toda vez que tiver que fazer um programa desse tipo envolvendo caracteres. O que importa é que sabendo disso você pode realizar operações e comparações entre caracteres. Ou seja: 'a' + 1 = 'b' 'A' + 4 = 'E' 'a' - 'a' = 0 'z' - 'a' = 25 'c' > 'a' resulta em verdadeiro 'd' > 'z' resulta em falso Obs: 'A' é diferente de 'a', e pertencem a intervalos de números diferentes na tabela, portanto não faça operações ou comparações entre maiúsculas e minúsculas, como 'B' - 'c'. Agora, como utilizar isso no programa? Podemos criar um vetor de contadores de 26 posições, inicializado com valores 0 em todas as posições: int contadores[26] = {0}; Onde cada posição entre 0 a 25, armazenará a quantidade de uma das letras do alfabeto de A a Z respectivamente. E para converter a letra da palavra para seu respectivo número de 0 a 25 basta subtrair 'A', e então pode usar o resultado entre os colchetes do vetor. Ex: char c = 'G'; int i = (int)(c - 'A'); // 6 contadores[i]++; Agora só precisamos garantir que as letras sempre serão maiúsculas, e para isso basta usar a função toupper() para transformar a letra para maiúscula, essa função recebe um caractere e se for uma letra minúscula ela retorna o caractere da letra maiúscula correspondente, do contrário retorna o próprio caractere. Ex: toupper('a') // 'A' toupper('B') // 'B' Obs: Também existe a função tolower() que faz o oposto. Agora você tem como contar as letras da palavra, seu programa ainda precisa achar o valor máximo, e no fim basta percorrer esse vetor ver todas as posições com valor igual ao valor máximo e fazer o oposto, somar o número da posição a 'A' e imprimir o caractere na saída.
  3. Do mesmo modo que você passaria qualquer outra variável, declara a struct no protótipo da função, e passa o nome da struct ao chamar a função.
  4. Acredito que isso não vai funcionar... O modo que eu achei que gera resultados consistentes foi usar "%*[^\n]" em um scanf e logo em seguida usar "%*c" em outro scanf. Lembrando que no scanf, %[ serve para capturar cadeias de caracteres/string, sendo que você indica um conjunto de caracteres entre os colchetes, ou seja %[0-9a-zA-Z] capturaria uma string contendo números e letras. Você também pode usar ^ no início do conjunto de caracteres para indicar um conjunto de caracteres que não devem ser capturados (ou seja, todos os caracteres que não forem iguais ao que vier após ^ são capturados), por exemplo %[^\n] captura qualquer caractere menos o caractere nova linha '\n'. E * é usado para informar ao scanf que o que for capturado não será guardado em nenhuma variável, ou seja é apenas descartado. Ficando assim: #include <stdio.h> void flush(){ /*Descarta todos os caracteres se houver algum até encontrar o caractare nova linha ´\n´, então só sobra o ´\n´ na entrada: */ scanf("%*[^\n]"); //E então descarta o caractere nova linha ´\n´: scanf("%*c"); } int main() { int i; char c, d, e; /*Pode ser feito colocando o %*[^\n] dentro do scanf de captura: */ scanf("%d%*[^\n]", &i); scanf("%*c"); //Ou usando dois scanfs após capturar para descartar: scanf("%c", &c); scanf("%*[^\n]"); scanf("%*c"); /*Então podemos usar isto para criar uma função para limpar a stdin: */ scanf("%c", &d); flush(); scanf("%c", &e); flush(); printf("\n%d \n%c \n%c \n%c \n", i, c, d, e); return 0; } Só que juntar os 2 num único scanf não funciona: scanf("%*[^\n]%*c"); //Não funciona p/ limpar a stdin Pois o caractere nova linha fica sobrando na stdin.
  5. Se a entrada for Cida a saída pode ser acdi? Ou seja, exibir as letras mais repetidas na ordem alfabética ao invés de na ordem que aparecem na palavra?
  6. Recentemente os antivirus tem usado um sistema de reputação, em que programas que são usados por um número de maior pessoas/computadores diferentes sem causar problemas e sem serem reportados como maliciosos, são considerados confiáveis. Mas isso implica que programas pouco usados ou que nunca foram vistos antes pelo antivirus (ou seja, que não constam no banco de dados das empresas de antivirus) podem ser considerados como potenciais riscos ao computador. Você pode fazer o antivirus ignorar esses arquivos ou a pasta inteira onde eles estão em suas verificações para evitar que isso aconteça. Dá uma procurada nas configurações dele para encontrar onde está essa opção.
  7. Um mapa (ou dicionário ou vetor associativo) é parecido com um vetor/array comum. O vetor tem um número de itens ordenados sequencialmente, e você pode obter o item do vetor referenciando seu o índice ou posição nessa sequência. Ou seja, vetor[3] está acessando o item do vetor na posição 3 da sequência começando em 0 e indo até o tamanho do vetor -1. A diferença do dicionário/mapa é que você pode usar qualquer tipo de dado como uma 'chave' para referenciar um valor armazenado nele, por exemplo podemos criar um mapa D que usa strings como referências e armazena valores inteiros, e então fazer D["banana"] = 5, então 5 será armazenado na 'posição' "banana" do mapa D, e toda vez que acessar usando essa chave será retornado o número 5. Nesse caso a vantagem de usar isso para mapear int com int no programa foi que tendo um mapa vazio e fazer mapa[100] = 1, um item foi adicionado ao mapa, com valor 1, e pode ser referenciado pelo valor 100, mas o mapa não tem um tamanho fixo, e você pode adicionar outros valores usando outras referências, ou obter e alterar esses valores usando as mesmas referências. O que nesse caso significa que você pode usar qualquer valor inteiro como referência não ficando limitado a um intervalo de números, e não tem várias posições do vetor desnecessárias que não serão usadas apenas ocupando memória. Mas note que as chaves dos mapas não necessariamente são sequenciais, você não tem como somar +1 a "pera" para obter "banana" e usar como referência, o que significa que você teria que saber quais as chaves usadas no mapa previamente para conseguir acessar os valores guardados nele. Mas para isso o map do C++ tem um tipo membro especial, um iterador (iterator), o qual, como o nome sugere, pode ser iterado para percorrer o mapa e obter tanto as chaves (first) quanto os valores (second) deste mapa (como eu fiz no programa), sendo que os itens do mapa são ordenados de modo que suas chaves fiquem em ordem crescente, a menos que seja especificado outro tipo de comparação para determinar ordem.
  8. Você pode somar cada posição dos 2 vetores mais um valor carregado (que é inicializado em 0), se o resultado da soma for 0 ou 1, armazena o número e carrega 0, se der 2 armazena 0 e carrega 1, e se der 3 armazena 1 e carrega 1. Como exemplo vamos somar 0 0100 1110 + 1 0101 1100 que em decimal fica 78 +348 = 426: posições 8 7 6 5 4 3 2 1 0 1o numero 0 0 1 0 0 1 1 1 0 2o numero 1 0 1 0 1 1 1 0 0 Então vamos somar: digito do primeiro numero + digito do segundo numero + carrega Ficando assim: "carrega" começa igual a 0 posicao 0: 0 + 0 + 0 = 0 => resultado = 0 e carrega = 0 posicao 1: 1 + 0 + 0 = 1 => resultado = 1 e carrega = 0 posicao 2: 1 + 1 + 0 = 2 => resultado = 0 e carrega = 1 posicao 3: 1 + 1 + 1 = 3 => resultado = 1 e carrega = 1 posicao 4: 0 + 1 + 1 = 2 => resultado = 0 e carrega = 1 posicao 5: 0 + 0 + 1 = 1 => resultado = 1 e carrega = 0 posicao 6: 1 + 1 + 0 = 2 => resultado = 0 e carrega = 1 posicao 7: 0 + 0 + 1 = 1 => resultado = 1 e carrega = 0 posicao 8: 0 + 1 + 0 = 1 => resultado = 1 e carrega = 0 posições 8 7 6 5 4 3 2 1 0 resultado 1 1 0 1 0 1 0 1 0 Ou seja, resultado = 1 1010 1010 = 426.
  9. A solução usando map: #include <iostream> #include <map> using namespace std; int main() { int num,n; map<int, int> v = {}; cin >> num; for(int i=0;i<num;i++){ cin >> n; v[n]++; } map<int, int>::iterator it = v.begin(); while(it != v.end()){ cout << it->first << " aparece " << it->second << " vez(es)" << endl; it++; } return 0; }
  10. Agora eu testei meu código e funcionou corretamente. Só tinha ficado faltando abrir uma chave { na linha do if, corrigi isso e deu certo, eu editei o post e corrigi o código. adicionado 12 minutos depois O método que você usou nesse último código é o que eu teria sugerido se fosse estabelecido um intervalo de números que o usuário pode digitar, como de 0 a 2000 que você usou no código. Talvez usando MAP para mapear int com int daria pra fazer isso sem limitar os números a um intervalo...
  11. #include <iostream> #include <string> #include <iomanip> #include <vector> #include <algorithm> #include <stdlib.h> using namespace std; int main() { int num,n; cin >> num; vector<int>numeros; for(int i=0;i<num;i++){ cin >> n; numeros.push_back(n); } sort(numeros.begin(),numeros.begin()+num); num = numeros[0]; int cont = 1; for(int j=1;j<numeros.size();j++){ if(numeros[j] == numeros[j-1]){ cont++; } else { cout << num << " aparece " << cont << endl; num = numeros[j]; cont = 1; } } cout << num << " aparece " << cont << endl; return 0; } Fiz isso mas estou ocupado no momento então não posso testar agora, testa e veja se da certo.
  12. Uma maneira de fazer isso seria ordenar os números no vetor conforme eles vão sendo digitados. Por exemplo o usuário digita: (8, 4, 8, 10, 5, 6, 8, 4, 10) E no vetor fica: (4, 4, 5, 6, 8, 8, 8, 10, 10) Aí no final basta percorrer o vetor verificando cada vez que o número muda, e contando quantas vezes repete até o número mudar.
  13. isrnick

    Matriz em C

    Não entendi o que você está tentando fazer no programa. Vai representar o grafo como uma matriz de adjacência? Está construindo um grafo ou checando/analisando o grafo? Talvez fique mais claro se você der algum exemplo postando uma matriz de um grafo e o que o programa deve fazer.
  14. Checando a informação eu vi que na verdade o GCC só passou a usar automaticamente -std=gnu11 (C11 com algumas extensões) quando nenhum padrão é especificado, a partir da versão 5.1.0, e antes disso o padrão automático era -std=gnu90. Então pode ser que o MinGW que vem com CodeBlocks ainda use uma versão anterior do GCC (eu peguei o mais atualizado MinGW separadamente). Mas você sempre pode ir lá nas Configuração de Compilador do CodeBlocks e configurar para ele usar -std=gnu11 ou -std=c11 quando compilar (digita em Outras opções do compilador/Other compiler options, ou então clica com o botão direito na lista de flags e adiciona outra flag com isto na lista e marca ele).
  15. Isso foi admitido na versão C99 da linguagem, então acho que contanto que você não especifique que quer compilar em alguma versão anterior (C89, usando parâmetros -std=c89 ou -ansi no GCC, por exemplo) não deveria dar problema. Já que por padrão o compilador usa versões mais recentes da linguagem.
  16. Isto: using namespace std; Pertence ao C++ não ao C, mas seu programa foi salvo como um arquivo C ("Untitled1.c"), portanto o CodeBlocks está tentando compilar como se o código fosse em C. Arquivos com código C++ devem ser salvos com extensão ".cpp". Mas se sua intenção era mesmo programar em C apenas remova essa linha e o código deve funcionar.
  17. Pelo que vi só tinha uns nomes errados das variáveis nos printfs no final do programa. #include<stdio.h> #include<stdlib.h> int main() { float quantidade=15, H=0, M=0; float peso[15][2], maior=0, menor=100000, alturaH=0, alturaM=0; for(int aux=0; aux<quantidade; aux++) { do { printf("Insira o sexo %d(m->1 e f->2): ", (aux+1)); scanf("%f", &peso[aux][0]); if((peso[aux][0]>0)&&(peso[aux][0]<3)) { if(peso[aux][0]==1) { H++; } else { M++; } } else { printf("\nValor invalido!\n\n"); } } while((peso[aux][0]<1)||(peso[aux][0]>2)); do { printf("\nInsira a altura %d(em metros): ", (aux+1)); scanf("%f", &peso[aux][1]); if(peso[aux][1]>0) { if(peso[aux][0]==1) { alturaH+=peso[aux][1]; } else { alturaM+=peso[aux][1]; } } else { printf("\nValor invalido!\n"); } } while(peso[aux][1]<=0); if(maior<peso[aux][1]) { maior=peso[aux][1]; } if(menor>peso[aux][1]) { menor=peso[aux][1]; } printf("\n\n"); } printf("a - a maior altura é %.2f m e a menor é %.2f m\n", maior, menor); printf("b - a media da altura das mulheres é %.2f m e a dos homens é %.2f m\n", (alturaM/M), (alturaH/H)); printf("c - a quantidade de homens é %.2f%% e mulheres é %.2f%%\n\n", ((H/quantidade)*100.0), ((M/quantidade)*100.0)); system("pause"); return 0; } Olhando por alto não parece ter problemas na lógica, mas não cheguei a analisar detalhadamente.
  18. Não entendi direito o que você quer dizer. Pra isso não bastaria colocar o seu programa no dropbox e rodá-lo nos diferentes computadores quando logar na sua conta?
  19. Se me lembro corretamente o jeito que o dropbox funciona é que você indica uma pasta, e ele automaticamente copia/sincroniza todos os arquivos dentro da pasta para a nuvem. Então, imagino que bastaria salvar os arquivos de texto gerados pelo seu programa nessa pasta.
  20. Bom se você realmente "nada sabe" a recomendação é que você comece estudando lógica de programação, tem vários cursos e materiais disponíveis na internet. Eu também recomendo estudar inglês ao mesmo tempo caso ainda não domine, pois saber inglês vai tornar seu aprendizado de programação e suas linguagens muito mais fácil. Aí depois a linguagem de programação vai depender do que você pretende fazer, vai fazer websites? Aplicativos para android? Sistema embarcado? etc...
  21. Você quer que o ciclo/loop continue enquanto o valor for diferente de 1001 E diferente de 1002, o problema é esse você usou OU mas deveria ser E.
  22. Acredito que o contrário seria mais simples. Começa separando o dígito menos significativo do número e segue separando cada dígito até o mais significativo. E para fazer isso basta usar o resto da divisão inteira (operador %) por 10 para obter o digito menos significativo, e em seguida a divisão inteira por 10 para eliminá-lo do número (e então o segundo menos significativo vira o menos significativo no que sobrou do número). Assim: 9675832 % 10 = 2 9675832 / 10 = 967583 967583 % 10 = 3 967583 / 10 = 96758 96758 % 10 = 8 96758 / 10 = 9675 9675 % 10 = 5 9675 / 10 = 967 967 % 10 = 7 967 / 10 = 96 96 % 10 = 6 96 / 10 = 9 9 % 10 = 9 9 / 10 = 0 Assim você não precisa saber quantos dígitos o número tem, apenas repete o processo até a divisão inteira por 10 do que ainda sobrou do número ficar igual a zero (0). Portanto, você só precisa fazer um ciclo (for ou while) que continua calculando o resto e a divisão do número por 10, enquanto o número for diferente de 0.. int numero = 9675832, num, digito; cout << "\n\n"; for (num = numero; num != 0; num = num/10) { digito = num % 10; cout << digito << "\n"; }
  23. Cadê o algoritmo? (Obs: Para postar códigos use a tag CODE apertando o botão <> no topo do campo de resposta.) adicionado 36 minutos depois: valordesconto<-(5/100*precototal) se precototal<500 senao valordesconto<-(10/100*precototal) se precototal>500 Aqui está o problema. Quando você usa um comando de desvio condicional, primeiro você testa a condição e apenas se ela for verdadeira os comandos os comandos listados a seguir são executados. Então ficaria assim: se precototal<500 então valordesconto<-(5/100*precototal) senao valordesconto<-(10/100*precototal) fimse Obs: O fórum está acentuando a palavra "então" automaticamente no código acima, mas deveria ser sem o til ( ~ ).
  24. Serve em inglês? Think Python: http://greenteapress.com/wp/think-python-2e/ ou O tutorial oficial de Python: https://docs.python.org/3/tutorial/

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!