Ir para conteúdo
Fórum Script Brasil

vangodp

Membros
  • Total de itens

    883
  • Registro em

  • Última visita

Posts postados por vangodp

  1. Adaptando o código de Barão, te preparei esse exemplo:

    #include <stdio.h>
    
    int main () {
        int vetor_n[6];
        int i;
        
        printf ( "Digite os valores do vetor N:" );
        for ( i = 0; i < 3; i++ ) {
            scanf ( "%d", &vetor_n[i] );
        }
        
        printf("%d\n", vetor_n[0]);
        printf("%d\n", vetor_n[1]);
        printf("%d\n", vetor_n[2]);
        
        getchar();
        return 0;
    }
    

    Agora já pode por 3 inteiros de forma consecutiva separadas por espaços como você quer. O problema reside que só esta preparado para ler 3 enteiros, porem é facilmente modificável si assim desejar aumentando el valor 3 dentro do loop for, que é a condição de limite de execuções, para que execute mais vezes.

    Ao ler os dados mesmo que os separe por espacio, eles irão se armazenando no buffer de entrada como letras, é justo no memento que você pulsar enter que tudo o que esta no buffer se vaia "encaixando" no seu lugar, devido que scanf só lê até encontrar um espaço, tabulador ou a tecla enter, cada vez que o bucle se execute scanf vai vaziando o que esta entre espaço e espaço e o irá metendo no vetor.

    Também podemos modificar tudo isso para que quando escanf encontre por exemplo um valor como -1, queira dizer que queremos deter a toma de números, porem não sei si isso te interessa. A solução apresentada só lê um numero fixo de inteiros, e podemos querer ler uma quantidade variável de valores inteiros. Si precisar ler uma quantidade que varie avise, e o modificamos.

    A solução proposta serve para ambos problemas más si não servir para o primeiro comente aqui o faremos algo melhor. de todas formas você pode usar

    scanf("%d-%d", &n1, &n2); para ler 2 inteiros separados por '-' e é só trocar isso pelo espaço, ou outra letra qualquer.

    Sorte

  2. si usar un editor hexadecimal é possível ver o conteúdo da estrutura. Porem devemos ter em conta o alinhamento de bytes para essa tarefa já que vejo que envias a estrutura do tamanho de sizeof(suaEstrutura) . Isso pode ser complicado de entender si não sabe o que é o alinhamento de bytes em C/C++, busque informação sobre isso no google.

    Outra coisa a ter em mente é que não podemos quebrar nada em um arquivo binário porque ele é lineal, não se pode fazer:

    3

    NomeA 0 0 0 0 0 0
    NomeB 1 1 1 1 1 1
    NomeC 2 2 2 2 2 2

    Ele é:

    3NomeA 0 0 0 0 0 0NomeB 1 1 1 1 1 1NomeC 2 2 2 2 2 2-1 //<- O -1 é o EOF
  3. claro Fernanda! Felicidades, eres bastante intuitiva. Esses símbolos '%d', '%f', '%c'... entre muitos outros, se denominam especificadores de formato de escritura(printf), e os do scanf especificadores de formato para leitura. O que fazem é dar forma a um string para que se leia ou se escreva de forma desejada, porem eles também tem certas regras.

    Eu posso ter um flotante(real), más querer mostrar ele como inteiro(decimal). No caso da variável 'k' si você mostrar ela como %f, é como si estivesse fazendo um cast antes de mostrar, si não souber que é um cast, um cast é uma conversão entre tipos de dados, o problema esta em que não podemos fazer uma conversão de tipos de decimal a flotante para direções de memoria, porque pode existir uma direção 120006. O que nunca vai existir é uma direção 120006.32 já que, ou ela é 120006, ou ela é 120007, porem não existe meios termos quando se trata de direções de memoria, e por isso seu código falhava ao mostrar a direção como float(não permitido), mas não falhava ao mostrar a variável inteira como flotante, que nesse caso sim ta permitido, o compilador assume que é nossa responsabilidade tomar conta disso já que podemos que rer fazer isso já que como falei, esta permitido.

    Sobre a memoria, tudo ficará mais claro quando chegar no tema de ponteiros.

    Sobre os especificadores de formato de leitura ou escritura leia isso:

    http://pt.wikibooks.org/wiki/Programar_em_C/Entrada_e_sa%C3%ADda_simples#Especifica.C3.A7.C3.B5es_de_formato

    Tenha claro que não todos eles são compatíveis entre printf e scanf, alguns são só de scanf e outros só de printf, más eles não são só exclusivos de scanf e printf, algumas outras funções muito uteis também utilizam especificadores como fprintf() para imprimir em arquivos com formato, e sprintf() para formar strings desde varias variáveis. Logo estão suas versões de leitura fscanf e sscanf().

    Leia o tema recomendado e pratique com especificadores e formato de strings, si tiver duvidas Aqui esta o foro para isso.

    Sorte! :P

  4. Acho que falha por tentar imprimir as direções das variáveis como flotante nessa linha: printf("x%f=%f",&k,&x );

    com o operador '&' adiante de uma variável, estamos extraindo o local de memoria onde se encontra a variável e não o valor que guarda, essa direção é um numero decimal que se usa sim ou sim o modificador %d já que se trata de uma direção de memoria.

    Por outro lado si o que queremos é imprimir o valor de k e x não ponha '&' adiante de k nem de x. Recorde... printf("x%d=%d",&k,&x ); imprimem o local(direção), no qual se encontram as variáveis k e x, más devemos usar sempre %d ou vai dar erro. Para imprimir o valor de k e x como flotantes printf("x%f=%f",k,x ); faça sem '&' e com isso já podemos ver o resultado na tela.

    Esse erro nós entenderemos melhor quando chegar no tema de ponteiros.

    Para scanf continuar pondo '&' adiante das variáveis para ler tipos de dados básicos, com isso queremos dizer que ao ler um char por exemplo, esse char se guarde no lugar(direção) onde se encontra a nossa variavel na memoria.

    imagine que somos um carteiro, que entregamos pacotes :lol:, em uma rua muito comprida as casas esta numeradas. quando eu vejo '&' adiante de uma variavel isso se refere ao numero da casa que pertence o pacote, já o pacote não leva esse '&' vai sem, então imaginamos que scanf se chama entregar e não scanf, entregar("%c", &pacote) é como dizer, entregar pacote na casa numero X onde seja a residencia do pacote, esse x não devemos saber só devemos saber cuando nos referimos ao pacote 'pacote', ou a residencia do pacote '&pacote'. Isso é o que acontece no caso do scanf entregamos o pacote na casinha de memoria onde ele pertence, no caso do printf, podemos tanto querer saber onde esta o pacote printf("%c", &pacote), como podemos querer saber que tem dentro de esse pacote printf("%c", pacote) que é o que guarda.

    E com isso más ou menos já da para aguentar um pouco melhor até aprender o tema dos ponteiros. Tenha simplesmente claro que nós estamos lidando com a memoria em todo momento, a memoria ela é física por isso trabalhamos com direçoes, porque dependendo de onde a enviamos as coisas vam parar num lugar ou outro, podemos cometer erros, estamos programando todo o tempo enviando e recebendo a memoria, e que podemos querer saber coisas como, onde esta o dado, ou saber seu valor, isso é o que temos que ter claro, si tomamos uma variável envio ela ao local onde tenho que armazenar(incluir '&'), si vou mostrar valor esse valor então não ponho '&', já que não é onde guarda o que eu quero saber, e sim o que guarda.

    Prova fazer as reformas no seu código e comente aqui si o problema continua ;).

  5. Pois cara.. eu te ajudo, add eu ai pelo skype e falamos. Fica difícil eu explicar tudo aqui né?

    Si você quiser ajuda para melhorar realmente sua forma de programar, eu te estou oferecendo ajuda de bom agrado. Acha que te vai servir de ajuda si simplesmente eu 'maquiar' o seu código, ou você acha melhor eu te explicar onde é que estão os, e como você pode melhorar ele, etc.

    Si quiser que eu retoco ele, posso fazer isso em 30 minutos, más não sei em que isso vai te ajudar. Acho melhor explicar os erros e debater em tempo real os problemas que ficar de ping pong no forum.

    Espero sua resposta. Agora depende de si realmente você quer ou não receber ajuda. La no skype me chamo igual.

    Em uma tarde você pode ficar afinado no tema de arquivos, não é brincadeira.

  6. Esse código tem vários erros, começando pelo erro que comenta Gender, sobre como limpar o buffer corretamente, até mesmo a forma de abrir os arquivos sem fazer uso da função perror para controlar as excepções ou erros que podem aparecer durante a abertura do arquivo, passando também por erros de reaproveitar o mesmo ponteiro 'arquivo' para abrir un novo documento, sem ter fechado previamente o arquivo anterior usando fclose(arquivo), isso faz con que não surta mudanças no arquivo que é quando fechamos o arquivo que são aplicadas. Esse erro esta na linha arquivo = fopen ( "dados.txt", "w" ); logo após a linha } while ( soun == 'n' ); dentro da função cadastrar. Em nenhum momento você fechou o file descriptor antes de reaproveitar o ele.

    A coisa não termina ai... Outro erro grave é você tentar enviar a estrutura completa ao arquivo, quando na realidade deveria enviar os dados serializados, um a um, ao arquivo, caso contrario o alinhamento dos Bytes te vai dar uma dor de cabeça muito grande. Busque informação sobre Byte Aligne o alinhamento dos Bytes em C/C++. Busque também "space padding"

    Faz pouco eu escrevi algo sobre isso aqui mesmo nesse foro, más como a todos não interessa ler coisas dos outros usuários sempre van chocar com o problema para depois buscar solução. Leia aqui sobre o problema:

    https://www.scriptbrasil.com.br/forum/topic/179264-ajuda-com-programa-de-agenda-em-c/

    Em fim... Esse código é uma boa coleção de bugs, provavelmente devido a que realmente alguns temas são bastante avançados, ou o professor não ta sabendo explicar nada direito. Sem falar dessas chamadas a main que você faz durante todo seu código.

    Sinto ser duro, más é que você nem pois o código direito no foro, use a etiqueta code para dar formato ao código. Si não como eu te vou dizer em que linhas você esta errando? Mesmo assim você esta errando em tudo, precisaria mil linhas para ti explicar tudo isso direito, e ainda o fato de publicar o código sem as etiquetas não ajuda.

    Coisas como informação do sistema operativo, arquitetura, compilador, IDE, etc, não são opções, são dados importantes na hora de acelerar a ajuda nos foros.

    Se você quiser marcar um dia por skype posso te ajudar a reformular seu projeto de forma correta, más depende de vc. Em skype eu me chamo igual.

    Sorte.

  7. #include <stdio.h>
    #include <stdlib.h>
    
    int main () {
        
        int numeroSalgadinhosConsumidos = 0;
        float total = 0; 
        float valorSalgadinho;
    
        printf ( "Valor do Salgadinho: R$ 1,50\n" );
        valorSalgadinho = 1.50;
        
        
        printf ( "Por Favor, digite quantas unidade de cada produto foi consumido:\n" );
        printf ( "Salgadinho:\n" );
        scanf ( "%d", &numeroSalgadinhosConsumidos );
    
        printf ( "Valor Total\n" );
        total = ( valorSalgadinho * numeroSalgadinhosConsumidos );
        
        printf("Sua conta ascende a: %2.2f R$\n\n", total);
        
        
        
        system ( "PAUSE" );
        
        getchar();
        return 0;
    }
    

    si precisar somar más coisas sempre será numero de coisas multiplicado por valor, e o resultado se soma a total e se volta a guardar nele mesmo.

    Un exemplo é al agregar um segundo produto(CocaCola por exemplo):

    #include <stdio.h>
    #include <stdlib.h>
    
    int main () {
        
        float total = 0; 
        //salgadinhos
        int numeroSalgadinhosConsumidos = 0;
        float valorSalgadinho;
    
        //CocaColas
        float ValorCocaCola = 0;
        int nCocaColas = 0;
        
        printf ( "Valor do Salgadinho: R$ 1,50\n" );
        valorSalgadinho = 1.50;
        
        
        printf ( "Por Favor, digite quantas unidade de cada produto foi consumido:\n" );
        printf ( "Salgadinho:\n" );
        scanf ( "%d", &numeroSalgadinhosConsumidos );
    
        printf ( "Valor Total\n" );
        total = ( valorSalgadinho * numeroSalgadinhosConsumidos );
        
        printf("Sua conta ascende a: %2.2f R$\n\n", total);
    
        system ( "PAUSE" );
        //Agora cocacola
        system("cls");
        printf ( "Valor da Coca Cola: R$ 1,00\n" );
        ValorCocaCola = 1.00;
        
        
        printf ( "Por Favor, digite quantas unidade de cada produto foi consumido:\n" );
        printf ( "Coca Cola/s:\n" );
        scanf ( "%d", &nCocaColas );
    
        printf ( "Valor Total\n" );
        total = total + ( ValorCocaCola * nCocaColas);
        
        printf("Sua conta ascende a: %2.2f R$\n\n", total);        
        
        system ( "PAUSE" );
        
        getchar();
        return 0;
    }
    

    Normalmente esse programa pode ser tão complexo como um programa funcional. Eu só sigo seu ritmo, más si quiser algo más elaborado é só falar =D. Podemos usar estruturas funções etc.

    É isso ai, essa é a atitude.. Não desista. ;) B)

  8.     cout << "Entre com o nome do arquivo: "; //nome do arquivo que o usuário quer abrir
        cin >> nomearquivo;
        cout << endl;
        
        nomearquivo = nomearquivo+".txt";
        ifstream arquivo(nomearquivo);
     

    si não funcionar ifstream arquivo (nomearquivo); prove

       ifstream arquivo (nomearquivo.c_str());

    Ou diretamente:

        cout << "Entre com o nome do arquivo: "; //nome do arquivo que o usuário quer abrir
        cin >> nomearquivo;
        cout << endl;
        
       ifstream arquivo( (nomearquivo+".txt").c_str() );

    Alguma dessas funciona seguro.

  9. #include <iostream>
    #include <windows.h>
    #include <conio.h>
    using namespace std;
    
    void gotoxy ( int x, int y ) {
        HANDLE hcon;
        hcon = GetStdHandle ( STD_OUTPUT_HANDLE );
        COORD dwPos;
        dwPos.X = x;
        dwPos.Y = y;
        SetConsoleCursorPosition ( hcon, dwPos );
    }
    
    int main () {
        char mapa[16][17] = {
            {"                "},
            {"                "},
            {"                "},
            {"                "},
            {"                "},
            {"                "},
            {"                "},
            {"                "},
            {"                "},
            {"                "},
            {"                "},
            {"                "},
            {"                "},
            {"                "},
            {"                "},
            {"                "}
    
        };
        
        
        for ( int y = 0; y < 16; y++ ) {
            for ( int x = 0; x < 16; x++ ) {
                cout << mapa[y][x];
            }
            cout << endl;
        }
        
        int x = 0;
        int y = 0;
        int cx = 0;
        int cy = 0;
        
        //inicia em:
        gotoxy ( 0, 0 );
        printf ( "Z" );
        
        int ch;
        while ( ( ch = _getch() ) ) {
            if ( ch == 27 ) {
                return 0;
            }
            if ( ch == 72 ) {
                //ACIMA
                if ( y > 0 ) {
                    gotoxy ( x, y );
                    printf ( " " );
                    y--;
                    gotoxy ( x, y );
                    printf ( "Z" );
                }
                
            } else if ( ch == 75 ) {
                //ESQUERDA
                if ( x > 0 ) {
                    gotoxy ( x, y );
                    printf ( " " );
                    x--;
                    gotoxy ( x, y );
                    printf ( "Z" );
                }
                
            } else if ( ch == 77 ) {
                //DIREITA
                if ( x <= 15 ) {
                    gotoxy ( x, y );
                    printf ( " " );
                    x++;
                    gotoxy ( x, y );
                    printf ( "Z" );
                }
                
                
            } else if ( ch == 80 ) {
                //ABAIXO
                if ( y <= 15 ) {
                    gotoxy ( x, y );
                    printf ( " " );
                    y++;
                    gotoxy ( x, y );
                    printf ( "Z" );
                }
                
            } else {
                gotoxy ( x, y );
                printf ( " " );
                cx = x;
                cy = y;
                gotoxy ( x, y );
                printf ( "Z" );
                x = cx;
                y = cy;
            }
            
        }
        
        cin.ignore();
        return 0;
    }
    
    
  10. Acho que deveria de dar uma olhada aqui: #2 já teve um usuário com o mesmo problema.

    Nesse link comento uma coisa muito importante antes de entrar no tema dos arquivos que é o Byte aligne.

    E também tem a forma de escrever no arquivo que estas buscando.

    De esse exercício saiu esta solução que apesar de estar um 95% em C, contem cosas de C++ como referencias.

    #include <stdio.h>
    #include <ctype.h>   // para tolower
    
    
    FILE* fileManager(){
        FILE* arquivo;
        char modo;  //opção
        char* nomeArquivo = "prova.txt";
        
        printf("Escolha um modo para abrir o arquivo \n\nG-Escritura \nL-Leitura \nA-Anexão \n\n?: ");
        scanf("%c%*c", &modo);
        modo = tolower(modo); //<-pasamos a minuscula 
        
        switch ( modo ) { //Vai verificar o modo
            case 'g':
                //G - É para gravação,o parametro wt
                arquivo = fopen ( nomeArquivo, "wt" ); //Só permite escrever no arquivo, borra conteudo anterior
                break;
                
            case 'l':
                //l - É para leitura  do texto
                arquivo = fopen ( nomeArquivo, "r" ); //modo leitura, no hace falta poner t, por default ja é t, si nao por b(binario), começa do principio.
                break;
                
            case 'a':
                //A- É para append(anexação)
                arquivo = fopen ( nomeArquivo, "a" ); //Modo Anexar só permite escrever ao fin do arquivo, nao importa si tentar mover o descriptor de arquivo, sempre vai anexar ao fin evitando borrar conteudo.
                break;
        }
        
    
        if ( arquivo == NULL ) { //A diretiva NULL em letras maiusculas,é quando a pontar para o espaço da memoria NULO,ou NULL,caso o arquivo não exista
            perror("Desculpe! "); //<-importante para saber que tipo de erro tivemos ao tentar abrir
            
            //fazemos uma pausa
            printf("\nPulse uma tecla para continuar...");
            scanf("%*c");
            
            //como nao conseguimos abrir o arquivo retornamos NULL que no apunta a nada.
            return NULL;
        }else{  
            //Si conseguimos abrir informamos do exito.
            printf("O arquivo %s esta aberto em modo %s\n", nomeArquivo, (modo=='g')? "gravação.":(modo=='a')? "anexão.": "leitura."  );
        }
        
        //Si chegamos aqui é por que o arquivo esta aberto e agora retornamos ele como foi pedido.
        return arquivo;
    }//FIN fileManager
    
    void finalizar ( FILE *arquivo ) { //Está função vai fechar o arquivo
        fclose ( arquivo );
    }//FIN finalizar
    
    
    //////MAIN////////
    int main() {
        FILE* arquivo = fileManager(); //a variavel arquivo recebe o ponteiro ao arquivo.
    
        if( arquivo == NULL ){
            return 1; // si o programa retornar 1 é por que nao abrio o arquivo nao temos por que fechar ele, saimos aqui mesmo.
        }
    
    
        finalizar(arquivo); // si passou pela comprovaçao anterior é preciso fechar o arquivo antes de sair ja que nao vamos fazer mais nada.
        return 0;
    }//FIN MAIN
    
    

    com algo de mudanças acho que você pode adaptar ele perfeitamente a suas necessidades.

    O programa le um nome, telefone particular e celular e um email.

    Ele pode tomar dados de um contato e guardar ele no arquivo, pode listar todo o arquivo na tela, pode borrar um contato do arquivo, pode ordenar o arquivo limpando dos contatos eliminados etc etc.

    cada função é independente da outra, uma guarda, outra lê, outra, limpa tela, outra lista, outra organiza......

    Guarda ele como .cpp e veja como funciona.

  11. não precisa estar em C++. Porem si você esta aprendendo C++ essa não é a forma estândar de fazê-lo em C++, essa forma pertence a C.

    Não tem problema usar, mesmo sendo de C, tudo depende de muitos fatores, C++ contem uma melhor gestão para os streams, por isso é melhor usar a forma de C++ si estiver em C++. Outro fator por exemplo é si nós estamos trabalhando num grupo de programadores, todos devem se por de acordo de que forma vão trabalhar, pelo que sempre é bom conhecer as duas formas padrões.

    Si é para sigo mesmo, sem intervenções externas de preferencias, acho que fica ao critério do próprio programador usar ou não uma ou outra forma conforme seu gosto.

    Deixo um exemplo funcional ligeiramente adaptado para manejo de excepções.

    #include <stdio.h>
    #include <ctype.h>   // para tolower
    
    
    FILE* fileManager(){
        FILE* arquivo;
        char modo;  //opção
        char* nomeArquivo = "prova.txt";
        
        printf("Escolha um modo para abrir o arquivo \n\nG-Escritura \nL-Leitura \nA-Anexão \n\n?: ");
        scanf("%c%*c", &modo);
        modo = tolower(modo); //<-pasamos a minuscula 
        
        switch ( modo ) { //Vai verificar o modo
            case 'g':
                //G - É para gravação,o parametro wt
                arquivo = fopen ( nomeArquivo, "wt" ); //Só permite escrever no arquivo, borra conteudo anterior
                break;
                
            case 'l':
                //l - É para leitura  do texto
                arquivo = fopen ( nomeArquivo, "r" ); //modo leitura, no hace falta poner t, por default já é t, si não por b(binario), começa do principio.
                break;
                
            case 'a':
                //A- É para append(anexação)
                arquivo = fopen ( nomeArquivo, "a" ); //Modo Anexar só permite escrever ao fin do arquivo, não importa si tentar mover o descriptor de arquivo, sempre vai anexar ao fin evitando borrar conteudo.
                break;
        }
        
    
        if ( arquivo == NULL ) { //A diretiva NULL em letras maiusculas,é quando a pontar para o espaço da memoria NULO,ou NULL,caso o arquivo não exista
            perror("Desculpe! "); //<-importante para saber que tipo de erro tivemos ao tentar abrir
            
            //fazemos uma pausa
            printf("\nPulse uma tecla para continuar...");
            scanf("%*c");
            
            //como não conseguimos abrir o arquivo retornamos NULL que no apunta a nada.
            return NULL;
        }else{  
            //Si conseguimos abrir informamos do exito.
            printf("O arquivo %s esta aberto em modo %s\n", nomeArquivo, (modo=='g')? "gravação.":(modo=='a')? "anexão.": "leitura."  );
        }
        
        //Si chegamos aqui é por que o arquivo esta aberto e agora retornamos ele como foi pedido.
        return arquivo;
    }//FIN fileManager
    
    void finalizar ( FILE *arquivo ) { //Está função vai fechar o arquivo
        fclose ( arquivo );
    }//FIN finalizar
    
    
    //////MAIN////////
    int main() {
        FILE* arquivo = fileManager(); //a variavel arquivo recebe o ponteiro ao arquivo.
    
        if( arquivo == NULL ){
            return 1; // si o programa retornar 1 é por que não abrio o arquivo não temos por que fechar ele, saimos aqui mesmo.
        }
    
    
        finalizar(arquivo); // si passou pela comprovaçao anterior é preciso fechar o arquivo antes de sair já que não vamos fazer mais nada.
        return 0;
    }//FIN MAIN
    
  12. //LINGUAGEM C
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    void flush_in() {
        int ch;
        
        while ( ( ch = fgetc ( stdin ) ) != EOF && ch != '\n' ) {}
    }
    
    int main ( int argc, char **argv ) {
    
        int i = 0;
        char letras [ ] = "abcde";
        int tam = sizeof(letras)/sizeof(letras[0]);
        char* entrada = (char*) calloc( tam, sizeof(letras[0]) );
        
    
        printf ( "Entre com a String: " );
        fgets ( entrada , tam, stdin);
        flush_in(); //chamar esa funçao antes de ler chars e strings. é a melhor forma de limpar o buffer que existe.
        
        for ( i = 0; i<tam-1; i++  ){
            if ( tolower(entrada[i]) == tolower(letras[i]) ){
                printf("%d\n", i+1);
            }else{
                printf("%d\n", 0);
            }
        }
    
        free(entrada);
        return 0;
    }
    

    Para esse programa não importa si é maiúscula ou minuscula assim você evita ter letra e LETRA, tudo é automático, si envés de char letras [ ] = "abcde"; você por char letras [ ] = "abcdefghij"; o programa só vai aceitar a mesma quantidade de letras, e o loop que as compara vai ficar configurado automaticamente para se executar a mesma quantidade de vezes.

    :ninja:

    Sorte!

×
×
  • Criar Novo...