Ir ao conteúdo

arfneto

Membro Pleno
  • Posts

    6.526
  • Cadastrado em

  • Última visita

Tudo que arfneto postou

  1. sucesso?
  2. Está certa sobre esse enunciado? Está de fato escrito assim e só tem isso? Isso não é a soma de 4 primos, é a soma de 4 primos ao quadrado. E nada se fala sobre os tais primos. Podem ser quaisquer primos? No exemplo são consecutivos. Será sempre assim? É uma restrição do enunciado? É um problema interessante, mas estou duvidando de que tenham proposto algo assim. É algo um pouco sofisticado para um programa que não seja de algo tipo um curso de simulação ou Teoria dos Números ou Análise Combinatória ou algo assim. Eis o que você teria que fazer: pegar todos os possíveis grupos de 4 primos possíveis considerando o número digitado e simular. As menores parcelas seriam claro 4, 9 e 25. E aí teria que achar o maior possível primo do conjunto, que seria o menor que a raiz quadrada de (N-38) para o número digitado N. Imagino que tenha entendido a origem disso, mas um exemplo ajuda 2,3 e 5 são os primeiros primos, então 4, 9 e 25 são as menores parcelas substituindo lá na fórmula. Somando isso dá 38. Então x = (n-38) é o que sobra. No seu exemplo de N = 87 teriamos x = (87-38) = 49, e fica fácil de ver porque 49 é 7 * 7 e tem a solução. Claro, esse é o menor número possível e por isso o exemplo. Trivial. Mas e se o número fosse, digamos, 1000? 1000 - 38 = 962 raiz quadrada de 962 fica entre 31 e 32. 962 = 31*31 + 1 na verdade então o maior primo possivel teria que ser o anterior a 31, já que 31 obviamente não serve: 29 no caso. Note que como 962 é 31*31+1--- 31 é primo --- então 999 serviria: 2+2 + 3*3 + 5+5 + 31*31 = 999 Voltando ao 1000: então o maior primo possível seria 29 e teriamos que testar as possíveis combinações de 4 primos ao quadrado nesse conjunto de primos entre 2 e 29: [2,3,5,7,11,13,17,19,23,29] Combinações de 10 elementos 4 a 4: tema de cursinho. Resumindo: Calcula o último primo possível Calcula o total de combinações Testa uma por uma Game Over Estou escrevendo sem pensar muito mas acho que é isso. De volta ao seu programa: int j1, j2, j3, j4, next, i, numb, prime; printf("Entrada: "); scanf("%d", &n); while(1){ if((j1 *j1) + (j2 *j2) + (j3 *j3) + (j4 *j4) == n){ printf("Saida: %d + %d + %d + %d", j1, j2, j3, j4); } Pra que está lendo o número antes do programa estar pronto? Só vai te atrasar. Use uma atribuição simples. Não leva a nada ler o número, exeto que você tem que perder um tempo. Então não sei se entendi o que está tentando fazer. Ou melhor, não entendi mesmo. int j1, j2, j3, j4, next, i, numb, prime; Não inicializou nenhuma dessas variáveis. E aí escreve while(1) { if((j1 *j1) + (j2 *j2) + (j3 *j3) + (j4 *j4) == n) { printf("Saida: %d + %d + %d + %d", j1, j2, j3, j4); } next = p4+2; if(next > n) printf("Impossivel"); while(1) for(i=3; i<= sqrt(next); i=i+2){ ... continua Está comparando a soma de 4 quadrados de números de você não leu e não vieram de lugar algum, para ver se é igual a um número que você leu. Vai levar a lugar algum também. Porque 4 quadrados? Que seria p4+2? Se por acaso (p4+2) for menor ou igual a n você vai entrar em outro loop, while(1) onde vai ficar para todo o sempre. . como esse prime não foi inicializado pode ser qualquer coisa. C não tem essas constantes true e false adicionado 11 minutos depois Maldade não dizer a fórmula. Então aí está, como vimos no ensino médio. Ou no cursinho... Para um conjunto de N elementos os possíveis conjuntos de k elementos serão N! / (k! * (n-k)!) considerando k < N e sem repetição. Para o exemplo de 1000 seriam 10 primos e então apenas 210 combinações. Par valores de até 10^8 vai dar uma distração para seu computador por um tempinho.
  3. Muito bem. Como eu te disse, não sei o que é uma lista por contiguidade. TEm um livro-texto? Uma apostila? Uma definição? Se isso é o que parece, uma simples lista de estruturas alocadas dinâmicamente e não uma lista ligada, a.k.a. linked list, você pode usar tags para indicar que uma posição no vetor está livre e assim usar ponteiros --- não ponteiros tido struct* --- apenas integers indicando onde está agora o real início de sua lista. Isso se usa por exemplo quando se tem um pool de conexões por exemplo, já alocadas para ganhar tempo, e no servidor a gente vai rotacionando as conexões para quem solicita. É muito rápido. Pegue uma nota fiscal por exemplo e use para criar um registro de produto modelo e comece a escrever as funções. É simples na verdade. Estamos falando da mesma coisa? Não vi mesmo usar uma linked list? Uma lista por contiguidade seria isso que eu imagino?
  4. Como passou a opção C de Para cout<<" C - Mostrar Nome Sobrenome"<<endl ? Você só vai inserir o código nos lugares certos. As funções estão todas funcionando. Por exemplo case 'B': B_listar_o_vetor(&Vetor); break; case 'C': C_lista_sem_sobrenome(&Vetor); break; case 'D': cout << "Nome mais comprido: " << D_nome_mais_comprido(&Vetor) << endl; break; case 'E': letra = 'A'; // exemplo. voce vai ler a tal letra cout << E_total_com_inicial(letra, &Vetor) << " nomes iniciam com '" << letra << endl; break; case 'F': F_ordenar_vetor(&Vetor); B_listar_o_vetor(&Vetor); break; E assim por diante
  5. Você poderia recortar e colar o que te mostrei nas funções. Lá tem quase tudo. Veja uns protótipos que pode usar, já com as letras do enunciado pra facilitar: // uma lista com funcoes como as pedidas void A_inserir_no_vetor(const string str, vector<string>* vetor); void B_listar_o_vetor(vector<string>* vetor); void C_lista_sem_sobrenome(vector<string>* vetor); string D_nome_mais_comprido(vector<string>* vetor); int E_total_com_inicial(char letra, vector<string>* vetor); void F_ordenar_vetor(vector<string>* vetor); bool sem_sobrenome(string nome); Algumas notas: A string nova = "teste um"; A_inserir_no_vetor(nova, &Vetor); nova = "Teste DOIS"; A_inserir_no_vetor(nova, &Vetor); já estaria bem. Você lê uma linha a partir do teclado e chama a função com o valor que o cara digitou. Não precisa inventar nada. B listar eu ja te mostrei. nada especial. Chama direto a partir do menu, já que não tem parâmetros C Imagine uma função auxiliar chamada sem_sobrenome(nome) que retorna true se a string nome não tem sobrenome, Criada apenas copiando o código comentado que te mostrei. Então você copia ocódigo do item B mas só lista se a tal função retornar true para o nome. Também sai direto do menu D A função retorna simplesmente o que foi pedido: uma string com o nome mais comprido. Não tem nenhum parâmetro de entrada então é só chamar direto do menu E Nesse caso você tem que ler a letra. Só isso. E chamar a função direto, tipo letra = 'A'; cout << E_total_com_inicial(letra, &Vetor) << " nomes iniciam com '" << letra << endl; F Essa não tem qualquer parêmetro, mas precisa chamar a opção B de novo ou ninguém vai acreditar em você F_ordenar_vetor(&Vetor); B_listar_o_vetor(&Vetor); Só isso. O código da tal função acho que nem tem problema em mostrar: void F_ordenar_vetor(vector<string>* vetor) { sort(vetor->begin(), vetor->end()); return; }; adicionado 0 minutos depois Veja as notas que escrevi item a item
  6. Entendi. Apenas ache o equivalente lá então. Não sei onde li Code::Blocks. Desculpe. Esse não dá pra eu instalar. Mas vá em Tools depois Compiler Options depois Compiler e vai ter uma opção parecida, tipo "Add the following commands when calling the compiler" e lá você acrescenta o que eu te falei: -std=c++11 e confirme. Avise se rodou
  7. Estou tentando te ensinar. Também é EAD. Se você usa esse Code::Blocks apenas use o mouse e vá em Settings depois Compiler e vai abrir a janela que eu te mostrei, onde você vai na linha em que eu mostrei em amarelo e clica no quadradinho. Depois clique em OK. Eu instalei agora a versão 17.12 mas pode ser qualquer uma do IDE depois de 2011 O programa que te mostrei resolve os tais casos. E funciona perfeitamente.
  8. Eu tinha me prometido não instalar nada nessas máquinas aqui, mas trata-se de uma época estranha... Settings | Compiler Que tipo de professor não ensinou vocês a configurar uma versão de menos de 20 anos para compilar os programas? adicionado 6 minutos depois Esses são os casos que precisa resolver, pensando ANTES. Os valores do vetor estão entre aspas claro 1 "" Em branco vai dar m#$%a porque vai cancelar seu programa se tentar acessar a inicial 2 "Nome 1" caso simples: nome e sobrenome 3 "XomeNome2" caso simples sem sobrenome 4 " Nome3 " pegadinha. Espacos antes e depois. Vai zoar a inicial e nao tem sobrenome 5 "Aome 4 xxxxxxxxxxxxxxxx" caso simples 6 "No" muito curto: nao cabe nome e sobrenome com menos de 3 letras 7 "Nome Sobrenome" normalzinho 8 " " nome em branco so pra ferrar adicionado 10 minutos depois Veja esse resultado Nome vazio: ai nao adianta! ... Inicial: 'N' 012345678901234567890123456789 pra ajudar :) 'Nome 1' Tamanho: 6 Tem sobrenome e comeca depois da posicao 4 Inicial: 'X' 012345678901234567890123456789 pra ajudar :) 'XomeNome2' Tamanho: 9 Sem espacos ==> sem sobrenome... Inicial: 'N' 012345678901234567890123456789 pra ajudar :) ' Nome3 ' Tamanho: 7 Tem espacos mas estão no final... Inicial: 'A' 012345678901234567890123456789 pra ajudar :) 'Aome 4 xxxxxxxxxxxxxxxx' Tamanho: 23 Tem sobrenome e comeca depois da posicao 4 Inicial: 'N' 012345678901234567890123456789 pra ajudar :) 'No' Tamanho: 2 Nome muito curto para ter um sobrenome Inicial: 'N' 012345678901234567890123456789 pra ajudar :) 'Nome Sobrenome' Tamanho: 14 Tem sobrenome e comeca depois da posicao 4 Sem inicial, nome em branco... 012345678901234567890123456789 pra ajudar :) ' ' Tamanho: 7 Nome em branco... Desse programa #include <iostream> #include <vector> using namespace std; int main() { int primeira_letra = 0; int ultima_letra = 0; int espaco_interno = 0; vector<string> Vetor = { "", "Nome 1", "XomeNome2", " Nome3 ", "Aome 4 xxxxxxxxxxxxxxxx", "No", "Nome Sobrenome", " " }; for (auto nome : Vetor) { int tamanho = nome.length(); if (nome.length() == 0) { cout << "Nome vazio: ai nao adianta! ..." << endl; continue; // tenta outro }; // if() primeira_letra = nome.find_first_not_of(' ', 0); if (primeira_letra != string::npos) { const char& inicial = nome.at(primeira_letra); // Inicial: 'N' cout << "\n\n Inicial: '" << inicial << "'" << endl; } else { cout << " Sem inicial, nome em branco..." << endl; }// if(); // gabarito com as colunas cout << " 012345678901234567890123456789 pra ajudar :)" << endl; // 'nome' cout << "'" << nome << "'" << endl; // Tamanho: n cout << " Tamanho: " << tamanho << endl; // tem sobrenome? // para ter um sobrenome tem que ter ao menos 3 letras "A B" if (nome.length() < 3) { cout << " Nome muito curto para ter um sobrenome" << endl; continue; // tenta outro }; // if() // entao se tiver um espaco ao menos entre o primeiro nao espaco // e o ultimo nao-espaco tem um sobrenome primeira_letra = nome.find_first_not_of(' ',0); // claro que so tem espacos nao tem sobrenome if (primeira_letra == string::npos) { cout << " Nome em branco..." << endl; continue; // tenta outro } // if(); // entao tem ao menos uma letra. A partir dessa procura // a ultima letra int ultima_letra = nome.find_last_not_of(' '); if (ultima_letra == string::npos) { cout << " Sem mais letras a partir da primeira..." << endl; continue; // tenta outro } // if(); // se chegou aqui entao tem um sobrenome se tiver um espaco // entre a primeira e a ultima letra int espaco_interno = nome.find_first_of(' ', primeira_letra + 1); if (espaco_interno == string::npos) { cout << " Sem espacos ==> sem sobrenome..." << endl; continue; // tenta outro } // if(); // tem um espaco a partir da primeira letra. Se for depois da // ultima letra nao adianta. Tipo "NomeSobrenome " if (espaco_interno > ultima_letra) { cout << " Tem espacos mas estão no final..." << endl; continue; // tenta outro }; cout << " Tem sobrenome e comeca depois da posicao " << espaco_interno << endl; }; // for() }; // main() Faz o que você precisa e tem MUITOS comentários caso a caso. Acha que consegue incluir em seu programa? é só isso. Conseguiu mudar aquela opção no seu IDE? Que versão você usa?
  9. ? Não sei o que dizer. é só C++ e tem 5 linhas. É de fato C++ que você usa certo? Porque não respondeu ontem falando do "erro"? Parece que todo mundo usa isso aqui no forum, mas é uma escolha infeliz. Esse não é um bom IDE para escrever programas. Você não disse o que deu errado então fica difícil, mas num programa de 5 linhas imagino que o medieval Code::blocks está em falta da opção de compilação -std=c++11 e sim, esse 11 é de 2011... Acrescente isso e veja se roda. Vou te mostrar um programa que testa os tais itens C D e E. Vou copiar aqui. Mas teste isso agora ou não vai adiantar nada.
  10. Bem, não estou falando do que todos te disseram. Falo do que eu disse há pouco. Te mostrei as 5 funções de que precisa. Acha que mesmo assim não consegue resolver? Rodou o programa que mostrei ontem?
  11. Entendeu o que eu mostrei? adicionado 2 minutos depois A inicial e o tamanho são só uma linha cada. O lance do sobrenome é mais chato, mas não pelo C ou C++. Tem umas pegadinhas, porque pode ter espaços antes ou depois tipo " NOME " então precisa uasr as funções que te mostrei. Ou claro escrever outras.
  12. Agora depois do Esqueci de postar esse link Onde tem os métodos da classe string Veja os métodos: Gente boa quem escreveu isso. Não é que tem find_first_of() pra dizer por exemplo onde está a primeira letra ou o primeiro espaço? E find_last_of() pra dizer onde está o último espaço ou letra? E tem o contrário também, pra dizer se tem um espaço entre a primeira e a última letra? find_first_not_of() ? E tem esse que devolve o tamanho: nome.length() E tem esse que devolve a letra numa certa posição... nome.at(0); É tudo de que precisa. Não há nada demais em ler a documentação. Mesmo os profissionais sempre começam por isso. Ver a documentação da classe para saber o que tem lá que dá para usar... Você tem um livro-texto? Um manual? http://www.cplusplus.com/reference/ é seu amigo! E https://docs.microsoft.com/pt-br/cpp/cpp/c-cpp-language-and-standard-libraries?view=vs-2019 também. adicionado 1 minuto depois Entendeu como usar isso para resolver os desafiadores ítens C D e E? Se não entendeu escreva de novo!
  13. Porque não o simples? #include <iostream> #include <vector> using namespace std; int main() { vector<string> Vetor = { "Nome 1", "Nome 2", "Nome 3", "Nome 4", "Nome 5" }; for (auto nome : Vetor) cout << nome << endl; }; // main() Que mostra Nome 1 Nome 2 Nome 3 Nome 4 Nome 5 E a partir daí criar as funções? adicionado 7 minutos depois sobre essas o que determina um sobrenome é um espaço. Apenas varrendo o vetor --- um loop --- mostre os caras que tem não tem um espaço no meio da string. No começo ou no fim não faz diferença certo? cada string tem um tamanho, dado por nome.length() para a string nome. Apenas varrendo o vetor --- um loop --- salve a que tem o maior comprimento. tipo string maior_nome; A inicial é... a primeira letra: nome[0]. Um char. Apenas compare em um único loop com a inicial procurada.
  14. Já perdeu a referência na verdade... Ficou lá dentro da função que inicia a lista porque você não retornou o endereço nem passou o endereço do ponteiro... Recomendo muito ler essa discussão sobre o mesmo assunto: Onde tem uns dados e um código de exemplo que funciona, com os resultados eu acho Compare typedef struct tLista { tAtleta *atleta; int qtd; int tam; } tLista; void inicia_lista(tLista *, int); void insere(tLista *, int, tAtleta *); int busca_posicao(tLista *, tAtleta *); Com algo assim struct tAtleta { char nome[100]; int min; int seg; int dec; int raia; int serie; }; typedef struct tAtleta Atleta; struct tLista { struct tLista* atleta; int qtd; }; typedef struct tLista Lista; int busca_posicao(Lista* equipe, Atleta* um); Lista* inicia_lista(Lista* equipe); Lista* insere(Atleta* um, Lista* equipe); Lista* Equipe; Equipe = inicia_lista(Equipe); Atleta Johnny; strcpy(Johnny.nome, "Johnny Cash"); Johnny.min = 1; Johnny.seg = 2; Johnny.dec = 3; Johnny.raia = 4; Johnny.serie = 5; Equipe = insere(&Johnny, Equipe); Note as diferenças entre seu código e esse exemplo: tem uma estrutura Atleta e uma estrututra Lista, mais fácil de ler As rotinas que manipulam as listas devolvem o ponteiro atualizado. E trabalham apenas com endereços. É importante. É útil ter o tamanho da lista na estrutura, mas o tamanho N em geral não existe. Em geral ao inserir é criado um nó da lista a cada vez, contendo o dado a ser inserido. E é exatamente por isso que as listas são tão úteis. Tem sempre o tamanho certo. adicionado 8 minutos depois Talvez não esteja tentando usar uma lista encadeada e sim uma lista simples de tamanho fixo alocada dinâmicamente... É isso? Tem um enunciado?
  15. Mas qual a sua dúvida? leia os dois valores verifique se estão dentro dos limites do enunciado calcule o custo como @Flávio Pedroza explicou Nada mais
  16. Olá! Não conheço essa nomenclatura. Você tem um livro texto? Qual é? Imagino que esteja falando de uma lista como estrutura de dados e uma lista sequencial por contiguidade seria um simples vetor com um elemento depois do outro na memória. Nesses últimos dias apareceram tópicos aqui envolvendo listas, encadeadas simples ou duplas, aquelas com ponteiros, e acho que eu até postei algumas soluções com código e saída. Pode pesquisar aqui pelo material que eu postei. Tem uma opção no forum. Agora se de fato precisa de uma lista sequencial é algo bem trivial. Apenas declare uma estrutura de um certo tamanho, já que o enunciado não fala em limites nem em alocação. Implemente primeiro a função que lista, depois a que insere. Não precisa sequer classificar os produtos porque não está no enunciado. E invente umas categorias de produto porque também não tem no enunciado.... Depois crie remover. Não estou certo da diferença entre inserir o primeiro e criar a lista porque o problema não parece exigir nada demais da lista...
  17. Não é pra tirar nada e sim colocar. Use o valor de retorno de scanf_s() ou QUALQUER função dessa família. E coloque o 1 lá como eu te mostrei. É melhor pra você. Para as situações que precisa controlar, isso serve: int total = 0; int sim = 0; int feminino_sim = 0; int masculino = 0; int masculino_nao = 0; int N = ??; // o total que vai ler E considere muito o que @AdrianoSiqueira disse: se em um programa de 20 linhas você fica em dúvida sobre o que é soma, cont1 e cont2 imagine num programa maior... Veja a lista acima: é claro o que é cada coisa, como é claro de onde vai tirar as respostas. Não precisa sequer da variável de porcentagem porque só vai calcular e mostrar... Vou dizer algo pobre: seja metódico São só 4 perguntas: Quantos disseram sim: o valor de sim. Quantos disseram não (total - sim) claro. % das mulheres que disseram sim. Como eu disse antes, esse enunciado é medíocre. Não sei onde vai entrar o 150 por exemplo. E a porcentagem teria que estar melhor qualificada: seria a porcentagem em relação à amostra toda ou em relação às mulheres? Ficando com o que o idioma português sugere, vamos considerar as porcentagens em relação ao total de amostras do mesmo sexo. E você tem duas possibilidades: se não tem nenhuma mulher a porcentagem é zero. Se tem alguma mulher a conta é simples e não tem a ver com C Se: feminino_sim: tem o total de mulheres que disseram sim, dá pra imaginar o total de mulheres é claro (total - masculino) já que dá pra imaginar o que são total e masculino Então: feminino_sim / (total - masculino): é a proporção de mulheres 100.0 * isso: é a tal porcentagem. 4. % dos homens que disseram não: tem as mesmas considerações: 0% se não tem nenhum homem no grupo. Se tem algum Se (sim - feminino_sim): claro devem ser os homens que disseram sim masculino: claro deve ser o total de homens Então (masculino - (sim - feminino_sim): devem ser os homens que disseram não masculino: tem o total de homens (masculino - (sim - feminino_sim)) / (masculino)) é a proporção de homens que responderam não 100.0 * isso: a tal porcentagem. Claro que você pode usar as cinco possíveis variáveis e não ter que pensar nisso, mas essa é uma solução possível. Lógico que você tem que acumular esses valores durante a leitura dos N casos, que deveriam ser 150. O lado C Como todas as variáveis são inteiras, usar a constante 100.0 na expressão obriga o compilador C a converter o resultado da expressão para ponto flutuante e você pode imprimir com as decimais, usando por exemplo %6.2f no printf(). Como o '%' é especial em printf() você precisa usar '%%' para imprimir um '%' na saída.
  18. oh não postei o programa :D:D:D É bem simples. Tem 4 funções char* guarda(); // guarda os valores em uso void mostra(); // mostra os valores em uso void restaura(); // deixa como estava antes void testa(); // tenta mostrar o menu com as strings E vai trocando os valores para ver como fica. Eis o início int main() { char* local = guarda(); mostra(); testa(); setlocale(LC_ALL, "pt_BR.utf8"); mostra(); testa(); restaura(local); printf("\nMuda codepage da console para 1252\n"); SetConsoleCP(1252); mostra(); testa(); restaura(local); São ciclos onde mostra a configuração, altera algo, mostra o menu, restaura tudo e tenta de novo Eis o programa todo #include <locale.h> #include <stdlib.h> #include <stdio.h> #include <tchar.h> #include <windows.h> int n = 0; int ccp_original = 0; int occp_original = 0; char local_original[80]; char* guarda(); // guarda os valores em uso void mostra(); // mostra os valores em uso void restaura(); // deixa como estava antes void testa(); // tenta mostrar o menu com as strings int main() { char* local = guarda(); mostra(); testa(); setlocale(LC_ALL, "pt_BR.utf8"); mostra(); testa(); restaura(local); printf("\nMuda codepage da console para 1252\n"); SetConsoleCP(1252); mostra(); testa(); restaura(local); printf("\nMuda output codepage da console para 1252\n"); SetConsoleOutputCP(1252); mostra(); testa(); restaura(local); printf("\nMuda output codepage e codepage da console para 1252\n"); SetConsoleCP(1252); SetConsoleOutputCP(1252); mostra(); testa(); restaura(local); mostra(); testa(); return 0; }; // main() char* guarda() { char* pLocale = &local_original[0]; ccp_original = GetConsoleCP(); occp_original = GetConsoleOutputCP(); pLocale = setlocale(LC_ALL, NULL); return pLocale; }; // guarda() void mostra() { printf("Locale: '%s' ANSI CP: '%d' Console CP: '%d' Console Output CP: '%d'\n\n", setlocale(LC_ALL, NULL), GetACP(), GetConsoleCP(), GetConsoleOutputCP() ); }; // mostra() void restaura() { SetConsoleCP(ccp_original); SetConsoleOutputCP(occp_original); setlocale(LC_ALL, "C"); }; // restaura(); void testa() { printf("\n***** teste *****\n");; printf("=-= =-= =-= OPERAÇÕES =-= =-= =-= \n"); printf("[ 1 ] - Adição \n"); printf("[ 2 ] - Multiplicação \n"); printf("[ 3 ] - Subtração \n"); printf("[ 4 ] - Divisão \n"); printf("\n***** fim do teste *****\n\n\n");; }; // testa() // fim do texto
  19. Consegue sim. Fique tranquilo quando a isso. Talvez seja mais simples escrever uma função que retorna o proximo primo. Postei uma aqui um dia desses. Pode pesquisar no forum. Tem o código. A partir daí é só ir testando os primos que dividem esse seu número alvo até ter encontrado todos os fatores ou até ter passado da raiz quadrada do alvo, a lógica que preferir usar. Teste antes com o seu exemplo claro. E com números menores...
  20. Ele vai perder o resto da divisao do dinheiro por 7. Meio caro esse café, Mas é só isso. Divida o valor por 7 usando int. Vai ter um número. Multiplique por sete e terá o gasto com café. Subtraia do total e vai ter o valor do troco que a máquina não vai dar para o cara... Você está vendo ao contrário e usando módulo 5... %5
  21. setlocale(LC_ALL, "pt_BR.utf8"); Não. Na verdade fica pior. Acho que aqui mesmo já escrevi muitas vezes sobre isso: Então eis o que eu penso: tem que ter um bom motivo para mexer nessas coisas. Se não tem, use uma interface gráfica. É muito mais fácil e recompensador. Um motivo bom seria assim: alguém está te pagando bem para fazer isso tenha uma boa nota a partir disso tem uma questão pessoal de ver essas coisas funcionando mesmo sabendo que na máquina ao lado pode não rodar. E tem muito tempo para ler especificações e documentos. E se for investir nisso use UNICODE. É o que os navegadores e o mundo todo faz. E mesmo assim entenda que não vai funcionar sempre. Só funciona na web porque tem um parâmetro que define o encoding... Não existe isso em um arquivo texto ou uma string que você está lendo de sei lá onde. Ou escrevendo para alguém ler sei lá onde. De volta ao programa. Eis o que acontece ao mudar o locale em C Lá se vão partes do texto e sai tudo em uma linha só. Nem surpreende porque com UTF-8 acho que tinha que usar as versões Unicode das funções e das strings. Na console comum essas tais codepages trabalham apenas selecionando diferentes conjuntos de caracteres para valores maiores que 127 --- bit 8 = 1 . ASCII só usa 7 bits. Ok, esquecendo a codepage 65001 Mas e se eu faço questão de usar essa m#$%a? O problema disso é partir da ideia que todos os computadores são iguais ao nosso. Ou rodar um programa desses só no nosso computador. É preciso interrogar o sistema sobre a configuração da console, salvar, configurar como a gente imagina que vá funcionar, rodar o programa e restaurar tudo. Não dá pra supor que fonte a console do cara está usando, que cor de letra e fundo ele está usando, qual o tamanho da console dele... Coisas assim. Nesse caso, a saída de um programa de teste local original = 'C' Locale: 'C' ANSI CP: '1252' Console CP: '850' Console Output CP: '850' ***** teste ***** =-= =-= =-= OPERAÃıES =-= =-= =-= [ 1 ] - AdiþÒo [ 2 ] - MultiplicaþÒo [ 3 ] - SubtraþÒo [ 4 ] - DivisÒo ***** fim do teste ***** Locale: 'pt_BR.utf8' ANSI CP: '1252' Console CP: '850' Console Output CP: '850' ***** teste ***** =-= =-= =-= OPERA[ 1 ] - Adi[ 2 ] - Multiplica[ 3 ] - Subtra[ 4 ] - Divis ***** fim do teste ***** Muda codepage da console para 1252 Locale: 'C' ANSI CP: '1252' Console CP: '1252' Console Output CP: '850' ***** teste ***** =-= =-= =-= OPERAÃıES =-= =-= =-= [ 1 ] - AdiþÒo [ 2 ] - MultiplicaþÒo [ 3 ] - SubtraþÒo [ 4 ] - DivisÒo ***** fim do teste ***** Muda output codepage da console para 1252 Locale: 'C' ANSI CP: '1252' Console CP: '850' Console Output CP: '1252' ***** teste ***** =-= =-= =-= OPERAÇÕES =-= =-= =-= [ 1 ] - Adição [ 2 ] - Multiplicação [ 3 ] - Subtração [ 4 ] - Divisão ***** fim do teste ***** Muda output codepage e codepage da console para 1252 Locale: 'C' ANSI CP: '1252' Console CP: '1252' Console Output CP: '1252' ***** teste ***** =-= =-= =-= OPERAÇÕES =-= =-= =-= [ 1 ] - Adição [ 2 ] - Multiplicação [ 3 ] - Subtração [ 4 ] - Divisão ***** fim do teste ***** Locale: 'C' ANSI CP: '1252' Console CP: '850' Console Output CP: '850' ***** teste ***** =-= =-= =-= OPERAÃıES =-= =-= =-= [ 1 ] - AdiþÒo [ 2 ] - MultiplicaþÒo [ 3 ] - SubtraþÒo [ 4 ] - DivisÒo ***** fim do teste ***** Esse programa vai e volta com as configurações tentando achar o culpado. Ao que parece trata-se da Console Output CodePage que devia ser 1252 e não 850... Note que ao final o programa deixa tudo como estava. Entenda que se a fonte em uso na console não tiver esses caracteres mesmo assim não adianta nada... E veja o link na tela do Windows Não são assim tão novos os "novos recursos da console", mas está na tela do Windows 10 desde 2018. Trata-se de uma volta ao passado para minimizar o trabalho de tratar essas coisas nas máquinas de hoje em dia. Em especial na nuvem. Tem muito material naquele link para quem estiver determinado a estudar isso.
  22. Entendo. Só estou dizendo que o enunciado 'medíocre e fala claramente em uma amostra com 150 resultados Trocou o %s por %c lá no scanf()? Porque declarou as duas variáveis como char e leu uma com %s e a outra com %d? Ou já alterou isso? Entendeu o que o pessoal falou sobre "limpar"a entrada do teclado? adicionado 20 minutos depois Essas rotinas que terminam por _s são chamadas "versões seguras" das rotinas originais. Só que você não usou os parâmetros corretos. Você tem um livro-texto? Qual é? Uma apostila ao menos? Então deve escrever n = scanf_s("%c", &sex, 1); // por exemplo Indicando que espera ler 1 letra apenas Toda a família scanf() retorna um valor. Use! É melhor para você. Deve retornar 1 quando conseguir ler um valor. Pode parecer irrelevante mas no futuro talvez note que isso é algo importante. scanf() foi escrita or gente muito esperta. Alguns dos melhores da história e tudo lá tem uma razão de ser.
  23. Cuidado: fflush() só atua na saída. Veja essa nota em http://www.cplusplus.com/reference/cstdio/fflush/ If the given stream was open for writing (or if it was open for updating and the last i/o operation was an output operation) any unwritten data in its output buffer is written to the file. If stream is a null pointer, all such streams are flushed. In all other cases, the behavior depends on the specific library implementation. In some implementations, flushing a stream open for reading causes its input buffer to be cleared (but this is not portable expected behavior). Ou essa em https://www.geeksforgeeks.org/use-fflushstdin-c/ Can we use it for input stream like stdin? As per C standard, it is undefined behavior to use fflush(stdin). However some compilers like Microsoft visual studio allows it allow it. How is it used in these in these compilers? While taking an input string with spaces, the buffer does not get cleared for the next input and considers the previous input for the same. To solve this problem fflush(stdin) is. used to clear the stream/buffer A implementação da Microsoft parece atuar na entrada, mas não é oficial. Não está no padrão e não vai funcionar em outros sistemas e pode parar de funcionar com a Microsoft se a compania resolver seguir o padrão. Em geral é mais seguro mudar a máscara de scanf() ou ler o que tem até o '\n' inclusive, antes de tentar ler outro valor. Ou não usar scanf() para isso, já que scanf() foi feita para ler entrada formatada e o teclado por certo não é assim: o cara pode digitar o que quiser. Ou mesmo escrever flush() em seu prgrama. Ou fflush() claro void flush() { do { int ch = getc(stdin); } while ((ch != '\n') && (ch!= EOF)); }; // flush() adicionado 4 minutos depois Que enunciado besta. Nada fala sobre ler os valores, no entanto fala sobre uma hipotética resposta SIm/Não. Mas claramente fala sobre 150. Assim sendo seria o caso de ficar em frente ao terminal digitando 150 grupos de dados, Sério? adicionado 6 minutos depois E por sua conta você está lendo 10. E os outros 140?
  24. Podem me chamar de coisas. Como chato por exemplo... Mas vou repetir: um enunciado é como um contrato de serviços, uma especificação de projeto. No mundo real se você fizer menos pode não receber. E ser processado. E se fizer mais pode receber e mesmo assim ser processado. No mundo acadêmico dos exercícios de programação às vezes o enunciado tem pegadinhas. Pequenos detalhes aparentemente irrelevantes que o cara que escreveu deixou para ver até onde o aluno está atento. E ao tentar fazer mais você pode perder muito tempo com o mais antes de fazer o simples. E um erro no mais pode acabar com sua nota... OK, não fui eu que escrevi tal enunciado, não estou aprendendo nem ensinando e nem vou corrigir, mas... se tiver paciência continue lendo Nós temos isso no enunciado: Não isso (versão do autor) printf("Digite: primeiro numero:\n");scanf("%d",&num1); printf("Digite: segundo numero:\n");scanf("%d",&num2); printf("\nOPERADORES\n"); printf("Soma -> 1 \n"); printf("subitrair -> 2 \n"); printf("Multiplicar -> 3 \n"); printf("Dividir -> 4 \n"); printf("\nEscolha o Numero"); Com '- >' apontando para os números de opção, que claro vão ficar desalinhados. Não ficariam se estivessem a esquerda, certo? Subtrair escrito errado Apenas essa opção sem a primeira letra em maiúscula O prompt é Escolha o Numero mas o título do menu é OPERADORES. Provavelmente seria mais coerente escrever Escolha o OPERADOR mantendo as maiúsculas para associar imediatamente com o título do menu Seria melhor deixar um espaço ao final do prompt Escolha o Numero: para o cursor não ficar grudado na palavra ao ler a opção Apesar de estar no enunciado, recomendo não usar acentos nesses programas de console a menos que o enunciado seja bem explícito sobre isso. Fazer isso não acrescenta nada exceto o acento. Ou isso (versão de @devair1010) printf("Primeiro numero -: "); scanf("%f", &num1); printf("Segundo numero --: "); scanf("%f", &num2); printf("\nOPERADORES\n\n"); printf("1 - Soma + \n"); printf("2 - subitrair - \n"); printf("3 - Multiplicar * \n"); printf("4 - Dividir /\n\n"); printf(" Escolha a Opera%co ", 135, 198); Os números passaram para a esquerda Apareceram os operadores que não estão no enunciado, mas estão a direita e vão claro ficar desalinhados. Provavelmente ficariam melhor logo a direita dos números, mas como não estão no enunciado não deveriam aparecer. O programa poderia simplesmente aceitar os operadores, mas como uma conveniência porque se o cara está usando o teclado numérico tem os sinais ali do lado e ele poderia tentar por engano. Não corrigiu a grafia de subitrair O printf("Escolha...") tem um especificador %c, mas dois parâmetros. Está errado. E em muitos casos 135 é mesmo o código para 'ç'. Mas 198 nem sempre é 'ã'. Esses caracteres são da parte da tabela chamada extended ASCII e o que vai aparecer na tela é sempre uma emoção. Veja na tabela original da IBM e vai ver que no limiar dos tempos era outra coisa e assim é preciso ajustar a página de código dentro do programa para alguma que tenha essa letra em 198 como a Code page 850 (Latin-1 - Western European languages). E se vai mesmo fazer isso precisa antes obter o número da codepage em uso e salvar em seu programa para restaurar na saída. O mesmo deve ser feito com as cores do texto: se o cara que vai rodar esse programa estava usando cyan sobre azul exemplo vai ficar furioso depois de rodar um programinha desses e ver que ele mudou a cor na saída para o que o autor do programa acha certo. Ou seja: um inferno. Talvez seja melhor não fazer nada. Ou isso na versão de @AdrianoSiqueira printf("=-= =-= =-= OPERAÇÕES =-= =-= =-= \n"); printf("[ 1 ] - Adição \n"); printf("[ 2 ] - Multiplicação \n"); printf("[ 3 ] - Subtração \n"); printf("[ 4 ] - Divisão \n"); printf("[ 0 ] - Sair \n"); printf("> "); scanf(" %c", &operacao); As opções ganharam outro formato agora com os números entre [ ] Apareceu uma opção nova que não tinha no enunciado O prompt virou um singelo e solitário '>'. Talvez um prompt relacionado ao título do menu fosse mais adequado. Algo como "Escolha a OPERACAO: " já que o título está assim. Desse modo fica muito clara a associação entre a opção e o objeto da opção. E agora temos muitos acentos. E nenhuma tentativa de acertar a tal codepage.Eis o que aparece em meu computador por exemplo: Steve Jobs diria que EU não soube usar o programa, claro. E que eu deveria ter configurado meu computador "corretamente". Mas pode ser que o cara que vai corrigir seu programa não pense assim com o Steve e a Apple e lá se vai sua nota perfeita Copiando do enunciado e tirando os acentos seria só Menu de opções: 1 Somar dois numeros 2 Multiplicar dois numeros 3 Subtrair dois numeros 4 Dividir dois numeros Sua opcao: Porque não?
  25. Se você tem o menu especificado porque mudou o texto? Isso é uma especificação, Um contrato. Não pode fazer menos Pode fazer mais: switch(op) { case '1': case '+': printf("= %d", num1+num2); break; case '2': case '-': printf(" = %d", num1 - num2); break; case '3': case '*': printf("= %d", num1 * num2); break; case '4': case '/': printf("= %d", num1 / num2); break; default: break; }; // switch() Assim o cara pode digitar também os operadores + - * /. Eu esperaria isso. scanf() não foi escrita para ler campos do teclado. Talvez deva confirmar que leu até o fim da linha na entrada, rodando algo como esse do{}while antes de ler o outro operador. Ou mudar a mascara de scanf() que le o segundo numero do { int ch = getc(stdin); } while ((ch != '\n') && (ch != EOF)); // para ter certeza que nao ficou nada switch(op) { case '1': case '+': printf("= %d", num1+num2); break; case '2': case '-': printf(" = %d", num1 - num2); break; case '3': case '*': printf("= %d", num1 * num2); break; case '4': case '/': printf("= %d", num1 / num2); break; default: break; }; // switch() Em geral se espera ver um default: em todo case. Isso também foi mal... Use como está no enunciado, e com a grafia certa 3 Subtrair dois numeros E isso Como acabou de perguntar por dois números talvez devesse usar outra palavra aqui, como "Escolha a operacao"

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!