Ir ao conteúdo

arfneto

Membro Pleno
  • Posts

    6.526
  • Cadastrado em

  • Última visita

Tudo que arfneto postou

  1. Não há razão para não funcionar. O formato está descrito com algum detalhe aqui https://docs.microsoft.com/en-us/windows/win32/gdi/bitmap-storage struct FileHeader { char header[2]{ 'B', 'M' }; int32_t fileSize; int32_t reserved{ 0 }; int32_t dataOffset; }; struct InfoHeader { int32_t headerSize{ 40 }; int32_t width; int32_t height; int16_t planes{ 1 }; int16_t bitsPerPixel{ 24 }; int32_t compression{ 0 }; int32_t dataSize{ 0 }; int32_t horizontalResolution{ 2400 }; int32_t verticalResolution{ 2400 }; int32_t colors{ 0 }; int32_t importantColors{ 0 }; }; Essas são possíveis declarações do início do arquivo. Logo a seguir vem os pixels, uma linha por vez.
  2. Você tem um livro sobre C++? Recomendo muito um livro. Seguir algum livro. É mais produtivo e terá uma referência sempre. Escreva seu programa aos pouco. Foco nos dados. Sempre nos dados. Veja como vai representar os funcionários, as unidades de produção e os valores, antes de tudo
  3. Como sabe que a leitura chegou ao final? Talvez devesse postar o código todo... ulli sizeFile = in.tellg();//pegando a posição atual Que pretende com essa linha? fileSize seria mais comum, certo? E em java. Em C++ deve ser mais comum file_size mesmo. E se pretendia declarar algo como um inteiro sem sinal pode usar unsigned long ou os tipos em <cstdint> como uint32_t e uint64_t com sentido óbvio. Talvez devesse mostrar na tela em cerr ou cout os valores que leu para se assegurar das coisas. Você tem um livro de C++? Sua escola assina uma biblioteca online talvez? depois de chamar read() o total de bytes lidos pode ser consultado chamando gcount() e o estado pode ser consultado usando rdstate(), e o fim de arquivo estará sinalizado em eofbit... Como vai liberar a memória alocada? Outra chamada a sendFile e já era a memória ocupada por Buffer...
  4. Mais ainda: Então variando a e b se pode determinar c ao quadrado e claro c. C pode ou não ser um número natural. Se for um número natural a soma pode ser 1000 e temos uma resposta. Pode ser menor que 1000 e aí continuamos incrementando a e b Até onde pode ir a? como (a,b) e (b,a) são o mesmo resultado, pode usar a até a metade de 1000 e aí variar b enquanto a soma de a, b e c for menor que 1000 Em resumo, dois loops, um dentro do outro e dentro deles o cálculo de c e um teste.Umas 10 linhas.
  5. Não sei se força bruta vale como cálculo, mas computadores são para isso afinal. E teoremas e fórmulas para calcular os valores. Para a = 0 a gente tem o caso mais simples, com b = c e a+b+c = 1000 então b=c=500 Mas pode ter mais. Considerando: c é dependente de a e b, mas pode não ser um número natural se c for natural a soma pode ser ou exceder 1000 tanto faz a ordem de (a,b). (0,500,500) é o mesmo que (500,0,500) por exemplo. A soma é comutativa afinal. Então só precisamos testar um lado, com a<=b ou a>=b.
  6. ? Estava melhor como escreveu antes. Se sabe que os números são inteiros não pode só testar as combinações?
  7. char *getString(char *mensagem) { char *string = (char *) malloc(255 * sizeof(char)); printf("%s", mensagem); fgets(string, 255, stdin); string[strcspn(string, "\n")] = '\0'; return string; } @AdrianoSiqueira fgets() retorna ao ler N-1 bytes, o segundo parâmetro, ou encontrar um '\0' no arquivo --- stream --- especificado pelo terceiro parâmetro. Isso quer dizer que se leu até N-1 caracteres e não leu um '\0' a rotina vai colocar um lá no fim. E se Leu N-1 a rotina vai parar aí. Ou seja: o último byte da string apontada pelo primeiro parâmetro é sempre NULL, 0, o tal '\0'. Assim não faz sentido usar sprcspn() para um loop na string porque é claro que só vai achar o 0 na última posição. É a definição de string e o propósito de fgets() --- get string from file. Faça o simples e use string[ strlen(string)-1 ] = 0; Mas o problema maior com essa função está em char *string = (char *) malloc(255 * sizeof(char)); A cada vez que chama isso a partir da primeira desaparecem 255 bytes de memória. O leak clássico. O ponteiro se perde e não há como liberar essa memória.
  8. Poste o código como ficou e algum comentário de qual foi sua ideia ao escrever do modo como fez. Pode ajudar outros
  9. Sua função cadastrar() é um beco sem saída: não cadastra e não retorna nada. Faça seu programa em torno dos dados. Todos os seus programas. typedef struct Livro { char titulo[200]; char autor[200]; char editora[200]; int edicao; } Livro; Livro Livro_biblioteca[max]; Veja o exemplo de @herbertbahia como já faz sentido. Considere que uma biblioteca tem livros, um certo número deles. Provavelmente char[200] para cada item vai ser muito chato de usar e muito grande. Use uns 20 nos testes ou menos. Edição int pode ser mais problema do que solução: como regra use char a menos que vá operar com os valores, como somar preços. Acrescente sempre um campo tipo int como ID para ajudar. Isso porque depois sempre aparece uma outra necessidade e é mais fácil comparar ID do que qualquer outro campo. E se o cara escolhe por titulo na tela e você tem a ID na struct é um passeio ir no cadastro e achar o cara e vincular com todos os títulos do mesmo autor, por exemplo. Entendeu? Veja esse conjunto por exemplo typedef struct { int id; char autor[20]; char edicao[5]; char editora[20]; char titulo[20]; } Livro; typedef struct { int id; char nome[20]; int N; // o total de livros Livro* Acervo; // O vetor de livros } Biblioteca; Biblioteca* cadastrar( char* nome, char* arquivo ); int mostrar(Biblioteca* bib); E veja como começar pelos dados simplifica as coisas: uma biblioteca tem um acervo de N livros e tem um nome pra identificar. E só com essas funções já pode escrever Biblioteca* teste = cadastrar("Loja 1", "livros.txt"); int n = mostrar(teste); E aí no próprio IDE você edita um arquivo de teste com uns 3 livros e testa seu programa pra ver se mostra() mostra os 3 livros. E aí segue com as suas funções. Exemplo: 12;Jhonny1;Edicao 1;O'Reilly;A Tour of C++ 22;Jhonny2;Edicao 1;O'Reilly;A Tour of C++ 3;Jhonny3;Edicao 1;O'Reilly;A Tour of C++ 512;Jhonny4;Edicao 1;O'Reilly;A Tour of C++ Com os valores separados convenientemente por ';'. O total de linhas do arquivo vai ser claro o total de livros no acervo, o tal N. o nome da Biblioteca você passou como parâmetro e a vida segue. O nome do arquivo você sabe porque acabou de criar. E pode usar vários pra testar sem ter que digitar nada de novo... cadastrar() devolve um endereço de uma struct do tipo Biblioteca, que contem N livros, que leu a partir do arquivo livros.txt. E mostrar() mostra na tela o conteúdo de uma biblioteca, e você confere o funcionamento. E aí continua com seu programa.... É só um exemplo
  10. A análise apenas cria métricas sobre esses dados simples. Então antes de tudo faça um programa que lê os dados e põe na tela, pra ver a mecânica da coisa Mas como vai ter que gerar um arquivo e o enunciado não fala nada sobre como ler, faça o simples e leia de um arquivo também e vai poupar seu tempo. Você edita o arquivo no próprio IDE ou num editor de texto. Muito mais fácil e rápido Depois que estiver lendo certinho --- e é trivial --- crie uma struct de acordo e tene colocar os dados em um vetor delas Depois escreva uma função que grava as structs todas no disco e vai entender o mecanismo que vai usar para gerar o relatório Edite um modelo do relatório no próprio IDE ou no bloco de notas para saber o que vai escrever dentro do programa Escreva uma função para gerar cada item do relatório, em separado. É só um exercício de faculdade. Não precisa ser eficiente. Só não pode ser errado ou mal feito Cada função recebe o endereço do vetor de structs com os dados e o ponteiro para o arquivo aberto e gera seus dados, de forma independente Ao final terá seu relatório certinho. Sem stress.
  11. Não entendi o que quer fazer. Poderia explicar um pouco mais? Também não entendo. Está tentando criar vários arquivos? Para que? Seu programa só gera um número. Só um número inteiro. Ou zero ou o número de arquivos da extensão pedida pelo usuário. Entendeu o que eu expliquei no tópico anterior? Como está seu programa agora?
  12. Está errado: nada tem a ver com estar rodando o Code::Blocks. Pense bem: o propósito do IDE é gerar programas que se imagina você vai usar depois... Não pode haver um comando do Code::Blocks no seu programa. Se tiver você está criando um problema... Isso vem do jeito de os iniciantes usam os programas, e eu nunca tinha pensado de fato nisso até frequentar esses forums: em geral usa um IDE para escrever E RODAR os programas. E depois que o programa fica pronto não se usa mais. Nunca mais. De volta ao Code::Blocks e ao contexto Basta você identificar qual a janela da console e fechar, ou mininizar, ou esconder, usando por exemplo SetWindowPos() Está programando em C ou C++ usando exatamente a API do Windows. Não há nada que não possa fazer com o Windows, já que afinal é a API do Windows. Não é que funciona só com o code::Blocks, @devair1010 Apenas se você olhar na pasta de instalação desse programa vai ver: Então você precisa, ao distribuir o programa, enviar também esse executável, que foi fornecido com o Code::Blocks. Você não precisa de um IDE para escrever programas. É só uma conveniência e nem sempre é conveniente. Se você escrever um programa usando o Eclipse pode muito bem usar esse executável, dá na mesma. Ele não faz parte do Code::Blocks, que não permitiria afinal sequer criar um programa. Ele nem tem um compilador, como sabe. É só uma capa em torno de um ou mais compiladores e linkers, como todo IDE Você quer fechar a janela da console dentro de um programa em C que usa a Windows API então feche a janela usando a windows API. adicionado 25 minutos depois Para ficar claro: se você escreve um programa para console é bem possível que você queira configurar a tal janela. Tirar as barras de scroll, controlar o tamanho, as cores e a fonte, a página de código... É o simples. Mas se você quer abrir janelas e usar controles, tipo os common controls lá, botões, janelas, labels e tal, apenas no LINK não deve usar o /SUBSYSTEM:CONSOLE mas sim o WINDOWS. Ou assim configurar o projeto no IDE.
  13. Aqui onde compara teste se é igual e nesse caso compare os nomes. Só isso.
  14. ???? Que seria um comando exclusivo para code::Blocks? system? taskkill? Não creio que exista existe isso. Code::Blocks não tem comandos fora do menu, e mesmo lá é meio primitivo comparado aos IDE modernos... C:\WINDOWS\system32>taskkill /? TASKKILL [/S sistema [/U usuário [/P [senha]]]] { [/FI filtro] [/PID processid | /IM imagename] } [/T] [/F] Descrição: Esta ferramenta é usada para finalizar tarefas por identificação de processo (PID) ou nome de imagem. Lista de parâmetros: /S system Especifica o sistema remoto ao qual se conectar. /U [domínio\]usuário Especifica o contexto de usuário em que o comando deve ser executado. /P [senha] Especifica a senha para o contexto de usuário. Solicita entrada, caso omitido. /FI filtro aplica um filtro para selecionar um conjunto de tarefas. Permite que "*" seja usado. Por exemplo: nome_imagem eq acme* /PID processid especifica a PID do processo a ser finalizado. Use TaskList para obter a PID. /IM imagename Especifica o nome de imagem do processo a ser finalizado. O caractere curinga '*' pode ser usado para especificar todas as tarefas ou nomes de imagem. /T Finaliza o processo especificado e quaisquer processos filho iniciados por ele. /F Especifica a finalização forçada do(s) processo(s). /? Exibe esta mensagem da Ajuda. Como sempre escrevo isso, vou repetir aqui: nunca use system. Ou mesmo taskkill em seus programas. Não vai estar fazendo nada exceto chamar o sistema pra fazer algo. É lento, sem controle e perigoso porque alguém pode facilmente trocar esses programas por outros. Esses programas de linha de comando existem para serem usados em scripts e arquivos .BAT para ferramentas simples de administração de sistema onde não há experiência suficiente para escrever uma ferramenta em alguma linguagem e nem experiência para usar recursos como powershell ou WMI ou algo assim. @devair1010 @Lucca Rodrigues A barra de scroll aparece nos programas gerados para o susbsystem console por padrão, porque a janela tem como sabe 9001 linhas por default. Se você mudar ela desaparece. Se você gerar usando o subsystem para desktop ela não aparece a menos que você force a mesma situação... PostMessage() para mandar uma mensagem para uma janela do seu próprio programa é um caminho estranho. São as janelas do seu programa. Você não precisa mandar mensagens para elas. Basta usar os Handles que você já tem. E entenda o que eu disse sobre gerar programas para a console ou para o desktop. No Unix/Linux/Mac/Android não tem esse conceito, mas no Windows é diferente. A console é um mundo separado. Se você não quer a janela da console escreva para desktop e vai abrir uma janela comum e você pode controlar melhor. adicionado 16 minutos depois Acho que no ano passado eu postei um programa aqui que listava todos os processos rodando no Windows. Esse é o mecanismo comum no Windows para essas coisas: você chama uma função de enumeração --- é a nomenclatura --- e ela vai devolvendo a lista de processos rodando. Deve dar pra ver aqui na lista de conteúdo que eu postei. Não sei agora o que era. Depois disso você identifica o processo que você quer terminar e chama TerminateProcess() para encerrar. https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-terminateprocess?redirectedfrom=MSDN Não chame system() para chamar TaskKill() se está escrevendo um programa em C e usando a API do Windows. Seria como mandar uma carta alguém que está na sua frente dizendo pra ele mandar um recado para alguém que está do seu lado. Um último palpite: não testem esse tipo de programa dentro do ambiente de execução do IDE apenas. Esse ambiente é muito diferente do ambiente de execução normal e de um "build" de produção normal, um "release build". Gere um EXE e RODE ao menos uma vez antes de tirar conclusões.
  15. Se quer sumir com as barras de scroll e tal, basta usar SetConsoleScreenBufferSize() e mudar o tamanho da janela para ficar igual ao tamanho do buffer. A janela da console tem 9001 linhas, e por isso o scroll sempre acende...
  16. É um pouco chato isso. Mas são várias funções que você chama, e tem várias maneiras de fazer. Um programa não precisa ter uma janela, ou pode ter outras. Talvez o mais simples seja usar uma segunda janela e deixar minimizada a janela do seu programa, chamando SetWindowPos() para as janelas certas e EnumClhildWindows() para achar a certa. Eu acho. Estou escrevendo sem consultar. A documentação disso é muito boa. Eu acho. E começa em https://docs.microsoft.com/en-us/windows/win32/winmsg/windows Dá uma lida lá pra ver o que acha. Em geral não se usa mais isso porque é muito trabalho para pouco resultado. Então o interesse vai para os frameworks, como .Net e GTK+ e Qt e SDL e WxWidgets e tal. Porque tem os designers gráficos para arrastar e colar componentes e já gera o código. Muito meigo. E para objetivos mais ambiciosos OpenGL e Directx e mesmo asssim em geral através de outros frameworks, como os game engines e os SDK da nVidia e da AMD... Mas pode achar divertido. adicionado 2 minutos depois está "solto" porque eu só troquei 2 letras... E não era assim uma explicação, confesso. Me desculpe. Apenas listei as linhas que eu alterei para rodar no meu computador com um bitmap que eu sabia que era 800 por 600 porque foi meu programa que gerou. E o __stdcall, e a chamada a SetWindowPos(). Foi só o que eu mudei do programa que o autor postou.
  17. Você não tem um livro? Sua escola não assina uma biblioteca online que você possa acessar? Acho que é muito, muito importante ter um livro... De todo modo seu IDE --- sim, IDE é masculino --- não abre a documentação? Talvez devesse usar algum mais moderno se não abre. Em geral basta você parar o ponteiro do mouse sobre a função e acende algo. Veja um exemplo E já vem o protótipo da função. Só precisa ficar parada olhando uns 2s e já acende a definição. E se não for suficiente você claro pode ir no link "Search Online". Sim, tem em português também. Não dá pra avançar sem procurar por novas coisas... De todo modo tem aí o exemplo também: fgets() lê do arquivo, o último parâmetro, no caso stdin, o teclado, até o fim da linha ou até ler o total de caracteres que definiu no segundo parâmetro. Vai ler o '\0' final inclusive. Sem stress de limpar o buffer e comer caracteres ou algo assim como por vezes acontece quando você usa scanf() e não leu o manual nem uma vezinha. Os valores lidos vão para o Buffer, o primeiro parâmetro. E ela retorna também o ponteiro para os valores lidos. Assim essa única linha lê a tal listagem e coloca em 'linha' a partir de linha[0]... Mais uma linha e você lê a extensão... O "terceiro ponto" é o seu programa, na prática. Exemplo Imagine que o cara quer separar os arquivos .cpp. E vai digitar a.cpp, b.cpp, teste.py x.pas .cpp Tem 8 arquivos na "listagem". E o cara quer saber quantos são .cpp . Meio besta digitar o ponto na extensão, já que todos vão ter ponto. Mas que vou dizer? Se você usar a única linha do exemplo acima ela vai ler em linha essa "listagem". Imagine esse sofisticado programa em C : int main() { char linha[150]; fgets(linha, 100, stdin); return 0; } Se você testar ele com um debugger, aquele programa que testa programas e que deve ter no seu IDE vai ver que, se você digitar aquela linha no programa, no momento do return 0; vai ter Viu lá o valor da linha? vai ter 30 posições com o valor que foi digitado e um \n ao final. Esse é o resultado de gets() Aí você lê a extensão que o cara quer, e ele vai digitar .cpp e você vai ficar com isso em outra variável, e vai ter 5 bytes, certo? Agora veja a linha com uma régua pra facilitar: a.cpp, b.cpp, teste.py x.pas 0....5....0....5....0....5....0....5....0....5.... 0 1 2 3 Sem novidades. A gente já viu que tinha 30 posições. A terceira parte, o seu programa, é um loop. Pode ser qualquer coisa, for, while do/while, goto Tudo que você tem que fazer é ver, até o final da linha, marcada pelo '\n' na posição 29: onde estão os pontos se depois do ponto tem "cpp" e contar Nada mais. Lá estão os pontos em 1, 8, 19 e 24 se não li errado. Desses apenas o 1 e o 8 tem cpp depois e então a saída de seu programa será uma única linha com o número 2. Como saber se achou? pode usar um loop com um if dentro certo? Já tem com o que comparar: a string que tem a extensão. Se o cara digitou .cpp e você leu em char extensao[30]; está claro que só precisa comparar extensao com linha, as duas de umas 4 variáveis que seu programa vai ter. Qual o tamanho da extensao? strlen(extensao); mas nem precisa saber o tamanho. Basta comparar até o '\0' que finaliza toda e qualquer string em C. Confirme se entendeu
  18. Mas qual é o caso? Se quer mostrar um bitmap LoadImage() cuida dos detalhes. Se não precisa mudar nada não mude nada. Note que LoadImageW espera as strings wide, então convém mudar para LoadImageA() ou mudar as strings() Rodou no meu computador com umas poucas mudanças: Declarei WinMain() como int __stdcall para o compilador não ficar reclamando. Prefixei as strings com L em MessageBox(NULL, L"Error while loading image", L"Error", MB_OK | MB_ICONERROR); Só para ele não ficar reclamando //Mostra a imagem quando abrir a janela hsti = CreateWindowW(L"Static", L"", WS_CHILD | WS_VISIBLE | SS_BITMAP, 5, 5, 1024, 768, hwnd, (HMENU)1, NULL, NULL); LoadMyImage(); SendMessage(hsti, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap); SetWindowPos(hwnd, HWND_TOP, 50, 100, 800, 600, SWP_SHOWWINDOW); Coloquei LoadMyImage() depois de CreateWindow() --- não precisava --- e chamei SetWindowPos() em seguida para mudar o tamanho para o tamanho da janela para o tamanho do bitmap, que era 800x600 --- um fractal gerado por um programa de teste que eu escrevi outro dia --- e assim a imagem ficou inteira: adicionado 0 minutos depois Para compilar usei o compilador da microsoft mesmo
  19. Talvez tenha superestimado esse lance de "listagem" e tal. É só uma linha. Nada mais. Exagero chamar de listagem. Eis o que importa: o programa vai ler uns grupos de letras, separados por ponto e virgula. Um formato conhecido, um padrão: nome do arquivo, ponto, extensão, vírgula, nome do arquivo.... até o fim da linha. scanf() foi escrita para isso: ler entrada formatada. E seria a opção séria pra escrever isso e eu iria divergir de @devair1010 No entanto, como o programa é muito simples e tem só UMA linha de entrada, pode ser preciosismo se preocupar com algo mais.scanf() e extensões e arquivos e tal. Pode apenas fazer como ele sugeriu: Leia a linha toda usando gets() Leia a extensão na segunda linha Num único loop varre a linha que leu e ao encontrar cada ponto veja se o que vem depois é a extensão que procura, e nesse caso some 1 a um contador No final do loop vai sobrar o contador que é a sua resposta. O exercício é muito simples: não precisa sequer listar os arquivos do tipo nem nada mais. Não perca seu tempo. Mas se for perder tempo e fazer bonitinho use scanf() leia a entrada e liste os arquivos da extensão pedida e o total ao final. E depois tire na versão final, pois o enunciado pede só o número. Vai aprender alguns truques no caminho, por certo. Mas não é o enunciado.
  20. Você entendeu o que te expliquei? Levou a sério? Achou ofensivo o fato de eu dizer que seu programa não está bom E te dizer porque? Eu por outro lado sou um senhor de 60 anos ajudando gratuitamente pessoas de qualquer idade com sugestões simples ou talvez sofisticadas dependendo da formação de cada um e do tipo de dúvida. Escrevo aqui desde o ano passado e já postei ao que diz aqui em torno de 1600 tópicos em uma ampla gama de assuntos relacionados. E centenas de programas. Sou --- ou deveria ser --- um especialista nessas coisas. Escrevo de graça e não vejo nada demais em dizer que um programa está ruim. Não se trata de diminuir o aluno ou meu funcionário ou nada disso. Se entendeu o que eu te expliquei sua observação não foi bem colocada, eu acho. Poderia ter perguntado simplesmente algo como: "como eu faria para melhorar essas funções considerando suas observações, @arfneto E eu teria te dito. Em geral eu programo uma solução curta e apenas algumas vezes eu posto, porque os autores das questões desaparecem porque provavelmente encontraram solução por conta própria ou em outra fonte os autores das questões às vezes parecem buscar apenas uma resposta pronta e não tem sequer paciência para ler explicações ou responder perguntas o tópico virou discussão ideológica eu tenho mais o que fazer na ocasião Quando tento aprender algo --- e isso acontece toda hora --- costumo ter uma aproximação bem humilde em relação aos temas, e fico feliz se alguém tenta me ajudar e diz que o que fiz não está bom. Economiza o meu tempo. Por outro lado, se entendeu o que eu disse então não eu acho que não deveria ter dito o que disse. De volta a seu programa se ainda precisar de ajuda Para você ver como pode ser diferente, eis uma função que faz o seu serviço int fase(int etapa, int alvo); Você diz o número que espera ler e a etapa e pronto. Espero que entenda a diferença e entenda porque seu programa não está bom. Pode chamar assim a tal função: fase(1, 1); fase(2, 99); fase(3, 17); fase(4, 57); fase(5, 50); printf("\nPORTA LIBERADA!\n\n"); E ter o mesmo resultado de seu programa --- quando ele funcionar. Só que é muito mais compacto e fácil de entender do modo como te mostrei agora. Veja um possível código para isso: int fase(int etapa, int alvo) { int numero = 0; printf("[Etapa %d de 5] Digite o numero: ", etapa); scanf("%d", &numero); while (numero != alvo) { printf("\nVoce digitou um numero incorreto!\n"); printf("Tente novamente\n\n"); printf("[Etapa %d de 5] Digite o numero: ", etapa); scanf("%d", &numero); }; printf("voce passou pela etapa %d! Continue...\n\n", etapa); return alvo; // tanto faz }; Pois é, umas 10 linhas Como seria rodando num programa? Algo assim [Etapa 1 de 5] Digite o numero: 1 voce passou pela etapa 1! Continue... [Etapa 2 de 5] Digite o numero: 17 voce digitou um numero incorreto! Tente novamente [Etapa 2 de 5] Digite o numero: 99 voce passou pela etapa 2! Continue... [Etapa 3 de 5] Digite o numero: 17 voce passou pela etapa 3! Continue... [Etapa 4 de 5] Digite o numero: 57 voce passou pela etapa 4! Continue... [Etapa 5 de 5] Digite o numero: 51 voce digitou um numero incorreto! Tente novamente [Etapa 5 de 5] Digite o numero: 49 voce digitou um numero incorreto! Tente novamente [Etapa 5 de 5] Digite o numero: 50 voce passou pela etapa 5! Continue... PORTA LIBERADA! E como seria um programa que chama essa coisa? int main() { fase(1, 1); fase(2, 99); fase(3, 17); fase(4, 57); fase(5, 50); printf("\nPORTA LIBERADA!\n\n"); return; }; Mais legível, não é? Apenas as 5 fases, com números constantes, e os números alvo fornecidos na chamada. Espero que te ajude a entender. Eis o programa todo se quiser testar #include "stdio.h" int fase(int etapa, int alvo); int main() { fase(1, 1); fase(2, 99); fase(3, 17); fase(4, 57); fase(5, 50); printf("\nPORTA LIBERADA!\n\n"); return; }; int fase(int etapa, int alvo) { int numero = 0; printf("[Etapa %d de 5] Digite o numero: ", etapa); scanf("%d", &numero); while (numero != alvo) { printf("\nVoce digitou um numero incorreto!\n"); printf("Tente novamente\n\n"); printf("[Etapa %d de 5] Digite o numero: ", etapa); scanf("%d", &numero); }; printf("voce passou pela etapa %d! Continue...\n\n", etapa); return alvo; // tanto faz }; Tem umas 20 linhas de código apenas Espero que vença sua batalha. Quanto ao "mesmo assim fico grato pela sua ajuda" não gostei do tom. Talvez deva ver o aprendizado com mais humildade. Minha opinião apenas. Esse é um forum de C, C++ e C# não de procedimentos sociais afinal. O forum é moderado e tem um botão para se queixar se achar que é o caso.
  21. typedef struct { float x; // coordenada x float y; // coordenada y } Ponto; typedef struct { int N; // numero de vertices Ponto** v; // ponteiro para os ponteiros para vertices } PlanoA; typedef struct { int N; // numero de vertices Ponto v[];// ponteiro para um vetor de vertices } PlanoB; A bem da verdade também pode declarar como no planoB acima, mas é menos flexível. E incomum, Nunca vi na verdade. Isso só se usa em listas de parâmetros de funções e em geral em programas de escola apenas. Os profissionais preferem o uso mais flexível e a notação usando ponteiros ao invés de colchetes [ ] e índices. Mas é perfeitamente possível. E mais próximo do que você quer fazer. Isso é como um formulário, e você vai preencher. Com memória. Alocando espaço para as variáveis. Usando o PlanoB você não pode sequer declarar uma variável desse tipo. Apenas ponteiros. No caso do PlanoA pode.
  22. Seu programa não está bom. Notou que a diferença entre cada etapa é o número alvo e a ordem dela? Programou 5 funções e não esta única etapa? Para voltar a ler precisa de um loop e não escreveu um. E sabe como orque escreveu outros nas funções... Você tem um livro? Qual é? Sua escola não assina uma biblioteca virtual que você possa usar? Sabe o que é um vetor? Algo como int Numeros[15]; // sim, 15 numeros inteiros, de Numero[0] a Numero[14]
  23. Certamente. Não consigo imaginar o contrário: como alguém que tenha a resolução não teria o problema resolvido.? Você tem alguma dúvida sobre como resolver?
  24. Como assim? Essa é a declaração da estrutura. Nada mais. typedef struct { float x; // coordenada x float y; // coordenada y } Ponto; Ponto é assim, digamos. E typedef struct { int N; // numero de vertices Ponto** vertice; // vertice[0] a vertice[N] apontam para // um vertice... } Poligono; O polígono é assim. Tem N vértices, que vão corresponder a N ponteiros logo abaixo, vertice[0], vertice[1], ... vertice[N] Não é o que quer? Exatamente como o sistema faz com argv[]? Não é que isso vai te ajudar. Isso é a declaração. Quanto aos pontos, pode usar por exemplo Ponto teste; Ponto lista[10]; lista[5].x = 12.3f; Não sei de onde você vai obter os vértices
  25. acho que precisa da janela criada antes de chamar LoadImage()...

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!