Ir ao conteúdo

arfneto

Membro Pleno
  • Posts

    6.526
  • Cadastrado em

  • Última visita

Tudo que arfneto postou

  1. Eu te disse exatamente onde estava faltando, com o número da linha e tudo. E depois postei até o programa corrigido... Eu te disse como identificar e te mostrei 3 desenhos com a sequência do que tinha que fazer A noção de adequação vem da sua lógica. Mas um modelo de carro geralmente é algo assim: "Corolla", "Camry", "Tundra", "Yaris" só pra ficar na mesma marca. Modelo em geral não é 1245, 12, 128, -234... Eu te disse dias atrás como fazer isso e te mostrei um exemplo rodando, naquela função mostra_um_carro(). Aquele é o caminho. Como eu antecipei na ocasião, está tendo muito trabalho por seguir esse outro caminho com tantas pesquisas...
  2. O programa SEMPRE compila. Você quer dizer que ele, o IDE, gerou um programa e executou e retornou sem fazer nada aparente. Não entendo a lógica do que fez. Que argumento usou pra pesquisar? Já tinha até uma nota com os números das linhas e o que precisava alterar no código. Para compilar. E uma noção do que estava errado.... Tentando usar uma variável não inicializada como argumento em um switch(). Você continua usando modelo como int e lendo com %s? Até quando? E porque acha que modelo de um carro num programa de estacionamento pode ser um int? Porque não fez como recomendado em relação a isso?
  3. E onde definiu esse tot_clientes ? adicionado 2 minutos depois porque começou seu programa por um menu? Comece seu programa pelos dados. Sempre pelos dados. Coloque esse menu depois, e só se o enunciado exigir de fato. Procure ler de arquivos, é muito mais fácil e seguro. E gravar em arquivos sempre que possível. É mais simples e rápido. adicionado 6 minutos depois porque começou seu programa por um menu? Comece seu programa pelos dados. Sempre pelos dados. Coloque esse menu depois, e só se o enunciado exigir de fato. Procure ler de arquivos, é muito mais fácil e seguro. E gravar em arquivos sempre que possível. É mais simples e rápido. Esse é um programa de verdade? Tem cadastros de alunos, disciplinas e locação de filmes no mesmo programa? E onde estão as estruturas?
  4. Acha mesmo que teria algo na linguagem que não serve para nada? namespaces são uma solução para um problema comum: colisão de nomes. std é o nome do namespace que contém as funções da biblioteca padrão, STL. Não. De modo algum. Apenas as funções que estão nesse namespace, std, as funções que estão em <iostream> Não é o caso. E nem é chato: é "uma mão na roda", como dizia minha avó. Imagine que você escreva uma classe Pilha, uma classe Fila, uma classe Arvore e todas tenham o método inserir(). E logo você vai gostar de existir namespace e o operador de escopo, o tal "::". Essas coisas que não "servem pra nada" é a maneira do sistema saber onde procurar a função. Já pensou em como poderia usar uma função sua chamada cout()? Pois é... #include <iostream> namespace MeuMundo { void cout() { std::cout << "Na funcao cout()" << std::endl; } }; using namespace MeuMundo; int main() { std::cout << "Hello World!\n"; cout(); }; Mostra Hello World! Na funcao cout() Recomendo MUITO conseguir um livro de qualidade sobre C++. adicionado 14 minutos depois construtor é o método chamado automaticamente quando você declara algo de uma classe. Há um destrutor também, que é chamado também automaticamente. Você pode ter quantos construtores precisar para uma classe. E eles podem ter parâmetros totalmente diferentes, graças ao tal polimorfismo. E se você derivar a classe --- a tal herança --- os construtores e destrutores são chamados em cascata. Cada classe tem apenas um destrutor. Recomendo muito conseguir um livro sobre C++. Essa linguagem é enorme e sofisticada.
  5. ? Isso se chama exemplo. Podia ser qualquer coisa. Claro, são tipos. É uma função, em C. A estrutura de um protótipo? Trata-se da lista de parâmetros, para o compilador saber o que são e quantos são. E a especificidade é total: 1:1. Exatamente como estão declarados os parâmetros formais na implementação da função. Como está no desenho...
  6. Notou que ele rodou seu programa? Isso quer dizer que compilou, gerou um programa e mandou executar Não respondeu a nada do que eu perguntei adicionado 1 minuto depois Que significa? Pesquisou o que? E o que achou? O que fez você declara opcao1 e opcao2 e continuar usando opcao para ler em scanf()?
  7. ? Imagino que tenha visto isso... O que não entendeu?
  8. pesquisas? apenas precisava alterar as duas linhas Sério? Você criou DUAS variáveis novas e continuou lendo a antiga? O que pesquisou que te fez mudar isso? Seu programa tem duas funções main() Como o sistema vai saber qual das duas chamar para iniciar o programa? Seu sentido não está refletido em seu programa. Está bem pior agora. O que leu? O que pesquisou? Qual a razão de criar outra função main()? adicionado 8 minutos depois E porque modelo é um int? E porque cor tem 50 letras? Corrigindo o mais óbvio, assim compila: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> struct cad_cliente { char nome[10]; int idade; char CPF_CNPJ[20]; char CNH[30]; char Endereco[50]; }; struct cad_veiculo { char placa[10]; int modelo; char marca[20]; char cor[30]; char ano[50]; }; int main(void) { char aux[300]; struct cad_veiculo info; int opcao = 400; switch (opcao) { case 2: system("cls"); printf("Informe o numero da placa: "); placa: fflush(stdin); fgets(aux, 300, stdin); if (strlen(aux) < 7) { printf("erro quantidade de digitos menor do que o correto\n"); printf("Digite novamente: "); goto placa; break; } else if (strlen(aux) > 7) { printf("erro quantidade de digitos maior do que o correto\n"); printf("Digite novamente: "); goto placa; break; } else { strcpy(info.placa, aux); } printf("Informe o modelo do veiculo: "); modelo: fflush(stdin); fgets(aux, 300, stdin); if (strlen(aux) < 17) { printf("erro quantidade de digitos menor do que o correto\n"); printf("digite novamente: "); goto modelo; break; } else if (strlen(aux) > 17) { printf("erro quantidade de digitos maior do que o correto\n"); printf("digite novamente: "); goto modelo; break; } else { scanf("%d", &info.modelo); } printf("Informe a marca do veiculo: "); fgets(info.marca, 20, stdin); system("pause"); printf("Informe a cor do veiculo: "); fgets(info.cor, 30, stdin); system("pause"); printf("Informe o ano do veiculo: "); fgets(info.ano, 50, stdin); system("pause"); break; default: break; }; // switch() }; Assim compila ao menos
  9. Você leu mesmo o que te expliquei antes? Era exatamente como fazer isso.... Exceto pela parte de NÃO usar strtok()... Aquela parte que começa assim: Talvez possa ler de novo e me dizer se não entendeu ainda e tento explicar de outro modo. Sobre o primeiro dos 2 problemas de que falei Entendeu que um arquivo csv é uma tabela, imagino. Veja o seu arquivo importado para o Google Planilhas, por exemplo. com um click só: É só isso. scanf() foi escrita por caras muito bons, muito bons mesmo, e para ler esse tipo de dado. Para você ver a diferença, pense assim: aí acima tem 10 linhas de dados e a primeira linha com os nomes dos campos, como é o padrão para csv. é uma tabela MxN coo eu falei. 8 campos e 11 linhas aqui. Planilhas foram a razão de pessoas comprarem computadores num primeiro momento: Visicalc foi a razão de alguém comprar um Apple II, por exemplo. Lotus 123 foi a razão de muitas empresas cogitarem de ter um PC. De volta ao tópico: Então MxN, 11 linhas, 8 campos = 88 campos. Então um programa que leia isso vai ler os 88 campos... Veja essa listagem: [ 1, 0 1] 'ideTipoEmpreendimentoOperacao' [ 1, 1 2] 'nomTipoEmpreendimento' [ 1, 2 3] 'sigEmpreendimento' [ 1, 3 4] 'qtdEmpreendimento' [ 1, 4 5] 'mdaPotenciaInstaladakW' [ 1, 5 6] 'mesReferencia' [ 1, 6 7] 'anoReferencia' [ 1, 7 8] 'dthProcessamento' [ 2, 0 9] '10' [ 2, 1 10] 'Central Geradora Hidrelétrica' [ 2, 2 11] 'CGH' ... [ 11, 6 87] '2010' [ 11, 7 88] '13/09/2017 00:00:00' Lidos 88 campos em 11 registros Que "consome" o arquivo todo. Eis o programa que gerou isso int main() { //CSV_TEO usina[20]; setlocale(LC_ALL, "Portuguese"); char campo[80], delim[4]; int n = 0; int campos = 1; int registros = 1; FILE* ent = fopen("campos.csv", "r"); while ((n = fscanf(ent, "%[^,\n]%c", campo, delim)) > 0) { printf("[%3d,%3d %3d] '%s'\n", registros, ((campos-1)%8), campos, campo); campos += 1; if (delim[0] == 10) registros += 1; }; //while() printf("\n\nLidos %d campos em %d registros\n", campos-1, registros); fclose(ent); return 0; }; Esse programa, que foi escrito em minutos, apenas lê direitinho TODOS os campos. Isso quer dizer que você pode importar os dados assim. Talvez seja interessante você ver a diferença entre usar strtok() que foi escrita com outro propósito, e scanf() como aqui... O programa tem só 8 instruções e já leu tudo certinho. scanf() é para isso: scan formatted input. Sobre o segundo dos 2 problemas de que falei: o sort Sobre a classificação, o que eu te expliquei antes foi que você usa o seu sort em um vetor de int. Mas na hora de comparar usa o int para apontar para a struct. E no sort quanto precisa inverter inverte os índices no vetor, sem mexer na estrutura. É um conceito muito comum e muito poderoso. Look-up table. Exemplo: ID, a coluna A no seu arquivo, as primeiras 4 10 9 8 7 Então você cria um vetor int ref[4] = { 0,1,2,3 }; E classifica o vetor a partir dessas ID, que são 10, 9, 8 e 7. Vai ficar com ref = 3, 2, 1, 0 Se você escrever // imprime por ordem de entrada no arquivo for (int i = 0; i < 4; i += 1) printf("%d\n", usina[i].ideTipoEmpreendimentoOperacao); vai imprimir na ordem em que leu do arquivo. Por outro lado, se imprimir assim: // imprime por ordem de ID for (int i = 0; i < 4; i += 1) printf("%d\n", usina[ref[i]].ideTipoEmpreendimentoOperacao); vai mostrar classificado pela coluna A, como quer. Apenas trocando [ i ] por [ ref [ i ] ]. E pode ter um outro vetor que classifica por ano/mes de referencia, outro que classifica por Potência Instalada, tudo isso sem tocar no chato vetor de struct... E pode usar o qsort() do C que é bem rápido e já tem onde inserir a função de comparação... void qsort( void *endereco, size_t itens, size_t tamanho, int (*comparador)(const void *, const void*) );
  10. Não era pra sair nada mesmo. Talvez eu não tenha me explicado bem, mas mostrei a saída do mesmo programa rodando no Terminal e na console. Entendeu isso? O mesmo programa. E te disse também que a Codepage só atua mesmo a partir de 0x80, os caracteres do "extended ASCII" com códigos a partir de 128. E te mostrei acho um link para a página. E um resumo do final da tabela. Também te disse do uso desses caracteres em comunicação e do sentido que eles tem, tipo EOT ETX ACK NAK SO H são significados muito especiais. Ou eram nos anos 80 Isso jamais chegava a um programa de usuário e era visto nos programas de comunicação e nas telas dos analisadores de protocolo. Claro que alguns não devem mesmo mostrar nada, já que 7 é o alarme e toca um BEEP 8 é o backspace 9 é o TAB 10 é o linefeed o tal '\n' 11 é o TAB vertical para quem se lembra 12 é o FF para avançar a página na impressora, quem diria 13 é o retorno de carro, o '\r' que voltava o carro nos terminais tty para quem se lembra. '\r' volta o cursor sem avançar a linha. Voltava nos anos 80. O cursor era físico, como o carro da máquina de escrever, de onde vem o nome CR na tabela ASCII --- carriage return 27 é o ESCAPE, ESC Para os outros o terminal mostra o esperado: E a console nada. Claro que antes mostrava, muito antes. Décadas atrás. Fiquei curioso por isso e fui procurar na fonte normal de informações sobre Windows, a Microsoft. Essa é a posição oficial: https://github.com/microsoft/terminal/pull/1964 a última correção sobre isso. Do ano passado. No geral a recomendação deles é a mesma que eu falo desde o ano passado aqui: não use isso. Fuja dessas coisas a menos que seja pago ou tenha uma nota a partir disso. Se vai usar num programa moderno e de console use Unicode e troque esses caracteres pelo correspondente em Unicode. Se precisa mesmo disso porque tem um programa antigo bem antigo mesmo use o "legacy mode" da console. Caracteres de controle Esses caracteres eram chamados "caracteres de controle" porque podem ser gerados usando Control, claro. Até Control-Z. Mapa de Caracteres No windows tem esse aplicativo onde você pode achar o código atual desses símbolos e acho que copiar para seu programa. Veja Para escrever mesmo isso na console tem que dar umas voltas a mais em C ou C++ usando int _setmode ( int fd, int mode ); como descrito em https://docs.microsoft.com/pt-br/cpp/c-runtime-library/reference/setmode?view=vs-2019 E escrever usando wprintf() ou WriteConsoleW() descritas na mesma documentação. Se precisar avise depois posto um exemplo.
  11. Não. Nada a ver. Acho que não leu o que te expliquei antes afinal. Em Isso era uma alternativa à essa opção folclórica e complicada que usou em todo o programa. Leia o que eu expliquei lá. Seu programa não está bom. E por isso tem tanto trabalho. Agora apenas coloque a chave que faltava. Espero que tenha entendido onde. E arrume o scanf() ou a declaração de modelo.
  12. As codepages atuam apenas no Extended ASCII, os codigos a partir de 128. Os caracteres abaixo de 31 tem muitos significados e muitos eram usados em comunicação e por isso muita gente sabia de cabeça. Veja na tabela: Veja os nomes deles Então em geral não imprime nada. Não me lembro agora de como pode imprimir isso na console. Vou procurar me lembrar e te falo. Mas os acima de 127 basta inserir essa linha de que falei e pode usar o código direto. No entanto precisa confirmar se a fonte da console que está usando tem as letras para imprimir também. Aqui: E se mudar algo restaure ao sair do programa, como já te expliquei... Veja o mesmo programa rodando no terminal do Windows e na console para imprimir os valores de 2 a 19.... O terminal imprime mais O programa é só isso int teste() { SetConsoleOutputCP(437); SetConsoleCP(437); for (int x = 2; x < 20; x++) printf("%d: %c\n", x, x); return 0; };
  13. Você devia ter incorporado aquilo que te expliquei antes, e te mostrei um exemplo, e as outras coisas que te disse sobre o programa. Aqui na linha 17 você declara opção e não dá nenhum valor. E logo em seguida entra no switch() tomando uma decisão a partir de um valor desconhecido. É claro que está errado. Pode ser inofensivo ou pode cancelar seu programa. Usar um int para codificar o modelo de um carro só faz sentido se tiver uma tabela de modelos, o que eu acho que você não tem. De todo modo se for assim deve trocar o %s por %d no scanf() e passar o endereço de um int. Um loop via goto dentro de um switch é perfeitamente possível, mas é uma construção bem problemática. É uma ideia ruim e só vai te dar problemas. Isso se não perder pontos por isso. Compare com a ideia que te expliquei e te dei um exemplo, de usar algo assim: typedef struct cad_veiculo Carro; // pra nao ficar repetindo Carro* le_um_carro(); // ou mesmo int le_um_carro(Carro* carro); E aí no menu pra tratar a opção 2 você simplesmente chama a função: info = *le_um_carro(); // ou res = le_um_carro(&info);
  14. Você precisa dar algum valor para opcao antes de entrar no switch(). na linha 18 coloque algum valor ou vai entrar no loop sem nunca ter lido nada. voce mudou o modelo para int. Se está certo então deve mudar a linha 58 de acordo porque no scanf() continua usando %s coloque a chave que falta lá no fim na linha 71, "};"
  15. parece que falta até mais, certo? Onde está a chave que fecha o switch()? e a que fecha o main() ? Poste o programa todo e eu te mostro as linhas. Está perdendo muito tempo com isso
  16. Não. Você apenas vai fechando as partes internas e vai ficar claro onde está faltando a chave... adicionado 0 minutos depois Como no desenho que te mostrei, as 3 imagens
  17. e? não entendi. Compilou ou não?
  18. Então use. Já viu que falta a chave? Use o '-' no switch()
  19. Falta uma chave no final Seu IDE não fecha partes do codigo clicando em + ou - e tal? Assim ajuda a ver. Alinhe melhor seu texto se o próprio IDE não faz isso para você. Veja abaixo o sinal '-'. Se você clica nisso o programa --- o IDE, que é masculino --- em geral vai comprimindo o código pra facilitar a concentração em algum trecho. Alguns IDE até mudam a cor das chaves e parenteses e traçam sozinhos uma linha entre cada par para facilitar a visualização. Ao clicar no '-' adicionado 3 minutos depois Assim você vai entender melhor: tem a struct, o switch e falta a chave do main()
  20. É problemático usar isso na console, mas entenda que antes de tudo precisa usar a pagina de código correta que tenha os símbolos que quer. Provavelmente é só isso. Não dá pra ter tudo com ASCII. Com Unicode já tem mais de 1.1 milhão A página de código referente aos tempos iniciais do Windows, pré Windows95/98 é a 437. Então se você usar SetConsoleCP(437); a mágica de voltar no tempo acontece. Eu escrevi um programa um dia desses para desenhar usando aqueles caracteres de desenho que eu usava naquela época. Se eu achar posso postar aqui se quiser. Tem um exemplo de como fazer e desfazer essas mudanças. Mas se você ainda só roda seus programas dentro do IDE na mesma máquina basta essa linha... Veja os caras de volta: e o final Não use isso. É só problema. Cortesia da wikipedia a pagina toda https://en.wikipedia.org/wiki/Code_page_437 Eu tinha isso na pasta em alguma época. E a tabela EBCDIC. E sabia a maioria de cabeça Não mais. adicionado 33 minutos depois E pode ter que mudar a fonte da console tambem, e talvez deva chamar SetConsoleOutputCP(437) ao invés de SetConsoleCP(437)
  21. Não entendi. O que significa? Estão na tabela ASCII?
  22. Unicode está descrito aqui: https://www.unicode.org/charts/ e talvez valha a pena ler isso, direto do dono do Windows, em português do brasil https://docs.microsoft.com/pt-br/cpp/c-runtime-library/unicode-the-wide-character-set?view=vs-2019 Se tem algum caracter que quer imprimir poste o código e a gente pode procurar adicionado 1 minuto depois Unicode é o ASCII de hoje, a tabela oficial de caracteres para o mundo todo e tem hoje mais de um milhão de símbolos. Foi projetado por Rob Pike --- o mesmo que escreveu GO --- e outros.
  23. Não existem dois. Unicode é só isso. Unicode.
  24. Se precisa mesmo de índices e expoentes e esses caracteres especiais, e TEM que usar programas para console use unicode. E rode seus programas no terminal do windows 10, que usa os mesmos códigos dos anos '80 do Unix, derivados do terminal VT-100 adicionado 8 minutos depois Pode usar a console também, talvez usando a codepage 65001 e ver se tem os caracteres que quer. E reprograme a console na saída para deixar como encontrou. E use as funções w de todas as funções, tipo wprintf(). Mas o caminho recomendado é usar unicode e o terminal Pode ver as tabelas aqui https://www.unicode.org/charts/
  25. vai dar certo. É praticamente a mesma coisa. Teste em separado. É muito mais rápido.

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!