Ir para conteúdo
Fórum Script Brasil

Marcelo Utikawa da Fonseca

Membros
  • Total de itens

    297
  • Registro em

  • Última visita

Posts postados por Marcelo Utikawa da Fonseca

  1. Alguns pontos:

    1) Ao invés de fazer:

    (*atual).topo
    use:
    atual->topo
    Esta "setinha" é justamente um operador criado para não ter que fazer o que você está fazendo! Vai funcionar exatamente do mesmo jeito e o código fica mais limpo... 2) Se topo e base devem armazenar um endereço de memória então devem ser declarados como ponteiros. Assim a sua estrutura deve ser declarada como:
    typedef struct thread
    {
      int *base;
      int *topo;
    } THREAD;
    Obs.: eu coloquei o typedef em maiúsculo para diferenciar do nome da estrutura. Além disso esta prática deve ser evitada visto que ela abstrai o tipo e portanto torna o código mais difícil de entender. Procure sobre isto na inrernet que você irá ver bastante sobre isso, inclusive o kernel do linux mesmo não usa este recurso e fortemente pedem para que seja evitado! :) 3) Não entendi o que você está querendo exatamente. Você quer atribuir zero em todas as posições? Para isso use o código:
    memset(atual->base, 0, 30);
    memset(atual->topo, 0, 30);
    Agora que eu percebi: você não está fazendo malloc para base! Desta forma você recervou apenas 30 int e depois falou para base usar mais 30 após esta posição? Você está acessando uma área de memória não alocada! Além disso vocÊ não está fazendo o casting ao alocar o topo. Use o seguinte código para alocar a memória:
    atual->base = (int *)(malloc(30*sizeof(int)));
    atual->topo = (int *)(malloc(30*sizeof(int)));

  2. O problema é que algum dos bancos de dados devem ser selecionados senão não vai funcionar. Para confirmar, altere o trecho de código original do database.h:

    #elif defined(__USE_PGSQL__)
    #define DATABASE_CLASS DatabasePgSQL
    #define DBRES_CLASS PgSQLResult
    class DatabasePgSQL;
    class PgSQLResult;
    
    #endif
    para:
    #elif defined(__USE_PGSQL__)
    #define DATABASE_CLASS DatabasePgSQL
    #define DBRES_CLASS PgSQLResult
    class DatabasePgSQL;
    class PgSQLResult;
    #else
    #error Select a database
    #endif
    Se aparecer a mensagem de erro "Select a database" durante a compilação realmente este é o problema mas eu pessoalmente não tenho mais dúvidas que este é o problema. Mais uma coisa: será que este arquivo deve ser compilado? Pelo que diz no tutorial:
    Vá até o diretório Sources e inclua todos os arquivos deixando APENAS os seguintes:

    Você deve selecionar todos os arquivos no diretório, com exceção dos citados na lista, não é?

  3. O sizeof retorna o tamanho em bytes que uma variável está ocupando em memória. Assim, como a função fwrite recebe o número de bytes a serem gravados a partir de um certo endereço de memória, precisamos passar como parâmetro o retorno de sizeof.

    Se eu compliquei mais do que expliquei me avise que eu tento melhorar! :)

    Sobre as consoantes e vogais eu vi que você criou um tópico específico assim respondo lá que é melhor, ok?

  4. Então: o problema com marcadores em arquivos binários é que o tab é um dado como outro qualquer e tem o seu valor. Se uma variável tem o mesmo valor não dá para saber. Em um arquivo binário como no seu caso não precisa de nenhum marcador, apenas a gravação direta e usando a mesma forma para ler os dados de volta.

    Assim o fprintf poderia ser substituída pelo código abaixo:

    fwrite(&binimp, sizeof(binimp), 1, arq);

    Nos argumentos estou passando o endereço da variável que deve ser gravada (&binimp), o seu tamanho (sizeof(binimp)), 1 indicando que apenas uma variável desta deve ser gravada e o ponteiro para o arquivo.

    Este terceiro parâmetro (1) seria usado onde temos um vetor para ser gravado, por exemplo.

  5. Ótimo, eu espero poder te ajudar! Mas o jogo do Corinthians vai começar então não vou ficar aqui direto... :)

    Realmente acesso a arquivos é algo um pouco complicado mas com um pouco de experiência você já vai entender.

    O que acontece agora é que eu não entendi exatamente o que você precisa pois em um arquivo binário não vai adiantar muito gravar o tab como marcador.

    Este link explica muito bem o uso de fwrite: http://www.cplusplus.com/reference/clibrar...dio/fwrite.html

    Este site possui muitas outras funções e serve como referência, aproveite! :)

  6. Olá!

    Primeiramente parabéns! Espero que você goste da linguagem, eu pessoalmente adoro programar em C e C++! :)

    Eu pessoalmente acho melhor aprender C antes de C++ já que ela é uma extensão da linguagem original.

    O principal ponto para qualquer pessoa que queira aprender a programar em qualquer linguagem é lógica de programação. Principalmente em linguagem C/C++ onde a lógica é tão importante.

    Quanto aos compiladores: eu sei que Dev-Cpp é bem utilizado e pelo que eu sei é free. Eu uso muito o linux e lá temos o gcc. Eu sei que também existe o gcc para windows mas eu pessoalmente nunca usei.

    Eu aprendi a programar na raça mesmo, comecei fazendo arquivos .bat no dos, depois programando em basic também no dos e depois fui para linguagem C. Eu aprendi com um livro de C++ da Viviane Mizrahi e depois eu fiz um curso com ela aqui na cidade de São Paulo.

    No submarino está o link para o livro: http://www.submarino.com.br/books_productd...mp;ProdId=77448

    Pelo que vi existe uma segunda edição no link: http://www.submarino.com.br/books_productd...;ProdId=1090673

    Não sei se são iguais mas eu aprendi com o do primeiro link! :)

    De qualquer forma hoje em dia se acha muita coisa na net, talvez o livro nem é mais tão necessário!

    Agora a minha lição de vida: Nunca desista! A diferença entre o sucesso e o fracasso pode ser apenas uma tentativa.

    Pense nisso... ;)

  7. Valeu cara! É que eu nunca nem joguei Tíbia então é meio complicado ficar procurando algo que não sabemos o que é. Além disso eu iria ter que instalar compiladores e tudo o mais aqui para reproduzir o erro!

    Agora quanto ao problema: parece algum erro na configuração do projeto pois não acredito que o código esteja com erro.

    Todos os arquivos citados no caminho do tutorial existem conforme indicado?

    Obs.: este é um erro do compilador, não do linker. Portanto não se preocupe em checar as configurações dele agora, ok? :)

    Outra coisa: se der para colocar o código de database.h aqui deve ajudar pois podemos ver flags que não estão sendo passadas ao compilador.

  8. O problema está sendo que o código funciona mas está gravando em modo texto. Porque você fez assim, este formato com o tab é o que deve ser?

    Caso você salve o arquivo em formato binário não conseguirá visualizar o seu conteúdo, apenas um outro programa é que conseguirá ler. É isto mesmo que você quer?

    Para utilizar arquivos binários você precisa abri-lo com a flag "wb" ao invés de "w". Além disso você grava os dados com a função fwrite.

    Explique exatamente se é isso que é preciso e qual o formato exato do arquivo.

  9. Eu não sei muita coisa de pascal (para ser sincero quase nada!) mas pelo que entendi o seu programa exibe uma espécie de banner na tela. Converter para C não é tão simples pois isso não faz parte da linguagem e irá variar conforme o SO em uso.

    No Linux o que é muito usado para isso seria a lib ncurses. Já no dos/windows existia uma lib da borland (turbo c) que continha funções como gotoxy, textcolor... Para que exatamente você precisa converter este código? Não dá para muar alguma coisa?

  10. Na realidade existem alguns problemas. Seguem meus comentários:

    1) A função leitura retorna uma variável criada dentro dela mesma, ou seja, esta variável somente existirá enquanto a função leitura estiver sendo executada. Assim, ao acessar esta variável fora da função através do ponteiro você estará acessando uma área da memória que não está mais alocada e que poderá ser sobrescrita por outra parte do programa, corrompendo os dados.

    2) A função scanf precisa do endereço da variável onde os dados lidos serão salvos e por isso usamos o operador &. Porém, ao passar um vetor sem o índice como parâmetro, o vetor retorna o próprio endereço da memória. Assim, usar o operador & nesse caso é como se fosse o endereço do endereço da memória, ou seja, um erro! Para usar um vetor no scanf podemos usar um dos modos abaixo:

    char vetor[50];
    scanf("%s", vetor);
    scanf("%s", &vetor[0]);
    3) Evite ao máximo criar variáveis globais! Esta não é uma boa prática. O correto neste caso é criar uma variável estática na função leitura. Esta variável não é destruída ao sair da função e assim, quando a função leitura for chamada novamente, a variável conterá o valor que tinha quando a função terminou pela última vez. 4) Como agora a função leitura recebe uma estrutura e não retorna nada, a função main conterá a declaração de uma variável e não de um ponteiro para a estrutura. 5) Ao ler a variável opcao com scanf foi passado o formato de leitura de string ("%s") ao invés de um char ("%c") que é o tipo da variável opcao. 6) A função main não possuía tipo definido, fazendo portanto que ela tivesse o tipo int. Eu explicitamente indiquei o tipo de retorno int e também adicionei um valor de retorno a ela visto que ela não é void! Segue abaixo a função leitura corrigida:
    #include <stdio.h>
    #include <stdlib.h>
    
    //Declaração do tipo de estrutura
    struct tipo {
      int numero;
      float x, y;
      char varchar1[40], varchar2 [10], varchar3 [12];
    };
    
    struct tipo *leitura();
    
    //Função Principal
    int main() {
      char opcao;
      struct tipo p;
    
      do{
        leitura(&p);//Atribuindo o struct ponteiro da função p/ o ponteiro p
        system("cls");
    
        printf("Numero : %d\n", p.numero);
        printf("Valores float : x = %.2f e y = %.2f\n", p.x, p.y);
        printf("Varchar1 = %s\n", p.varchar1);
        printf("Varchar2 = %s\n", p.varchar2);
        printf("Varchar3 = %s\n", p.varchar3);
        printf("Deseja Continuar (S/N)?");
    
        scanf("%c", &opcao);
        system("cls");
      } while(toupper(opcao)=='S');
    
      return 0;
    }
    
    //Função de leitura que retorna um struct do tipo ponteiro
    void leitura(struct tipo *pont_le) {
      static unsigned int var = 1;
      pont_le->numero=var;
    
      printf("Informe o valor float x: ");
      scanf("%f", &pont_le->x);
    
      printf("Informe o valor float y: ");
      scanf("%f", &pont_le->y);
    
      printf("Informe varchar1: ");
      scanf("%s", pont_le->varchar1);
    
      printf("Informe varchar2: ");
      scanf("%s", pont_le->varchar2);
    
      printf("Informe varchar3: ");
      scanf("%s", pont_le->varchar3);
    
      var++;
    }

  11. Você já fez alguma coisa? Sabe como declarar uma classe?

    Mostre que você tem boa vontade em fazer e aprender que muitos também terão vontade de ensinar e tirar suas dúvidas!

  12. De nada, não foi aula nenhuma não! :)

    Pode parecer um pouco difícil no começo pois realmente C/C++ é uma linguagem que exige muita lógica. Porém como eu sempre digo: a linguagem C/C++ é muito simples pois não tem muitas opções nem comandos. E justamente por ser tão simples é que dá mais trabalho ao programador. Assim que pega o jeito fica mais fácil.

    Quanto ao seu problema, o motivo é o seguinte:

    if(strcmp(pa1,pa2)>=0)
    Na comparação acima o if será verdadeiro sempre que o retorno de strcmp for maior ou igual a zero. Porém, se o retorno for zero, as strings são iguais! O correto neste caso seria:
    if(strcmp(pa1,pa2)) {
        printf("As duas palavras são diferentes.\n");
    
        if(strcmp(pa1,pa2)>0)
          printf("A primeira palavra é maior.\n");
        else
          printf("A segunda palavra é maior.\n");            
      } else {
        printf("As duas palavras são iguais.\n");
      }
    Assim a checagem que indica se uma palavra é maior que a outra ocorrerá apenas se as palavras forem diferente pois, caso forem iguais, esta checagem já não fará mais sentido, correto? :) Obs.: a função fgets inclui o enter digitado pelo usuário na string. Porém, caso o limite seja alcançado, não existirá o enter. Assim o ideal é utilizar o gets da seguinte forma:
    fgets(pa1, sizeof(pa1), stdin);
    last_char = strlen(pa1)-1;
    if(pa1[last_char] == '\n')
      pa1[last_char] = 0; // Adiciona o nulo sobre o \n para removê-lo da string.
    Este código acima poderia até mesmo ser utilizado para criar uma função como:
    char *read_stdin(unsigned int nchar)
    {
      unsigned int last_char;
      char *ptr = (char *)(malloc(nchar));
      if(ptr != NULL) {
        fgets(ptr, nchar, stdin);
        last_char = strlen(ptr) - 1;
        if(ptr[last_char] == '\n')
          ptr[last_char] = 0;
      }
    
      return ptr;
    }
    Esta função recebe apenas o número de caracteres que a sua string deve conter. Ela automaticamente aloca a memória, lê o dado do usuário, remove o \n e retorna o endereço em memória utilizado para salvar a string. Seu programa programa precisaria apenas do seguinte código:
    char *nome, *end;
    
    printf("Digite seu nome: ");
    nome = read_stdin(30);
    
    printf("Digite seu endereço: ");
    end = read_stdin(100);
    
    if(nome == NULL || end == NULL) {
      printf("Memória insuficiente!\n");
    } else {
      printf("Nome: %s\nEnd.: %s\n", nome, end);
    }
    
    free(nome);
    free(end);

    Como a memória foi alocada dinamicamente é necessário chamar a função free para liberá-la ou seu programa irá acabar com a memória do PC... :)

  13. O seu problema é que strings funcionam diferente em C. Na realidade não existe um tipo de string, apenas vetores de caracteres.

    O que você fez no código está errado pois, ao declarar uma variável como:

    char meses[12];
    Você criou um vetor capaz de armazenar 12 caracteres, ou seja, uma única string. O tipo char armazena um caracter e não uma string! Além disso você precisa de reservar um espaço para o byte nulo que é incluído ao final da string para determinar o seu final. O correto no seu caso seria declarar da seguinte forma:
    char meses[12][10];
    Assim você possui um vetor capaz de armazenar 12 vetores de 10 caracteres cada (9 na realidade devido ao byte nulo). Além disso, diferentemente do VB que aceita tanto aspas simples como duplas para strings, em C você obrigatoriamente deve usar aspas duplas. Aspas simples são para um único caracter. Ou seja: "a" é uma string contendo apenas o caracter a e 'a' é o próprio caracter a. Segue abaixo um código que cria um vetor meses para uso no seu programa:
    char meses[12][] = {
      "Janeiro",
      "Fevereiro",
      "Março",
      "Abril",
      "Maio",
      "Junho",
      "Julho",
      "Agosto",
      "Setembro",
      "Outubro",
      "Novembro",
      "Dezembro"
    }
    Note que no código eu estou criando e inicializando o array de meses de uma só vez. Isso me permite não especificar a última dimensão do array que será escolhida pelo compilador com base nos textos que eu passei como parâmetro. Sobre os printf: esta função envia um texto para o console e retorna o número de bytes escrito, nada que irá importar no seu programa. Simplesmente ignore o valor de retorno. Já no scanf abaixo:
    scanf("%i",&meses[i]);
    A string de formato é "%i", ou seja, será lido um inteiro. Porém, como parâmetro, foi passada uma posição do vetor meses, ou seja, um char. O correto aqui é passar uma variável do tipo inteiro. Abaixo segue a declaração de um inteiro e seu uso com scanf:
    int mes;
    scanf("%i", &mes);
    Como a variável mes já conterá o número de mês, precisamos apenas usá-la como índice do vetor para retornar o mês, não há a necessidade de um for. Só devemos ter cuidado de checar se o mês passado é válido. Na checagem do while eu acho que fica mais claro se compararmos de outra forma: convertemos a resposta para um caracter maiúsculo e então comparamos apenas com 'S'. Como eu disse, isso é minha opção pessoal! Da forma como estava também estava certo. Por último, main é do tipo int e portanto deve retornar um int: incluia sempre um return 0; no final. A seguir está o código completo com as correções:
    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
    #include<math.h>
    
    using namespace std;
    int main(void)
    {
    // Declaração e Inicialização de Variáveis
      int dia, mes, ano;
      char resposta = 's';    
      char meses[12][] = {
        "Janeiro",
        "Fevereiro",
        "Março",
        "Abril",
        "Maio",
        "Junho",
        "Julho",
        "Agosto",
        "Setembro",
        "Outubro",
        "Novembro",
        "Dezembro"
      }
    
      do {
        // Entrada de Dados    
        printf("Entre com o dia do nascimento do aluno:");
        scanf("%i",&dia);
    
        printf("\nEntre com o mês do nascimento do aluno:");
        scanf("%i",&mes);
    
        printf("\nEntre com o ano do nascimento do aluno:");
        scanf("%i",&ano);
    
    // Processamento de Dados
        if(mes<1)
          mes=1;
        else if(mes>12)
          mes=12;
    
    // Saida de Dados
        printf("\nO estudante nasceu em %i de %c de %i" ,dia ,meses[mes] ,ano);
    
    // Perguntar se Quer Continuar
        resposta = printf("\n \nDeseja Continuar S/N?:");
        fflush( stdin );
        scanf( "\n %c", &resposta );
      }while(toupper(resposta) == 'S');
    
      return 0;
    }

  14. Não sei se entendi direito mas 30 caracteres reais eu acredito que seja 30 caracteres mais o nulo no final. Assim a declaração deveria ser:

    char pa[31], pas[31];
    Já para receber o texto do usuário, não use gets! Essa função não checa limites de vetor e podem causar problemas graves. Ao invés utilize a fgets:
    fgets(pa, sizeof(pa), stdin);
    Quanto a uma string maior que a outra: o que isso significa exatamente? Número de caracteres ou maior no sentido de ordem alfabética? Seguem códigos para as duas situações: 1) Maior em tamanho: use a função strlen que retorna o tamanho da string
    if(strlen(pa1)>=strlen(pa2))
         printf("A primeira palavra é maior.\n");
      else
         printf("A segunda palavra é maior.\n");            
         system("PAUSE");
    2) Maior em ordem alfabética: use a função strcmp pois ela retorna zero se forem iguais ou então se a primeira é maior que a segunda
    if(strcmp(pa1,pa2)>=0)
         printf("A primeira palavra é maior.\n");
      else
         printf("A segunda palavra é maior.\n");            
         system("PAUSE");

  15. Que isso, não há problema algum! E é sempre bom ajudar pois, se hoje eu sei, é porque algum dia alguém me ensinou! :)

    Não entendi exatamente o que está acontecendo mas, pelo código acima, apenas descomentar o código que incrementa nConsulta não irá resolver. Desta forma a posição que será exibida será sempre uma além da última!

    Para que os dados sejam exibidos a opção de listar tem que ficar como abaixo:

    /* Faz o display no ecrã dos dados recolhidos*/
                    case '2': {
                         for(i=0; i<nConsulta; i++) {
                              printf("Numero: %d\n",        hospital[i].numero);
                              printf("Nome: %s\n",          hospital[i].nome);
                              printf("Especialidade: %s\n", hospital[i].especialidade);
                              printf("Data: %d\n",          hospital[i].data);
                              printf("Hora: %d\n",          hospital[i].hora);
                              printf("Contacto: %d\n",      hospital[i].contacto);
                         }
                    }
                    break;

    Note que foi descomentado o loop for e o índice do vetor foi alterado para o contador i.

    Abraços e boa sorte!

    Qualquer dúvida é só falar... :)

  16. Ei! Você removeu o código porquê?

    Como ontem eu havia copiado o código, eu consegui testá-lo e hoje voltei para responder!

    Seguem abaixo meus comentários e o código funcionando:

    1) Para usar a função exit inclua stdlib.h

    2) Ao utilizar o scanf você estava passando o formato sempre como "%s" mesmo quando você queria ler uma variável do tipo int

    3) No scanf, quando você passa como parâmetro um vetor sem o seu índice, você não deve usar o operador &

    Bem, não tenho mais o seu código original e por isso eu só me lembrei destes três pontos no seu código. A seguir um código que funciona!

    #include <stdio.h>
    #include <stdlib.h>
    
    #define ESPACO 200
    #define FICH "consulta.txt"
    
    typedef struct consulta
    {
       int numero;
       char nome[20];
       char especialidade[20];
       int data;
       int hora;
       int contacto;
    }  CONSULTA;
    
    int main() {
    
        char opcao;
    
        CONSULTA hospital[ESPACO], tabela;
        int nConsulta = 0, i, j;
        FILE *fp;
        while(1) {
            printf("\n\nDev Testes\n");
            printf("1 - Inserir Consulta\n");
            printf("2 - Listar\n");
            printf("3 - Ordenar por número\n");
            printf("4 - Ordenar por nome\n");
            printf("5 - Gravar para ficheiro\n");
            printf("6 - Ler de ficheiro\n");
            printf("7 - Sair\n");
            printf("8 - Remover Consulta\n\n");
            rewind(stdin);     /* reinicio do ficheiro */
            opcao = getchar();
            switch(opcao) {
                case '1': {
                    printf("Número: ");
                    scanf("%d", &hospital[nConsulta].numero);
                    printf("Nome: ");
                    scanf("%s",  hospital[nConsulta].nome);
                    printf("Especialidade: ");
                    scanf("%s",  hospital[nConsulta].especialidade);
                    printf("Data: ");
                    scanf("%d", &hospital[nConsulta].data);
                    printf("Hora: ");
                    scanf("%d", &hospital[nConsulta].hora);
                    printf("Contacto: ");
                    scanf("%d", &hospital[nConsulta].contacto);
                    rewind(stdin);
    //                nConsulta++;
                    }
                    break;
        /* Faz o display no ecrã dos dados recolhidos*/
                    case '2': {
                        /*  for(i=0; i<nConsulta; i++) {*/
    
                    printf("Numero: %d\n",        hospital[nConsulta].numero);
                    printf("Nome: %s\n",          hospital[nConsulta].nome);
                    printf("Especialidade: %s\n", hospital[nConsulta].especialidade);
                    printf("Data: %d\n",          hospital[nConsulta].data);
                    printf("Hora: %d\n",          hospital[nConsulta].hora);
                    printf("Contacto: %d\n",      hospital[nConsulta].contacto);
    
                         /*}*/
                    }
                    break;
        /* Ordenar por numero*/
                 case '3': {
                        for(i=0; i<nConsulta; i++){
                            for(j=0; j<nConsulta-i-1; j++){
                                if(hospital[j].numero > hospital[j+1].numero) {
                                    tabela = hospital[j];
                                    hospital[j] = hospital[j+1];
                                    hospital[j+1] = tabela;
                                }
                            }
                        }
                    }
                    break;
        /* Ordenar por nome*/
                case '4': {
                        for(i=0; i<nConsulta; i++){
                            for(j=0; j<nConsulta-i-1; j++){
                                if( strcmp(hospital[j].nome, hospital[j+1].nome)==1 ) {
                                    tabela = hospital[j];
                                    hospital[j] = hospital[j+1];
                                    hospital[j+1] = tabela;
                                }
                            }
                        }
                    }
                    break;
        /* Gravar para ficheiro*/
                case '5': {
                     fp = fopen(FICH, "wb");
                     fwrite(&nConsulta, sizeof(int), 1, fp);
                     fwrite(hospital, sizeof(CONSULTA), ESPACO, fp);
                     fclose(fp);
                    }
    
                    break;
        /* Ler o ficheiro*/
                case '6': {
                     fp = fopen(FICH, "rb");
                     fread(&nConsulta, sizeof(int), 1, fp);
                     fread(hospital, sizeof(CONSULTA), ESPACO, fp);
                     fclose(fp);
                    }
                    break;
        /* Sair */
                case '7':
                    exit(0);
            }
         }
    }

  17. Que função você está usando?

    cout? printf? Por ser C++ acredito ser cout, correto?

    Existem alguns modificadores mas não me lembro agora.

    Se for C, você deve estar usando printf! Nesse caso a exibição de um número possui algumas formatações. Um float, por exemplo, pode ser representado da seguinte forma:

    printf("valor = %.02f\n", valor);

    Nesse caso indicamos que devem ser exibidas duas casas decimais e preenchidas com zero.

    É disso que você está falando? Eu sinceramente não entendi exatamente o que você quis dizer. Coloque alguns códigos para explicar melhor!

  18. Alguns comentários sobre o seu código:

    1) Sempre que você precisar checar vários resultados para uma mesma variável, utilize o comando switch. O código fica muito mais claro e a execução mais rápida.

    2) Ao utilizar define dê preferência por declarar com as letras em maiúsculo. Não há erro se não for desta forma mas o código fica muito mais fácil de interpretar.

    3) A função nulo recebe dois argumentos mas apenas 1 é utilizado. Outra coisa: a comparação de nulo é muito simples, não há a necessidade de criar uma função para isso.

    4) O ideal é comparar se o divisor é nulo dentro da função de divisão pois esta checagem sempre precisa ser feita.

    5) Você não precisa passar um argumento para a função menu apenas para criar a variável. Crie a variável num dentro da função menu.

    6) As funções das operações recebem um float mas as variáveis que você passa são int.

    7) O loop ia até 10 mas não tinha relação com os vetores, fazendo apenas com que o menu fosse exibido por 10 vezes.

    Seguem as modificações com os vetores:

    #include<stdio.h>
    #include<stdlib.h>
    #define TAMANHO 10
    
    void exibe_result(char operacao[], float *res);
    
    void soma(float *val1, float *val2, float *res);
    void sub (float *val1, float *val2, float *res);
    void mult(float *val1, float *val2, float *res);
    void divi(float *val1, float *val2, float *res);
    
    int menu();
    
    main()
    {
      int i;
      float val1[TAMANHO], val2[TAMANHO];
      float res_soma[TAMANHO], res_sub[TAMANHO], res_mult[TAMANHO], res_divi[TAMANHO];
    
      for(i=0; i<TAMANHO; i++) {
        val1[i] = 0;
        val2[i] = 0;
      }
    
      while(1) {
        switch(menu()) {
          case 1:
            for(i=0; i<TAMANHO; i++) {
              printf("\nDigite Primeiro numero da posicao %d\n", i+1);
              scanf("%f", val1+i);
    
              printf("Digite Segundo numero da posicao %d\n", i+1);
              scanf("%f", val2+i);
            }
    
            break;
    
          case 2:
            soma(val1, val2, res_soma);
            exibe_result("Soma", res_soma);
            break;
    
          case 3:
            sub(val1, val2, res_sub);
            exibe_result("Subtracao", res_sub);
            break;
    
          case 4:
            mult(val1, val2, res_mult);
            exibe_result("Multiplicacao", res_mult);
            break;
    
          case 5:
            divi(val1,val2, res_divi);
            exibe_result("Divisao", res_divi);
            break;
    
          case 6:
            exit(0);
            break;
    
          default:
            printf("Opcao invalida!\n");
        }
      }
    
      system("pause");
    }
    
    int menu()
    {
      int num;
    
      printf("\n[1] - Entrada de dados\n");
      printf("[2] - Adicao\n");
      printf("[3] - Subtracao\n");
      printf("[4] - Multiplicacao\n");
      printf("[5] - Divisao\n");
      printf("[6] - Sair\n");
      printf("\n\nEscolha uma das opcoes\n");
    
      scanf("%d", &num);
      return num;
    }
    
    void exibe_result(char operacao[], float *res)
    {
      int i;
      printf("Resultados da operacao %s:\n\n", operacao);
      for(i=0; i<TAMANHO; i++) {
        printf("Posicao %d: %.03f\n", i+1, res[i]);
      }
    }
    
    void soma(float *val1, float *val2, float *res)
    {
      int i;
      for(i=0; i<TAMANHO; i++) {
        res[i] = val1[i] + val2[i];
      }
    }
    
    void sub(float *val1, float *val2, float *res)
    {
      int i;
      for(i=0; i<TAMANHO; i++) {
        res[i] = val1[i] - val2[i];
      }
    }
    
    void mult(float *val1, float *val2, float *res)
    {
      int i;
      for(i=0; i<TAMANHO; i++) {
        res[i] = val1[i] * val2[i];
      }
    }
    
    void divi(float *val1, float *val2, float *res)
    {
      int i;
      for(i=0; i<TAMANHO; i++) {
        if(val2[i])
          res[i] = val1[i] / val2[i];
        else
          res[i] = 0;
      }
    }

  19. Eu não sei como compilar no kdevelop pois não o utilizo. Porém provavelmente ele cria um makefile e assim você pode compilar diretamente na linha de comando com o comando make.

    Caso você esteja desenvolvendo um programa para console mesmo, compile-o da seguinte forma:

    gcc -o nome_do_executavel arquivo.c

    Onde nome do executável é o nome do arquivo que será gerado e arquivo.c o nome do arquivo que será compilado.

  20. Inicialmente eu queria fazer uma pergunta: professores de linguagem C viram este programa e não viram nada de errado? Tem muita coisa errada, além de que ele nem funciona! Quem está aprendendo é normal mas professores não encontrarem nada de errado é que ficou feio! De qualquer forma vou responder, sem problemas... :)

    O sintoma que você descreve é causado quando há violação no acesso à memória. Assim, em uma situação dessas, você deve checar se os seus vetores e ponteiros estão acessando áreas reservadas para eles ou se estão ultrapassando os limites.

    Existem vários pontos no programa em que violações estão ocorrendo. Seguem abaixo meus comentários:

    1) abre_arquivo

    void abre_arquivo()
    {
      if ((parquivo = fopen("aviao.txt","r+b"))== NULL)
         parquivo = fopen("aviao.txt","w+b");
    }
    Esta função abre o arquivo sem criá-lo e, caso ele não exista, abre novamente para que ele seja criado. Aqui existe um problema: se você rodar o programa em um disco em modo de somente-leitura como um CD, por exemplo, o arquivo não será criado e o programa não checa isso, causando um erro no programa ao tentar ler o arquivo. 2) procura
    int procura(char p[20])
    {
      int i,x;
      char textoArquivo[100];
      char linha;
      char val[10];
      char poltrona[2];
      char aux[1];
      char aux2[2];
      x = 10;
    
      for(i = 0; !feof(parquivo);i++) { //incrementa 'i' enquando não for
         fgets(textoArquivo, 101, parquivo); //pega uma string de 100 caracteres
    
         while(textoArquivo[x] != '<') {
            fflush(stdin);
            aux[1] = textoArquivo[x];
            strcat(poltrona,aux);
            strcat(aux2,poltrona);
            ++x;
         }
    
         if(strstr(aux2,p)){
            return 1;
         }
    
         continue; //volta ao inicio do loop sem executar o resto
      }
    
      return 0;
    }
    Aqui existem alguns problemas: a) O contador i não é utilizado em lugar algum! Ele é desnecessário e pode ser removido. Assim podemos transformar o for em um while com a condição e desprezando a inicialização e incremento do for. b ) A função fgets irá receber 101 caracteres porém a variável só pode armazenar 100 caracteres! A chamada a esta função com estes parâmetros irá causar violação no acesso à memória. c) Em while(textoArquivo[x] != '<') você está buscando por '<' dentro de textoArquivo, correto? Como x começa com 10, a busca iniciará na posição 11 (o vetor começa em zero!). Isto está correto? Acredito que deveria começar em 0. d) O comando fflush(stdin) serve para descarregar o que estiver no buffer de entrada, ou seja, algo que tenha sido digitado pelo usuário. Neste momento, porém, não é lido nenhum dado de usuários e portanto essa chamada é desnecessária, podendo ser removida. e) Em aux[1] = textoArquivo[x] você está inserindo um dado de textoArquivo na segunda posição de aux porém a sua declaração indica que este é um vetor de apenas uma posição! Neste ponto também está ocorrendo violação no acesso à memória f) A função strcat serve para concatenar strings, ou seja, adicionar uma no final da outra. Em C o byte nulo (valor zero) indica o fim de uma string e portanto ambas as strings devem obrigatoriamente possuir bytes nulos marcando seu final. Porém, aux, poltrona e aux2 não o possuem! Além disso o maior vetor possui 2 posições! Estes strcat são dos comandos que mais estão violando o acesso à memória neste programa. g) A instrução continue não tem qualquer efeito e pode ser removida. 3) cadastrar
    void cadastrar()
    {
      int ie;
      char entrada[30];
      char entrada2[30];
    
      printf("\n Cadastrar Novo Aluno\n\n");
      printf("\n\tNome do Aluno.....: ");
      gets(entrada);
      printf("\n\tNome do Aluno.....: ");
      gets(entrada2);
      ie = procura(entrada2);
      printf("%d",ie);
    
      char aux_tagpoa[60] = tagpoa;
      char aux_tagpaa[60] = tagpaa;
      strcat(aux_tagpoa,entrada2);
      strcat(aux_tagpaa,entrada);
      strcat(aux_tagpoa,aux_tagpaa);
      strcat(aux_tagpoa,tagpaf);
      strcat(aux_tagpoa,tagpof);
      char *xml = aux_tagpoa;
      printf("%-20s",xml);
      fseek(parquivo,0,SEEK_END);
      fwrite(xml,strlen(xml),1, parquivo);
      getch();
    }
    a) Os textos dos printf devem ter vindo de outro programa e o nome das variáveis não ajudam! Pelo que pude perceber entrada contém o passageiro e entrada2 contém a poltrona. Estou correto? b ) Não use a função gets! Até mesmo alguns compiladores avisam ao utilizá-la pois ela gera um grande problema: não há verificação de limite de vetor e portanto ele é facilmente ultrapassado. Utilize fgets em seu lugar! c) A função procura é executada porém seu resultado apenas é exibido na tela. O programa não checa o retorno e portanto os dados sempre são gravados, independentemente de já existirem no arquivo ou não. Além disso deveria ser buscada a tag formada e não apenas o texto digitado em entrada2 pois assim estaremos comparando qualquer coisa! d) Acredito que o getch não seja necessário neste ponto. 4) main
    main()
    {
      abre_arquivo();
      cadastrar();
      getch();
    }
    a) Eu colocaria o tipo de retorno de main como int para não ficar implícito b ) Faltou o fclose para fechar o arquivo c) Adicione um return 0; no final pois main precisa retornar um int! Além do que já falei, o vetor entrada2 é criado com 30 posições mas a função p recebe como argumento um vetor de apenas 20 posições! Ao receber vetores em funções, omita o tamanho para que ele seja escolhido automaticamente. Bem, acho que é isso! :) Segue abaixo o código com as correções:
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <string.h>
    #define TAG_PO_ABRE   "<poltrona>"
    #define TAG_PO_FECHA "</poltrona>"
    #define TAG_PA_ABRE   "<passageiro>"
    #define TAG_PO_FECHA "</passageiro>"
    
    FILE *parquivo; //ponteiro para arquivo
    void abre_arquivo()
    {
      if ((parquivo = fopen("aviao.txt","r+b")) == NULL)
        if((parquivo = fopen("aviao.txt","w+b")) == NULL) {
          printf("Erro abrindo arquivo!\n");
          exit(1);
        }
    }
    
    int procura(char p[])
    {
      long tamArquivo, pos;
      char *textoArquivo;
      char poltrona[2];
      char aux[1];
      char aux2[2];
    
      fseek(parquivo,0,SEEK_END);
      tamArquivo = ftell(stream);
      rewind(parquivo);
    
      textoArquivo = (char *)(malloc(tamArquivo)); // Aloca espaço para ler o arquivo inteiro
      if(textoArquivo == NULL) {
        printf("Memoria insuficiente!\n");
        fclose(parquivo);
        exit(2);
      }
    
      fgets(textoArquivo, tamArquivo), parquivo); // Lê o arquivo inteiro
    
      pos = 0; // Inicializa pos para o loop.
      while(pos<tamArquivo) {
        // Busca início da tag
        while(textoArquivo[pos] != '<') {
          pos++;
          if(pos == tamArquivo) {
            free(textoArquivo);
            return 0;
          }
        }
    
        if(textoArquivo[pos+1] != '/') { // Achou tag de abertura
          if(!strncmp(textoArquivo+pos, p, strlen(p))) { // Achou poltrona, retorna.
            free(textoArquivo);
            return 1;
          } else { // Poltrona não encontrada, avança para a próxima posição.
            pos++;
          }
        }
      }
    
      free(textoArquivo);
    
      return 0;
    }
    
    void cadastrar()
    {
      int ie;
      char passageiro[30];
      char poltrona[30];
    
      printf("\n Cadastrar Passageiro\n\n");
      printf("\n\tNome do Passageiro.....: ");
      fgets(passageiro, sizeof(passageiro), stdin);
      printf("\n\tPoltrona...............: ");
      fgets(poltrona, sizeof(poltrona), stdin);
    
      // Força o nulo no final
      passageiro[sizeof(passageiro)-1] = 0;
      poltrona  [sizeof(poltrona  )-1] = 0;
    
      } else {
        char aux_tags[120] = TAG_PO_ABRE;
        char *xml;
    
        strcat(aux_tags, poltrona);
        if(procura(aux_tags)) { // Busca tag de poltrona fornecida por usuário
          printf("Assento ocupado!\n");
        } else {
          strcat(aux_tags, TAG_PA_ABRE);
          strcat(aux_tags, passageiro);
          strcat(aux_tags, TAG_PA_FECHA);
          strcat(aux_tags, TAG_PO_FECHA);
    
          xml = aux_tags;
          printf("%-20s",xml);
    
          fseek(parquivo,0,SEEK_END);
          fwrite(xml,strlen(xml),1, parquivo);
        }
      }
    }
    
    int main()
    {
      abre_arquivo();
      cadastrar();
      fclose(parquivo);
      getch();
    
      return 0;
    }

    Obs.: eu não compilei este código, apenas digitei diretamente aqui na resposta do fórum! Teste e, caso exista algum problema, me avise!

  21. Porque a soma tem que ser feita em binário? Você pode apenas converter os números para um decimal e então realizar a soma em decimal. Seria mais simples!

    Para exibir em binário utilize a função abaixo:

    void ExibeBinario(unsigned long numero)
    {
       int shift=1;
    
       printf("Binario de %ld: ");
    
       while(numero>>shift)
          shift++;
    
       while(shift-->0)
          printf("%c", (numero>>shift)&1 ? '1' : '0');
    
       printf("\n");
    }

×
×
  • Criar Novo...