Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Federal da Grande Dourados Faculdade de Ciências Exatas e de Tecnologias Curso de Bacharelado em Sistemas de Informação Algoritmos e Programação Constantes, strings, tipos de dados Profª Janne Oeiras Lachi 1 Tipos básicos ` Vimos: ` int, char, float ` Exemplo: /* Mostra o uso de const para declarar constantes */ #include <stdio.h> #include <stdlib.h> int main () { const char Bip = ‘\a’; /* declaração de constante */ const double Pi = 3.141592; /* declaração de constante */ double raio, area; printf(″Digite o raio da esfera:); scanf(“%ld”, &raio); area = 4.0 * Pi * raio * raio; printf(″%c%c″, Bip, Bip); printf(″\nArea da esfera = %.2lf\n″, area); system(″PAUSE″); return 0; } 2 O tipo double ` Serve para armazenar números com ponto flutuante de dupla precisão ` Normalmente tem o dobro do tamanho do float e, portanto, o dobro da capacidade ` Números em ponto flutuante correspondem ao que os matemáticos chamam de números reais ` Em C temos três tipos de variáveis para armazenar um número em ponto flutuante: ` float, double e long double 3 Tipos de dados definidos pelo padrão ANSI Tipo Bit* Bytes Faixa de Valores char 8 1 -128 a 127 unsigned char 8 1 0 a 255 int 32 4 -2.147.483.648 a 2.147.483.647 unsigned int 32 4 0 a 4.294.967.295 short int 16 2 -32.768 a 32.767 long 32 4 -2.147.483.648 a 2.147.483.647 unsigned long 32 4 0 a 4.294.967.295 float 32 4 3.4x10-38 a 3.4x1038 double 64 8 1.7x10-308 a 1.7x10308 long double 80 10 3.4x10-4932 a 1.1x104932 *O tamanho e a faixa de valores podem variar de acordo com o processador ou compilador. Modificadores de tipos ` Todos os tipos básicos podem ser acompanhados por um modificador. Em C temos 3 modificadores: ` short, long e unsigned ` long e short têm influência no tamanho usado para representar um valor ` unsigned indica se o tipo será usado para representar valores apenas positivos ` Observação: em alguns livros é citado o modificador signed, mas na declaração de variáveis ele pode ser omitido, o que significa que podem ser aceitos valores positivos e negativos. 5 Modificadores de tipos ` Um modificador pode ser usado sem que o tipo seja especificado. Nesse caso o compilador assume que o tipo é int unsigned int ou unsigned 32 4 0 a 4.294.967.295 short int ou short 16 2 -32.768 a 32.767 long int ou long 32 4 -2.147.483.648 a 2.147.483.647 6 Conversões de tipos ` Pode ser feita de duas maneiras: ` Automaticamente ` Explicitamente 7 Conversão automática ` Quando dois ou mais operandos de diferentes tipos se encontram em uma mesma expressão, o conteúdo da variável de menor tamanho é convertido ao tipo da variável de maior tamanho. ` Essa conversão é feita em uma área temporária de memória, antes de a expressão ser executada e o resultado desta é novamente convertido para o tipo da variável à esquerda do operador de atribuição. 8 Conversão automática: exemplo /* Conversão automática de tipo */ #include <stdio.h> #include <stdlib.h> int main () { int A = 10; char B = ‘X’; float C = 2.30; printf(″\nO valor inicial de A é %d\n″, A); printf(″\nO valor inicial de B é %c\n″, B); printf(″\nO valor inicial de C é %.2f\n″, C); A=C; /* A recebe a parte inteira de C, ou seja, 2*/ printf(″\nA=C, o valor de A é %d\n″, A); C=A; /* A variável A (int) é convertida em um float C, ou seja, 2*/ printf(″\nC=A, o valor de C é %f\n″, C); 9 Conversão automática: exemplo (cont.) B=A; /* B (char) recebe os bits de A (int) */ printf(″\nB=A, o valor de B é %d\n″, B); C=B; /* A variável C (float) recebe os bits de B (char) */ printf(″\nC=B, o valor de C é %.2\n″, C); system(″PAUSE″); return 0; } 10 Conversão automática ` Pode não resultar no esperado... /* Conversão automática de tipo */ #include <stdio.h> #include <stdlib.h> int main () { int VarInt=2000000000; /* 2.000.000.000 */ int Dez=10; VarInt=(VarInt*Dez)/Dez; /* Valor muito grande */ printf(″\nVarInt= %d\n″, VarInt); /*resposta errada */ system(″PAUSE″); return 0; } A saída é: VarInt = -147483648 11 Conversão automática ` Onde está o problema? /* Conversão automática de tipo */ #include <stdio.h> #include <stdlib.h> int main () { int VarInt=2000000000; /* 2.000.000.000 */ int Dez=10; VarInt=(VarInt*Dez)/Dez; /* O máximo que pode ser representado é 2.147.483.647 e essa conta dá 20.000.000.000, um valor muito grande */ printf(″\nVarInt= %d\n″, VarInt); /*resposta errada */ system(″PAUSE″); return 0; } 100 10101000 00010111 11001000 00000000 É o número - 1474836648012 Conversão explícita ` O operador de molde consiste em escrever o nome do tipo desejado entre parênteses e, em seguida, o valor ou a expressão a ser avaliada. O resultado é a expressão convertida para o tipo especificado ` Tem a seguinte sintaxe: (tipo desejado)variável ou (tipo desejado)(expressão) Conversão explícita: exemplo 1 /* Conversão explícita de tipo */ #include <stdio.h> #include <stdlib.h> int main () { int VarInt=2000000000; /* 2.000.000.000 */ int Dez=10; VarInt=((double)VarInt*Dez)/Dez; /* Converte para double */ printf(″\nVarInt= %d\n″, VarInt); system(″PAUSE″); return 0; } Conversão explícita: exemplo 2 /* Conversão automática de tipo */ #include <stdio.h> #include <stdlib.h> int main () { int A = 10; float B = 200.210; printf(″\n--- Valores iniciais ---\n\n″); printf(″\nO valor inicial de A é %d\n″, A); printf(″\nO valor inicial de B é %.2f\n″, B); printf(″\n--- Conversão dos valores ---\n\n″); printf(″\nA=B, o valor de A é %d\n″, A= (int)B); A = 30; B = 0.0; printf(″\n--- Novos valores iniciais ---\n\n″); printf(″\nO valor inicial de A é %d\n″, A); printf(″\nO valor inicial de B é %.2f\n″, B); Conversão explícita: exemplo 2 (cont.) printf(″\n--- Conversão dos valores ---\n\n″); printf(″\nB=A, o valor de B é %.2f\n″, B = (float) A); system(″PAUSE″); return 0; } O módulo <math.h>: funções matemáticas ` Para usar as funções abaixo, as suas variáveis devem ser do tipo double Função Exemplo Comentário ceil ceil(x) Arredonda um número real para cima. Por exemplo, ceil(3.2) é 4. floor floor(x) Arredonda o número para baixo. Por exemplo, floor(3.2) é 3. abs abs(x) Obtém o valor absoluto de x. sqrt sqrt(x) Calcula a raiz quadrada de x. pow pow(x,y) Calcula a potência de x elevado a y. modf z = modf(x, &y) Decompõe o número real armazenado em x em duas partes: y recebe a parte inteira e z, a parte fracionária do número. 17 Funções getche() e getch() ` Podem ser usadas como uma alternativa a função scanf() ` Podem ser usadas quando não queremos teclar ENTER para terminar a leitura ` Lêem um caractere no instante em que é digita, sem esperar pela tecla ENTER ` A diferença entre as duas é que a função getche() mostra na tela o caractere lido ` Precisam do módulo conio.h (não faz parte do C padrão, mas geralmente está presente junto com os compiladores por serem muito utilizadas) 18 Funções getche(): exemplo /* Mostra a função getche() */ #include <stdio.h> #include <stdlib.h> #include <conio.h> int main () { char ch; printf(″\nPressione uma tecla: ”); ch = getche(); /* aguarda uma tecla no teclado */ printf(″\nA tecla sucessora ASCII é %c.\n”, ch+1); system(″PAUSE″); return 0; } 19 Funções getch(): exemplo /* Mostra a função getch() */ #include <stdio.h> #include <stdlib.h> #include <conio.h> int main () { char ch; printf(″\nPressione uma tecla: ”); ch = getch(); /* aguarda uma tecla no teclado */ printf(″\nA tecla sucessora ASCII é %c.\n”, ch+1); system(″PAUSE″); return 0; }20 Funções getchar() e putchar() ` Fazem parte do módulo stdio.h (portanto, fazem parte do C padrão e estão presentes em qualquer compilador) ` A função getchar() aguarda o próximo caractere da entrada padrão (teclado) e retorna seu caractere lido. Só termina a leitura quando o ENTER é pressionado. ` A função putchar() imprime um caractere na saída padrão (vídeo) 21 Funções getchar() e putchar(): exemplo /* Mostra as funções getchar() e putchar() */ #include <stdio.h> #include <stdlib.h> #include <conio.h> int main () { char ch; printf(″\nPressione uma tecla: ”); ch = getchar(); /* aguarda uma tecla no teclado */ printf(″\nA tecla sucessora ASCII é ”); putchar(ch+1); putchar(‘\n’); system(″PAUSE″); return 0; } 22 Um pouco mais sobre strings ` Como visto anteriormente, em C não existe um tipo string, isto é, não há um tipo definido para declararmos uma variável que aceite uma cadeia de caracteres. ` Precisamos criar uma estrutura chamada vetor do tipo char para armazenar, por exemplo, o nome de uma pessoa. ` O último caractere de uma string é um terminador, isto é, um caractere nulo representado por \0 23 Strings: exemplos ` “Jose da Silva” ` “?interrogação?” ` “1.234” ` “0” ` Exemplo com vetor: Sempre precisa declarar com um valor a mais do que precisamos char letra, palavra[21]; letra=‘a’; palavra[0]=‘e’; palavra[1]=‘x’; palavra[2]=‘e’; palavra[3]=‘m’; palavra[4]=‘p’; palavra[5]=‘l’; palavra[6]=‘o’; palavra[7]=‘\0’; /* fim da string */ palavra[8]=‘z’; /* será ignorado */ Posições de 8 a 20 serão ignoradas porque o terminador está na posição 7 24 Strings: atribuição ` Caractere a caractere em cada posição do vetor (exemplo anterior) ou das seguintes formas: char nome[5]= {‘J’, ‘o’, ‘a’, ‘o’, ‘\0’}; ou char nome[5]= {“Joao”}; 25 Strings: operações inválidas ` Existem operações que não são possíveis de serem executadas utilizando uma string char str[10]; /* correto */ char str2[10]={“Palavra 2”}; /* correto */ str = “abacaxi”; /* ERRO! Não é possível atribuir assim */ str1 = str2; /* ERRO! Não é possível copiar str2 para str */ if (str == str2) /* ERRO! Não é possível comparar str2 com str */ 26 Lista 2: exercício 15 ` Preparar um programa em C para ler um nome de pessoa na forma “nome de batismo” seguido por “sobrenome” e imprimir na forma “sobrenome” seguido pelo “nome de batismo”. ` Exemplo: Entrada: MONALISA, ALMEIDA PRADO Saída: ALMEIDA PRADO, MONALISA #include <stdio.h> int main() { char nome_de_batismo[31], sobrenome[101]; printf("Informe o nome e o sobrenome separados por virgula:"); scanf("%[a-zA-Z ]%*[,]%[a-zA-Z ]", nome_de_batismo, sobrenome); printf("\nO sobrenome e nome sao: %s,%s\n", sobrenome, nome_de_batismo); return 0; } 27 Lista 2: exercício 11 ` %[...] lê uma seqüência de caracteres, sem ignorar espaços, especificando entre colchetes quais caracteres devem ser aceitos, ou, se o primeiro caractere dentro dos colchetes for um acento circunflexo (^), quais não devem ser aceitos. Além disso, se colocarmos um traço entre dois caracteres, todos os caracteres entre os dois serão incluídos no padrão. ` Por exemplo, se quisermos incluir qualquer letra minúscula, poderíamos escrever %[a-z]; se quiséssemos também incluir as maiúsculas, colocaríamos %[a-zA-Z]. A leitura pára quando for encontrado um caractere que não coincide com o padrão especificado. printf("Informe o nome e o sobrenome separados por virgula:"); scanf("%[a-zA-Z ]%*[,]%[a-zA-Z ]", nome_de_batismo, sobrenome); http://pt.wikibooks.org/wiki/Programar_em_C/Entrada_e_sa%C3%ADda_simples 28 Lista 2: exercício 11 ` O modificador * (asterisco) especifica que o valor atual deve ser lido da maneira especificada, mas não será guardado em nenhuma variável, e portanto não deve haver um ponteiro correspondente a esse valor. ` Por exemplo, poderíamos ter um programa que espera ler uma palavra e depois um número, mas não importa qual palavra é. ` Nesse caso usaríamos o modificador *: scanf ("%*s %d", &numero). O programa leria a palavra e guardaria o número na variável numero. printf("Informe o nome e o sobrenome separados por virgula:"); scanf("%[a-zA-Z ]%*[,]%[a-zA-Z ]", nome_de_batismo, sobrenome); http://pt.wikibooks.org/wiki/Programar_em_C/Entrada_e_sa%C3%ADda_simples 29 Lista 2: exercício 11 ` Outra solução.... #include <stdio.h> #include <stdlib.h> int main() { char nome_de_batismo[31], sobrenome[101]; printf("Informe o nome:"); scanf("%[a-zA-Z ]", nome_de_batismo); printf("Informe o sobrenome:"); scanf(“%*[\n]%[a-zA-Z ]", sobrenome); printf("\nO sobrenome e nome sao: %s,%s\n", sobrenome, nome_de_batismo); system("pause"); return 0; } 30 Problema sem o uso de %*[\n] ` Escrevemos o nome e teclamos ENTER ` Depois não conseguimos inserir o sobrenome por causa do ENTER entrado que não corresponde a nenhum caractere especificado dentro do [] ` O programa então “pula” para a linha de impressão no formato “sobrenome”, “nome” 31 Usando o módulo <string.h> Nome Sintaxe Função strcpy strcpy (destino, origem) Copia ou atribui o conteúdo da string origem para destino. strcat strcat(destino, origem) Concatena o conteúdo da string origem ao final do conteúdo de destino. strcmp strcmp(string1, string2) Compara o conteúdo da string1 com a string2. strlen strlen(string1) Retorna o tamanho da string1. strupr strupr(string1) Converte o conteúdo da string1 em maiúsculas. strlwr strlwr(string1) Converte o conteúdo da string1 em minúsculas. Função strcpy(): exemplos char linguagem[20]; linguagem = “Pascal”; /*ERRADO!!! */ strcpy(linguagem,“Pascal”); /*CERTO!!! */ char linguagem1[20]={“Linguagem Java”}, linguagem2[20]={“Pascal”}; linguagem1 = linguagem2; /*ERRADO!!! */ strcpy(linguagem2,linguagem1); /*CERTO!!! */ 33 Função strcat(): exemplo /* Mostra a função strcat() */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main () { char string1[51], string2[101]; printf(″\nEntre com uma string (até 50 caracteres): ”); scanf(“%s”, string1); strcpy(string2,”Voce digitou a string ”); strcat(string2, string1); printf(″\n%s”,string2); system(″PAUSE″); return 0; } 34 Função strcmp(): exemplo 35 /* Mostra a função strcmp() */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main () { char string1[21], string2[21]; int retorno; printf(″\nEntre a primeira string (até 20 caracteres): ”); scanf(“%s”, string1); printf(″\nEntre a segunda string (até 20 caracteres): ”); scanf(“%s”, string2); retorno = strcmp(string2,string1); if (retorno==0) printf(“\nAs strings são iguais”); else printf(“\nAs strings são diferentes”); system(″PAUSE″); return 0; } if (strcmp(string2,string1)) printf(“\nAs strings são diferentes”) else printf(“\nAs strings são iguais”); Se for 1, é pq são diferentes Função strlen(): exemplo /* Mostra a função strlen() */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main () { char string1[100]; int tamanho; printf(″\nEntre a string (até 99 caracteres): ”); scanf(“%s”, string1); tamanho = strlen(string1); printf(“\nA sua string tem tamanho %d”, tamanho); system(″PAUSE″); return 0; } 36 Função strupr(): exemplo /* Mostra a função strcat() */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main () { char string1[100]; int tamanho; printf(″\nEntre a string (até 99 caracteres): ”); scanf(“%s”, string1); printf(“\nVersão em letras maiúsculas: %s”, strupr(string1)); system(″PAUSE″); return 0; } Poderia ter sido usado: strupr(string1); printf(“\nVersão em letras maiúsculas: %s”,string1);37 Umproblema exemplo 38 ` 20. Uma empresa irá dar um aumento de salário aos seus funcionários de acordo com a categoria de cada empregado. O aumento seguirá a seguinte regra: a) Funcionários das categorias A, C, F e H ganharão 10% de aumento sobre o salário b) Funcionários das categorias B, D, E, I, J e T ganharão 15% de aumento sobre o salário ; c) Funcionários das categorias K e G ganharão 25% de aumento sobre o salário; d) Funcionários das categorias L, M, N, O, P, Q, R e S ganharão 35% de aumento sobre o salário; e) Funcionários das categorias U, V, X, Y, W e Z ganharão 50% de aumento sobre o salário; ` Faça um Programa em C que escreva o nome, categoria e salário reajustado de um Empregado. 39 #include <stdio.h> #include <stdlib.h> #include <ctype.h> int main() { float salario; char categoria, nome[101]; printf("Informe o nome do funcionario:"); scanf("%s", nome); fflush(stdin); printf("\nInforme a categoria do funcionario:"); scanf("%c", &categoria); printf("\nInforme o salario atual do funcionario"); scanf("%f", &salario); categoria = toupper(categoria); if (categoria == 'A' || categoria == 'C' || categoria == 'F' || categoria == 'H') printf("\nO salario reajustado do funcionario %s, da categoria %c, sera de %.2f", nome, categoria, salario * 1.10); else { if (categoria == 'B' || categoria == 'D' || categoria == 'I' || categoria == 'J' || categoria == 'T') printf("\nO salario reajustado do funcionario %s, da categoria %c, sera de %.2f", nome, categoria, salario * 1.15); else { if (categoria == 'K' || categoria == 'G') printf("\nO salario reajustado do funcionario %s, da categoria %c, sera de %.2f", nome, categoria, salario * 1.25); else { if (categoria == 'L' || categoria == 'M' || categoria == 'N' || categoria == 'O' || categoria == 'P' || categoria == 'Q' || categoria == 'R' || categoria == 'S') printf("\nO salario reajustado do funcionario %s, da categoria %c, sera de %.2f", nome, categoria, salario * 1.35); else { if (categoria == 'U' || categoria == 'V' || categoria == 'X' || categoria == 'Y' || categoria == 'W' || categoria == 'Z') printf("\nO salario reajustado do funcionario %s, da categoria %c, sera de %.2f", nome, categoria, salario * 1.50); else printf("\nCategoria invalida!!!"); } } } } system("pause"); return 0; } Resolução com if...else #include <stdio.h> #include <stdlib.h> #include <ctype.h> int main() { float salario; char categoria, nome[101]; printf("Informe o nome do funcionario:"); scanf("%s", nome); fflush(stdin); printf("\nInforme a categoria do funcionario (A a Z):"); scanf("%c", &categoria); printf("\nInforme o salario atual do funcionario"); scanf("%f", &salario); categoria = toupper(categoria); . . . Entrada de dados 40 41 if (categoria == 'A' || categoria == 'C' || categoria == 'F' || categoria == 'H') printf("\nO salario reajustado do funcionario %s, da categoria %c, sera de %.2f", nome, categoria, salario * 1.10); else { if (categoria == 'B' || categoria == 'D' || categoria == 'I' || categoria == 'J' || categoria == 'T') printf("\nO salario reajustado do funcionario %s, da categoria %c, sera de %.2f", nome, categoria, salario * 1.15); else { if (categoria == 'K' || categoria == 'G') printf("\nO salario reajustado do funcionario %s, da categoria %c, sera de %.2f", nome, categoria, salario * 1.25); else { if (categoria == 'L' || categoria == 'M' || categoria == 'N' || categoria == 'O' || categoria == 'P' || categoria == 'Q' || categoria == 'R' || categoria == 'S') printf("\nO salario reajustado do funcionario %s, da categoria %c, sera de %.2f", nome, categoria, salario * 1.35); else { if (categoria == 'U' || categoria == 'V' || categoria == 'X' || categoria == 'Y' || categoria == 'W' || categoria == 'Z') printf("\nO salario reajustado do funcionario %s, da categoria %c, sera de %.2f", nome, categoria, salario*1.50); else printf("\nCategoria invalida!!!"); } } } } continuação Atenção if (categoria == 'A' || categoria == 'C' || categoria == 'F' || categoria == 'H') printf("\nO salario reajustado do funcionario %s, da categoria %c, sera de %.2f", nome, categoria, salario * 1.10); if (categoria == 'A' || categoria == 'C' || categoria == 'F' || categoria == 'H') printf("\nO salario reajustado do funcionario %s, da categoria %c, sera de %.2f", nome, categoria, salario * 1.10); if (categoria == 'A' || 'C' || 'F' || 'H') printf("\nO salario reajustado do funcionario %s, da categoria %c, sera de %.2f", nome, categoria, salario * 1.10); Não pode construir a expressão sem comparar um a um porque a expressão sempre vai ser verdadeira. 42 Exemplo: usando o switch em C #include <stdio.h> #include <stdlib.h> #include <ctype.h> int main() { char nome[31], categoria; float salario; printf("\nInforme o nome do funcionário:"); scanf("%s", nome); fflush(stdin); printf("\nInforme a categoria do funcionário (A a Z):"); scanf("%c", &categoria); printf("\nInforme o salário do funcionário:"); scanf("%f", &salario); categoria = toupper(categoria); Entrada de dados 43 Exemplo: usando o switch em C switch(categoria) { /* a) Funcionários das categorias A, C, F e H ganharão 10% de aumento sobre o salário */ case 'A': case 'C': case 'F': case 'H': printf("\nO funcionário %s, da categoria %c deve ter novo salário de R$%.2f.\n\n", nome, opcao, salario*1.1); break; /* b) Funcionários das categorias B, D, E, I, J e T ganharão 15% de aumento sobre o salário ; */ case 'B': case 'E': case 'I': case 'J': case 'T': printf("\nO funcionário %s, da categoria %c deve ter novo salário de R$%.2f.\n\n", nome, opcao, salario*1.15); break; 44 Exemplo: usando o switch em C /* b) Funcionários das categorias B, D, E, I, J e T ganharão 15% de aumento sobre o salário ; */ case 'B': case 'E': case 'I': case 'J': case 'T': printf("\nO funcionário %s, da categoria %c deve ter novo salário de R$%.2f.\n\n", nome, opcao, salario*1.15); break; /* c) Funcionários das categorias K e G ganharão 25% de aumento sobre o salário; */ case 'K': case 'G': printf("\nO funcionário %s, da categoria %c deve ter novo salário de R$%.2f.\n\n", nome, opcao, salario*1.25); break; /* d) Funcionários das categorias L, M, N, O, P, Q, R e S ganharão 35% de aumento sobre o salário; */ case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': printf("\nO funcionário %s, da categoria %c deve ter novo salário de R$%.2f.\n\n", nome, opcao, salario*1.35); break; 45 Exemplo: usando o switch em C 46 /* e) Funcionários das categorias U, V, X, Y, W e Z ganharão 50% de aumento sobre o salário; */ case 'U': case 'V': case 'X': case 'Y': case 'W': case 'Z': printf("\nO funcionário %s, da categoria %c deve ter novo salário de R$%.2f.\n\n", nome, opcao, salario*1.5); break; default: printf("\nCategoria inválida!\n"); break; } system ("pause"); return 0; } Exemplo: usando o switch em C switch(opcao) { /* a) Funcionários das categorias A, C, F e H ganharão 10% de aumento sobre o salário */ case 'A': case 'C': case 'F': case 'H': printf("\nO funcionário %s, da categoria %c deve ter novo salário de R$%.2f.\n\n", nome, opcao, salario*1.1); break; Não dá para fazer algo do tipo abaixo, usando o OU lógico: case (‘A' || ‘C' || ‘F' || ‘H’): printf("\nO funcionário %s, da categoria %c deve ter novo salário de R$%.2f.\n\n", nome, opcao, salario*1.1); break; errado 47 Alguns detalhes de implementação... 48 #include <stdio.h> #include <stdlib.h> #include <ctype.h> int main() { char nome[31], categoria, opcao; float salario; printf("\nInforme o nome do funcionário:");scanf("%s", nome); fflush(stdin); printf("\nInforme a categoria do funcionário (A a Z):"); scanf("%c", &categoria); printf("\nInforme o salário do funcionário:"); scanf("%f", &salario); opcao = toupper(categoria); Função toupper() ` Pertence ao módulo ctype.h ` Dada uma letra, ela a transforma para a sua versão maiúscula; ` Exemplo: ` letra= ‘a’ ` letra = toupper(letra); ` Agora o conteúdo de letra é ‘A’ ` A função tolower() faz o contrário, isto é, converte uma letra maiúscula em minúscula 49 Função toupper() ` É usada porque o usuário pode digitar uma letra correspondente a uma categoria no formato minúsculo ou maiúsculo; ` Como dentro do nosso case usamos tudo maiúsculo, se não tratarmos essa possibilidade de letra minúscula, o case não reconhecerá quando o usuário digitar, por exemplo, a categoria ‘b’. Será dada a mensagem “Categoria inválida”. 50 Alguns detalhes de implementação... 51 #include <stdio.h> #include <stdlib.h> #include <ctype.h> int main() { char nome[31], categoria; float salario; printf("\nInforme o nome do funcionário:"); scanf("%s", nome); fflush(stdin); printf("\nInforme a categoria do funcionário (A a Z):"); scanf("%c", &categoria); printf("\nInforme o salário do funcionário:"); scanf("%f", &salario); categoria = toupper(categoria); Problema sem o uso de fflush() Escrevemos o nome da funcionária e teclamos ENTER Depois não conseguimos inserir a categoria, pois o cursor já está pedindo o valor do salário. O que ocorre é que a categoria é do tipo char (1 caractere) e quando teclamos ENTER, esse ENTER é capturado e é atribuído à variável categoria 52 Função fflush() ` Pertence à biblioteca stdio.h ` Sintaxe: ` fflush(stdin); ` Onde, fflush é o comando de limpeza do buffer e stdin é o buffer de teclado 53 Usando o fflush (stdin) 54 Outra opção: fgets() ` Pertence à biblioteca stdio.h ` Sintaxe: ` fgets(<nome da variável>, <tamanho>, stdin); ` O código ficaria então: #include <stdio.h> #include <stdlib.h> #include <ctype.h> int main() { char nome[31], categoria, opcao; float salario; printf("\nInforme o nome do funcionário:"); fgets(nome,31,stdin); 55 Vantagem em relação ao scanf() ` Usando o scanf() não conseguimos pegar facilmente uma string com mais de uma palavra (ex.: José da Silva) porque o scanf() vai cortar a string no primeiro espaço em branco (ficaria somente José) ` O fgets() também ajuda a limitar o tamanho máximo da string que queremos pegar 56 Ainda não é suficiente... O fgets() pega o ENTER que nós damos ao terminar de escrever o nome. Veja na figura que há uma quebra de linha após o nome. 57 Ajeitando o código... ` Podemos incluir mais uma linha de código após o fgets() ` nome[strlen(nome)-1]='\0‘; #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> int main() { char nome[31], categoria, opcao; float salario; system("chcp 1252 > nul"); printf("\nInforme o nome do funcionário:"); fgets(nome,31,stdin); nome[strlen(nome)-1]='\0'; 58 Ajeitando o código... ` A função strlen() pertence à biblioteca string.h e retorna o tamanho da string nome ` nome[strlen(nome)-1]='\0'; ` Digitamos “Janne Lachi<enter>” que tem, portanto, tamanho 12, mas que está organizado da seguinte forma: ` Então, estamos pedindo para incluir o símbolo de final de string '\0' na posição strlen(nome)-1= 11, ou seja, estamos substituindo o ENTER por '\0' 59 Agora sim... 60 Explorando printf( ) ` Códigos especiais são usados dentro da expressão de controle de printf( ) com o símbolo % ` Exemplos: %d, %s, %c, %f ` Se quisermos imprimir a frase “O desconto dado foi de 10%”, como faremos? ` Dentro do printf( ) devemos usar dois símbolos de % #include <stdio.h> #include <stdlib.h> int main () { int desconto = 10; printf(″O desconto dado foi de %d%%.\n″, desconto); system(″PAUSE″); return 0; } 61 Tamanhos de campo na impressão ` A função printf( ) permite estabelecer o tamanho mínimo de um campo para impressão. ` Podemos definir o número de colunas que serão ocupadas por um valor ou texto a ser impresso. ` Essa definição é usada para alinhamento e estética #include <stdio.h> #include <stdlib.h> int main () { printf(″Os alunos são %2d.\n″, 350); printf(″Os alunos são %4d.\n″, 350); printf(″Os alunos são %5d.\n″, 350); system(″PAUSE″); return 0; } SAÍDA: Os alunos são 350. Os alunos são 350. Os alunos são 350. 62 Observação ` Se o tamanho do campo especificado for menor que o tamanho mínimo necessário para imprimir o valor associado, a impressão utilizará o número necessário de colunas, ignorando o tamanho especificado para o campo. #include <stdio.h> #include <stdlib.h> int main () { printf(″Os alunos são %2d.\n″, 350); printf(″Os alunos são %4d.\n″, 350); printf(″Os alunos são %5d.\n″, 350); system(″PAUSE″); return 0; } SAÍDA: Os alunos são 350. Os alunos são 350. Os alunos são 350. 63 Imprimindo uma tabela #include <stdio.h> #include <stdlib.h> int main () { int lapis=45, borrachas=2345, canetas=420, cadernos=8, fitas=13050; printf(″\nLapis %12d″, lapis); printf(″\nBorrachas %12d″, borrachas); printf(″\nCanetas %12d″, canetas); printf(″\nCadernos %12d″, cadernos); printf(″\nFitas %12d″, fitas); system(″PAUSE″); return 0; } SAÍDA: Lapis 45 Borrachas 2345 Canetas 420 Cadernos 8 Fitas 13050 64 Imprimindo uma tabela ` Pode-se usar tamanho de campos com números em ponto flutuante e, ao mesmo tempo, obter precisão e arredondamento. #include <stdio.h> #include <stdlib.h> int main () { float cidade1=4.875, cidade2=234.542, cidade3=42.036, cidade4=8.0; printf(″\nCidade 1 %12.2f″, cidade1); printf(″\nCidade 2 %12.2f″, cidade2); printf(″\nCidade 3 %12.2f″, cidade3); printf(″\nCidade 4 %12.2f″, cidade4); system(″PAUSE″); return 0; } 65 Imprimindo uma tabela ` Pode-se usar tamanho de campos com números em ponto flutuante e, ao mesmo tempo, obter precisão e arredondamento. /* Tamanho de campo com ponto flutuante */ #include <stdio.h> #include <stdlib.h> int main () { printf(″%4.2f\n”, 3456.78); printf(″%3.2f\n”, 3456.78); printf(″%3.1f\n”, 3456.78); printf(″%10.3f\n”, 3456.78); system(″PAUSE″); return 0; } SAÍDA: 3456.78 3456.78 3456.8 3456.78 66 Alinhamento à direita ou à esquerda /* Sem tamanho de campo */ #include <stdio.h> #include <stdlib.h> int main () { printf(″%.2f %.2f %.2f\n″, 8.0, 15.3, 584.13); printf(″%.2f %.2f %.2f\n″, 834.0, 1500.55, 4890.21); system(″PAUSE″); return 0; } SAÍDA: 8.00 15.30 584.13 834.00 1500.55 4890.21 67 Alinhamento à direita ou à esquerda /* Com tamanho de campo */ #include <stdio.h> #include <stdlib.h> int main () { printf(″%10.2f %10.2f %10.2f\n″, 8.0, 15.3, 584.13); printf(″%10.2f %10.2f %10.2f\n″, 834.0, 1500.55, 4890.21); system(″PAUSE″); return 0; } 68 Alinhamento à direita ou à esquerda ` O sinal de menos (-) precedendo a especificação do tamanho do campo justifica os campos à esquerda /* Com tamanho de campo e alinhado à esquerda */ #include <stdio.h> #include <stdlib.h> int main () { printf(″%-10.2f %-10.2f %-10.2f\n″, 8.0, 15.3, 584.13); printf(″%-10.2f %-10.2f %-10.2f\n″, 834.0, 1500.55, 4890.21); system(″PAUSE″); return 0; } 69 Tamanho de campo com cadeias de caracteres 70 /* Com tamanho de campo com cadeias de caracteres */ #include <stdio.h> #include <stdlib.h> int main () { printf("\nOBJETO %12s", "CODIGO"); printf("\nLapis %12s", "WQR"); printf("\nBorrachas %12s", "ASO"); printf("\nCanetas %12s", "KPX"); printf("\nCadernos%12s", "FJI"); printf("\nFitas %12s\n", "TYE"); system("PAUSE"); return 0; } Complementando com zeros à esquerda /* Com tamanho de campo e complementando com zeros*/ #include <stdio.h> #include <stdlib.h> int main () { printf("\n%04d", 21); printf("\n%06d", 21); printf("\n%6.4d", 21); printf("\n%6.0d", 21); system("PAUSE"); return 0; } 71 Função scanf( ) ` Sintaxe: scanf(“string de formatação”, endereço da variável 1,..., endereço da variável n); ` Alguns erros... ` Passar mais de uma variável como argumento: ` scanf(“%f%d”, &salario, &idade, &ano); ` Passar mais códigos do que variáveis: ` scanf(“%f%d%d”, &salario, &idade); ` Informar os nomes das variáveis sem o &: ` scanf(“%f%d”, salario, idade); ` A exceção é para variáveis do tipo string que não precisam do & por serem um vetor 72 scanf( ) ` Espera que o usuário digite cada caractere exatamente como ela aparece na string de formatação scanf(“string de formatação”, endereço da variável 1,..., endereço da variável n); scanf(“Digite um numero inteiro: %d”, &meuInteiro); ` A função scanf() vai esperar que o usuário digite EXATAMENTE a frase Digite um numero inteiro: antes de introduzir o número inteiro esperado ` Para informar ao usuário o que deve ser dado como entrada, use a função printf() 73 Entrada formatada com scanf( ) ` No exemplo abaixo queremos receber do usuário uma data com o formato dd/mm/aaaa ` Com o uso de %*c vamos ignorar o caractere / /* Mostra o uso do caractere * com scanf() */ #include <stdio.h> #include <stdlib.h> int main () { int dia, mes, ano; printf("Digite uma data no formato dd/mm/aaaa: "); scanf("%d%*c%d%*c%d", &dia, &mes, &ano); printf("A data que voce digitou foi: %02d/%02d/%d\n", dia, mes, ano); system("PAUSE"); return 0; } 74 Operador condicional ternário ` É o único operador em C que opera sobre 3 expressões ` Sintaxe: expressão 1 ? expressão 2 : expressão 3 ` A expressão 1 é avaliada primeiro ` Se seu valor for diferente de 0 (verdadeira), a expressão 2 será avaliada e o seu resultado será o valor da expressão condicional como um todo. ` Se seu valor for 0, a expressão 3 será avaliada e será o valor da expressão condicional como um todo. 75 Operador condicional ternário: exemplos /* a variável que conter o maior valor numérico entre a e b será atribuída a max */ max = (a > b)? a: b; /* Variável absol recebe o valor absoluto de x */ absol = (x > 0)? x : -x ; /* Imprime “Ímpar” se x for um número ímpar ou “Par” se x for par */ printf(“%s”, (x%2)? ”Impar” : “Par”); 76 Referências ` Ulysses de Oliveira. Programando em C. D. Rio de Janeiro; Editora Ciência Moderna, 2008 ` Victorine Viviane Mizrahi. Treinamento em linguagem C. São Paulo: Pearson Prentice Hall, 2008. ` Ricardo Sonaglio Albano e Silvie Guedes Albano. Programação em Linguagem C. Rio de Janeiro; Editora Ciência Moderna, 2010. 77 Algoritmos e Programação Tipos básicos O tipo double Tipos de dados definidos pelo padrão ANSI Modificadores de tipos Modificadores de tipos Conversões de tipos Conversão automática Conversão automática: exemplo Conversão automática: exemplo (cont.) Conversão automática Conversão automática Conversão explícita Conversão explícita: exemplo 1 Conversão explícita: exemplo 2 Conversão explícita: exemplo 2 (cont.) O módulo <math.h>: funções matemáticas Funções getche() e getch() Funções getche(): exemplo Funções getch(): exemplo Funções getchar() e putchar() Funções getchar() e putchar(): exemplo Um pouco mais sobre strings Strings: exemplos Strings: atribuição Strings: operações inválidas Lista 2: exercício 15 Lista 2: exercício 11 Lista 2: exercício 11 Lista 2: exercício 11 Problema sem o uso de %*[\n] Usando o módulo <string.h> Função strcpy(): exemplos Função strcat(): exemplo Função strcmp(): exemplo Função strlen(): exemplo Função strupr(): exemplo Um problema exemplo Exemplo: usando o switch em C Exemplo: usando o switch em C Exemplo: usando o switch em C Exemplo: usando o switch em C Exemplo: usando o switch em C Alguns detalhes de implementação... Função toupper() Função toupper() Alguns detalhes de implementação... Problema sem o uso de fflush() Função fflush() Usando o fflush (stdin) Outra opção: fgets() Vantagem em relação ao scanf() Ainda não é suficiente... Ajeitando o código... Ajeitando o código... Agora sim... Explorando printf( ) Tamanhos de campo na impressão Observação Imprimindo uma tabela Imprimindo uma tabela Imprimindo uma tabela Alinhamento à direita ou à esquerda Alinhamento à direita ou à esquerda Alinhamento à direita ou à esquerda Tamanho de campo com cadeias de caracteres Complementando com zeros à esquerda Função scanf( ) scanf( ) Entrada formatada com scanf( ) Operador condicional ternário Operador condicional ternário: exemplos Referências
Compartilhar