1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Operadores lógicos em C - The C Programming Language. Dúvidas exercício 23 [fechada]

Discussion in 'Technology' started by Carlos Leonardo M. Lago, Aug 2, 2020 at 12:38 PM.

  1. Estou lendo e resolvendo os exercícios do Livro "The C Programming Language" B&D. Acabei de resolver a questão 23 do primeiro capítulo e seu enunciado pede que escrevamos um programa capaz de retirar os comentários (os de linha única e multiplas linhas).

    Ao escrever meu programa tive diversos problemas no tratamento dos caracteres para reconhecer os comentários e quando eles encerravam. Pesquisando na internet encontrei uma solução que me deixou curioso e confuso.

    Quando tentamos reconhecer o fim dos comentários de multiplas linhas, basta apenas que identifiquemos os caracteres /. Logo ele terá que reconhecer primeiro o '' e depois '/', além de que as duas preposições devem ser verdadeiras para que seja identificado o fim de um comentário. Dito isto, teríamos algo como:

    if ( text == '/' && text[i+1] == '*' )
    while ( text != '*' && text[i+1] != '/' )
    ++i;


    Ou seja, utilizamos o conectivo(E) '&&', para que as duas preposições sejam avaliadas. A lógica parece ser a correta para este caso, no entanto, a solução so funciona com a utilização do conectivo(OU) '||', ficando assim:

    // Função que retira todos os comentários de um string
    void nocomments( char text[], char new_text[])
    {
    int i, k, c;
    i = k = 0;
    int status = 0;

    for( int j; j < MAXLINE; ++j)
    new_text[j] = 0;

    while ( text != '\0') {
    if ( text == '"')
    if ( status == 1 )
    status = 0;
    else
    status = 1;

    if ( status == 0) {
    if ( text == '/' && text[i+1] == '*') {
    while (text != '*' || text[i+1] != '/') { //[WARNING] A condição correta lógicamente seria o AND ,no entanto ,funcionou com o OR.
    ++i;
    }
    i += 2;
    }
    else if ( text == '/' && text[i+1] == '/') {
    while( text != '\n' ){
    ++i;
    }
    i += 1;
    new_text[k++] = '\n';
    }
    }

    else if ( status == 1 ) {
    new_text[k++] = text[i++];
    }

    new_text[k++] = text[i++];
    }
    new_text[k] = '\0';
    }


    Enfim, a solução funciona porém eu não consigo entender o porque já que não faz sentido para mim. Ao menos por enquanto.

    Login To add answer/comment
     

Share This Page