Ir ao conteúdo
  • Cadastre-se

arfneto

Membro Pleno
  • Posts

    6.252
  • Cadastrado em

  • Última visita

Tudo que arfneto postou

  1. que significa a vírgula depois de x? Use apenas float x = 0; Esse ; abaixo depois do ) termina o comando if e o que sobra é um comando novo que vai ser executado sempre... porque escreveu isso? adicionado 5 minutos depois Não sei se ficou claro: é isso que está errado. Tire o ';' de lá
  2. não é bem "que ela causa" coisas. É o objetivo dela: configurar a cor do texto e a cor de fundo. São as coisas que você programou. E não "desprogramou". Vai ficar assim Ao encerrar o programa ele não sabe voltar atrás e deixar as cores como antes. O que acontece é que você provavelmente nunca testa seus programas fora do IDE e assim a cada vez que vai rodar compila o programa de novo e roda só no IDE. E ao rodar "dentro" do IDE abre um terminal a cada vez e assim não vai saber que o anterior ficou zoado. Ele é fechado assim que o programa encerra. Por isso muitos usam a folclórica função getch() no final do programa ou aquele ingênuo system("pause"); A lógica é a que te mostrei nas duas funções de exemplo: ao entrar no programa e antes de mudar qualquer coisa você chama BOOL WINAPI GetConsoleScreenBufferInfoEx( _In_ HANDLE hConsoleOutput, _Out_ PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx ); E antes de encerrar você chama e restaura como estava antes BOOL WINAPI SetConsoleScreenBufferInfoEx( _In_ HANDLE hConsoleOutput, _In_ PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx ); Veja essa função de exemplo e vai entender como funciona: Essa função escreve uma mensagem na tela em video reverso como dá para imaginar. Só que ela SEMPRE funciona. Ela reverte as cores em uso no momento e depois restaura. Então pode ver o mecanismo que te expliquei e rodar em sua máquina, chamando essa função. Se você estiver usando cyan sobre azul ela vai escrever em azul sobre cyan e depois deixa tudo igual. mensagem_em_video_reverso("mensagem de teste"); Eis o código void mensagem_em_video_reverso(char* mensagem) { HANDLE H = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(H, &info); WORD foreground = info.wAttributes & 0xF; WORD background = info.wAttributes & 0xF0; printf("\n"); text_color(background, foreground); printf("%s\n", mensagem); text_color(foreground, background); return; } // mensagem_em_video_reverso()
  3. Não tem uma versão do programa de agora? A escola não forneceu um arquivo de dados para testes? O grande problema que eu vejo em seu primeiro programa é muito comum em programas de iniciantes: a ideia de que tem que ler essas coisas no teclado. Não tem. E é uma me$%a tentar fazer isso. Desista logo. Faça as contas: mesmo que tenha um único país e um ciclo de 5 dias apenas vai ter que digitar 4 linhas e um monte de coisas/ PARA CADA TESTE. Esqueça isso. É muito mais simples ler de um arquivo que você pode editar em editor de texto que alguém já escreveu. Word? Excel, Bloco de Notas? Write? Sublime Text? Vi? O próprio editor de seu IDE --- sim, IDE é masculino --- por exemplo... Se preocupe em ler e armazenar os dados antes de tudo. Pense em seu programa em torno dos dados. antes de escrever o programa. Depois leia um conjunto de dados e mostre na tela tudo que leu para ficar seguro. E implemente as funções uma a uma. Li o material e não é nada complicado. Apenas medidas, umas poucas contas. Veja essa por exemplo: É a mesma coisa que aquele exercício besta de ler um vetor e mostrar o menor e o maior valor e a média que vemos aqui toda hora. Ou aquele dos homens mais altos e a porcentagem de mulheres e tal. Apenas varrer os dados e extrair alguma medida. Poste o covid19.h e eu tento ver algo mais objetivo para ajudar você. Ou ele só tem essas 3 funções e uma constante mesmo? E o enunciado mais arrumadinho? Uma boa opção para testar é criar um gerador de dados de teste. Sempre dá certo. Saberia escrever um?
  4. Precisa resolver se quer recuperar ou descartar. Isso é um inferno. Seria preciso saber qual a CodePage em uso na máquina que gerou o log e não existe isso nos sistemas. Algo prático como o parâmetro de encoding que tem na web ou em XML ou no e-mail Então o normal é filtrar a entrada e aceitar somente um universo de caracteres para mostrar na tela. Para os que estão fora usar um simbolo qualquer que pode parametrizar. Se sabe qual a página ou a fonte em uso pode alterar em seu programa e usar assim mesmo. E se pode abrir mão da console pode fazer isso usando xml ou html e a interface gráfica, porque lá você pode usar encoding. Outra opção seria usar Unicode e o Terminal do Windows e não a console e aí poderia usar todo o universo de caracteres, mas teria que saber o que está naquelas mensagem para converter... Katakana? Hiragana? Sei lá. De todo modo seria um inferno. Se precisar muito ou for bem pago o Terminal do Windows tem todos os caracteres possíveis e usa aceleração gráfica via GPU e é muito rápido. E mesmo na console normal deve funcionar, com algum trabalho adicional, Use as versões unicode das funções. Identifique o encoding das palavras que estão lá. São funções como wprintf() e constantes wchar_t.
  5. @devair1010 @Jorge Curvelo parece um pouco complicado com todos esses loops. Acho que sete deles. Se considerar que isso que escrevi possa estar certo seriam apenas 2 loops e um outro com um if para separar as frutas duplicadas. E de fato, um programa de teste com os arquivos do enunciado mostra Lista de Frutas * Da primeira lista: 1: 'uva' 2: 'melancia' 3: 'tomate' * Da segunda lista: 'uva' [Duplicada] 4: 'pera' 'tomate' [Duplicada] 5: 'tangerina' 'melancia' [Duplicada] 6: 'laranja' Na tela estão as frutas da primeira lista e as frutas da segunda lista. E está marcado quando foi descartada uma fruta duplicada. E tem o número de frutas que deve estar no arquivo de saída. Esse é um pouco mais que o mínimo necessário para atender ao enunciado, se li corretamente O arquivo gerado, sem surpresas uva melancia tomate pera tangerina laranja E o programa de teste #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main() { char lista_original[40][20]; FILE* lista; FILE* nova_lista; int continua = 0; int qtd = 0; char fruta[20]; printf("Lista de Frutas\n\n * Da primeira lista:\n"); lista = fopen("frutas1.txt", "r"); nova_lista = fopen("frutas3.txt", "w"); do { qtd = qtd + 1; fscanf(lista, "%s", fruta); printf("%2d: '%s'\n", qtd, fruta); strcpy(&lista_original[qtd][0], fruta); fprintf(nova_lista,"%s\n", fruta); } while (!feof(lista)); fclose(lista); printf("\n * Da segunda lista:\n"); lista = fopen("frutas2.txt", "r"); do { fscanf(lista, "%s", fruta); int duplicada = 0; for (int i = 0; i < qtd; i = i + 1) { if (strcmp(fruta, &lista_original[i][0]) == 0) { duplicada = 1; printf(" '%s' [Duplicada]\n", fruta); break; } }; // for() if (duplicada) continue; qtd = qtd + 1; printf("%2d: '%s'\n", qtd, fruta); strcpy(&lista_original[qtd][0], fruta); fprintf(nova_lista, "%s\n", fruta); } while (!feof(lista)); fclose(lista); fclose(nova_lista); return 0; }; // fim E sem surpresas: Dois loops O segundo loop tem um loop interno e um if para eliminar os duplicados Um pouco off-topic (palpites ), sobre o programa de exemplo, @devair1010 no tópico #15 #define H GetStdHandle(STD_OUTPUT_HANDLE) void textcolor_2(int l,int f){SetConsoleTextAttribute(H,l+(f<<4));} Esse #define de algo de uma única letra pode acabar coincidindo com alguma variável H que um dia você use no programa. Só que isso é usado uma única vez, no código de textcolor_2() que só tem uma linha ou mude para algo como _H_ que é praxe nesses casos Mas sugiro escrever o simples void textcolor_2(int l,int f){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),l+(f<<4));} E esquecer o #define H E sobe essas linhas talvez fosse o caso de considerar ao invés do #define H algo assim #define _preto_ 0 #define _azul_ 1 #define _verde_ 2 #define _ciano_ 3 #define _vermelho_ 4 #define _magenta_ 5 #define _marron_ 6 #define _cinza_claro_ 7 #define _cinza_escuro_ 8 #define _azul_claro_ 9 #define _verde_claro_ 10 #define _ciano_claro_ 11 #define _vermelho_claro_ 12 #define _magenta_claro_ 13 #define _amarelo_ 14 #define _branco_ 15 E aí poderia escrever o simples textcolor_2(_branco_, _vermelho_claro_); printf(" lista de compras 01 \n"); textcolor_2(_branco_,_preto_); E poderia usar as cores pelo nome. Deixei um '_' antes e depois da cor para evitar bater de frente com alguma variável de algum programa. É prática comum em C e outras linguagens que não tem namespaces ou algo parecido. adicionado 34 minutos depois @devair1010 Acho que já falamos sobre isso umas vezes aqui, e ao rodar seu exemplo aconteceu de novo então vou comentar outra vez: Quando um programa muda algo na configuração do sistema é preciso --- ou pelo menos considerado educado --- restaurar tudo na saída. É comum um programa de console --- na medida em que eles ainda existam assim --- mudar fontes ou recursos como tamanho da janela o. Muitas vezes você precisa de caracteres que não tem em todas as fontes, para desenhar por exemplo. E aí muda a fonte Em outros casos precisa mudar a página de código para usar acentos especiais Às Vezes só muda as cores para destacar algo ou fazer uma graça Pode ser que precise apagar aquelas barras de rolagem que ficam nas janelas de prompt de comando para um jogo ou uma tela mais limpa A console do Windows tem 9001 linhas. Sim, 9001 --- o linux não tem console nem o MacOS --- e muitas vezes é preciso mudar isso para não rolar a tela ao escrever na última linha ou na última coluna Mas ao final veja que meu terminal rodando seu programa ficou escrevendo em amarelo sobre vermelho... Claro, é só fechar o terminal e abrir outro, mas é chato. Como eu disse, rodar um programa não deve mexer na máquina em definitivo a menos que esse seja o objetivo do programa. Eu rodei um programa de teste para combinar dois arquivos e acabei com uma tela vermelha... Pra não dizer que não deixei um Exemplo _cs_status* guarda(_cs_status* antes) { antes->cp_original = GetConsoleCP(); antes->ocp_original = GetConsoleOutputCP(); strcpy(antes->local_original, setlocale(LC_ALL, NULL)); HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); char buffer[80]; char* pBuffer = buffer; int res = 0; res = GetCurrentConsoleFont(h, 0, &(antes->font_info)); // pois e: mas qual a fonte? Tem que ver na tabela // precisa da versao ex da rotina e eu nao sabia antes->font_infoEx.cbSize = sizeof(CONSOLE_FONT_INFOEX); res = GetCurrentConsoleFontEx(h, 0, &(antes->font_infoEx)); // A fonte em uso fica aqui no registro // Computador\HKEY_LOCAL_MACHINE\SOFTWARE\ // Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont // GetConsoleMode(h, &antes->mode_original); // agora falta SCREEN BUFFER antes->infoEx.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX); GetConsoleScreenBufferInfoEx(h, &antes->infoEx); return antes; }; // guarda() Essa função acima é de meu uso e salva essas configurações e muitas outras. Talvez possa usar algo assim. No caso do que falamos aqui acho que basta o GetConsoleMode() Esse exemplo tem uma função irmã void restaura(_cs_status* antes) { // restaura locale e paginas de codigo SetConsoleCP(antes->cp_original); SetConsoleOutputCP(antes->ocp_original); setlocale(LC_ALL, antes->local_original); // restaura a fonte HANDLE ho = GetStdHandle(STD_OUTPUT_HANDLE); int res = SetCurrentConsoleFontEx(ho, 0, &antes->font_infoEx); if (res == 0) printf("SetCurrentConsoleFontEx() falhou: %d\n", GetLastError()); // console mode SetConsoleMode(ho, antes->mode_original); // cor e fundo SetConsoleTextAttribute(ho, antes->infoEx.wAttributes); }; // restaura(); E você pode ver como é simples salvar e restaurar.
  6. Olá! Bom que está rodando ok agora. Entenda que o objetivo de responder a essas dúvidas em um forum público é que possa ajudar mais pessoas com dúvidas parecidas. E assim se você edita os tópicos iniciais faz com que seja impossível para quem eventualmente está lendo e interessado no problema entender o que está acontecendo. As respostas aos posts vão se referir a coisas que não estão mais lá... Veja o tópico #2 por exemplo e não dá para entender nada... Você voltou ao tópico original e colocou o programa corrigido e com uma parte faltando... Peço que não altere os posts mas apenas poste as correções e o resultado final para ter algo consistente registrado...
  7. Entenda que esse erro é da chamada a scanf() . Você declarou ndecimal um int mas na hora de ler usou o especificador %ld. Esse %ld espera um ponteiro para long int e por isso o erro --- warning, aviso no caso. Mas está errado mesmo, porque sua função também espera um long int: Melhor corrigir a declaração de ndecimal para long int ndecimal; Não pode usar um compilador com mensagens em português? adicionado 2 minutos depois Entendeu que não tinha entendido o seu erro?
  8. Você entendeu que não tem nada errado com a função??? O que está errado é o programa. Acima passou o endereço da função para scanf() e isso não funciona Aqui declarou DUAS variáveis e passou para scanf() o endereço de uma terceira que não declarou adicionado 0 minutos depois pois é Algo assim adicionado 1 minuto depois usando um printf() adicionado 1 minuto depois Está lendo mesmo o que eu escrevo? adicionado 12 minutos depois Cada chama a n() vai retornar um int normal mas que vai ter a representação do argumento em binário. Sua lógica est;a correta. A saída da função vai ser um número e aí você faz o que precisar com ele.
  9. você leu mesmo o que eu disse? estava melhor antes. A função está ok, mas está confundindo os nomes todos. Antes faltava uma variável agora sobram 2 adicionado 5 minutos depois int ndecimal; scanf("%ld", &ndecimal); printf("Decimal: %ld Binario: %ld\n", ndecimal, n(ndecimal)); que tal algo assim mais simples? No primeiro código você estava lendo uma variável com o nome da função No segundo está lendo uma variável chamada decimal que você não declarou.
  10. ? Não entendi de que precisa. Se esse é o programa todo, não declarou uma variável em main() para ler o número. Claro que não pode ser n, já que esse é o nome da função. A função em si está ok.
  11. Mas cada curso tem apenas 6 alunos no máximo. Porque não declara apenas um vetor de 6 e coloca os ids la? Se fala do contrário veja o que te expliquei no primeiro post. O aluno tem uma lista de cursos, se não há limite apenas use uma lista. Ou apenas monte na hora de mostrar
  12. Não tem um limite para o número de cursos que um aluno pode fazer? Se não tem deve criar uma lista de cursos no registro do aluno. Ou definir um limite mesmo e declarar um vetor fixo de cursos dentro da estrutura. Melhor confirmar com seu professor. Como tem apenas uma lista de 6 possíveis alunos em cada curso pode definir mesmo um vetor de 6 caras e marcar lá a id de cada aluo inscrito. O resto das informações pode levantar na hora da consulta mesmo, usando loops. Ou criar os arquivos ou tabelas de referência vinculando alunos e cursos adicionado 19 minutos depois int consulta(int); void exclui() Entenda que main() deve ser a primeira função de seu programa e não a última. No início apenas declare as funções, são chamados protótipos, como acima. Entenda que usar void() quase sempre é um desperdício de informação. E algumas vezes um erro. É essencial você entender que uma lista encadeada é simplesmente uma abstração, e que você não deve misturar os conteúdos. Se prepare para tratar os dados e escreva seu programa em torno dos dados não deve usar consulta() e exclui(). Não é esperto. Deve usar algo como int consulta(Dado*, Lista*); int exclui(Dado*,Lista*); Porque? Simples: você não quer programar toda vez a mesma coisa. Uma lista é uma lista, de cursos ou alunos ou livros ou músicas ou produtos... Programe e teste sua lista em separado e apenas crie listas adicionais onde precisa. Ou vai levar uma eternidade para fazer o programa, a toa. Lista* alunos; Lista* cursos; Lista* outra; Muitas linguagens tem listas para você declarar e usar como se fossem um tio e conseguem isso declarando assim. struct nodoA{ int codA; char nomeA[20]; }aluno; //Estrutura do nodo struct nodoC{ int codC; char nomeC[10]; struct nodoA alunos [6]; struct nodoC *proxC; }curso; struct nodoC *auxC; struct nodoC *inicio; Isso está um pouco confuso. Não vai criar uma lista de alunos? Então não devia usar essa nomenclatura de nodo. E se vai usar entenda que todos esses "nodo" são iguais... struct nodo { Dado* info; struct nodo* prox; // antes struct nodo* prev; // depois } Algo assim afinal. Dado pode ser qualquer coisa. Em C em geral se declara (void*) e converte quando preciso, por exemplo, para ponteiro para aluno ou curso. Em outras linguagens se usa algo como generics ou templates e assim pode ter listas de qualquer coisa, como alunos ou cursos. Entenda que estruturalmente é igualzinho. Por isso essas são chamadas de tipos abstratos, uma maneira de representar coisas concretas como filas ou listas em programas de computador. E isso simplifica muito as coisas e não o contrário
  13. Não parece ter mudado muito o programa... Do modo como está vai ter muito trabalho, como eu disse. E não respondeu o que vai fazer com esses dados, as atividades e notas, mas com esse tópico já revela algo, ao menos em relação às notas. printf("\nVerificar notas"); for(n=0;n<1;n++){ for(m=0;m<4;m++){ printf("\nNota %d: %2.f",contar+1,nota[n][m]); } } printf("\n[%d][%d]",nota[n][m]); Essas construções parecem no geral muito complicadas. E não mudou o lance do case ao que parece. Esse aí do trecho não parece ter uma break e em geral isso acaba dando errado Coloque as notas onde elas deveriam estar: na estrutura de cada aluno...
  14. Há 3 maneiras de organizar isso. Ao menos. Tudo depende do que vai fazer depois com essas informações. Das funções do programa. Você vai ter uma lista de cursos e uma lista de alunos. Ou alguma combinação de listas disso. Pode ser que precise incluir uma lista de alunos para cada elemento da lista de cursos e baste. Pode ser que precise incluir na lista de alunos uma lista de cursos e baste. Pode ser que precise das duas coisas e então o mais simples é criar uma lista ou arquivo de relações, vinculando alunos a cursos e cursos a alunos. É o que faz um banco de dados: cria tabelas de relações e tabelas de dados.
  15. Você está tentando dizer que cada aluno tem 4 notas "parciais"? As notas são dados do aluno, apenas inclua na estrutura de aluno. O que vai dar as opções alterar é seu programa, então não faz diferença Entendeu as coisas que te expliquei no outro tópico sobre esse mesmo programa?
  16. Recapitulando leia A e grave em um vetor e ao mesmo tempo no arquivo de saída. abra B e só grave na saída os que não estão no vetor. feche os 3 arquivos game over Que tal um vetor: int lista_original[31]; // um numero bom de frutas Pra ficar mais fácil de contar: na posição 0 está o total de frutas. Da posição 1 em diante a primeira, a segunda, as frutas afinal Aí você lê "frutas1.txt" e coloca em ... lista_original. Ao mesmo tempo abre "todasfrutas.txt" e vai gravando lá as tais frutas. Faz sentido hein? E na posição [0] estará o total de frutas já que você claro vai somando ao ler. Fim do item 1. Ai você abre o outro arquivo de frutas, "frutas2.txt". Para cada fruta que você lê você vai no vetor e procura a tal fruta. Se não tem lá você grava na saída. E é só isso. Fecha os arquivos e termina. adicionado 21 minutos depois const char* frutas1[3] = { "uva", "melancia", "tomate" }; const char* frutas2[6] = { "uva", "pera", "tomate" "tangerina", "melancia", "laranja" }; Note que algo simples como acima permitiria testar seu programa em minutos... Control-C Control-V direto do enunciado...
  17. do { arq = fopen("frutas01.txt", "w"); char fruta[20]; printf("lista de compras 01\n\n"); printf("escreve uma fruta\n"); scanf("%s", fruta); fprintf(arq, "%s\n", fruta); printf("outra fruta?"); scanf("%c", &outra); } while (outra == 's'); fclose(arq); Se você escreveu isso sabe algumas das chamadas ao menos. No entanto está bem ruim. Há uma causa e efeito entre cada comando... e isso quer dizer que tem que fazer sentido a maneira e a ordem em que escreve as instruções. Pense bem: você tem um loop para gravar as tais frutas. Boa idíea mas talvez não precisasse disso se seu enunciado é criar uma lista integrada de ... frutas No entanto você abre o arquivo dentro do loop, de modo que vai gravar no máximo uma fruta.... E talvez não seja muito seguro ler um único caracter com scanf() porque o cara pode digitar vários e vai cancelar seu programa.... adicionado 1 minuto depois mas eu te disse o que fazer Abre o outro arquivo e só grava na saída o que não estiver no vetor... adicionado 3 minutos depois Acho que já perguntei isso: você tem mesmo um enunciado que te obriga a ler da tela essas duas listas? Não basta ler dois arquivos e gerar um terceiro, que é muito mais fácil?
  18. Que tal a lista que vai gerar, a tal intersecção e que imagino que vá gerar um arquivo novo? Ou mostrar na tela, ou os dois? Isso é a saída... E a entrada? Os dois conjuntos. Que conjuntos? As duas listas.
  19. Seu curso é de C ou C++? Foi você que escreveu o programa que postou? adicionado 1 minuto depois porque tem que digitar as frutas toda vez? Está no enunciado? Não pode usar dois arquivos que é muito mais simples? Que parte não entendeu do que expliquei? Ou que parte entendeu? Sabe escrever um programa que umas linhas de um arquivo e salva em um vetor?
  20. tentou simplesmente chamar a função da biblioteca que compilou? Que acontece? Não sei se tem mesmo algo errado
  21. apenas faça o que eu disse. É uma simples intersecção Tem uma dúvida em particular?
  22. Faz sentido, já que tirou os tais "itens que repetem"... Isso tem um nome e é intersecção de conjuntos A e B. A maneira ortodoxa de criar isso é leia A e grave em um vetor e ao mesmo tempo no arquivo de saída. abra B e só grave na saída os que não estão no vetor. feche os 3 arquivos game over
  23. Acho que já te disse isso... Abra um novo tópico com um título significativo e assim pode ajudar outros caras com problemas parecidos Essa foi uma afirmação curiosa... Isso quer dizer que você não tem muita coisa. Pense assim: se você tem um exercício sobre vetores então esse é o conceito do momento e provavelmente é nisso que você pode ter dificuldade se for ter alguma. Comece por isso e teste isso. Ler valores e escrever na tela não vai acrescentar nada e pode te dar a impressão de que está "quase pronto" até você descobrir que tem alguma dificuldade com o novo tema. Não é um bom caminho. Escreva funções para resolver os problemas menores. Funções são apenas trechos de código com um nome mas tornam a vida mais simples. Se não sabe usar apenas leia as páginas seguintes de seu livro. Se não tem um livro arrume um. Um vetor é apenas um grupo de variáveis identificadas por um índice e simplifica as coisas ao invés de complicar, mas repito: escreva a parte dos vetores, do conceito central PRIMEIRO. Não misture entrada e saída com a lógica. Só dá problema e dificulta os testes. Sabe usar estruturas? É mais fácil assim. Um vetor de estruturas. Pois é: esse é o objetivo e você não fez quase nada nesse sentido. Sobre o programa até aqui case 2: if(saldo == 0){ printf("Seu saldo esta zerado, voce nao tem o que sacar!\n"); continue; } printf("Digite o valor a ser sacado : "); scanf("%f",valorsaque); Essa é uma construção curiosa. Porque se preocupar com isso? Se vai tratar isso especialmente não ofereça a opção de saque no menu para o cliente com saldo zero... Acho que sabe que antes de tudo precisa saber a conta do cliente, certo? E aí poderia deixar o saldo do cliente já no menu. Para que esperar o cara perguntar o óbvio? Você usou um switch dentro de um while para tratar as opções. Com continue ao invés de break em cada case. Algo curioso. Se vai usar o switch e é o único comando do loop apenas troque os continue por break e termine o switch() normalmente. Assim não vai ficar furioso com você mesmo se precisar colocar um comando final dentro do loop e descobrir que tem que editar TODOS os case: para trocar os continue por break. Chamaria isso de programação defensiva. Sobre os vetores, um trecho de programa #define _N_CLIENTES 10 struct cliente { int conta_corrente; double saldo; int total_operacoes; }; typedef struct cliente CLIENTE; int main() { CLIENTE cadastro[_N_CLIENTES]; int conta_corrente[_N_CLIENTES]; double saldo[_N_CLIENTES]; int total_operacoes[_N_CLIENTES]; // no banco chamam isso de "carga de cadastro" // se fosse um vetor de estruturas cadastro[0].conta_corrente = 1234567; cadastro[0].saldo = 100.12; cadastro[0].total_operacoes = 0; cadastro[1].conta_corrente = 2345678; cadastro[1].saldo = 123.12; // se fossem 3 vetores ligados pelo indice conta_corrente[0] = 1234567; total_operacoes[0] = 0; saldo[0] = 100.12; conta_corrente[1] = 2345678; saldo[1] = 123.12; total_operacoes[1] = 0; // claro que da na mesma // agora que tem dados no cadastro pode operar com os dois clientes // claro que saldo e deposito como operacao e a mesma coisa // para depositar ou sacar um dinheiro na conta de um // cliente você procura no cadastro acha o indice dele no cadastro // e faz o servico int um_cliente = 2345678; double valor = 100.0; // um deposito // vai descobrir que e o cliente 1 cadastro[1].saldo += valor; cadastro[1].total_operacoes += 1; // ou se usou 3 vetores saldo[1] += valor; total_operacoes[1] += 1; valor = -99.; // e um saque cadastro[1].saldo += valor; cadastro[1].total_operacoes += 1; // ou se usou 3 vetores saldo[1] += valor; total_operacoes[1] += 1; return 0; }; // fim Assim você tem um exemplo com dois caminhos. Não teste seu programa lendo dados e mostrando na tela. Só vai atrasar.
  24. Construções assim sugerem que faltou um break; para o case: anterior. Seu programa não está bom. Muito difícil de ler, de testar e de manter funcionando quando conseguir que ele funcione. Você sabe escrever funções? Se sabe use algumas., Se não sabe veja em algum livro e aplique aqui porque o tempo que vai perder para acertar isso sem elas é maior do que o tempo que leva para aprender a escreve-las. E de qualquer modo vai precisar de funções em seus programas... Escreva funções com propósito determinado e teste em separado. Vai perceber que vale a pena. E as atividades, notas e matérias? Seu programa tem lá o título de gerenciador de atividades, mas por enquanto apenas gira em torno de manter dois cadastros muito parecidos, de alunos e professores Você tem um enunciado? Um projeto? Estão bem definidas as atividades e as notas e o que fazer com os dados? Notou que o gerenciador de atividades não tem uma estrutura de atividades? Sugiro escrever essas coisas primeiro. Como são as atividades e o que fazer com as notas. O contador de alunos e o contador de professores são meio que supérfluos já que alocou todos os 10 alunos e professores e parece que não pesquisa por posição deles então pode mesmo varres as estruturas. Em geral nesses casos existem estruturas de relação, ligando os alunos e professores com as matérias, notas e atividades. Em algum lugar se define que uma matéria tem professores e alunos, os alunos tem notas, coisas assim. E se tem notas e atividades não deveriam estar associadas a professores e alunos? Que esse programa faz além de editar os cadastros e validar as senhas?

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!