Ir para conteúdo
Fórum Script Brasil

vangodp

Membros
  • Total de itens

    883
  • Registro em

  • Última visita

Posts postados por vangodp

  1. A combinação de teclas Ctrl+c = copiar e Ctrl+v pegar.

    Ctrl+x cortar.

    Selecione todo o texto e pegue aqui escolhendo esse botão chamado código que tem essa aparência: <>. Pegue o código aí num quadro que vai sair e tudo pronto.

    Ele vai ficar assim:

    #include <stdio.h>
    int main (void){
        printf("Alo mundo");
        return 0;
    }
    
  2. #include <stdio.h>
    int main (void){
        int vet[] = {10,11,12,13,14,15,16,17,18,19,20};
        int i;
        for (i = sizeof(vet)/sizeof(vet[0]); i >= 0; i--)
        {
            if (vet[i] % 2 == 0)
                printf ("%d\n", vet[i]);
        }
        
        return 0;
    }
    

    O int que serve de indice i no linguagem C tem que ser declarado fora do loop for, e não levar ponto e coma depois de for e antes da chave de abertura do corpo.

    Acima um exemplo valido.

  3. scanf lê até encontrar espaço' ', ou um tabulador'\t' e por ultimo um enter'\n'.

    Si escrevemos "alo mundo" e pulsar enter, no buffer a coisa fica assim: "'a','l','o',' ','m','u','n','d','o','\n'". Então nesse caso temos 2 coisas que "quebram" a frase, um espaço e um enter( ' ' e '\n' ).

    O \n ele é um char valido igual que outro qualquer, ele esta na tabela asc2, e tem um valor 10 em decimal e ele ainda tem mais uma qualidade diante de scanf, ele é o encargado de vaziar o buffer.

    Scanf vai acumulando letras até encontrar o scanf que é como si fosse um aviso de ir liberando tudo o que ta acumulado nas seguintes variáveis que ele vai encontrando, más seguindo as regras que antes falei sobre que ele vai liberando elas dependendo si encontra espaço, tabulador ou o mesmo enter.

    Então vamos ver exemplos

    si tenho char frase[100]; e char outraFrase[100]; e faço uma leitura com scanf ("%s", frase); e que nesse momento nós escrevemos "alo mundo" e pulsamos enter, o scanf vai por tudo isso no buffer, ficando "alo mundo\n", logo depois ele vai ver o \n e não vai descansar até que o buffer esteja vazia, tudo da seguinte forma:

    1º ele vai pegar as letras até que encontra um espaço, tabulador ou enter, isso é começando pelo inicio de la primeira letra 'a' de "alo", ele vai checando letra a tetra ate encontrar os caracteres' ', '\t' e '\n', obviamente logo depois de 'o' de "alo" tem um espaço, então ai o buffer mete a tesoura e "corta" "alo" e o envia a primeira variavel compativel que encontrar que nesse caso é frase, agora o buffer tem "mundo\n", más scanf já não tem + variáveis compativeis com strings para meter o resto, isso não significa que a coisa vai parar ai, pois o buffer tem que ser vaziado completamente e de forma correta si ainda resta um string, tem que esperar outro scanf com outro string.

    Então mais abaixo queremos ler outra frase com scanf, ai temos scanf ("%s", outraFrase); que pedimos bunitinha outra frase, e para nossa surpresa descobrimos que o programa passou direto pelo scanf e nem leu nada, mas isso foi por que como o buffer ainda tinha lá "mundo\n" e esta ainda com o \n que esta dizendo que tudo saia do buffer, ele nem vai esperar, ele vai meter o mundo+\n tudo ai essa segunda variável por você.

    Então vamos ver uns exemplos:

    #include <stdio.h>
    
    int main(){
        
        char f[100];  //frase
        char of[100]; //otra frase
        
        printf("Escreva uma frase: ");
        scanf("%s", f);
        
        printf("Escreva outra frase: ");
        scanf("%s", of);   //<- vai pasar direto por aqui nem vai parar, más of vai ganhar "mundo" igualmente 
        
    
        printf("\n\nfrase: %s\n", f);
        printf("Outra frase preenchida automaticamente: %s\n", of);    
        
        printf("\nAdeus..\n");
        return 0;
    }
    

    Depois de escrever alo mundo olhe como f ganha "alo" e of ganha "mundo".

    Outro exemplo com chars:

    Nesse exemplo escolha uma letra e pulse enter para ver como enter se mete em c2. Al imprimir c2 como inteiro podemos ver um valor de 10 em decimal que você pode buscar ele aqui: http://pt.wikipedia.org/wiki/ASCIIna parte de sinais não imprimíveis.

    #include <stdio.h>
    
    int main(){
    
        char c1; 
        char c2;
        
        printf("Escreva uma letra: ");
        scanf("%c", &c1);
        
        printf("Escreva outra letra: ");
        scanf("%c", &c2);   //<- vai pasar direto por aqui nem vai parar, más c2 vai ganhar o caracter enter igualmente, pois ele tambem é uma letra. 
        
    
        printf("\n\nLetra c1: %c\n", c1);
        printf("Letra c2: %d <- isso aqui é o enter imprimido como inteiro %%d, assim vc pode comparar ele na tabela asc2 e var que ele vale 10\n", c2);    
        
        
        printf ("\n\nBusque em: http://pt.wikipedia.org/wiki/ASCII a tabela asc2, na parte de Sinais de controle(não- imprimiveis)\n");
        return 0;
    }
    
    

    Existem letras que não são visíveis como letra, más todas são visíveis como inteiros.

    Que fique constância que isso não é um erro de scanf nem muito menos. O scanf trabalha de forma correta somos nós que falhamos sempre como programadores, e agora vou explicar com um exemplo:

    #include <stdio.h>
    
    int main(){
    
        char nome[100];
        char sobrenome[100];
        
        printf("Escreva nome e sobrenome separados por espaço. Exemplo: \"Jose freitas\"\n");
        scanf("%s %s", nome, sobrenome);
        
        printf("\n%s %s\n\n", nome, sobrenome);
    
        return 0;
    }
    

    Outro exemplo:

    #include <stdio.h>
    
    int main(){
    
        int dia;
        int mes;
        int ano;
        printf("Escreva uma data composta de dia, mes e ano separadas por '/': exemplo\"24/07/2015\"\n");
        scanf("%d/%d/%d", &dia, &mes, &ano);
        
        printf("dia: %d mes: %d ano: %d", dia, mes, ano);
    
        return 0;
    }
    

    Como podemos ver scanf é uma função muito útil uma vez aprendemos a trabalhar com ela.

    Como solucionar o problema?

    existem muitas formas de resolver esse problema. Podemos limpar buffer ou evitar que entre a ultima tecla pulsada ao buffer com %*c. vamos ver um exemplo:

    #include <stdio.h>
    
    int main(){
        char c1;
        char c2;
        
        printf("Escreva uma letra: ");
        scanf("%c%*c", &c1);
        
        printf("Escreva outra letra: ");
        scanf("%c%*c", &c2);   //<- agora aqui vai ler corretamente a causa de %*c evita que a ultima tecla pulsada entre al buffer 
        
        printf("\n\nLetra c1: %c\n", c1);
        printf("Letra c2: %c \n", c2);    
        
        return 0;
    }
    

    Como pode ver existe formas de evitar esse erro. Busque sobre como limpar o buffer entrada pero no use fflush com strings, existe más de una forma de faze-lo, investiga um poco. http://forum.imasters.com.br/topic/336835-tutorial-systempause-e-fflushstdin/

    Acho que já esta explicado, depende de você investigar sobre o tema de buffer, scanf, especificadores de formato tanto em printf como scanf, tabela asc2... etc etc.

    Sorte!

    PD: nesse mesmo forum encontrei um exemplo de por que você não deve usar fflush ainda que te digam que sim:

    https://www.scriptbrasil.com.br/forum/topic/164704-resolvendo-problemas-de-buffer/

    Preste atenção ao comentário de axell13 que explica por que não usar fflush e sugere uma alternativa para limpar o buffer sem problemas.

  4. <script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

    Obrigado, foi de grande ajuda, eu não muito bom em programação e meu código tá meio bagunçado mesmo, a lógico dele é pra interagir com o usuário, pedindo pra ele digitar os dados e guarda-los no programa, você consegue fazer o código dessa maneira pra mim ver?

    Podemos entrar em contato por chat(skype ou outros) para que possa te ajudar no que você quiser, não tem problema.

    No skype eu chamo igual. Esa noite eu estaria aqui na net.

  5. Normalmente não se deve borrar dados de uma base de dados, basta com por alguma marca diante que diga que esse usuário esta excluído da lista, por exemplo:

    usuario ativo:

    nome sobrenome 999222333 nome@sobrenome.com

    Repare que tem um espaço em branco antes do nome. Nesse caso si não tem marca o usuario estaria ativo.

    Para indicar que ele esta excluído da lista basta por algo na frente como '*'. Ficando da seguinte forma:

    *nome sobrenome 999222333 nome@sobrenome.com

    Então si você tiver que listar os dados, esses com simbolo '*' adiante não se mostram. É convenhamos algo, não é bom borrar nenhum usuário já que pode servir para algo más adiante, para alguma especie de controle o consulta, algo assim.

    Então é só mudar a estrutura:

    typedef struct Agenda
    {
            char nome[50];
            char fone[20];
            char fonecelular[20];
            char email[80];
    }T_agenda;

    ... Por:

    typedef struct Agenda
    {
            char excluido; //incluir isso para armazenar o '*'
            char nome[50];
            char fone[20];
            char fonecelular[20];
            char email[80];
    }T_agenda;

    Também você esta passando algo muito más importante por alto no seu código.

    Quando você usar sizeof para ler o tamanho da estrutura para fwrite, a estrutura pode variar de um computador a outro. WTF!!. Isso acontece por causa do Byte align ou alinhamento de Bytes.

    você pode executar esse código que eu vou por a continuação e comprovar nele que eu tenho uma estrutura que contem um char+um int+um double, supondo que char tem um tamanho de 1Byte, um int 4Bytes e um double tem 8Bytes(pode ser diferente dependendo de vários fatores). Si somamos 1+4+8 é igual a 13Bytes não é? NAAAUMMM... É mais!!! Comprova.

    #include<stdio.h>
    #include<stdlib.h>
    
    struct _estrutura{
    	char c;
    	int n;
    	double d;
    };
    
    
    int main(){
    	struct _estrutura s;
    	printf ( "%d", sizeof( s ) ); 
    
    	return 0;
    }
    

    Percebemos que o valor é mais alto que a soma dos 3 juntos(pode imprimir os 3 por separados para comprovar). Isso porque? Pelo alinhamento de Bytes! Byte Align altera alguns dados inflando eles para optimizar o rendimento do programa. Qual o problema então, más optimizado melhor não é? Depende! Melhor é, o problema é que cada compilador faz sua optimização dependendo de vários fatores como arquitetura do PC, versão e ajustes de compilador e sei la más que regras.

    Vai ser bonito que você tire um fim de semana inteiro preparando um programa, e quando você chegar la na sala do profes e você se dar conta que a po**a do programa não funciona, e que você tirou um fim de semana inteiro fazendo a me**a do programa, e agora ele não funciona, e você nem sabe por que di***s isso acontece... hahah

    Busca no Google faça um favor: "Alinhamento de Bytes em C" ou C++ como quiser. Arranje um bom articulo para ler sobre isso e entender o que eu estou falando.

    E ainda tem mais...

    se você guardar essa estrutura num arquivo você esta desperdiçando memoria. Se o zé ruela se chamar nome: Zé sobrenome: Ruela, para o nome você reservou 50 caráteres, no arquivo você vai ver a coisa assim:

    "Zé :P Ruela"... Não é melhor si fosse assim: "Zé Ruela"??? pois isso você consegue melhor escrevendo o arquivo com fprintf e lendo com fscanf (Só si for texto plano!). Si for binário melhor seguir com fwrite e fread.

    Vou demostrar o que eu estou falando com um exemplo:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    struct Dados{
    	char excluido;
    	char nome[50];
    	char sobrenome[50];
    	int edade;
    };
    
    
    int main(){
    	FILE* f;
    	f = fopen( "data.txt", "w+" );
    	if ( f == 0 ){
    		return 1;
    	}
    	//recheio de dados express XD
    	Dados d[5] ={
    		{ '\0', "Marco", "Antonio", 27},
    		{  '*', "Maria", "Dolores", 67}, //Maria Dolores se va a gravar no arquivo más não se vai imprimir por que tem a marca * diante do seu nome.
    		{ '\0', "Edvan", "Menezes", 43},
    		{ '\0', "Paulo", "Augusto", 28},
    		{ '\0', "Lurdes","Aquilar", 33},
    	};
    
    	//gravando
    	for ( int i = 0; i<5; i++ ){
    		fprintf( f, "%c %s %s %d\n",d[i].excluido, d[i].nome, d[i].sobrenome, d[i].edade );
    	}
    	fclose(f);
    	
    	
    	//ato seguinte é ler da mesma forma
    	f = fopen( "data.txt", "r" ); //modo só de leitura
    	if ( f == 0 ){
    		return 2;
    	}
    	//outra estrutura diferente para guardar desde o arquivo.
    	Dados d2[5] = {0};
    	
    	//lemos todas as linhas
    	for ( int i = 0; i<5; i++ ){
    		fscanf( f, "%c %s %s %d%*c",&d2[i].excluido, d2[i].nome, d2[i].sobrenome, &d2[i].edade );
    		//só imprimimos o cliente si não tiver a marca '*' que indica que esta excluido da lista de clientes.
    		if ( d2[i].excluido != '*' ){
    			printf("%c %s %s %d\n",d2[i].excluido, d2[i].nome, d2[i].sobrenome, d2[i].edade );
    		}
    	}	
    	fclose(f);
    	
    	printf("Observe como maria dolores não esta incluida na lista devido a que tem a marca '*' de excluida.");
    	
    	getchar();
    	return 0;
    }
    

    Essa criatura aqui é melhor que essa outra a continuação:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    struct Dados{
    	char excluido;
    	char nome[50];
    	char sobrenome[50];
    	int edade;
    };
    
    
    int main(){
    	FILE* f;
    	f = fopen( "data.txt", "w+" );
    	if ( f == 0 ){
    		return 1;
    	}
    	//recheio de dados express XD
    	Dados d[5] ={
    		{ '\0', "Marco", "Antonio", 27},
    		{  '*', "Maria", "Dolores", 67}, //Maria Dolores se va a gravar no arquivo más não se vai imprimir por que tem a marca * diante do seu nome.
    		{ '\0', "Edvan", "Menezes", 43},
    		{ '\0', "Paulo", "Augusto", 28},
    		{ '\0', "Lurdes","Aquilar", 33},
    	};
    
    	//gravando
    	for ( int i = 0; i<5; i++ ){
    		fwrite( &d[i], sizeof(struct Dados), 1, f);
    	}
    	fclose(f);
    	
    	
    	//ato seguinte é ler da mesma forma
    	f = fopen( "data.txt", "r" ); //modo só de leitura
    	if ( f == 0 ){
    		return 2;
    	}
    	//outra estrutura diferente para guardar desde o arquivo.
    	Dados d2[5] = {0};
    	
    	//lemos todas as linhas
    	for ( int i = 0; i<5; i++ ){
    		fread( &d2[i], sizeof(struct Dados), 1, f);
    		//só imprimimos o cliente si não tiver a marca '*' que indica que esta excluido da lista de clientes.
    		if ( d2[i].excluido != '*' ){
    			printf("%c %s %s %d\n",d2[i].excluido, d2[i].nome, d2[i].sobrenome, d2[i].edade );
    		}
    	}	
    	fclose(f);
    	
    	
    	
    	getchar();
    	return 0;
    }
    

    Da primeira forma você se livra de 2 problemas de uma só tacada. 1ºSem problemas de (sorte) por causa do Byte Align, e 2º o arquivo fica muito melhor organizado. Veja a diferença entre os 2 na forma em que se organizam nos seus arquivos, um esta bem compacto é o outro desperdiça memoria em disco.

    Ainda tem muitos más problemas no seu código... É horrível que alguém ainda use getch no seu código... Uma função do já extinto Juracic Borland? Isso não favorece a criação de programas portáveis.

    O ideal mesmo é você trabalhar com streams em vez do sistema de arquivos de C. C++ tem melhores mecanismos para streams com fstream más é questao de gosto, uns são puristas, e outros não lhes importa misturar C com C++(Depende do seu chefe XD).

    Espero que tudo isso que eu falei te sirva de alguma coisa. Te desejo sorte.
    Se precisar de más ajuda aqui estamos para auxiliar na medida do possível.

  6. #include<stdlib.h>
    #include<stdio.h>
    #include<locale.h>
    
    int** aloca ( int LINHAS, int COLUNAS );
    void liberaEspaco ( int** matriz, int LINHAS );
    
    int main() {
    
        setlocale ( LC_ALL, "portuguese" );
        
        int i = 0, j = 0, m, n;
        
        printf ( "Informe o número de linhas que deseja em sua matriz:" );
        scanf ( "%d", &m );
        printf ( "Informe o número de colunas que deseja em sua matriz:" );
        scanf ( "%d", &n );
        
        int** matriz = aloca ( /*linhas*/m, /*por colunas*/n );
        
        for ( i = 0; i < m; i++ ) {
            for ( j = 0; j < n; j++ ) {
                printf ( "Matriz[%d][%d]:", i, j );
                scanf ( "%d", &matriz[i][j] );
            }
        }
        
        printf("\n");
        for ( i = 0; i < m; i++ ) {
            for ( j = 0; j < n; j++ ) {
                printf ( "M[%d][%d]= %d\n", i, j, matriz[i][j] );
            }
            printf("\n");
        }
        liberaEspaco ( matriz, /*linhas*/m );
        
        
        system ( "pause" );
        return 0;
    }
    
    int** aloca ( int LINHAS, int COLUNAS ) {
        int i;
        int** matriz = ( int** ) malloc ( LINHAS*sizeof(int) );
        for (i=0;i<LINHAS;i++){
            matriz[i] = (int*) malloc (COLUNAS*sizeof(int));
        }
        return matriz; 
    }
    
    void liberaEspaco ( int** matriz, int LINHAS ) {
        int i;
        for (i=0;i<LINHAS;i++){
            free ( matriz[i] );
        }
        free(matriz);
    }
    
  7. Acho que a melhor forma seria usando memoria dinâmica:

    #include <stdio.h>
    #include <string.h>
     
    char* printnome(char nome[100]) {
        char* p = malloc( sizeof(char)*100+1 );
        if(p == NULL) return NULL;
        sprintf(p, "Seja bem-vindo, %s!", nome );
        return p;
    }
     
    int main() {
      char nome[100];
      strcpy(nome, "CEAD");
      char* p = printnome(nome);
      printf("%s", p);
      
      free(p);
      return 0;
    }
    

    :unsure:

  8. pelo menos diga o limguagem, que mania.

    //Para C
    #include <stdio.h>
    
    int main () {
    
        char nome[20] = "meuArquivo";
        char tipo[5] = "txt";
        char arquivo[20 + 5];
        sprintf ( arquivo, "%s.%s", nome, tipo ); 
        printf ("%s", arquivo);
    
        return 0;
    }
    
    //Para C++
    #include<iostream>
    #include <sstream>
    using namespace std;
    
    int main() {
        stringstream ss;
        
        string nome = "meuAquivo";
        string tipo = "txt";
        
        ss << nome << "." << tipo;
        
        cout << ss.str() << endl;
        
        //tambem pode guardar em um string
        string arqivo = ss.str();
        cout << arqivo << endl;
        
        //ou fazer:
        string outroArquivo = nome + '.' + tipo;
        cout << outroArquivo << endl;
        
        
        return 0 ;
    }
    

    Como ve.. C++ tem melhor gestao de cadenas de caracteres. Por isso é melhor você especificar o linguagem quando expor uma duvida.

    Agora é só você seguir o modelo e adaptar ele ao que você precisa, (scanf, cin...etc).

    Sorte!

    ;)

  9. você pode usar um gestor de cenas e tambem automatas de estado finito.

    Acho que o proprio é o gestor de cenas"scene manager"(muito utilizado en games), você imagina que tudo no seo jogo são cenas, a tela de apresentaçao, os menús, cada nivel do jogo etc etc. você precisa de um gestor que te ajude a mudar de cena en cada momento.

    você não falou a linguagen, más si fosse C++ você pode fazer uma clase chamada cena e logo depois outra que é gestor_de_cena que se encarga de mudar de nivel para você.

    Claro que falando parece facil, realmente a teoria é, o problema vem quando queremos transladar o conceito ao nosso jogo, aí o bicho pega.

    você podia nos contar más sobre ese jogo, subir o source dizer que bibliotecas utilizas, limguagem etc etc, assim podemos fazer más por você na medida do possivel, já que o tema de jogos é bastante complexo.

    só uns tips para você entender más ou menos.

    Todo jogo vai dentro de um gameloop que nada más é que um bucle ou sentença repetitiva(while). Esse loop se repete a uma certa velocidade, tem seus controles de eventos como podem ser captura de teclas, isso tudo pode mudar dependendo de un nivel a outro, como por exemplo a velocidade dos vehiculos, você pode fazer tudo isso dentro de um só loop, más nada te impede você fazer varios loops cada um para uma cena(intro, menú, fase1, fase2, creditos... ), e com um gestor que faça a transiçao de um loop a outro que contenha tudo o que você precisa, isso segue os principios do "divide e vencerás".

    Sorte.

  10. por muito vetor que seja esa casinha"--" tem que ter algum valor. Acho que para representar 'NADA' melhor si é o 0.

    então vamos imaginar que temos um vetor:

    int mes[42] = {

    00,00,00,00,01,02,03,

    04,05,06,07,08,09,10,

    11,12,13,14,15,16,17,

    18,19,20,21,22,23,24,

    25,26,27,28,29,30,31,

    00,00,00,00,00,00,00,

    }//representa o mes de janeiro tal como na sua foto

    É só imprimir "--" en vez de 0 usando alguns loops e un if:

    #include <stdio.h>
    
    int main () {
        int i = 0;
        int x = 0;
        int contador = 0;
        int mes[42] = {
             0,  0,  0,  0,  1,  2,  3,
             4,  5,  6,  7,  8,  9, 10,
            11, 12, 13, 14, 15, 16, 17,
            18, 19, 20, 21, 22, 23, 24,
            25, 26, 27, 28, 29, 30, 31,
             0,   0,  0,  0, 0,  0,  0
        };//representa o mes de janeiro tal como na sua foto
    
        //For externo se encarga de proporcionar salto de linha para cada semana
        for ( i = 0; i < 6; i++ ){
            //for interno imprime 7 dias por linha
            for ( x=0; x < 7; x++ ){
                if ( mes[contador] != 0 ){ // <- isso é o que vc está buscando. Si nao é 0 imprime normal....
                    printf("%02d ", mes[contador] );
                }else{                     //...Si é 0 imprime o "--" no logar do 0
                    printf("-- ");
                }
                contador++;
            }
            printf("\n"); //salta depois de imprimir 7 dias
        }
    
        return 0;
    }
    

    Isso não?

    Sorte! :)

  11. En vez de limpar você pode ir tomando precauçao para que não entre \n al buffer:


    #include <stdio.h>
    
    int main() {
    
    int nPosicoes, maxCaixas;
    int nProgramas, maxComandos;
    int nExecucoes;
    int programaNumero [60];
    char programa [9] [61];
    char posicao [10] [11];
    int i;
    scanf ( "%d%*c", &nPosicoes );
    scanf ( "%d%*c", &maxCaixas );
    scanf ( "%d%*c", &nProgramas );
    scanf ( "%d%*c", &maxComandos );
    scanf ( "%d%*c", &nExecucoes );
    
    
    for ( i = 0; i < maxCaixas; i++ ) {
    scanf ( "%[^\n]%*c", posicao[i] );
    }
    
    for ( i = 0; i < nExecucoes; i++ ) {
    scanf ( "%d%*c", &programaNumero[i] );
    }
    
    for ( i = 0; i < nProgramas; i++ ) {
    scanf ( "%[^\n]%*c", programa[i] );
    }
    
    
    getchar();
    return 0;
    }

    O especificador %[^\n] le até encontrar \n, ignorando espaços tabuladores etc, ou seja que você pode ler "Hola Mundo" e ele vai guardar ambos Hola e mundo em um só string, coisa que você não pode fazer com um scanf normal já que scanf le só até encontrar um espaço, um tabulador ou o caracter enter(\n).
    Por outro lado %*c ignora o ultimo char não permitindo ele entrar ao buffer. então %[^\n]%*c le tudo menos o \n que é o ultimo char que você pulsa (\n tambem é um char) ;).
    Para simples inteiros %d por só %*c atraz de forma que fique %*d%*c(le um int e ignora o ultimo char que é o enter que você pulsa logo en seguida). Tambem funciona com %c%*c.

    Outra forma magica de evitar o enter é ponendo un espaço antes do"%c" de forma que fique" %c" dentro do scanf, ou seja scanf(" %c", letra); ou scanf(" %s", frase); //Note o espaço antes do %c e do %s. Un exemplo:


    #include <stdio.h>
    
    int main() {
    
    int n;
    char c1;
    printf("Entre um int: ");
    scanf("%d", &n);
    
    printf("Agora um char: ");
    scanf(" %c", &c1);//entre " e %c tem um espaço que ignora o anterior enter fazendo que funcione correctamente. Si tirar o espaço falha a leitura do char por causa do \n ao ler o int
    
    printf("Apesar de ter \n no buffer se imprime normalmente: %c", c1);
    
    getchar();
    return 0;
    }

    Existe muitas formas de fazer.

    Sorte!

  12. Pode ser Assim mais fácil de entender:

        cout << (
            ( num == 1 ) ? "Janeiro" :
            ( num == 2 ) ? "Fevereiro" :
            ( num == 3 ) ? "Março" :
            ( num == 4 ) ? "Abril" :
            ( num == 5 ) ? "Maio" :
            ( num == 6 ) ? "Junho" :
            ( num == 7 ) ? "Julho" :
            ( num == 8 ) ? "Agosto" :
            ( num == 9 ) ? "Setembro" :
            ( num == 10 ) ? "Outubro" :
            ( num == 11 ) ? "Novembro" : "Dezembro" )
        << endl;
    

    Ou pode ser tudo em uma linha só :o :

        cout << ( ( num == 1 ) ? "Janeiro" : ( num == 2 ) ? "Fevereiro" : ( num == 3 ) ? "Março" : ( num == 4 ) ? "Abril" : ( num == 5 ) ? "Maio" : ( num == 6 ) ? "Junho" : ( num == 7 ) ? "Julho" : ( num == 8 ) ? "Agosto" : ( num == 9 ) ? "Setembro" : ( num == 10 ) ? "Outubro" : ( num == 11 ) ? "Novembro" : "Dezembro" ) << endl;
    
    
    

    Ou si você quiser agregar um aviso por si acaso a pessoa pulsar um numero que não corresponda a um dos 12 meses:

        cout << (
            ( num == 1 ) ? "Janeiro" :
            ( num == 2 ) ? "Fevereiro" :
            ( num == 3 ) ? "Março" :
            ( num == 4 ) ? "Abril" :
            ( num == 5 ) ? "Maio" :
            ( num == 6 ) ? "Junho" :
            ( num == 7 ) ? "Julho" :
            ( num == 8 ) ? "Agosto" :
            ( num == 9 ) ? "Setembro" :
            ( num == 10 ) ? "Outubro" :
            ( num == 11 ) ? "Novembro" : 
            ( num == 12 ) ? "Dezembro" : "Nao existe esse mes")
        << endl;
    
  13. Isso é por que você acha que ele está reservado na memoria assim:

    +-----+-----+-----+-----+
    |Byte0|Byte1|Byte2|Byte3|
    +-----+-----+-----+-----+
    | a[0]| a[1]|  B  |  C  |
    +-----+-----+-----+-----+

    Más na realidade ele esta assim:

    +-----+-----+
    |Byte0|Byte1|
    +-----+-----+
    | a[0]| a[1]|
    +-----+-----+
    |  B  |  C  |
    +-----+-----+

    O dato B compartilha memoria com o dado a[0], e o dado C com A[1]. Supondo que todos ocupam 1Byte em memoria.

    Como disse no coment do seu programa: "eles compartilham memoria". Más a pega é que você não pode usar ele para duas coisas ao mesmo tempo.

    Para que você entenda melhor imaginamos que temos a seguinte união:

    union unEjemplo {
    int A;  //4Bytes
    char B; //1Byte
    float C;//8Bytes
    } UnionEjemplo;

    Então vamos tomar que em um determinado computador um int ocupa 4Bytes, um char ocupa 1Byte e um float ocupa 8Bytes(Esses podem variar de tamanho dependendo de fatores como compilador, SO etc). Em uma estrutura normal ele estaria representado em memoria de esta forma:

    +------+------+------+------+------+------+------+------+------+------+------+------+------+
    |Byte00|Byte01|Byte02|Byte03|Byte04|Byte05|Byte06|Byte07|Byte08|Byte09|Byte10|Byte11|Byte12|
    +------+------+------+------+------+------+------+------+------+------+------+------+------+
    |             A             |   B  |                           C                           |
    +------+------+------+------+------+------+------+------+------+------+------+------+------+

    ...Ocupando a soma de todos seus membros int tamanhoEstructura = sizeof(A)+sizeof©+sizeof© //Depende também do alinhamento de Bytes ou em inglês Byte Align(Buscar en google).

    Más em uma união eles seriam assim:

    +------+------+------+------+------+------+------+------+
    |Byte00|Byte01|Byte02|Byte03|Byte04|Byte05|Byte06|Byte07|
    +------+------+------+------+------+------+------+------+
    |             A             |
    +------+------+------+------+
    |  B   |    
    +------+------+------+------+------+------+------+------+
    |                           C                           |
    +------+------+------+------+------+------+------+------+

    int tamanhoUnion = sizeof©; //C é o tipo de dado de maior tamanho de todos nesse exemplo, por isso a união vai levar o tamanho dele e todos os dados vão compartilhar essa mesma memoria.

    O Byte 0 do charB estaria compartilhando do Byte 0 de intA(ocupariam a mesma memoria) e vice versa. Os Bytes 0,1,2 e 3 de floatC compartilham o mesmo espaço que o Byte 0,1,2 e 3 de intA e vice versa. Todos os Bytes 0 dos membros compartilham o mesmo espaço.

    Acho que da para entender.

    Então... no seu exemplo:

    +-----+-----+
    |byte0|byte1|
    +-----+-----+
    | a[0]| a[1]|
    +-----+-----+
    |  B  |  C  |
    +-----+-----+

    Me permita fazer uma analogia: Os dados A[0],A[1],B e C vamos pensar que eles são carros, e que seus nomes são marcas ou modelos. Eles são carros muito evoluídos, são quase mágicos, pois eles possuem uma característica que nenhum carro convencional tem. Seu porta malas! Esse porta malas ocupa o mesmo espaço tempo(memoria) que do seus parceiros do tamanho de 1Byte =D.

    Por exemplo: o carro A[0] comparte um porta-malas do tamanho de 1Byte com seu parceiro carro B, se eu puser qualquer coisa que ocupa um Byte em qualquer dos porta malas de um de esses 2 carros, automaticamente o outro vai ter o mesmo conteudo no seu porta malas. kkkk

    Si eu puser um caractere 'x' no porta malas de A[0], B também vai ter ese 'x' no seu porta malas. Capiche?

    Os carros A[0] e B compartilham esse revolucionário porta malas entre si, e A[1] e C também.

    Ok feita a analogia o que aconteceu foi que você colocou no porta malas dos carros B(que compartilha com A[0]) e C(que compartilha com A[1])os dados 'c' e 'd'. Então si B='c' e C='d' os porta malas de ficam A[0]='c' e A[1]='d'.

    Em linguagem de programação fica ((B='c') == (A[0]='c')) e ((C='d')== (A[1]='d')) Por que compartilham memoria.

    As uniões já não são amplamente utilizadas por que se criaram para computadores que continham pouca memoria RAM já que como podemos ver "compartilham" a mesma memoria RAM, más seu uso é muito complexo e pouco recomendado em entornos de trabalhos atuais dado que qualquer maquina hoje em dia tem ao menos 2gigas ou más de RAM. Más aprender sobre unioes te pode ajudar em muitas coisas como por exemplo sockts que usam algumas uniões algo complicadas para estabelecer comunicação entre 2 ou más computadores.

    Si você quiser um conselho não esta de mais você aprender uniões, más eu não perderia demasiado tempo com elas já que pouco uso vão ter nos dias que correm atualmente. XD

    Sorte: :lol:

×
×
  • Criar Novo...