Jump to content

Fernando Mercês

Administrators
  • Posts

    1,523
  • Joined

  • Last visited

  • Days Won

    173

Posts posted by Fernando Mercês

  1. Pra facilitar seus testes, você pode escrever um arquivo texto com todas as entradas para o programa e depois só redirecionar a entrada ao executar seu programa. Por exemplo, o arquivo anexo pode ser usado da seguinte maneira no Prompt de Comando (no Windows) ou no shell do Linux:

    image.thumb.png.ef9a442dfd723f62a76263c92aaebd8a.png

    No examplo do arquivo anexo, ele vai criar:

    • Produto de código 1.
    • Produto de código 2.
    • Cliente de código 1.
    • Cliente de código 2.
    • Cliente de código 3.
    • Cliente de código 4.
    • Venda para o cliente de código 2 do produto de código 1 de 5 unidades a 2.50 cada.
    • Venda para o cliente de código 1 do produto de código 4 de 3 unidades a 5.00 cada.
    • Venda para o cliente de código 1 do produto de código 2 de 1 unidade a 3.00.

    Ou seja, é o mesmo que você digitar tudo isso, só que não precisar digitar toda hora. ?

    Valeu.

    entrada.txt

  2. Opa, tudo bem?

    Para nos ajudar, pode editar seu tópico e formatar a parte do código como código? É o botãozinho <> no editor. ?

    Eu achei a lógica meio complexa, mas te recomendo examinar o valor da variável soma na iteração do loop na função mais_vendido. Se você souber colocar breakpoint de depurar, ótimo. Se não, pode usar um:

    printf("%f\n", soma);

    Bom, acredito que o problema esteja na seguinte parte:

            if(soma>mais_vendido){
                mais_vendido=produtos[b];
            }

    Aí você está comparando soma (que tem o total faturado por todas as vendas de determinado produto) com o código do produto. Na real você precisa armazenar quanto um produto vendeu e comparar soma com esta nova variável.

    Boa sorte!

     

  3. Opa, na verdade basta uma estrutura (struct) com as coordenadas cartesianas e um código que converta, que você já tem. ?

    Algo assim:

    struct coord {
      float x;
      float y;
    };

    Aí você declara assim:

    struct coord c;

    Após declarar, você acessa os membros da uma struct com o operador . (ponto). Por exemplo, para colocar valores nos membros:

    c.x = 9.1;
    c.y = 3.4;

    Você vai precisar adaptar isso na sua chamada à scanf().

    Depois de ter os valores preenchidos na sua struct declarada, é só converter, acessando da mesma maneira e imprimir os resultados. Se já souber usar ponteiros, pode fazer uma função que receba a struct e substitua os valores, ou que receba duas structs (uma com as coordenadas cartesianas e a outra vazia, para preencher as coodernadas polares). Mas se ainda não trabalhou com ponteiros, ou não é exigido pelo exercício, pode fazer na main() mesmo.

    Um abraço e boa sorte!

  4. O fato de você estar compilando com gcc no Windows pelo Git Bash faz com que várias coisas sejam adicionadas no binário final, por conta do MinGW (Minimalist GNU for Windows). Fica mais complicado aprender assim. Eu recomendaria usar nasm e ld somente, de preferência num Linux virtual, ou via WSL2.

    Outra opção é usar ferramentas nativas para Windows. Aí recomendaria o fasm.

    Mas o livro é muito bom mesmo, então segui-lo como o autor propõe é a melhor recomendação, creio. ?

    Abraço.

  5. Oi Marvin,

    Acho que idade não tem grilo algum. Tá tudo certo.

    Sobre entrar para a área de segurança, acho que o caminho é por computação tradicional, senão fica muito inconsistente. Recomendo você buscar um curso de Ciência da Computação. É bem capaz que no terceiro ano você já consiga um emprego na área. Aí você continua os estudos e vai ter uma formação forte para uma carreira sólida. ?

    Vale também dar uma olhada no nosso Guia de Estudos e Profissões em https://menteb.in/guia também, para se guiar no que estudar no auto-estudo.

    Conta com a gente!

    Abraço!

  6. Opa, a instrução não tá completa aí.. falta o segundo argumento do MOV, mas é o seguinte:

    A sintaxe Intel, que é essa que você usou o exemplo, funciona assim:

    instrução argumento1, argumento2, argumento3...

    No caso do MOV, que é uma instrução de cópia de dados e por isso possui dois argumentos, o destino vem primeiro e a origem depois. Então é:

    mov destino, origem

    Então no seu exemplo:

    mov dword ptr ds:[eax + 0x30]

    Ou seja, você colocou só o destino, por isso a instrução tá incompleta, mas tudo bem, talvez sua dúvida seja no destino mesmo. Esse destino aí diz o seguinte:

    Copie uma DWORD (palavra dupla, ou seja, 32-bits/4 bytes) para o endereço apontado pelo registrador EAX, mas some 0x30 (48 em decimal) a este endereço antes. Ou seja, suponha que tenhamos o valor 0x950000 no registrador EAX e a instrução completa seja:

    mov dword ptr ds:[eax + 0x30], 0xffffffff

    Após executar essa instrução, o valor 0xffffffff será copiado para o endereço 0x950030 (que é o tal EAX + 0x30). O ds vem de data segment e já dá a dica que este é um segmento de dados. No caso de executáveis de Windows, provavelmente este endereço estará na seção .data, já que está sendo usado para escrita (o valor é copiado para lá) e esta seção em geral possui permissão de escrita quando mapeada em memória.

    Abraço,

    Fernando

  7. Ué, mas você usa loops for e while em várias partes do teu código. Não entendi...

    De qualquer forma, ignorando tudo que pode ser corrigido e/ou melhorado, no caso da sua implementação das opções 4 e 5, só faltou imprimir na tela o número do cacifo, dentro do loop. Então ao invés de:

    cout << "O cacifo esta " << cacifo[i] << endl;

    Você pode fazer:

    cout << "O cacifo " << i << " esta " << cacifo[i] << endl;

    Abraço.

  8. Olá, @herculespt, beleza?

    Acho que antes de implementar as opções 4 e 5, precisamos acertar o seu código. Do contrário, vai ficar cada vez mais difícil. ?

    Vejo os seguintes problemas:

    1. main() precisar retornar int

    A função main() não pode retornar um float. Tem que ser int. Falta também um return 0 no fim do seu código.

    2. A variável que vai abrigar a opção não precisa ser um array

    Você declara essa variável int op[6], mas como ela só vai abrigar uma opção por vez, ou seja, um número por vez, basta que seja int op.

    3. Provavelmente era pra você criar um tipo cacifo

    Pela estrutura do programa, me parece que a resposta mais correta seria criar uma struct ou class do tipo cacifo, ou seja, seu próprio tipo. Até dá pra fazer com as propriedades do cacifo (nome e estado - ocupado ou vazio), em variáveis independentes, mas seria mais complicado e menos eficiente. A não ser que você não precise do nome, aí basta um array de strings mesmo ou, mais eficiente, de inteiros (você pode usar 0 para vazio e 1 para ocupado). Se for nesta última opção, você só vai precisar declarar como int cacifos[20], mas acho que antes vale verificar se estes cacifos não precisam de nome ou de outras propriedades. Se precisarem, aí é melhor criar uma struct ou class (depende do que seu professor, ou professora, ensinou).

    4. Você precisa usar mais loops

    Ao invés de fazer:

       cout << "\nCacifo " << i << cacifo[0] << endl;
        cout << "Cacifo 1: " << cacifo[1] << endl;
        cout << "Cacifo 2: " << cacifo[2] << endl;
        cout << "Cacifo 3: " << cacifo[3] << endl;
        cout << "Cacifo 4: " << cacifo[4] << endl;
        cout << "Cacifo 5: " << cacifo[5] << endl;
        cout << "Cacifo 6: " << cacifo[6] << endl;
        cout << "Cacifo 7: " << cacifo[7] << endl;
        cout << "Cacifo 8: " << cacifo[8] << endl;
        cout << "Cacifo 9: " << cacifo[9] << endl;
        cout << "Cacifo 10: " << cacifo[10] << endl;
        cout << "Cacifo 11: " << cacifo[11] << endl;
        cout << "Cacifo 12: " << cacifo[12] << endl;
        cout << "Cacifo 13: " << cacifo[13] << endl;
        cout << "Cacifo 14: " << cacifo[14] << endl;
        cout << "Cacifo 15: " << cacifo[15] << endl;
        cout << "Cacifo 16: " << cacifo[16] << endl;
        cout << "Cacifo 17: " << cacifo[17] << endl;
        cout << "Cacifo 18: " << cacifo[18] << endl;
        cout << "Cacifo 19: " << cacifo[19] << endl;

    Você pode fazer:

    for (int i=0; i<20; i++) {
      cout << "Cacifo " << i + 1 << ":" << cacifo[i] << "\n";
    }

    Sempre que estiver repetindo linhas como essas no seu código, substitua por um loop. Você vai errar muito menos assim

    Faz essas correções aí, porque pra avançar precisaremos delas. Aí a gente continua a conversa. ?

    Um abraço!

  9. Bem lembrado. Mas tem um ponto.. Eu acho que a gente deve considerar o que o aluno está estudando (admitindo que isso é um exercício de um curso de programação). Normalmente, em enunciados deste tipo, que miram a lógica, considerar tabulações verticais e outros caracteres é um pouco "demais". Usar a isspace() provavelmente vai na mesma linha. Mas concordo que sua consideração é mais completa. Se quem passou o exercício falou de outros caracteres, e/ou falou da isspace() - o que pode ter acontecido vide a inclusão do ctype.h pelo @lucas costa da cruz -, você está certíssimo. Do contrário, comparar com ' ' deve ser suficiente. ?

    Um abraço,

    Fernando

  10. Bom dia, @lucas costa da cruz, tudo bem?

    Eu precisei editar seu post original pra formatar o código como código (é só clicar no botão <> aqui do editor na hora de postar). Pode fazer isso da próxima vez que postar código, por gentileza? ?

    Também fiz as seguintes edições no seu código, para melhorar a visualização:

    • Indentação: aninhei os códigos dentro dos blocos {}
    • Espaços: pus espaços entre coisas como include<arquivo> e for (i=0;i<...;i++), etc.
    • Coloquei os comentários das declarações de variáveis alinhados.
    • Adicionei também um espaço depois do caractere ":" (dois pontos) na linha "Digite sua frase: ". 

    Tudo isso foi pra deixar o código melhor pra quem for te ajudar, inclusive pra você mesmo ler.

    Agora em relação à lógica do programa em si, me parece que você modificou um programa que já contava vogais para agora contar espaços, foi isso? Achei inteligente fazer isso, parabéns! ?

    A sua contagem está certa. Só faltou imprimir o valor da variável ContadorEspacos. E nem precisa usar um condicional (if) pra testar se é maior que zero. Basta imprimir o valor dela, mesmo que seja zero.

    Mais uma coisa: você aloca um vetor de apenas 12 posições com char texto[12]. Isso vai fazer com que sua frase não possa ter mais do que 11 caracteres. Eu usaria pelo menos uns 255. ?

    NOTA: O seu programa possui um bug de segurança ao combinar um buffer que pode ser facilmente estourado com o uso da função gets(), mas este assunto foge do tema da lógica de programação em si, e acredito que este exercício seja para treinar sua lógica, então abrir este assunto com seus professores pode desviar muito, mas se quiser saber mais sobre o assunto, é só googlar por "buffer overflow".

    Um abraço!

  11. Opa, bem vindo!

    Tá um pouco embolado isso... Pra começar, queria pedir que você edite seu post e use o bloco de código no seu código, usando o realce de sintaxe em C. Olha só a diferença. ?

    Sem realce:

    printf("Digite a %d%c nota do %d%c Aluno --: ",j+1,166,i+1,167);

    Com realce (na tela de edição do post, seleciona seu código, clica no botão <>, escolhe C na caixa de seleção no canto inferior direito e clica em Inserir?

    printf("Digite a %d%c nota do %d%c Aluno --: ",j+1,166,i+1,167);

    Aí você corrige a indentação pra facilitar pra gente também. Fica melhor pra gente ver e tentar entender teu código.

    Abraço!

×
×
  • Create New...