Ir ao conteúdo

arfneto

Membro Pleno
  • Posts

    6.526
  • Cadastrado em

  • Última visita

Tudo que arfneto postou

  1. Estava achando familiar essa diuscussão. Semanas atrás eu postei um código aqui que trata disso. Playlists e listas ligadas, em Talvez você devesse ler. Tem as justificativas e um programa que funciona... Li os programas e lamento por ser sua apostila. São bem ruins. Exemplos de código para pilhas e listas e estruturas de dados estão disponíveis por todo lado na internet, e esses de sua apostila são muito ruins. Até cursos completos de estruturas de dados estão disponíveis de graça online, e você acabar com um material de referência com um código desses é triste. Eis o que posso dizer: Estruturas de dados como essas tais listas são genéricas e se manipulam através de ponteiros, em C. Em outras linguagens isso vem de graça. No tópico acima eu mostro exemplos em java e C++ e mostro um código que trata exatamente uma playlist... Da sua apostila, por exemplo... void push(int value); // + void pop(); // - void display();// peek() Isso para tratar uma pilha. Não se escreve assim. Procure um livro ou outra referência. O que está errado? pilha é uma estrutra genérica, uma abstração. Imagine uma pilha de suas músicas. Então push() coloca algo na pilha. No mundo inteiro se declara int push(Pilha*, Dado*); Você pode ter várias pilhas no programa ao mesmo tempo então quando você vai empilhar algo você diz o que vai empilhar e onde. O simples. Você não escreve push(30) como seu professor escreveu. Você escreve Pilha* musicas; Pilha* pratos; Musica uma_musica; Prato um_prato; ... if ( push(musicas, &uma_musica) == ok )... if ( push(pratos, &um_prato) == ok )... ... O mesmo vale claro para pop(), display() e tal... Acho que entendeu... Simplesmente não é assim como está em sua "apostila". Não me surpreende que tenha dificuldade continue escrevendo adicionado 3 minutos depois Hum... Não tem nenhum erro lá... Pode me dizer o que fez? O troço tem umas 50 linhas e metade é comentário.....
  2. Vou ler esse código... E sobre a primeira pergunta? Qual seria a dificuldade?
  3. Duas coisas: Como não conseguiu aplicar o código que faz exatamente o que está escrito lá? Qual foi a dificuldade? Pode postar esse código da tal lista de aula prática e podemos te ajudar a escrever um programa assim. Entendeu afinal o que eu disse inicialmente sobre misturar os dados? Do jeito que fez não vai dar. Depois te mostro um exemplo É importante. Ao menos eu acho que é... Enquanto não entender isso vai trabalhar muito mais...
  4. Esqueci de postar o programa de teste #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> void ler_notas(float nota[]) { int i; for (i = 0; i < 50; i++) { scanf("%e", &nota[i]); } }; // le_notas() int main() { // use nomes que facam sentido!!!!!!!!!!!!! // fp1 fp2 fp3 ??? FILE* aprovados = fopen("aprovados.txt", "w"); FILE* nafinal = fopen("nafinal.txt", "w"); FILE* reprovados = fopen("reprovados.txt", "w"); // os arquivos estão abertos. outro dia testamos os ponteiros float as_notas[50]; // claro, precisamos gravar as notas em algum lugar // temos as notas em 'as_notas' // temos a funcao 'le_notas()' que le as notas // sem surpresas: ler_notas(as_notas); // claro // agora o que falta? // gravar a nota no arquivo certo e sair para o lanche // ok: sem sair de casa // vamos ter que ler todas as notas ou nao vamos // saber quais sao. Elas estão em 'as_notas' int w = 0; //para o retorno de printf() pra ver se gravou for (int i = 0; i < 50; i += 1) { // aqui tem as notas uma por uma // falta testar quais sao // que tal um if()? if (as_notas[i] >= 7.) { // no mundo real testariamos esse w pra ver se gravou certo w = fprintf(aprovados, "%3.1f\n", as_notas[i]); printf(">= 7 Aprovado com %3.1f\n", as_notas[i]); // depois apagamos } else { if (as_notas[i] >= 4.) { w = fprintf(nafinal, "%3.1f\n", as_notas[i]); printf(">= 4 Na final com %3.1f\n", as_notas[i]); } else { w = fprintf(reprovados, "%3.1f\n", as_notas[i]); printf("<4 Sem chance %3.1f\n", as_notas[i]); } }; // if() }; // fecha os arquivos fclose(aprovados); fclose(nafinal); fclose(reprovados); }; // main() adicionado 3 minutos depois Ou a versão resumida sem tantos comentários agora que já deve ter entendido... #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> void ler_notas(float nota[]) { for (int i = 0; i < 50; i++) scanf("%e", &nota[i]); }; // le_notas() int main() { FILE* aprovados = fopen("aprovados.txt", "w"); FILE* nafinal = fopen("nafinal.txt", "w"); FILE* reprovados = fopen("reprovados.txt", "w"); float as_notas[50]; // claro, precisamos gravar as notas em algum lugar ler_notas(as_notas); // claro int w = 0; //para o retorno de printf() pra ver se gravou for (int i = 0; i < 50; i += 1) { if (as_notas[i] >= 7.) w = fprintf(aprovados, "%3.1f\n", as_notas[i]); else { if (as_notas[i] >= 4.) w = fprintf(nafinal, "%3.1f\n", as_notas[i]); else w = fprintf(reprovados, "%3.1f\n", as_notas[i]); }; // if() }; fclose(aprovados), fclose(nafinal), fclose(reprovados); }; // main() HIH
  5. Bem, são comandos de C. Eu escrevi em exemplo em C que roda como C++ porque é muito simples. Mas é C. Vou te mostrar uma possibilidade em C++ depois. Entendeu que o programa que te mostrei é o seu problema menos 3 linhas? As que gravam? Entenda que o enunciado é um contrato: você não pode fazer menos do que está lá. E se fizer mais pode ter problemas. adicionado 44 minutos depois Quando você está testando convém se defender, então ao mesmo tempo em que grava e vai sumir lá até você ver os arquivos pode usar algo assim naquele trecho if (as_notas[i] >= 7.) { // no mundo real testariamos esse w pra ver se gravou certo w = fprintf(aprovados, "%3.1f\n", as_notas[i]); printf(">= 7 Aprovado com %3.1f\n", as_notas[i]); // depois apagamos } else { if (as_notas[i] >= 4.) { w = fprintf(nafinal, "%3.1f\n", as_notas[i]); printf(">= 4 Na final com %3.1f\n", as_notas[i]); } else { w = fprintf(reprovados, "%3.1f\n", as_notas[i]); printf("<4 Sem chance %3.1f\n", as_notas[i]); } }; // if() usando um printf() para ver na tela assim que digitar o dado... E testar com 2 ou 3 porque não faz diferença. Depois você muda para 50. Não caia na tentação de escrever coisas na tela e perguntar coisas e tal. Você tem pressa e não está no enunciado. Entendo a ideia de @Lucca Rodrigues de fazer algo mais interativo, mas vou te mostrar uma razão para não fazer isso agora. E esqueça aquele "a" no modo de abrir os arquivos para gravação naquele exemplo. Isso se chama append mode e vai engordando o arquivo de saída a cada vez que você testa. Estudantes testam o programa 1.432 vezes em média então de nada vai ajudar você ver o resultado de todos os seus testes anteriores nos 3 arquivos... Veja um teste para 5 notas como pode ser simples Se estiver no mesmo diretorio onde está o programa pode escrever só nottas e teclar enter, claro... Ao ver as cinco notas já testa suas condições porque você mesmo já as escreveu lá na tela. E para 4 3 2 8 e 0 está ok então está funcionando. Com 5 ou 50 ou 5500 notas. Agora você confere os arquivos gravados Parece ok certo? Aí você apaga os printf() do programa, troca o 5 por 50 e já era. Mas... Quer testar com 50? Basta NÃO ter feito nada tido escrever na tela e perguntar condições tipo "Deseja continuar?". O programa só lê da entrada padrão e grava nos 3 arquivos então você edita um arquivo, cria 5 linhas com notas dos 3 casos, e faz o simples: control-A seleciona as 5 linhas, control-C copia as cinco linhas, control-V copia as 5 linhas de novo e já são 10. Control-A seleciona as 10, control_V 4 vezes e serão as 50 e já era... Um trecho do arquivo notas.txt com 10 vezes aquelas 5 notas do teste acima Claro, esse milenar comando type mostra na tela o conteúdo do arquivo E então você passa esse arquivo para seu programa... Usando esse tal comando '|' que passa a saída de um programa para a entrada do outro E rodou seu programa com 50 notas. Apague os printf() que mostram na tela os resultados, rode de novo pra ter certeza. É assim
  6. Entendo. Muito bom. Porque está usando printf() scanf() stdio.h e tal em programas em C++? Talvez seja mais simples em C++. Esses todos são comando de C
  7. Mas eu te mostrei um exemplo com todos os itens. O que você não entendeu? Não perguntou nada e foi "ver vídeos" sobre isso? Uma solução está aí em cima... Poste seu código. Testou o exemplo que te mostrei? Tem quase tudo que precisa...
  8. Está no caminho certo mas tem erros muito muito básicos para o último programa do semestre. Entenda que a função lenotas() não pode ficar no meio da outra função, main(). Na verdade é uma função como essa scanf() que você usou aí e poderia nem ter o código nesses arquivo, só o nome. E não pode claro ter espaços no nome da função. O include para a biblioteca padrão, que praticamente TODOS seus programas vão ter, é stdio.h e não studio.h não use esses nomes fp1 fp2 fp3. Sério? Use um nome que faça sentido para que você não precise marcar num papel quem é quem. a chamada de scanf() está errada. %d é para ler inteiros. o problema é claro: vai ler 50 notas. não deve passar a quantidade para a função. deve declarar o vetor em algum lugar. Em main() seria o certo. Veja um exemplo de como pode ser mais simples. Tem umas 15 linhas apenas, exceto pelos comentários que espero que você leia... #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> void ler_notas(float nota[]) { int i; for (i = 0; i < 50; i++) { scanf("%e", &nota[i]); } }; // le_notas() int main() { // use nomes que facam sentido!!!!!!!!!!!!! // fp1 fp2 fp3 ??? FILE* aprovados = fopen("aprovados.txt", "w"); FILE* nafinal = fopen("nafinal.txt", "w"); FILE* reprovados = fopen("reprovados.txt", "w"); // os arquivos estão abertos. outro dia testamos os ponteiros int as_notas[50]; // claro, precisamos gravar as notas em algum lugar // temos as notas em 'as_notas' // temos a funcao 'le_notas()' que le as notas // sem surpresas: ler_notas(as_notas); // claro // agora o que falta? // gravar a nota no arquivo certo e sair para o lanche // ok: sem sair de casa // vamos ter que ler todas as notas ou nao vamos // saber quais sao. Elas estão em 'as_notas' for (int i = 0; i < 50; i += 1) { // aqui tem as notas uma por uma // falta testar quais sao // que tal um if()? if (as_notas[i] >= 7) { // grava em aprovados, nao em fp1 fp34535 ou fp34 // use nomes que fazem sentido } else { if (as_notas[i] >= 4) { // grava em na_final } else { // esse ja era // reprovado // grava em reprovado } }; // if() }; // fecha os arquivos fclose(aprovados); fclose(nafinal); fclose(reprovados); }; // main() Para o final do semestre é estranho você escrever algo assim. Escreva de novo para sabermos como está indo. Seja como fizer, o programa tem um loop de leitura abre 3 arquivos um loop de teste das notas com um if dentro para gravar no arquivo certo fecha os 3 arquivos Só isso
  9. Você entendeu mesmo! Quando você precisar disso vai gostar de saber que funciona. Quando você não precisa vai odiar saber que esqueceu de apagar O suporte ao git é muito bom. E se não for esses são os caras que vão mudar, já que eles tem o compilador, o IDE e o GitHub Aqui no canto estão as informações: o branch --- master no caso ---, um botãozinho para mudar por exemplo para aquela versão de teste, quantas alterações estão salvas no repositório local e na nuvem. E se clicar no botão faz o sincronismo. Só não pede o lanche grátis ainda
  10. Recomendo muito um livro. Muito mesmo. De todo modo pode escrever aqui quando tem dúvidas objetivas. Sua escola UniGran não tem uma biblioteca? Ou melhor hoje em dia: uma biblioteca virtual com livros de referência? Escolas assinam serviços de referência para os alunos no mundo todo, tipo esse serviço que é provavelmente o melhor do planeta: Safari Books Online Pensando nisso, uma pesquisa assim agora mesmo Trouxe na primeira tela: Nada mal hein? Talvez nem precise da sua escola pagar um serviço E não é que a melhor editora técnica do mundo tem um "Free Trial" para o serviço? : A mesma O'Reilly. Veja em https://www.oreilly.com/ Deve ter até títulos em português, como a referência clássica e consagrada de C, o livro "branco" de K&R...
  11. Linguagem de Programação I também era sobre C? Tem um livro-texto? Qual é? Tem uma apostila? O tal procedimento é chamado função. Diz aí que recebe 2 parâmetros, um endereço de um vetor e um endereço de uma variável, ambos inteiros. Como vai retornar o maior valor do vetor no segundo argumento, isso quer dizer que ela não precisa retornar nada via o normal, return. então pode declarar como void, o nome reservado para esses casos. Se ela retornasse um int você deve imaginar como seria... void maior( int* argumento1, int* argumento2 ); // tem 2 arg do tipo ponteiro para int int outra_funcao( int* argumento1, int* argumento2 ); // tem 2 arg do tipo ponteiro para int Uma função main() é uma função também, e tem dois argumentos e retorna um int int main( int argc, char** argv )... Uma função main() que chame maior() ? int maint( int argc, char** agv ) { // preciso de um vetor de int... int vetor_de_int[100]; // esse tem 100. // preciso de um int para receber o resultado que vai ser o maior int no vetor int o_maior_do_vetor; // em algum momento vou chamar a funcao para fazer o servico maior( vetor_de_int, &o_maior_do_vetor ); // o prefixo & indica pra pasar o endereço // porque? porque a funcao maior() espera um ponteiro // em algum momento vai terminar, retornando um inteiro return 0; }; // main() Entendeu em termos gerais? O que faltou nas aulas para você entender essa parte?
  12. Para usar C nesse ambiente você vai se sentir um pouco desfavorecido por uns minutos... Vamos imaginar que quer criar um primeiro projeto em C, um projeto para console chamado p1 Então um exemplo você pode usar o assistente para criar um novo projeto e escolher lá um projeto de console C++ e teclar next chamar o projeto de p1 e confirmar O sistema vai criar a pasta no seu diretório raiz para os projetos, em geral \Users\<sua conta>\source\repos e toda a estrutura, e um programa p1.cpp que roda e tal. Aí você vai por exemplo em Source Files e clica com o botão direito e pede para criar um novo arquivo, C++ mesmo, mas escreve lá no nome p1.c e seu fonte C estará no projeto Os arquivos C e C++ convidem em harmonia até você tentar montar o projeto (Build F7). Há projetos que tem rotinas em C e C++ afinal. Mas não tente você essa aventura ainda rodando um build, claro. Apenas selecione o p1.cpp e apague apertando delete. Nada mais. Claro que para criar headers dá na mesma: um .p1.h é um p1.h. C ou C++. É só selecionar add | new file | header. É só isso. Se for copiar programas que você já tem basta abrir a pasta com o explorer por exemplo e copiar o material. E depois use o simples: Lá em source tem uma opção: Add existing file... Vai abrir uma janela e você pode clicar em todo mundo e adicionar de uma vez Note que você pode adicionar arquivos de dados, imagens, qualquer coisa ao projeto. Mas convém manter tudo na mesma pasta. Agora que você pode usar de graça um ambiente desses é difícil recusar: a documentação é no mínimo farta. O debugger é o máximo. A integração com o git é perfeita, ainda mais depois que a Microsoft simplesmente comprou... o GitHub. Um click e sincroniza com o repositório local. Um click e sincroniza com o GitHub na nuvem. O ambiente é atualizado a toda hora, então é jogo ganho. E se for acabar em uma empresa ou universidade que não usa isso será mesmo muito azar... É o padrão. Quer rodar o programa? Control-F5. Quer rodar com o debugger? F5. Compilar o o fonte que está aberto?Control-F7. Compilar tudo? F7. Sim, tem os ícones. E por aí vai. Quer ver onde está a p$%%a da função xyz() no projeto de 3 mil linhas? F12. Está em dúvida sobre os parâmetros? Deixe o cursor perto dos parenteses e aparecem na tela. Veja o exemplo abaixo. Tanto faz se é a função que você escreveu ou um simples printf(). Quer ver a documentação? Viu o botão Search Online? Vai acabar na documentação da função se for de biblioteca. Quer ver a declaração da função? Control-Alt F12. Quer mudar o nome da função no projeto inteiro? Rename. Não se lembra dos atalhos? Veja na tela Nada mal...Na boa, o ambiente é intimidador eu acho. Muito grande. Mas pode usar só 3 ou 4 teclas. Ou os ícones. E o editor mostra a documentação e os parâmetros de função e tudo sózinho...
  13. Na verdade não é que eu não me dei conta, @vangodp é algo determinado. Como sempre escrevo aqui --- e acho que hoje já escrevi --- não recomendo usar acentos ou locale ou chamar system() ou usar comentários com acentos em programas de console. Exceto naqueles casos em que eu sempre listo: alguém, está te pagando para fazer isso alguém vai te dar uma boa nota por fazer isso, porque talvez seja o objetivo do programa você tem uma necessidade pessoal ou uma vontade de arrumar problemas e não consegue evitar Então é claro que não vou usar isso em um programa de exemplo... Que por sinal NÃO funciona direito como eu expliquei... Para os outros casos eu sugiro seguir a recomendação da Microsoft e de todo mundo: use Unicode. E o novo Terminal do Windows. E as rotinas adequadas. E se prepare para ler um pouco... E para uma certa frustração porque nem assim é seguro. Isso só vai dar certo em situações em que tem um parâmetro tipo "Content-Type: text/html; charset=UTF-8"; nos arquivos que você recebe. No teclado não tem XML, JSON, e-mail, HTML, aí sim. adicionado 18 minutos depois corrigindo: nos arquivos que você recebe ou cria com texto em seus programas
  14. arfneto

    C Criando imagens em C

    Olá gerar uma imagem é como gerar qualquer outro arquivo. Deve saber o que pretende fazer com essas imagens. Se for interesante comprimir a imagem mas puder aceitar alguma perda na representação pode usar jpg ou png. Se quer uma imagem fiel pixel a pixel em relação ao que o programa gerou, porque talvez vá continuar calculando algo sobre ela, use bitmaps BMP, mesmo que não seja para Windows. Se precisa poder ampliar sem perder detalhes use algo vetorial como PDF. Para cada caso tem uma especificação para ler. Mas não é especialmente complicado. Postei meses atrás um programa em C que gerava um bitmap e tinha algumas funções para ler, salvar e preencher. Deve poder localizar aqui na pesquisa do forum por exemplo. Não me lembro agora. adicionado 7 minutos depois Foi em janeiro. Era um programa em C++ mas o que importa são os headers onde tem os formatos todos. E tem só duas funções. seria trivial reescrever.
  15. Olá Ainda está um pouco longe de funcionar. Podia fazer um programa primeiro só para ler os dados do arquivo, para se assegurar de que está no caminho certo... Podia usar nomes mais significativos que dado e dado_t por exemplo. Se dado_t é um ponteiro para dado onde vai afinal gravar esses dados de que sdegundo o enunciado do tópico você nem precisa? Não declarou nada... Para que a struct se só quer contar os registros? E se na primeira linha estão os nomes dos campos porque não ler afinal? E se o valor é temperatura (é?) porque não chamar de temperatura, ou value já que é o nome original? Ninguém leva a sério uma variável chamada temp ou aux afinal fscanf() retorna um número que você deveria tratar. É melhor assim. Um campo a menos e sua leitura pode ficar toda destruída... Recomendo muito SEMPRE fazer isso. E se dado_t é um ponteiro e você passa o endereço dele para fscanf() tudo que vai conseguir é corromper o próprio valor do ponteiro. Que por sinal não aponta para nada já que você não alocou memória para nenhuma dessas struct.... Podia ter postado ao menos as primeiras linhas do csv direto para poupar trabalho. Afinal apenas as duas primeiras já serviriam. Esse é o sentido de um arquivo csv. A gente precisa da primeira linha para saber o número dos campos e o nome. E depois vem os campos, um registro por linha, um campo entre cada delimitador. Veja a diferença: Compare com clicar em um anexo, baixar um programa, abrir um anexo em outro programa e depois voltar ao seu programa para tentar ajudar você. . . De volta ao programa: O CSV começa então pelo header, a linha que tem o nome dos campos. O formato dela não é novidade desde os anos 80 os nomes separados pelo delimitador que em geral é a vírgula. fscanf() então deve ler esses 3 campos sem problemas porque afinal foi esrita para isso nos '70: ler entrada formatada. Qual o o formato? um nome, uma vírgula, um nome, uma vírgula e o último nome. Qual a máscara para ler qualquer coisa que não seja uma vírgula? abcd] por exemplo quer dizer que aceita essas letras, quantas vier. [^abcd] que dizer que aceita qualquer coisa exceto a b c e d. Então [^,] lê o que tiver até a próxima vírgula. Como são 3 campos é só repetir. E desprezar as vírgulas. Sua máscara para os dados está certinha. Um exemplo O programa abaixo lê o arquivo e mostra os valores na tela assim fscanf(3) leu 'Series' + 'Value' + 'Time' 1: 0 37.9 2018-11-18T08:41:03-02:00 2: 1 37.9 2018-11-18T08:41:13-02:00 3: 2 37.9 2018-11-18T08:41:23-02:00 4: 3 37.9 2018-11-18T08:41:33-02:00 ... 97: 96 35.8 2018-11-18T09:00:30-02:00 98: 97 35.8 2018-11-18T09:00:40-02:00 99: 98 35.8 2018-11-18T09:00:50-02:00 99 leituras no arquivo O programa #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <locale.h> struct dado { int c_series; float c_value; char c_time[64]; }; typedef struct dado Dado; int main(int argc, char** argv) { const char* mascara_campos = "%[^,]%*1c%[^,]%*1c%s"; const char* mascara_dados = "%d,%f,%s"; Dado linha; FILE* csv = fopen("camera_temp.csv", "r"); int n = 0; int quantos = 0; char nome[3][30]; n = fscanf( csv, mascara_campos, &nome[0][0], &nome[1][0], &nome[2][0]); printf("fscanf(%d) leu '%s' + '%s' + '%s'\n", n, nome[0], nome[1], nome[2]); do { // le os caras ate o fim n = fscanf(csv, mascara_dados, &linha.c_series, &linha.c_value, linha.c_time ); if (n == 3) { quantos = quantos + 1; printf("%3d: %8d %8.1f %s\n", quantos, linha.c_series, linha.c_value, linha.c_time ); } } while (n == 3); printf("\n%d leituras no arquivo\n", quantos); fclose(csv); return 0; }; Está certo? Não. Apesar de mostrar o que está lá. Num arquivo csv não precisa ter os 3 valores. Tem que aceitar campos com por exemplo Series,Value,Time 1,2.9, teste ,2.9, ,,valido 1,, Todos esses campos são válidos. Quando o campo está em branco basta ter o delimitador depois para ser considerado válido. Esse troço é importante. Todos os bancos de dados leem CSV, os programas de planilhas e até aquele seu programinha de imprimir etiquetas que vinha em diskette nos anos 90 E esse programa não vai funcionar nesses casos. É só um exemplo. Um arquivo CSV é uma matriz de valores [x,y] onde x é o número de linhas e y o número de campos descritos na primeira linha. E scanf() falha quando algum campo está vazio. Referência considerada oficial sobre o formato CSV Mas é um começo
  16. Então talvez como iniciante pudesse ter dito que não entendeu e perguntado algo. Aí você me ajudaria a entender a sua dificuldade e te ajudar. Vou te mostrar um exemplo. Espero que pergunte algo se não entender É um roteiro de como pensar antes de começar a escrever o código. E depois escrever o mais importante nesse caso, que é a abstração, a estrutura de dados que vai afinal conter suas músicas. Uma música tem, segundo o enunciado um nome, um autor e a duracao. Não vejo razão para usar um float para identificar a duração da musica. Pense bem: quer que alguém digite que a musica tem 3,652 minutos? Não crie problemas para você mesmo. Faça o cara digitar minutos e segundos e grave os dois valores. Uma playlist é uma lista de músicas. Seria legal saber quantas músicas tem na lista e dar um nominho para ela. Assim pode ter lá no emulador o nome da playlist em execução. Seria razoável. Ou não? A playlist vai ser implementada usando essa tal lista encadeada. Em C. A lista encadeada é uma série de dados do mesmo tipo, onde cada um aponta para o próximo e talvez para o anterior. Quando usar os 2 ponteiros? A escolha é óbvia: se não sabe a música anterior não pode, digamos, voltar para a música anterior... Uma playlist de mão única é algo esquisito, mas a escolha é do autor. Certo? Então: Proposta para a música: struct musica { char faixa[50]; char artista[50]; int minutos; int segundos; }; typedef struct musica Musica; Só o que tem no enunciado. Mas assim pode escrever Musica umaMusica; Um exemplo de musica // cria uma musica so para ver com escreve const char* ex_musica = "Pet Sematery"; const char* ex_artista = "Ramones"; Musica umaMusica; strcpy(umaMusica.faixa, ex_musica); strcpy(umaMusica.artista, ex_musica); umaMusica.minutos = 3; umaMusica.segundos = 32; A lista podia ser assim: struct itemDaLista { Musica* musica; struct itemDaLista* proxima; struct itemDaLista* anterior; }; typedef struct itemDaLista Lista; Sem inventar: cada elemento da lista é... uma música. Só isso. E você pode voltar e avançar as músicas, tipo uma playlist E se for criar listas de outra coisa é só mudar o ponteiro. E a playlist como podia ser? struct umaPlaylist { int total; char nome[30]; Lista* musicas; }; typedef struct umaPlaylist Playlist; Sem surpresas: a playlist tem um nome e um certo número de músicas para você poder mostrar na tela. Exemplo acessando musicas, listas e playlist. #include <stdlib.h> #include <stdio.h> #include <string.h> struct musica { char faixa[50]; char artista[50]; int minutos; int segundos; }; typedef struct musica Musica; struct itemDaLista { Musica* musica; struct itemDaLista* proxima; struct itemDaLista* anterior; }; typedef struct itemDaLista Lista; struct umaPlaylist { int total; char nome[30]; Lista* musicas; }; typedef struct umaPlaylist Playlist; int main(int argc, char** argv) { // cria uma musica so para ver com escreve const char* ex_musica = "Pet Sematery"; const char* ex_artista = "Ramones"; Musica umaMusica; strcpy(umaMusica.faixa, ex_musica); strcpy(umaMusica.artista, ex_musica); umaMusica.minutos = 3; umaMusica.segundos = 32; // como seria uma lista de musicas Lista* lista; // so vamos usar listas DENTRO da playlist // porque e mais esperto // umas playlists zeradas Playlist* Jazz; Playlist* Colecao[10]; // 10 playlists porque nao? // grava uma playlist BrainDrain // primeiro aloca a memoria para ela Playlist* BrainDrain = (Playlist*)malloc(sizeof(Playlist)); strcpy(BrainDrain->nome, "Brain Drain '89"); // nome BrainDrain->total = 0; BrainDrain->musicas = NULL; // vazia por enquanto // so um exemplo mas so pra acostumar // no final apaga tudo para nao dar m. free(BrainDrain); return 0; }; // main() Não faz sentido? adicionado 11 minutos depois que são essas coisas dentro das chaves? inicio, *meio e tal? Você tem um livro-texto? Uma apostila? Que curso você faz? declare entre as chaves o que está dentro da estrutura. Depois das chaves as variáveis que são desse tipo de estrutura. E depois do struct o nome da própria. Leia o programa que te mostrei. Com atenção.
  17. Talvez deva prestar mais atenção ao digitar. Tem erros muito bestas que vão fazer você perder tempo a toa. Veja por exemplo struct ListaArtista { char musica[50], Cantor[50]; float duracao; ListaArtista* prox; }; ListaArtista* inicio, * meio, * fim* aux; está declarando ListaArtista antes e depois das chaves. Como assim? E está declarando nada menos que 3 ponteiros para a tal lista? inicio, meio e fim? E aux? Não devia ter uma vírgula antes? E com esses nomes?
  18. Talvez agora você já saiba, mas veja o tamanho do problema Essas são coisas que estão declaradas de um jeito nos protótipos e de outro no programa... adicionado 8 minutos depois Antes de imprimirPedido() parece ter umas 20 linhas de código perdidas lá. Verifique. Que pretende com o trecho abaixo void getch() { system("read b"); } Não use acentos em comentários ou qualquer parte do seu código a menos que alguém te obrigue.Ou pague. Não resolve nenhum problema e cria uns.
  19. Entendeu o que eu disse sobre não misturar os dados com a estrutura que representa os dados?
  20. Olá! Não é bem um emulador de player, certo? Apenas um gerenciador de playList parece. Sempre escrevo isso, então: Do jeito que fez não vai dar. Depois te mostro um exemplo. Vou tentar compilar seu programa...
  21. Acho que está tentando "importar" um programa que você não fez e não conhece... ou editou fortemente o programa sem muito controle... Sobre o primeiro erro: Você ou alguém apagou algo do final das declarações na linha 96 e a linha cabou por vírgula. Assim a linha 99 emendou com essa e produto ficou sendo int troque ',' por ';' na linha 96 Seria mais simples e seguro se você tivesse declarado Prod* produto = (Prod*) calloc(10, sizeof(Prod)); já na linha 93. Em geral se faz assim. E teria defendido você desse tipo de erro. Algo sobre os outros erros por enquanto Você tem um livro-texto? Qual é? Uma apostila ao menos? Veja com cuidado o que é e como usar um protótipo para uma função. Estão faltando alguns em seu programa e muitos erros são por isso. Não use /* */ para comentários de uma linha. É chato e perigoso. Um */ faltando no lugar errado e pode comer linhs do seu programa e nem dar erro... Funções como menu() em geral retornam a opção. E não se declara como void() para depois ter que declarar uma variável global com a opção pense nisso.... Sobre a estrutura do programa Quando um programa cresce para mais que um punhado de funções você começa a ver que tem que ter uma ordem nisso. Algo como --- na falta de um critério e sem gastar muito tempo explicando --- declarar as estruturas de dados e protótipos em um arquivo separado. Sim, para isso são os cabeçalhos, os tais arquivos .h Declarar as funcões em ordem alfabética por exemplo facilitaria muito a sua vida para achar esses erros e essas funções. Claro, se usa um IDE moderno pode apenas usar tipo F12 e shift F12 e ir alternando entre uma declaração de função e a implementacão dela. Sem stress. Colocar o código das funções que já estão funcionando em outro arquivo. para não ficar compilando TUDO toda hora. Deixar main() em um arquivo separado. Entendo sua escola não incentivar isso num primeiro momento --- o uso de um IDE ---. Escrevo um e não uma já que é uma abreviatura de ambiente, que é masculino em português. Aconteceu a mesma coisa com BIOS no BRasil: virou feminino por alguma razão histórica Pelo uso exclusivo de IDE muitos alunos depois de programar por anos não conseguem entender o que é uma biblioteca por exemplo. Um objeto, um linker. Como copiar programas para usar depois. Como enviar programas para outros. Uma pena. Se você não tiver um critério, quando seu programa cresce você gasta MUITO mais tempo para achar as coisas. Tudo bem não ter um roteiro profissional quando se está aprendendo ou começando, mas num programa de 1000 linhas já viu o tamanho do problema. Os caras que criaram isso eram muito melhores que nós... Sabe o que é um Makefile? É uma salvação.
  22. Todas as estruturas e chamadas da console estão bem descritas em https://docs.microsoft.com/en-us/windows/console/console-reference eu acho. Mas eu acho que você não deve usar essas estruturas diretamente para armazenar status do jogo. Crie uma estrutura pequena que representa o que você precisa. É mais versátil. E a partir do seu mapa você cria as funções de comando. E aí vai incluindo a interface de entrada com as teclas que vai aceitar, e a de saída com as mudanças na tela no decorrer do jogo. E a de controle que salva o estado do jogo, para, reinicia e tal. E assim fica mais fácil de portar o jogo de uma solução para outra, como por exemplo se desistir do modo caracter e for usar uma interface gráfica. De todo modo, para ler o buffer de entrada você usa antes de tudo PeekConsoleInput() e na saida acho que GetConsoleScreenBufferInfoEx() e outras. Estou escrevendo de memória. Postei muitos códigos sobre isso aqui nos últimos meses, em C ou C++. Se precisa de algo específico posso procurar nos programas depois, ou você pode ver aqui na pesquisa por conteúdo por autor no forum.
  23. Crie um novo tópico ao invés de emendar sua dúvida nesse tópico de um ano atrás. Assim tem mais chance de a gente ajudar e de ajudar mais alguém no futuro, ao ver essa nova discussão...
  24. Muito bom. De todo modo recomendo muito um livro-texto. Seu curso não tem? Seu professor pode sugerir um. Em geral as universidades tem um padrão.
  25. Oh rodava que dizer que apenas compilava. Agora entendo. Só com as Surfaces eu não via como mostrar algo e aí fiquei curioso! Seria preciso carregar algo, mesmo que seja um bitmap como no exemplo acima. Ou criar o normal, window, renderer e textures. Obrigado por responder Pode usar exatamente o mesmo comando no Windows!

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!