Baixe o app para aproveitar ainda mais
Prévia do material em texto
Algoritimos e Programação II Vanessa Lindemann Algoritimos e Programação II E sta disciplina dá continuidade ao estudo de lógica de programação iniciado em Algoritmos e Programação I e introduz o aluno no universo da programação, de forma que no final do semestre ele estará capacitado a construir programas em linguagem C. Para isso, vamos estudar variáveis indexadas, estruturas, ponteiros, funções e arquivos. Só é possível aprender a programar, programando! Portanto, resolver os exercícios propostos no final de cada capítulo, utilizando um compilador C, é fundamental para atingir o objetivo desta disciplina. Optou-se por usar o Dev-C++, que é um ambiente de desenvolvimento integrado, com enorme potencial para desenvolver programas em linguagem C e C++ no sistema operacional Windows. Diante do exposto, sugere-se que o aluno vá direto ao Capítulo 10 para instalar e configurar o Dev-C++ no seu computador. Assim, a cada capítulo estudado, será possível executar os exemplos e realizar os exercí- cios propostos. A disciplina possui conteúdos cumulativos, ou seja, no final do semestre, ainda estaremos utilizando conceitos estudados nas primeiras semanas de aula. Portanto, é importante organizar o estudo, resolver os problemas propostos periodicamente e não deixar as dúvidas para depois. As referências bibliográficas sugerem obras de autores que fundamen- tam os estudos realizados e oferecem ao aluno possibilidades de aprofun- damento com leituras complementares. Introdução Sumário 1 Introdução à Linguagem C ....................................................5 2 Estruturas Básicas de Controle ............................................35 3 Variáveis Indexadas Unidimensionais ..................................61 4 Strings ................................................................................81 5 Variáveis Indexadas Bidimensionais ..................................101 6 Estruturas .........................................................................122 7 Ponteiros ..........................................................................134 8 Funções ............................................................................144 9 Arquivos ...........................................................................172 10 Dev-C++: instalação e configuração ................................198 * Doutora em Informática na Educação pela UFRGS (2008); professora dos cursos da Computação da ULBRA Introdução à Linguagem C ÂÂ A linguagem C, criada por Dennis Ritchie na década de 70, resultou de um processo evolutivo de lingua- gens e, durante alguns anos, teve seu padrão baseado na versão 5 do sistema operacional UNIX. Com a po- pularização dos microcomputadores, várias versões de C foram criadas, gerando muitas discrepâncias entre elas. Para resolver essa situação, em 1983, o ANSI (American National Standards Institute) estabeleceu um comitê para definir um padrão que guiasse todas as implementações da linguagem C. A popularização da linguagem C deve-se a vários fa- tores, dentre os quais destacam-se (a) o conjunto de ope- Vanessa Lindemann Capítulo 1 6 Algoritmos e Programação II radores e tipos de dados disponíveis; (b) a portabilidade, podendo ser usada em máquinas de portes e de sistemas operacionais diferentes; (c) as características de lingua- gens de alto nível, aliadas às características de linguagens de baixo nível (também conhecidas como linguagem de máquina, manipulam bits, bytes e endereços). C é uma linguagem de propósitos gerais, estruturada e compilada (o compilador lê o código-fonte do programa inteiro e converte-o em um código executável). Ela é utili- zada para a construção de sistemas operacionais, compi- ladores, interpretadores, editores de textos, planilhas ele- trônicas, aplicativos para dispositivos móveis, programas para a automação industrial, gerenciadores de bancos de dados etc. As próximas seções são dedicadas à apresentação de conceitos e definições importantes e necessárias para o início da programação em linguagem C. Capítulo 1 Introdução à Linguagem C 7 1.1 Estrutura básica de um programa em linguagem C Um programa em linguagem C consiste em uma ou mais fun- ções. A função principal, denominada main, indica onde o programa inicia. A estrutura básica de um programa em C é apresentada a seguir. #include <nome da biblioteca> main( ) { // declaração de variáveis // bloco de comandos } Bibliotecas são arquivos contendo várias funções que po- dem ser incorporadas aos programas escritos em C (esses ar- quivos são chamados arquivos de cabeçalho − cabeçalho em inglês é header, o que explica a extensão .h usada logo após o nome dos arquivos). A diretiva #include faz com que as funções inseridas na biblioteca especificada possam ser utilizadas no programa. As bibliotecas stdio.h e conio.h, por exemplo, permitem a utilização de funções de entrada e saída padrão e de funções de tela, respectivamente. São exemplos de funções de tela, os comandos usados para limpar a tela, posicionar o cursor em uma determinada posição na tela, trocar a cor da fonte e/ou do fundo. A diretiva #include pode ser usada de duas formas: #include "nome da biblioteca" ou #include 8 Algoritmos e Programação II <nome da biblioteca>. A diferença entre se usar " " e < > é somente a ordem de procura pelo arquivo especificado nos diretórios. Usa-se " " para informar o nome do arquivo com o caminho completo, ou se o arquivo estiver no diretório de trabalho. Quando o arquivo estiver no caminho padrão do compilador (como é o caso de arquivos como stdio.h e string.h, por exemplo), usa-se os símbolos < e >. Os parênteses ao lado da palavra main indicam que ela é uma função, enquanto as chaves delimitam o seu início e o seu fim. O bloco de comandos que estiver entre as chaves é executado sequencialmente quando a função for chamada. Uma boa prática de programação do padrão ANSI é declarar a função main como int main(void) e, no seu final, an- tes de fechar a chave que delimita o corpo da função, incluir a instrução return 0; − essa prática evita que, ao executar os programas, alguns compiladores emitam uma mensagem do tipo A função deve retornar um valor. Como o compilador do Dev-C++, utilizado nesta disciplina, não emite esta men- sagem, optou-se por não adotar essa prática nos exemplos deste livro. É importante salientar que a linguagem C é case sensitive, ou seja, é sensível a letras maiúsculas e minúsculas (por exem- plo, uma variável declarada como a é diferente de A) e todos os programas devem, obrigatoriamente, ser escritos em letras minúsculas. Outro detalhe importante é que cada instrução primitiva é finalizada com um ponto-e-vírgula (vale destacar que não há ponto e vírgula após as diretivas de compilação #include e #define, nem após as estruturas de controle apresentadas no próximo capítulo). Capítulo 1 Introdução à Linguagem C 9 1.2 Identificadores Em linguagem C, os nomes utilizados para referenciar variá- veis, constantes e funções definidas pelo usuário são chama- dos de identificadores. A criação de um identificador deve seguir as seguintes regras: podem ser formados por letras, números e sublinhado; devem iniciar com uma letra ou com o sublinhado; letras minúsculas e maiúsculas são consideradas caracteres distintos; não podem ser palavras reservadas; podem conter qualquer tamanho, po- rém apenas os 32 primeiros caracteres são significativos. Além disso, é importante criar identificadores consideran- do a sua aplicação para facilitar a leitura do código-fonte e, consequentemente, o trabalho do programador. A quantidade de horas trabalhadas por uma pessoa durante uma semana de trabalho, por exemplo, pode ser armazenada em uma variável chamada qtde_horas; enquanto uma função que irá verifi- car se uma data é válida ou não pode ter como identificador valida_data. 1.3 Tipos de dados Os tipos de dados básicos emlinguagem C são: int (número inteiro), float (número real, representado em ponto flutuante), double (número real, representado em ponto flutuante com maior precisão), char (caractere) e void (vazio, sem valor). A linguagem C não possui tipo de dado lógico (que pode assu- 10 Algoritmos e Programação II mir verdadeiro ou falso), pois considera qualquer valor diferen- te de 0 (zero) como verdadeiro; e também não possui um tipo especial para armazenar cadeias de caracteres (strings), estas são armazenadas em um vetor de caracteres. A Tabela 1.1 apresenta a lista de tipos básicos utilizados em C. Tipo Faixa de valores Tamanho char -127 a 127 8 bits int -32.767 a 32.767 16 bits float 3.4 E-38 a 3.4 E+38 32 bits double 1.7 E-308 a 1.7 E+308 64 bits void vazio, sem valor 0 Tabela 1.1 − Tipos de dados básicos da linguagem C A faixa de valores apresentada está de acordo com o pa- drão ANSI, e é considerada a faixa mínima. Dependendo do processador e do compilador C que estiver sendo utilizado, o tamanho e a faixa de valores podem variar. 1.4 Modeladores É possível forçar que o resultado de uma expressão seja de um tipo específico usando o conceito de modelador. A forma geral de um modelador é (tipo)expressão onde tipo é um dos tipos padrão da linguagem C. Sendo r uma variável declarada do tipo float, as ex- pressões a seguir resultam em valores diferentes. A primeira Capítulo 1 Introdução à Linguagem C 11 expressão resulta 4, enquanto que a segunda, com o uso do modelador, resulta 4.5. r=9/2; r=(float)9/2; 1.5 Declaração, inicialização e escopo de variáveis Variável é uma posição de memória, identificada por um nome (identificador), usada para armazenar um dado de um deter- minado tipo por vez. As variáveis são declaradas após a espe- cificação de seus tipos, como pode ser observado nos exem- plos a seguir. float total; int idade, cont; A primeira linha da declaração de variáveis do exemplo cria uma variável chamada total, que irá armazenar valores do tipo real; na segunda linha, são criadas duas variáveis para armazenar valores do tipo inteiro, idade e cont. Cada uma dessas variáveis armazenará um único valor por vez. As variáveis podem ser inicializadas no momento da sua declaração, colocando o sinal de atribuição seguido da in- formação desejada, como no exemplo apresentado a seguir, em que cont é inicializada com 0 e resposta com S. É im- 12 Algoritmos e Programação II portante destacar que os dados atribuídos a variáveis do tipo caractere são envolvidos por apóstrofes. int cont=0; char resposta='S'; O local em que as variáveis são declaradas definem o seu escopo, que pode ser global ou local. As variáveis de escopo global, denominadas variáveis globais, são declaradas fora de qualquer função, inicializadas automaticamente com 0 (zero) e podem ser usadas em qualquer ponto do programa. As va- riáveis locais são declaradas dentro de uma função, não são inicializadas automaticamente e valem enquanto essa função estiver ativa. As variáveis de escopo local têm preferência em relação às de escopo global. 1.6 Definição de constantes Uma constante irá representar um valor fixo, previamente definido pelo programador e inalterável no programa. Uma das formas de definir constantes em C é a partir da diretiva #define, seguida do nome da constante e do valor que esta representará no programa. No exemplo a seguir, apresenta- -se a declaração da constante pi cujo valor é definido como 3.141516. Dessa forma, o programador usará pi no progra- ma ao invés de usar 3.141516. #define pi 3.141516 Capítulo 1 Introdução à Linguagem C 13 1.7 Códigos de formato Os códigos de formato são constantes que definem o formato dos dados a serem lidos e exibidos na tela. A Tabela 1.2 apre- senta alguns dos códigos de formato disponíveis em C. Código Formato %c Caractere %i Inteiro %f Ponto flutuante %lf Ponto flutuante longo (double) %s Cadeia de caracteres (string) Tabela 1.2 − Códigos de formatação Eles são usados em funções de entrada e de saída de da- dos (descritas na seção 1.12). A função de entrada scanf, por exemplo, possui dois argumentos: o código de formato e uma variável. No exemplo apresentado a seguir, o valor digi- tado pelo usuário será armazenado na variável denominada peso, declarada e formatada como float. scanf("%f",&peso); A função printf, exemplificada a seguir, também contém dois argumentos: o primeiro é uma mensagem, apresentada entre aspas; o segundo é uma variável, denominada dias. O valor armazenado na variável dias será exibido na posição em que aparece o código de formato usado na mensagem, nesse caso o %i. 14 Algoritmos e Programação II printf("Sua idade em dias e: %i", dias); Os códigos de formato podem ter modificadores que espe- cifiquem o tamanho do campo, o número de casas decimais e um indicador de justificação à esquerda. Especificador de largura mínima do campo: um valor entre o símbolo % e o caractere de formato indica a largura mínima do campo, preenchendo a saída com brancos (pa- drão) ou com zeros (coloca-se um 0 antes do especificador de tamanho). Quando um valor é maior que o mínimo definido, este será impresso por completo. Exemplos: %05d preencherá um número com menos de cinco dígitos com zeros à esquerda, de maneira que seu tamanho total seja cinco. Especificador do número de casas decimais: para defi- nir o número de casas decimais a serem exibidas em um ponto flutuante, usa-se um ponto entre o especificador de tamanho e o número de casas decimais desejadas. Por exemplo: %6.2f exibirá um valor com, no mínimo, seis dígitos de comprimento no total, com duas casas decimais (o ponto usado antes das casas decimais ocupa o espaço de um dígito, como pode ser observado nos exemplos apresentados na Tabela 1.3). Especificador para justificar informação à esquerda: por definição, toda saída é justificada à direita. O uso do sinal – depois do % faz com que a saída seja justificada à esquerda. Exemplo: %-6.2f justificará à esquerda um valor de ponto flutuante, com no mínimo seis dígitos no total, com duas casas decimais. Capítulo 1 Introdução à Linguagem C 15 A Tabela 1.3 apresenta exemplos da utilização dos especi- ficadores de tipos. O caractere especial \n, usado nos exem- plos, inicia uma nova linha antes de exibir o valor na tela. Código Resultado float valor=136.472; printf("\n %f",valor); printf("\n %8.1f",valor); printf("\n %08.1f",valor); printf("\n %-8.1f",valor); 136.472000 136.5 000136.5 136.5 int valor=790; printf("\n %i",valor); printf("\n %5i",valor); printf("\n %05i",valor); printf("\n %-5i",valor); 790 790 00790 790 printf("\n O total é %2i.",350); printf("\n O total é %4i.",350); printf("\n O total é %5i.",350); O total é 350. O total é 350. O total é 350. Tabela 1.3 − Exemplo da utilização dos especificadores de tipos 1.8 Caracteres especiais Os caracteres especiais são usados para representar alguma formatação em particular e caracteres especiais que seriam impossíveis de usar diretamente no código-fonte. Esses carac- 16 Algoritmos e Programação II teres devem ser precedidos da barra invertida, como o \n que representa nova linha. A Tabela 1.4 apresenta os caracteres e seus significados. Código Significado Código Significado \a alerta (beep) \v tab vertical \b retrocesso (backspace) \\ exibe barra invertida \f avanço de página \’ exibe aspa única \n nova linha \“ exibe aspas duplas \r retorna ao início da linha \? exibe ponto de interrogação \t tab horizontal \0 nulo Tabela 1.4 Códigos de caracteres especiais 1.9 Comando de atribuição O comando de atribuição, representado pelo sinal de igual- dade, é utilizado para atribuir valores a variáveis. É importante lembrar que os valores atribuídos a uma variável devem ser compatíveis com o seu tipo. Alguns exemplos de atribuição podem ser observados a seguir. total=345.60; resp='s'; cont=cont+1;Os caracteres são representados entre apóstrofes ( ' ) e as cadeias de caracteres entre aspas ( " ). Entretanto, caso seja necessário atribuir uma cadeia de caracteres a uma variável, utiliza-se a função strcpy, como ilustra o exemplo a seguir. strcpy(nome,“Ana Paula Rocha”); Capítulo 1 Introdução à Linguagem C 17 Para utilizar strcpy (abreviação de string copy) é preciso inserir no programa, a partir da diretiva #include, a biblio- teca string.h. Essa e outras funções para manipulação de strings serão descritas no capítulo 4. É possível atribuir um valor a duas ou mais variáveis a partir de um único comando, como na instrução primitiva x=y=10, em que as variáveis x e y recebem 10. 1.10 Operadores e funções A linguagem C possui operadores e funções predefinidas des- tinadas a cálculos matemáticos e à manipulação de caracte- res. Os operadores aritméticos e relacionais são apresenta- dos nas Tabelas 1.5 e 1.6, respectivamente. Os operadores lógicos são apresentados na Tabela 1.7 e os operadores re- duzidos na Tabela 1.8. Operador Exemplo Descrição + a + b Soma o conteúdo de a e de b. - a – b Subtrai o conteúdo de b do conteúdo de a. * a * b Multiplica o conteúdo de a pelo conteúdo de b. / a / b Divide o conteúdo de a pelo conteúdo de b. % a % b Obtém o resto da divisão de a por b.* Tabela 1.5 − Operadores aritméticos * O operador % só pode ser utilizado com operandos do tipo inteiro. 18 Algoritmos e Programação II Operador Exemplo Descrição == a==b Testa se o conteúdo de a é igual ao conteúdo de b. != a!=b Testa se o conteúdo de a é diferente do conteúdo de b. <= a<=b Testa se o conteúdo de a é menor ou igual que o conteúdo de b. >= a>=b Testa se o conteúdo de a é maior ou igual que o conteúdo de b. < a<b Testa se o conteúdo de a é menor que o conteúdo de b. > a>b Testa se o conteúdo de a é maior que o conteúdo de b. Tabela 1.6 − Operadores relacionais Operador Símbolo Descrição e && Conjunção ou || Disjunção não ! Negação Tabela 1.7 − Operadores lógicos Expressão Equivalente com operadores reduzidos total=total+valor; total+=valor; num=num*5; num*=5; d=d-valor; d-=valor; x=x/5; x/=5; Tabela 1.8 − Operadores reduzidos Além dos operadores apresentados anteriormente, a lin- guagem C disponibiliza operadores de pré e pós incremento e decremento, descritos na Tabela 1.9. Capítulo 1 Introdução à Linguagem C 19 Operador Descrição Pré-fixado Pós-fixado ++ Incrementa ++n n++ -- Decrementa --n n-- Tabela 1.9 − Operadores pré e pós-fixado O operador ++ incrementa um ao valor do seu operando, enquanto –- decrementa um. Esses operadores podem ser usados antes (pré-fixados) ou depois (pós-fixados) do nome da variável. Em ambos os casos a variável é incrementada ou decrementada. Entretanto, ++n incrementa o valor da variá- vel n antes que n seja usada e n++ usa o valor de n e depois o incrementa. Resumindo: ++i → incrementa o valor de i em um e depois o utiliza; i++ → utiliza o valor de i e depois incrementa-o em um. Logo, conclui-se que: z=a; a=a+1; é equivalente a z=a++; z=a; a=a-1; é equivalente a z=a--; a=a+1; z=a; é equivalente a z=++a; a=a-1; z=a; é equivalente a z=--a; 20 Algoritmos e Programação II 1.11 Comentários Os comentários são textos que podem ser inseridos no pro- grama com o objetivo de documentá-lo e não são analisados pelo compilador. Os comentários de uma linha são precedi- dos do símbolo //, enquanto o comentário de várias linhas é envolvido por /* e */, conforme pode ser observado nos exemplos a seguir. // Este é um comentário de uma linha. /* Este é um comentário com mais de uma linha. */ 1.12 Funções de entrada e saída de dados As funções de entrada e saída de dados garantem a comuni- cação do programa com o usuário e/ou outros dispositivos. Nesta seção, serão abordadas apenas algumas funções de entrada e saída de dados necessárias para prover a comuni- cação do usuário com o programa, considerando o teclado como periférico de entrada e a tela como periférico de saída. As funções de saída de dados são utilizadas para exibir da- dos na tela, seja uma mensagem, o resultado de uma expres- são ou o conteúdo armazenado em uma variável. A função de saída mais utilizada em C para este fim é a printf, cuja sintaxe é apresentada a seguir. Capítulo 1 Introdução à Linguagem C 21 printf(<string de controle>,<lista de argu- mentos>); A string de controle possui uma descrição de tudo que a função vai exibir na tela, incluindo não apenas a mensagem, mas também o formato de variáveis e/ou resultado de expres- sões e suas respectivas posições nessa mensagem. Isso é feito por meio do uso dos códigos de formatação vistos na Tabela 1.2. Para cada código de formatação incluído na mensagem, é necessário ter um argumento na lista de argumentos, confor- me ilustram os exemplos do Quadro 1.1. Variáveis Exemplos de função de saída float media; char nome[60]; 01 printf("%.1f",media); 02 printf("Digite o nome do aluno: "); 03 printf("Média final = %.1f",media); 04 printf("%s obteve média %.1f",nome,media); Quadro 1.1 − Exemplos da sintaxe da função printf No exemplo 01 do Quadro 1.1, a função printf possui a string de controle onde aparece o código de formatação %.1f e a variável media como argumento. Nesse caso, o comando de saída exibirá apenas o valor armazenado na va- riável media, formatado a partir do código de formato %.1f. O código de formato %f indica que será exibido um valor do tipo float, e o modificador .1 define que esse valor será exibido com uma casa decimal. Se a variável media estiver armazenando 8, por exemplo, o valor será exibido como 8.0. 22 Algoritmos e Programação II No segundo exemplo, o comando de saída contém apenas um literal na string de controle, que será reproduzido no dis- positivo de saída. No exemplo 03, a string de controle contém um literal e um código de formatação ("Média final = %.1f") e a lista de argumentos possui uma variável (media), resultando em Média final = 9.3 (considerando que a variável media esteja armazenando 9.333). O valor armazenado na variável media é exibido na posição em que aparece o código de formato %.1f, considerando apenas a primeira casa decimal. Por fim, supondo que a variável nome armazene Joana e a variável media armazene 5.77, a saída do exemplo 04 se- ria Joana obteve média 5.8 (o valor 5.77 será arredondado para 5.8). Nesse caso, a string de controle da função printf contém um literal com dois códigos de formato (%s e %.1f) e, consequentemente, a lista de argumentos possui duas vari- áveis (nome e media). Essas variáveis devem ser listadas na mesma ordem em que seus respectivos códigos de formato aparecem na string de controle. As funções de entrada de dados são utilizadas para receber dados digitados pelo usuário. Os dados recebidos são arma- zenados em variáveis já declaradas no programa. As funções de entrada mais utilizadas em C são scanf, getch, getche e fgets. Em geral, a função scanf é utilizada para ler dados numéricos, as funções getch e getche para ler um único caractere por vez e a função fgets para ler cadeias de carac- teres (strings). A sintaxe dessas funções é apresentada a seguir. Capítulo 1 Introdução à Linguagem C 23 scanf(<string de controle>,<lista de argumentos>); <variável> = getch(); <variável> = getche(); fgets(<variável>,<tamanho máximo da variável>,stdin); Na função scanf, a string de controle irá indicar o for- mato dos dados a serem armazenados nas variáveis contidas na lista de argumentos. Isso é feito a partir do uso dos códi- gos de formatação vistos na Tabela 1.2. Para cada código de formatação incluído na string de controle, é necessário ter uma variável na lista de argumentos, precedida do símbolo &, conforme ilustram os exemplos do Quadro 1.2. O símbolo &, chamado operador de endereço, associa a variável a um endereço de memória. Variáveis Exemplos defunção de entrada float peso; int idade; 01 scanf("%f",&peso); 02 scanf("%i",&idade); Quadro 1.2 Exemplos da sintaxe da função scanf No exemplo 01 do Quadro 1.2, a função scanf possui a string de controle onde aparece o código de formatação %f e o endereço da variável peso como argumento. Nesse caso, o comando de entrada fará a leitura do valor digitado pelo usuário e armazenará na variável peso. O código de formato 24 Algoritmos e Programação II %f indica que será armazenado um valor do tipo float. O segundo exemplo faz a leitura da variável idade, que é do tipo int. As funções getch e getche retornam um caractere. Nos exemplos apresentados no Quadro 1.3, a variável letra re- ceberá o caractere digitado pelo usuário. A diferença entre os exemplos é que a função getche, além de capturar o carac- tere digitado, o escreve na tela. Em ambos os casos, o usuário não terá que teclar <ENTER> depois de digitar o caractere. Variáveis Exemplos de função de entrada char letra; 01 letra=getch(); 02 letra=getche(); Quadro 1.3 − Exemplos da sintaxe das funções getch e getche A função fgets é usada para ler uma cadeia de caracte- res, ou seja, uma string. Ela possui três argumentos: o primeiro argumento é a variável que irá armazenar a string digitada pelo usuário; o segundo indica o tamanho máximo da string; e o terceiro, nesse caso o stdin, indica que a entrada de da- dos será realizada via teclado (std = standard + in = input, ou seja, entrada padrão). Os exemplos apresentados no Quadro 1.4 ilustram o uso da função fgets. Capítulo 1 Introdução à Linguagem C 25 Variáveis Exemplos de função de entrada char fone[15]; char nome[60]; 01 fflush(stdin); fgets(fone,15,stdin); 02 fflush(stdin); fgets(nome,60,stdin); Quadro 1.4 − Exemplos da sintaxe da função fgets Como pode ser observado nos exemplos do Quadro 1.4, a função fflush é usada antes da função fgets, com o objetivo de liberar o buffer do teclado. O primeiro exemplo lê a variável fone, que terá no máximo 14 caracteres, en- quanto o exemplo 02 lê a variável nome, que terá no máximo 59 caracteres. Ao definir o tamanho máximo de uma string, é preciso considerar que o espaço de um dos seus caracteres será reservado para o \0 (caractere nulo), necessário para in- dicar seu final. Mais detalhes sobre essa função, bem como outras funções específicas para a manipulação de strings, se- rão abordados no capítulo 4. As funções printf, scanf e fgets pertencem à biblio- teca stdio.h, enquanto as funções getch e getche fazem parte da biblioteca conio.h. 1.13 Funções de tela A Tabela 1.10 apresenta algumas funções de tela, utilizadas para organizar a interface do programa com o usuário. Essas funções fazem parte da biblioteca conio.h. 26 Algoritmos e Programação II Sintaxe da função Descrição clrscr() Limpa a tela e posiciona o cursor no canto superior esquerdo. clreol() Limpa a linha. gotoxy(col,lin) Posiciona o cursor na coluna e linha determinadas (a tela padrão possui 80 colunas e 25 linhas). textcolor(cor) Seleciona a cor do texto. textbackground(cor) Seleciona a cor do fundo da tela (para que todo o fundo fique da cor selecionada, deve-se utilizar a função para limpar a tela logo após esta). delline() Exclui a linha em que o cursor está posicionado, movendo todas as linhas que estiverem abaixo desta, uma posição para cima. insline() Insere uma linha na posição em que o cursor está posicionado, movendo todas as linhas que estiverem abaixo desta, uma posição para baixo. Tabela 1.10 − Funções de tela A lista de cores básicas, disponíveis para serem utilizadas nas funções textcolor e textbackground é exibida na Tabela 1.11. É possível utilizar tanto o código da cor, quanto seu nome em inglês, como parâmetro das funções. Exemplos: textcolor(4) ou textcolor(RED). Nos dois exemplos, a cor selecionada para o texto é a mesma, o vermelho. Capítulo 1 Introdução à Linguagem C 27 Código Cor Código Cor Código Cor 0 Preto 6 Marrom 12 Alaranjado 1 Azul 7 Cinza claro 13 Magenta claro 2 Verde 8 Cinza escuro 14 Amarelo 3 Ciano 9 Azul claro 15 Branco 4 Vermelho 10 Verde claro 5 Magenta 11 Ciano claro Tabela 1.11 − Lista de cores 1.14 Exemplo do uso das funções de entrada e saída e de tela A Figura 1.1 apresenta um programa que lê duas notas forne- cidas pelo usuário, calcula e escreve a média entre elas. Nesse exemplo, é possível observar o uso de vários dos conceitos e funções estudados neste capítulo. 28 Algoritmos e Programação II Figura 1.1 − Exemplo do uso das funções de tela, entrada e saída Na linha 2, um comentário foi usado para descrever o pro- blema que o programa resolve. Em seguida, nas linhas 4 e 5, são listadas as bibliotecas necessárias para executar as fun- ções utilizadas na solução do problema. A função principal (main) aparece entre as linhas 7 e 23. No início da função, tem-se a declaração de variáveis de escopo local (todas do tipo float), seguida das funções que selecionam a cor do texto e do fundo de tela, e do comando de limpar a tela. A função gotoxy é utilizada várias vezes, antes das funções de saída, para posicionar as mensagens em determinadas posi- Capítulo 1 Introdução à Linguagem C 29 ções da tela. No final do programa, usa-se o getch para que, ao executar, o programa mantenha a tela de exibição dos re- sultados até que o usuário digite qualquer tecla para retornar à tela de edição do compilador. Referências Bibliográficas DEITEL, Paul; DEITEL, Harvey. C: como programar. 6.ed. São Paulo: Pearson Prentice Hall, 2011. FORBELLONE, André Luiz Villar; EBERSPÄCHER, Henri Frederi- co. Lógica de Programação: a construção de algoritmos e estruturas de dados. 3.ed. São Paulo: Prentice Hall, 2005. ISAIA FILHO, Eduardo; LINDEMANN, Vanessa. Algoritmos e Programação I. Canoas: Ed. ULBRA, 2013. Atividades Parte I - Questões objetivas 1) A sintaxe da declaração de uma variável em C inclui o nome da variável seguido de um tipo. a) Certo b) Errado 30 Algoritmos e Programação II 2) São nomes válidos para variáveis na linguagem C: a) if, a*b_2, H789, &ya b) A, b, Y, count c) 9xy, a36, x*y, --j d) 2_ou_1, \fim, h, j e) i, j, int, obs 3) Em C, os nomes cont e Cont não podem ser emprega- dos para representar a mesma variável ao longo de um programa. a) Certo b) Errado 4) Uma string é uma sequência de caracteres armazenada em um vetor de caracteres. a) Certo b) Errado 5) O que faz o seguinte programa em C ? #include <stdio.h> main( ){ int i=2; printf("Valor de i = %i\n",i); } Capítulo 1 Introdução à Linguagem C 31 a) imprime: Valor de i = 2 e pula para a próxima linha; b) imprime: Valor de i = 2\n; c) pula para a próxima linha e imprime: Valor de i = 2; d) imprime: Valor de i = 2; e) nenhuma das alternativas anteriores. 6) Qual o resultado das variáveis j, k e l depois da seguinte sequência de operações? int j,k,l; j=k=10; l=++j; j=-j; k++; j=j+k-l--; a) j = -10, k = 10, l = 10 b) j = -11, k = 11, l = 10 c) j = -10, k = 11, l = 10 d) j = 11, k= 11, l = 11 e) nenhuma das alternativas anteriores 7) Na Linguagem C, os códigos de formatação de tipo de dados NÃO estão corretamente associados na alternativa: a) int - %i b) double - %d c) float - %f 32 Algoritmos e Programação II d) char - %c e) nenhuma das respostas anteriores Parte II - Resolução de problemas Resolva os problemas descritos a seguir, utilizando a Lin- guagem C. 1) O custo final de um carro novo para o consumidor é a soma do custo de fábrica, dos impostos e da porcentagem do distribuidor. Supondo que os impostos totalizam 45% so- bre o custo de fábrica e a porcentagem do distribuidor seja de 20% sobre o valor total, escreva um programa que leia o custo de fábrica de um carro, calcule e escreva o custo final ao consumidor. 2) Sabe-se que, para iluminar de maneira correta os cômodos de uma casa, para cada m2, deve-se usar 18W de potên-cia. Faça um programa que receba as duas dimensões de um cômodo (em metros), calcule e apresente a sua área (em m2) e a potência de iluminação que deverá ser utilizada. 3) Uma empresa que promove espetáculos teatrais precisa de um programa para definir o valor mínimo para o convite, considerando o custo total do espetáculo e o número de lu- gares disponíveis para o público no local da apresentação. 4) Sabe-se que: 1 pé = 12 polegadas; Capítulo 1 Introdução à Linguagem C 33 1 jarda = 3 pés; 1 milha = 1760 jardas. Faça um programa que receba uma medida em pés, faça as conversões conforme a descrição acima e mostre os re- sultados em polegadas, jardas e milhas. 5) Considerando uma aplicação de P reais à taxa de juros i constante por um período de N meses, calcule e escreva qual será o montante M após o término da aplicação, sen- do M = P * (1 + i) N. Respostas dos exercícios da Parte I 1) b; 2) b; 3) a; 4) a; 5) a; 6) b; 7) b. * Doutora em Informática na Educação pela UFRGS (2008); professora dos cursos da Computação da ULBRA Estruturas Básicas de Controle ÂÂ Ao criar um programa, tem-se como objetivo a solução de um determinado problema. Para que esse proble- ma seja resolvido, as instruções primitivas devem estar or- ganizadas de forma a representar um conjunto de ações, que seguirá um fluxo de execução determinado por três estruturas básicas de controle: sequencial, condicional e repetitiva - temas abordados nas próximas seções. Vanessa Lindemann Capítulo 2 Capítulo 2 Estruturas Básicas de Controle 35 2.1 Estrutura sequencial A estrutura sequencial contém um conjunto de instruções que serão executadas de forma linear, de cima para baixo, da es- querda para a direita, sem nenhum desvio entre os símbolos de início e fim do programa. Figura 2.1 Exemplo da estrutura de controle sequencial 36 Algoritmos e Programação II A Figura 2.1 apresenta um programa que calcula o salário de um funcionário, cuja estrutura é sequencial. O programa inicia com um comentário, que descreve o problema a ser re- solvido, seguido da lista de bibliotecas necessárias. A função principal (main) vai da linha 6 à 27, onde são declaradas as variáveis (linhas 7, 8 e 9), ocorre a entrada de dados (entre as linhas 12 e 17), o processamento (linhas 18, 19 e 20) e a saída de dados (entre as linhas 22 e 25). Essas instruções são executadas sequencialmente, do início ao final do programa, sem nenhum desvio. 2.2 Estrutura condicional A estrutura condicional é utilizada para desviar o fluxo de exe- cução do algoritmo para diferentes partes da solução. Tam- bém chamada de estrutura de seleção, ela divide-se em estru- tura SE e estrutura ESCOLHA. A estrutura SE é mais flexível, podendo utilizar na sua con- dição todos os operadores relacionais (<, >, <=, >=, =, <>) e, quando forem necessárias, mais de uma condição com os operadores lógicos (E e OU) entre elas. Essa estrutura também é classificada como estrutura condicional SE simples, composta ou encadeada. A sintaxe da estrutura condicional SE simples, em lingua- gem C, é apresentada a seguir. if(<condição ou lista de condições>) Capítulo 2 Estruturas Básicas de Controle 37 <instrução ou bloco de instruções> A condição é avaliada e, se retornar zero, que nessa si- tuação em C significa falso, a instrução não será executada. Quando resultar qualquer valor diferente de zero, que em C nessa situação é considerado verdadeiro, a instrução será exe- cutada. Essa estrutura pode conter mais de uma condição com operadores lógicos entre elas e, também, pode conter um blo- co de instruções a ser executado, ao invés de uma instrução única. Vale lembrar que um bloco é composto por duas ou mais instruções, delimitado por início e fim (em C, representa- dos pelos símbolos { e }). O Quadro 2.1 apresenta três exem- plos da estrutura condicional SE simples em linguagem C. Com instrução única Com bloco de instruções Mais de uma condição e bloco if(a>b) printf("%i",a); if(a>b){ a=a-b; printf("%i",a); } if(a>b && a<>0 && b<>0){ a=a/b; printf("%i",a); } Quadro 2.1 − Exemplos da sintaxe da estrutura condicional SE simples em C A sintaxe da estrutura condicional SE composta, em lingua- gem C, pode ser observada a seguir. if(<condição ou lista de condições>) <instrução ou bloco de instruções> 38 Algoritmos e Programação II else <instrução ou bloco de instruções> Quando a condição avaliada resultar qualquer valor di- ferente de zero, a instrução da cláusula if será executada; caso contrário, quando resultar zero, é a instrução da cláusula else que será executada. O Quadro 2.2 exemplifica a utilização da estrutura condi- cional SE composta em linguagem C. O programa apresenta- do lê um valor inteiro e verifica se ele é par ou ímpar. Na colu- na da esquerda, a solução aparece em português estruturado, enquanto a coluna da direita apresenta a mesma solução em linguagem C. Capítulo 2 Estruturas Básicas de Controle 39 Problema: ler um valor do tipo inteiro e verificar se ele é par ou ímpar. Português estruturado – SE Linguagem C - if algoritmo exemplo variáveis valor: inteiro início escrever("Digite um valor: ") ler(valor) se(valor mod 2 = 0)então escrever(valor," é par.") senão escrever(valor," é ímpar.") fim #include <stdio.h> #include <conio.h> main() { int valor; clrscr(); gotoxy(10,10); printf("Digite um valor: "); scanf("%i",&valor); gotoxy(10,14); if(valor%2==0) printf("%i é par.", valor); else printf("%i é ímpar.", valor); getch(); } Quadro 2.2 − Exemplo da estrutura de controle condicional SE Outro exemplo do uso da estrutura condicional SE com- posta pode ser observado na Figura 2.2, onde o programa lê duas notas, calcula a média do aluno e emite uma mensagem de aprovado ou reprovado. 40 Algoritmos e Programação II Figura 2.2 − Exemplo da estrutura de controle condicional SE composta, em linguagem C A aplicação da estrutura condicional SE encadeada, cuja sintaxe em linguagem C é apresentada a seguir, pode ser ob- servada na Figura 2.3 que verifica se um valor digitado pelo usuário é positivo, negativo ou nulo. if(<condição ou lista de condições>) <instrução ou bloco de instruções> else Capítulo 2 Estruturas Básicas de Controle 41 if(<condição ou lista de condições>) <instrução ou bloco de instruções> else <instrução ou bloco de instruções> Figura 2.3 − Exemplo da estrutura de controle condicional SE encadeada, em linguagem C Em situações de igualdade para uma mesma variável, em que é necessário comparar a variável com vários valores, utiliza- -se a estrutura condicional SE encandeada (por exemplo, com- parar uma variável op com as quatro operações básicas + - * e /). Nesse caso, tem-se uma seleção de múltipla escolha. 42 Algoritmos e Programação II O uso da estrutura condicional ESCOLHA, apresentado a seguir, pode simplificar bastante a "cascata" de estruturas SE necessária nessas situações. A estrutura ESCOLHA pode ser utilizada nesses casos desde que a variável avaliada seja do tipo inteiro ou caractere. A sintaxe da estrutura condicional ESCOLHA, em linguagem C, é apresentada a seguir. switch(<variável>){ case <1>: <instruções> break; case <2>: <instruções> break; case <n>: <instruções> break; default: <instruções> } Se a variável avaliada tiver um dos valores listados nas op- ções, as instruções correspondentes ao respectivo case serão executadas. Quando a variável for diferente de todas as op- ções listadas, a instrução (ou bloco de instruções) da cláusula default será executada. A cláusula default é opcional nessa estrutura. No final de cada case, aparece o break, usado para encerrar a execução da estrutura condicional. Para demonstrar a aplicação da estrutura condicionalES- COLHA em linguagem C, o Quadro 2.3 apresenta um exem- plo que executa as operações básicas de uma calculadora. Na coluna da esquerda, a solução aparece em português estrutu- rado e na da direita em linguagem C. Capítulo 2 Estruturas Básicas de Controle 43 Problema: construir uma calculadora que contenha as operações: +, - , * e /. Português estruturado - ESCOLHA Linguagem C - switch algoritmo exemplo variáveis valor1,valor2,r: real operador: caractere início escrever("Digite o 1º valor: ") ler(valor1) escrever("Digite o operador: ") ler(operador) escrever("Digite o 2º valor: ") ler(valor2) escolha(operador) caso "+": r valor1+valor2 caso "-": r valor1-valor2 caso "*": r valor1*valor2 caso "/": se(valor2<>0)então r valor1/valor2 senão r 0 senão início escrever("Operador inválido") r 0 fim fim escrever ("Resultado = ", r) fim #include <stdio.h> #include <conio.h> main(){ float valor1,valor2, r; char operador; clrscr(); gotoxy(10,5); printf("Digite o primeiro valor:"); scanf("%f",&valor1); gotoxy(10,8); printf("Digite o operador: "); gotoxy(29,8); operador=getc he(); gotoxy(10,11); printf("Digite o segundo valor: "); scanf("%f",&valor2); switch(operador){ case'+': r=valor1+valor2; break; case'-': r=valor1-valor2; break; case'*': r=valor1*valor2; break; case'/': if(valor2!=0) r = valor1 / valor2; else r = 0; break; default: gotoxy(10,15); printf("Operador inválido!"); r=0; } gotoxy(10,18); printf("Resultado = %3.2f", r); getch(); } Quadro 2.3 − Exemplo da estrutura de controle condicional ESCOLHA, em linguagem C 44 Algoritmos e Programação II Outro exemplo do uso da estrutura condicional ESCOLHA pode ser observado na Figura 2.4. Neste exemplo, o usuário digita o código de um produto e a quantidade adquiria e o programa calcula o total a pagar. Figura 2.4 − Exemplo da estrutura de controle condicional ESCOLHA, em linguagem C Capítulo 2 Estruturas Básicas de Controle 45 2.3 Estrutura de repetição Enquanto as estruturas condicionais, estudadas na seção ante- rior, têm como objetivo escolher entre diferentes fluxos de exe- cução a partir da avaliação de uma expressão, as estruturas de repetição possibilitam que uma ou mais instruções sejam executadas mais de uma vez no programa. As estruturas de controle de repetição dividem-se em EN- QUANTO, REPITA/ATÉ e PARA. Elas diferenciam-se em relação ao momento em que a condição de interrupção será avaliada, que pode ser antes ou depois da primeira iteração. A estrutura de controle de repetição ENQUANTO permi- te executar uma ou mais instruções repetidamente enquanto sua condição de interrupção resultar verdadeiro. A sintaxe da estrutura de repetição ENQUANTO, em linguagem C, é apre- sentada a seguir. while(<condição>) <instrução ou bloco de instruções> Como pode ser observado, a condição de interrupção é verificada antes da execução da instrução ou bloco de instru- ções a ser repetido. Se o resultado dessa condição for dife- rente de zero (que, em linguagem C, significa verdadeiro), a instrução ou bloco de instruções é executado e, logo após essa iteração, o fluxo de execução retorna para o início da estrutura while e a condição de interrupção é avaliada novamente. Esse processo é repetido até que a condição avaliada resulte zero (ou seja, falso em linguagem C). Nesse caso, o fluxo de 46 Algoritmos e Programação II execução do programa continuará a partir da instrução ime- diatamente após à estrutura while. Vale destacar que, como a condição de interrupção é avaliada no início da estrutura de controle, quando esta resultar zero na primeira vez em que for verificada, a instrução ou bloco de instruções da estrutura não será executado nenhuma vez. Ao contrário da estrutura ENQUANTO, a condição de in- terrupção da estrutura REPITA/ATÉ é verificada no final de cada iteração. Em linguagem C, a sintaxe da estrutura de repetição equivalente à estrutura REPITA/ATÉ, considerando o fato de que a condição de interrupção é avaliada no final de cada iteração, é apresentada a seguir. do{ <instrução ou bloco de instruções> } while(<condição>) Uma ou mais instruções serão executadas repetidamente enquanto a condição de interrupção da estrutura resultar ver- dadeiro (em linguagem C, verdadeiro significa qualquer valor diferente de zero). Como a condição só é avaliada no final de cada iteração, a instrução ou bloco de instruções a ser repeti- do será executado pelo menos uma vez, independente do valor inicial da condição de interrupção. Depois de cada iteração, se o resultado da condição for verdadeiro, o fluxo de execução retorna para o início da estrutura. Esse processo é repetido enquanto a condição de interrupção resultar verdadeiro. Capítulo 2 Estruturas Básicas de Controle 47 A estrutura de repetição PARA, diferente das anteriores, é controlada por uma variável de controle, como pode ser ob- servado na sintaxe apresentada a seguir, em linguagem C. for(v=vi;v<vf;v++) <instrução ou bloco de instruções> Onde: v representa a variável de controle; vi indica o valor inicial da variável de controle; vf indica o valor final da variável de controle; e v++ indica que a variável será incrementada em um a cada iteração. As estruturas de controle de repetição são exemplificadas nos quadros a seguir. Para facilitar o entendimento, a coluna da esquerda dos Quadros 2.4, 2.5 e 2.6 apresenta a solução em português estruturado e a da direita em linguagem C. 48 Algoritmos e Programação II Problema: ler 10 valores do tipo inteiro, calcular e escrever a média desses valores. Português estruturado – ENQUANTO Linguagem C – while algoritmo exemplo variáveis valor, soma, cont: inteiro media: real início cont 0 soma 0 enquanto(cont<10)faça início escrever("Digite um valor:") ler(valor) cont cont + 1 soma soma + valor fim media soma / 10 escrever("Média = ", media) fim #include <stdio.h> #include <conio.h> main() { int valor, soma, cont; float media; cont = 0; soma = 0; while(cont<10) { clrscr(); gotoxy(10,10); printf("Digite um valor: "); scanf("%i",&valor); cont = cont + 1; soma = soma + valor; } media = soma / 10; gotoxy(10,14); printf("Media = %.2f", media); getch(); } Quadro 2.4 − Exemplo da estrutura de controle de repetição ENQUANTO Capítulo 2 Estruturas Básicas de Controle 49 Problema: ler 25 valores, calcular e escrever o percentual de valores negativos. Português estruturado – REPITA Linguagem C – do while algoritmo exemplo variáveis cont: inteiro valor, negativo, perc: real início cont 0 negativo 0 repita escrever("Digite um valor: ") ler(valor) cont cont + 1 se (valor < 0) então negativo negativo + 1 até(cont=25) perc (negativo*100)/25 escrever("% negativos= ",perc) fim #include <stdio.h> #include <conio.h> main() { int cont; float valor, negativo, perc; cont = 0; negativo = 0; do{ clrscr(); gotoxy(10,10); printf("Digite um valor: "); scanf("%f",&valor); cont = cont + 1; if(valor < 0) negativo = negativo + 1; } while(cont<25); perc = (negativo*100)/25; gotoxy(10,14); printf("%% negativos= %.2f", perc); getch(); } Quadro 2.5 − Exemplo da estrutura de controle de repetição REPITA O exemplo utilizando a estrutura for, do Quadro 2.6, apresenta a solução de um problema em que o número de repetições é conhecido previamente. Nesses casos,na estrutu- ra for(cont=1;cont<=10; cont++), a primeira instru- ção inicializa a variável de controle (cont=1), a segunda ve- rifica a condição de interrupção avaliando a mesma variável (cont<=10) e a terceira incrementa a variável de controle em um a cada iteração (cont++). É importante destacar que a pri- 50 Algoritmos e Programação II meira instrução, usada para inicializar a variável de controle, é executada uma única vez, no início da execução da estrutura. Problema: ler um valor inteiro, entre 1 e 10, e escrever a sua tabuada. Português estruturado – PARA Linguagem C – for algoritmo exemplo variáveis valor, cont: inteiro início escrever("Digite um valor: ") ler(valor) se(valor>=1)e(valor<=10) para cont de 1 até 10 faça escrever(cont*valor) senão escrever("Valor inválido.") fim #include <stdio.h> #include <conio.h> main() { int valor, cont; clrscr(); gotoxy(10,5); printf("Digite um valor: "); scanf("%i",&valor); if(valor>=1 && valor<=10) for(cont=1;cont<=10;cont++) { gotoxy(10,cont+7); printf(" %i",cont*valor); } else{ gotoxy(10,7); printf("Valor inválido."); } getch(); } Quadro 2.6 − Exemplo da estrutura de controle de repetição PARA Em português estruturado, a estrutura PARA só pode ser utilizada para resolver problemas em que o número de repeti- ções é previamente conhecido, como no exemplo anterior. Em linguagem C, entretanto, a estrutura for é mais flexível, po- dendo ser utilizada em outras situações, como exemplificado nas Figuras 2.5 e 2.6. O exemplo apresentado na Figura 2.5 lê vários valores e calcu- la a média dos mesmos. A entrada de dados é encerrada quando Capítulo 2 Estruturas Básicas de Controle 51 o usuário digitar zero. Na linha 14 do programa apresentado na Figura 2.5, a estrutura for(cont=1;valor!=0;cont++) inicializa a variável cont, que é usada para contar a quantida- de de valores digitados pelo usuário; na segunda instrução da estrutura, que verifica a condição de interrupção, é a variável valor que é avaliada; e, por fim, a variável cont é incremen- tada em um a cada iteração. Diferentemente do exemplo ante- rior, nessa situação, a estrutura for manipula duas variáveis: cont e valor. Figura 2.5 − Exemplo da estrutura PARA, em linguagem C 52 Algoritmos e Programação II No exemplo apresentado na Figura 2.6, o enunciado do problema não define quantos valores serão lidos, nem indi- ca a condição de interrupção. Nessa situação, é necessário perguntar ao usuário, ao final de cada iteração, se ele deseja continuar a execução do programa − por isso, foi criada a variável resp para armazenar a resposta do usuário. A estru- tura for(cont=1;resp!='N'||resp!='n';cont++), linha 11, inicializa a variável cont, que é usada para contar a quantidade de valores digitados pelo usuário; na segunda instrução, que verifica a condição de interrupção, é a variável resp que é avaliada; e, por fim, a variável cont é incremen- tada em um a cada iteração. Capítulo 2 Estruturas Básicas de Controle 53 Figura 2.6 − Exemplo da estrutura PARA, em linguagem C Além dos exemplos apresentados até aqui, a linguagem C permite muitas outras possibilidades para a estrutura for, como demonstram os exemplos do Quadro 2.7. 54 Algoritmos e Programação II Flexibilidade Exemplo de aplicação Qualquer uma das três partes da estrutura for pode conter uma ou mais instruções, separadas por vírgula. //Escreve nos. de 0 a 98 em incremento de 2. main() { int x,y; for(x=0,y=0;x+y<100;x=x+1,y=y+1) printf("%i ",x+y); } É possível utilizar caracteres para definir valores iniciais e seus limites, ao invés de inteiros. /* Imprime as letras minúsculas do alfabeto e seus respectivos códigos decimais da tabela ASCII. */ main() { char ch; for(ch='a';ch<'z';ch++) printf("Valor ASCII de %c é %d.\ n",ch,ch); } É possível fazer chamada a funções em qualquer uma das partes da estrutura. /* Lê caracteres, um a um até que seja digitado X, e imprime o caractere seguinte a partir do código ASCII. */ main() { char ch; for(ch=getch();ch!='X';ch=getch()) printf("%c ",ch+1); } Qualquer uma das três partes da estrutura pode ser omitida, embora os pontos-e-vírgulas per- maneçam. Se a parte de inicialização ou a de in- cremento forem omiti-das, elas serão desconside-ra- das. Quando a segunda parte é omitida, a condi- ção de teste é considerada sempre verdadeira. /* Lê caracteres, um a um até que seja digitado X, e imprime o caractere seguinte a partir do código ASCII. */ main() { char ch; for( ; (ch=getch())!='X'; ) printf("%c ",ch+1); } /* Entra em laço infinito */ main() { for( ; ; ) printf("Laço infinito./n"); } Quadro 2.7 − Exemplos da flexibilidade da estrutura for Capítulo 2 Estruturas Básicas de Controle 55 Referências Bibliográficas DEITEL, Paul; DEITEL, Harvey. C: como programar. 6.ed. São Paulo: Pearson Prentice Hall, 2011. FORBELLONE, André Luiz Villar; EBERSPÄCHER, Henri Frederi- co. Lógica de Programação: a construção de algoritmos e estruturas de dados. 3.ed. São Paulo: Prentice Hall, 2005. ISAIA FILHO, Eduardo; LINDEMANN, Vanessa. Algoritmos e Programação I. Canoas: Ed. ULBRA, 2013. Atividades Parte I - Questões objetivas 1) Na programação estruturada, são necessárias apenas três es- truturas de controle para implementar algoritmos. São elas: a) seleção, repetição e aninhamento b) empilhamento, aninhamento e operação c) sequência, aninhamento e seleção d) sequência, seleção e repetição e) função, operação e programa 56 Algoritmos e Programação II 2) if(var) é equivalente a if(var!=0). a) Certo b) Errado 3) Para que faixa de valores da variável x o seguinte segmento de código imprime a letra C? if(x<=200) if(x<=100) if(x<0) printf("A") else printf("B") else printf("C") else printf("D") a) 0<x<100 b) x<=100 c) 100<x<=200 d) x>200 e) 100<=x<=200 4) Tendo em vista a sintaxe da linguagem de programação C, e supondo que todas as variáveis da expressão while(9<=H && P!=0 || F%2==0) Capítulo 2 Estruturas Básicas de Controle 57 sejam do tipo inteiro, o laço de repetição NÃO será exe- cutado se: a) H < 9 e P ≠ 0 e F for par b) H = 9 e P = 0 e F for ímpar c) H ≥ 9 e P ≠ 0 e F ≠ 0 d) H > 9 e P = 0 e F = 0 e) Nenhuma das respostas anteriores 5) Considerando que x e y são números inteiros positivos, as- sinale a alternativa que descreve a tarefa executada pelo programa em C descrito a seguir. #include<stdio.h> main(){ int x,y,z,w; printf("Digite os valores de x e y: "); scanf("%d %d",&x,&y); z=1; while(z*y<=x) z=z+1; z=z-1; w=x-z*y; printf("%d %d \n",z,w); } a) Exibe, respectivamente, o valor correspondente às vari- áveis x e y. 58 Algoritmos e Programação II b) Exibe, respectivamente, o quociente e o resto da variável x pela variável y. c) Exibe, respectivamente, os dois primeiros números pri- mos menores que x e y. d) Exibe, respectivamente, o resto e o quociente da variável x pela variável y. e) Exibe, respectivamente, o valor correspondente às vari- áveis x e y. 6) Quanto vale k no final da execução do seguinte trecho de código? k=0; for(i=1; i<=n; i++) for(j=i; j<=n; j++) k=k+1; a) n3 b) (n2–n)/2 c) n d) n(n+1)/2 e) n-1 Capítulo 2 Estruturas Básicas de Controle 59 Parte II - Resolução de problemas Resolva os problemas descritos a seguir, utilizando a Lingua- gem C. 1) Escreva um programa que leia 20 valores, encontre e escre- va o maior entre eles. 2) Construa um programa que leia um valor inteiro e positivo, calcule e escreva o seu fatorial. Exemplos: 4! = 1 x 2 x 3 x 4 = 24 5! = 1 x 2 x 3 x 4 x 5 = 120 Por definição, 0! = 1 3) Em uma eleiçãopresidencial, existem 4 candidatos. Os vo- tos são informados a partir de códigos, que obedecem a seguinte regra: 1, 2, 3, 4 = voto para os respectivos can- didatos; 5 = voto nulo; 6 = voto branco. Elabore um pro- grama que leia o voto de cada um dos eleitores, calcule e escreva: total de votos para cada candidato; total de votos nulos; total de votos em branco. Como finalizador do con- junto de dados tem-se o valor 0 (zero). 4) Elabore um programa que repita a leitura de uma data até que ela seja válida. Para cada data incorreta, escrever a mensagem "DATA INVÁLIDA". Quando a data for informa- da corretamente, deve ser impressa a mensagem "DATA VÁLIDA" e o programa deve ser encerrado. Para resolver 60 Algoritmos e Programação II esse problema, use três variáveis para representar a data: dia, mês e ano; não esqueça de considerar ano bissexto, quando o mês de fevereiro tem 29 dias. 5) Durante uma pesquisa realizada entre os habitantes de uma região, foram coletados os seguintes dados: idade, gêne- ro e salário. Faça um programa que calcule e informe: a média salarial do grupo; a maior idade do grupo; a quan- tidade de mulheres com salário superior a R$ 5.000,00. Respostas dos exercícios da Parte I 1) d; 2) a; 3) c; 4) b; 5) b; 6) d. Variáveis Indexadas Unidimensionais ÂÂUma variável simples representa um espaço da memó-ria do computador onde é possível armazenar um úni- co valor por vez. Os dados armazenados podem ser do tipo inteiro, real, caractere ou cadeia de caracteres. Esses conceitos, aliados às instruções primitivas de entrada e sa- ída de dados e às estruturas de controle de fluxo sequen- cial, condicionais e repetitivas, estudados nos capítulos anteriores, permitem resolver diversos problemas como visto até aqui. O uso de variáveis simples, entretanto, gera algumas limitações como a exemplificada a seguir. Vanessa Lindemann* Capítulo 3 * Doutora em Informática na Educação pela UFRGS (2008); professora dos cursos da Computação da ULBRA 62 Algoritmos e Programação II Problema: ordenar três valores do tipo inteiro. Português estruturado Linguagem C algoritmo exemplo variáveis a, b, c: inteiro início escrever("Digite 3 valores: ") ler(a, b, c) escrever("Valores ordenados: ") se(a<b)então se(b<c)então escrever(a,b,c) senão se(a<c) então escrever(a,c,b) senão escrever(c,a,b) senão se(b<c)então se(a<c)então escrever(b,a,c) senão escrever(b,c,a) senão escrever(c,b,a) fim #include <stdio.h> #include <conio.h> main() { int a, b, c; clrscr(); gotoxy(10,5); printf("Digite 3 valores: "); scanf("%i %i %i",&a,&b,&c); gotoxy(10,8); printf("Valores ordenados: "); if(a<b) if(b<c) printf("%i %i %i",a,b,c); else if(a<c) printf("%i %i %i",a,c,b); else printf("%i %i %i",c,a,b); else if(b<c) if(a<c) printf("%i %i %i",b,a,c); else printf("%i %i %i",b,c,a); else printf("%i %i %i",c,b,a); getch(); } Quadro 3.1 − Exemplo da limitação do uso de variáveis simples O programa descrito no Quadro 3.1 ordena três valo- res do tipo inteiro. Nesse método de ordenação, utilizando variáveis simples, ordenar n elementos implica em gerar Capítulo 3 Variáveis Indexadas Unidimensionais 63 n! resultados diferentes. Logo, é impossível, por exemplo, utilizar o mesmo método para ordenar 10 valores armaze- nados em variáveis simples − além de ter que utilizar 10 variáveis com nomes diferentes, seriam necessários exibir 10! (3.628.800) resultados. Uma forma de resolver esse problema é utilizar uma variável indexada unidimensional, que representa um conjunto de dados ordenados e homogêneo, armazena- do de forma contínua na memória, acessível por um único nome e um índice. Essas variáveis também são conhecidas como matrizes unidimensionais, arranjos unidimensionais ou vetores (nome que será adotado neste livro). 64 Algoritmos e Programação II 3.1 Estrutura A estrutura de um vetor, cujo tamanho é 10, é ilustrada na Fi- gura 3.1. À esquerda, a representação do vetor em algoritmo, onde os índices variam de 1 a 10; à direita, a representação em linguagem C, em que os índices variam de 0 a 9. Algoritmo 1 102 23 34 45 56 67 78 89 910 Linguagem C notas Índices: 1 a 10 Índices: 0 a 9 notas Figura 3.1 − Exemplos da estrutura de um vetor de tamanho 10 3.2 Declaração Para declarar um vetor, é necessário definir o tipo dos dados que serão armazenados nele, o nome (identificador) a partir do qual ele será manipulado e o tamanho da variável, que indica quantos valores ele poderá armazenar. A sintaxe da declara- ção de um vetor, em linguagem C, é apresentada a seguir. <tipo> <identificador>[<tamanho>]; Onde: tipo representa um dos tipos básicos; identificador é o nome que será usado para manipular a variável; tamanho indica a quantidade de elementos que a variável irá armazenar. Capítulo 3 Variáveis Indexadas Unidimensionais 65 A Tabela 3.1 exemplifica como declarar um vetor para ar- mazenar 10 elementos do tipo real, em português estruturado e o equivalente em Linguagem C. Português estruturado Linguagem C notas: vetor [1..10] de real float notas[10]; Tabela 3.1 − Exemplo da declaração de um vetor Um vetor pode ser inicializado no momento de sua decla- ração. Ao executar int vet[5]={0} a variável vet é criada e terá todas as suas posições inicializadas com zero; ao executar int vet[5]={1,2,3,4,5} a variável será inicializada com um valor diferente em cada posição. 3.3 Manipulação Para acessar um elemento de um vetor, além de referenciar o seu nome, é necessário indicar a posição do elemento deseja- do. A posição do elemento do vetor, denominada índice, deve ser indicada entre colchetes e pode ser uma constante, uma expressão aritmética ou uma variável. Ao isolar um elemento do vetor, é possível realizar instruções primitivas de entrada, de saída e de atribuição. Alguns exemplos da instrução primitiva de atribuição são apresentados na Tabela 3.2 e ilustrados na Figura 3.2. 66 Algoritmos e Programação II Português estruturado Linguagem C notas[3] ← 9.5 notas[2] = 9.5; i ← 3 notas[i] ← 9.5 i = 2; notas[i] = 9.5; Tabela 3.2 − Exemplo de atribuição a um elemento específico do vetor 10 2 3 4 5 6 7 8 9 9,5 notas Figura 3.2 − Variável notas depois da instrução de atribuição, em Linguagem C Português estruturado Linguagem C escrever (“Informe os 10 elementos do vetor: ”) para i de 1 até 10 faça ler(notas[i]) gotoxy(10,5); printf(“Informe os 10 elementos do vetor: “); for(i=0; i<10; i++){ gotoxy(i*5+10,8); scanf(“%f”,¬as[i]); } Tabela 3.3 − Exemplo da entrada de dados em um vetor A Tabela 3.3 exemplifica a entrada de dados da variável notas, declarada na Tabela 3.1. A Figura 3.3 ilustra o resul- tado dessa variável, supondo que o usuário tenha digitado 9, 8.3, 5.1, 6, 7.9, 5.2, 9, 8, 9.7 e 5, nessa ordem. Capítulo 3 Variáveis Indexadas Unidimensionais 67 10 2 3 4 5 6 7 8 9 5.1 7.9 5.28.3 8 9.7 569 9 notas Figura 3.3 − Ilustração da variável notas depois da entrada de dados, em Linguagem C A função gotoxy(coluna,linha) é utilizada para po- sicionar o cursor em uma determinada posição da tela. Ela é usada antes de instruções primitivas de entrada e saída para organizar os dados na tela. No exemplo de entrada de dados da Tabela 3.3, em linguagem C, a função gotoxy(10,5) posiciona o cursor na coluna 10 e na linha 5, antes da instru- ção de saída, que irá imprimir na tela a mensagem "Informe os 10 elementos do vetor: ". Essa mensagem será exibida uma única vez, a partir da coluna 10, na linha 5. Nesse mesmo exemplo, a função gotoxy(i*5+10,8) aparece novamente, antes da instrução primitiva de entrada de dados. Nesse caso, ela é usada para definiro local em que os dados de entrada, digitados pelo usuário, serão exibidos na tela. Como o usuário irá digitar 10 notas, para que todas sejam exibidas na tela uma ao lado da outra, o primeiro parâ- metro da função, que representa a coluna, não pode ser uma constante (ou seja, não pode ser um valor fixo). No exemplo, utiliza-se a expressão i*5+10 para definir a coluna em que cada valor digitado pelo usuário será exibido. Considerando que a variável i varia entre 0 e 9, os valores seriam lidos nas colunas: 10, 15, 20, 25, 30, 35, 40, 45, 50 e 55 − sempre na linha 8. Observa-se, portanto, que o valor que multiplica a variável i na expressão define o intervalo en- 68 Algoritmos e Programação II tre as colunas (no exemplo, o intervalo entre um valor e outro é de 5), enquanto o valor que é somado à variável i na ex- pressão, define a primeira coluna a ser utilizada (no exemplo, coluna 10). 3.4 Exemplos do uso de vetores Esta seção é dedicada à resolução de alguns problemas, cujas soluções utilizam variáveis indexadas unidimensionais, ou seja, vetores. No primeiro exemplo, a solução é apresentada em português estruturado e, em seguida, o equivalente em lingua- gem C. Nos demais exemplos, utiliza-se apenas a representa- ção em linguagem C. Â Exemplo 3.1 Problema: o professor de Algoritmos e Programação pre- cisa de um programa que leia a nota final de 10 alunos, cal- cule e escreva a média geral da turma. Capítulo 3 Variáveis Indexadas Unidimensionais 69 Problema: ler a nota final de 10 alunos, calcular e escrever a média geral da turma. Português estruturado Linguagem C algoritmo exemplo31 variáveis notas: vetor[1..10] de real soma, media: real i: inteiro início soma 0 escrever("Digite as 10 notas: ") para i de 1 até 10 faça início ler(notas[i]) soma soma + notas[i] fim media soma/10 escrever("Média turma =",media) fim #include <stdio.h> #include <conio.h> main() { float notas[10]; float soma, media; int i; soma=0; clrscr(); gotoxy(10,5); printf("Digite as 10 notas: "); for(i=0;i<10;i++) { gotoxy(i*5+10,8); scanf("%f",¬as[i]); soma = soma + notas[i]; } media = soma/10; gotoxy(10,14); printf("Média turma = %.1f",media); getch(); } Quadro 3.2 − Solução para o problema do exemplo 3.1 Na solução apresentada no Quadro 3.2, criou-se um ve- tor, com capacidade para armazenar 10 valores do tipo real. Para realizar a entrada de dados e, em seguida, somar as no- tas digitadas pelo usuário, foi utilizada a estrutura de repetição PARA. Por fim, a média da turma foi calculada (dividindo a va- 70 Algoritmos e Programação II riável que acumulou todas as notas pela quantidade de notas, nesse caso, 10) e exibida para o usuário. Â Exemplo 3.2 Problema: o professor de Algoritmos e Programação pre- cisa de um programa que leia a nota final de 10 alunos, calcu- le a média geral da turma e, a seguir, informe quantos alunos obtiveram nota superior à média da turma. Figura 3.4 Solução, em linguagem C, para o problema do exemplo 3.2 Capítulo 3 Variáveis Indexadas Unidimensionais 71 Até a linha 18, a solução apresentada na Figura 3.4 é a mesma do exemplo anterior: o programa emite uma mensa- gem ao usuário solicitando que ele digite 10 notas, estas são lidas e armazenadas em um vetor, acumuladas na variável soma e, em seguida, a média é calculada. Entre as linhas 19 e 21, o programa percorre o vetor novamente, comparando cada elemento com a variável media e, sempre que o valor comparado for maior que a média calculada, incrementa a variável cont em um. Por fim, o programa exibe a média da turma e a quantidade de alunos com nota superior a ela. Os exemplos 3.1 e 3.2 também podem ser usados para justificar o uso de variáveis indexadas. No primeiro caso, até seria possível resolver o problema sem utilizar um vetor: uma variável simples poderia ser lida dez vezes, acumulando cada valor lido na variável soma para, no final, calcular a média. No exemplo 3.2, entretanto, essa solução não seria possível, já que, para verificar a quantidade de alunos com nota superior à média da turma, é necessário ter a nota de todos os alunos para comparar com a variável media e, nesse caso, o progra- ma só teria a nota do último aluno armazenada. Â Exemplo 3.3 Problema: faça um algoritmo que leia um vetor de 20 po- sições, com elementos do tipo inteiro. A seguir, troque os ele- mentos de lugar: o 1º com o 20º, o 2º com o 19º, o 3º com o 18º, ... Finalmente, escreva o vetor modificado. A entrada e a saída de dados desse exemplo são ilustradas na Figura 3.5. 72 Algoritmos e Programação II 1 1 11 11 0 0 10 10 2 2 12 12 3 3 13 13 4 4 14 14 5 5 15 15 6 6 16 16 7 7 17 17 8 8 18 18 9 9 19 19 9 8 3 35 6 5 13 98 98 13 5 6 4 14 1 11 35 3 8 9 11 1 14 4 42 55 24 2 12 20 64 7 2 24 55 42 7 64 20 12 Vetor v Vetor v modificado Figura 3.5 Ilustração do resultado do exemplo 3.3 Como pode ser observado na Figura 3.6, esse problema foi resolvido em três etapas: a entrada de dados, que ocorre entre as linhas 10 e 14; a troca dos elementos do vetor, rea- lizada pelas instruções entre as linhas 15 e 20; e, por fim, a saída de dados, que apresenta o vetor modificado, executada entre as linhas 23 e 27. Capítulo 3 Variáveis Indexadas Unidimensionais 73 Figura 3.6 − Solução, em linguagem C, para o problema do exemplo 3.3 Para realizar a troca, é necessário que todos os dados te- nham sido armazenados no vetor, já que o primeiro elemento será trocado com o último, o segundo com o penúltimo e assim sucessivamente. Além disso, deve-se criar uma variável auxiliar. O Quadro 3.3 ilustra a necessidade da variável auxiliar no processo de troca. No exemplo, foram utilizadas duas variáveis simples, A e B. Supondo que A armazena 5 e B 2, se forem 74 Algoritmos e Programação II executadas as instruções A=B e B=A, o resultado será A e B ar- mazenando 2. Logo, sem a variável auxiliar, as duas variáveis ficariam com o mesmo valor. A solução correta, utilizando a variável auxiliar, é apresentada no Quadro 3.4, onde AUX=A, A=B e B=AUX. Instruções Variáveis A B 5 2 A = B 2 B = A 2 A = 2 B = 2 NÃO FUNCIONOU! Teste-de-mesa Saída Quadro 3.3 − Troca de conteúdo entre duas variáveis, sem usar variável auxiliar Instruções Variáveis AUX A B 5 2 AUX = A 5 A = B 2 B = AUX 5 A = 2 B = 5 Teste-de-mesa Saída Quadro 3.4 − Troca de conteúdo entre duas variáveis, usando uma variável auxiliar Capítulo 3 Variáveis Indexadas Unidimensionais 75 É importante observar que, nas etapas de entrada e saí- da de dados do exemplo 3.3, o número de iterações é 20, enquanto na etapa de trocas é 10. Isso ocorre porque o ve- tor possui 20 elementos e, a cada iteração, dois elementos são trocados. As trocas ocorrem entre os elementos v[i] e v[19-i]. Assim, quando i for 0, 19-i será 19, de forma que serão trocados os elementos v[0] com v[19]; quando i for 1, 19-i será 18, então serão trocados os elementos v[1] com v[18]; quando i for 2, 19-i será 17, trocando v[2] com v[17]; esse processo será repetido até a variável i chegar em 9, quando 19-i será 10 e serão trocados os elementos v[9] com v[10]. Â Exemplo 3.4 Problema: escreva um programa que leia um vetor (P) de 20 posições, com elementos do tipo inteiro. A seguir, encontre a posição do menor elemento do vetor, conte e informe quan- tos dos elementos do vetor são múltiplos desse valor. A entrada e a saída de dados desse exemplo são ilustradas na Figura 3.7, e a solução para o problema é descrita na Fi- gura 3.8. 1 110 102 123 134 145 156 167 178 189 19 13 5225 102 65 244 458 2112 999 8316 977 18P Menor elemento = 2 Posição do menor elemento = 5 Quantidade de elementos múltiplos de 5 = 4 Figura 3.7 − Ilustração do resultadodo exemplo 3.4 76 Algoritmos e Programação II Figura 3.8 − Solução, em linguagem C, para o problema do exemplo 3.4 Considerando que os índices do vetor não são exibidos para o usuário, e que ele não sabe que os índices em lingua- gem C iniciam em zero, o resultado apresentado no exemplo de entrada e saída da Figura 3.7 pode parecer estranho para ele. O menor elemento do vetor é o valor dois, entretanto, para o usuário, ele está na posição seis em vez da cinco. Para resolver essa questão, basta alterar a instrução que armazena Capítulo 3 Variáveis Indexadas Unidimensionais 77 a posição do menor elemento de posicao=i (linha 16 − Fi- gura 3.8) para posicao=i+1. Referências Bibliográficas DEITEL, Paul; DEITEL, Harvey. C: como programar. 6.ed. São Paulo: Pearson Prentice Hall, 2011. FORBELLONE, André Luiz Villar; EBERSPÄCHER, Henri Frederi- co. Lógica de Programação: a construção de algoritmos e estruturas de dados. 3.ed. São Paulo: Prentice Hall, 2005. ISAIA FILHO, Eduardo; LINDEMANN, Vanessa. Algoritmos e Programação I. Canoas: Ed. ULBRA, 2013. Atividades Parte I - Questões objetivas 1) Sobre variáveis indexadas unidimensionais, é CORRETO afirmar: I. Representam conjuntos ordenados de valores homogêneos, que podem ser de qualquer um dos tipos básicos de dados. II. São armazenadas na memória de forma contínua e acessadas a partir de um único nome e um índice. III. Também são conhecidas como vetores, arranjos ou matrizes unidimensionais. 78 Algoritmos e Programação II a) apenas II e III estão corretas; b) apenas I e II estão corretas; c) apenas a II está correta; d) apenas I e III estão corretas; e) todas estão corretas. 2) Para declarar um vetor, é necessário definir o tipo dos da- dos que serão armazenados nele, o identificador pelo qual ele será manipulado; e o tamanho da variável, que indica quantos valores ele poderá armazenar. a) Certo b) Errado 3) Considerando a declaração e a inicialização de variáveis indexadas, assinale a alternativa INCORRETA. a) float notas[30]; b) int n[10]={0}; c) int n[8]={12,43,78,10,25,01,29,18}; d) char letras[5]={a,b,c,d,e}; e) char respostas[12]={'x'}. 4) Seja um vetor declarado como int vet[10]; qual ele- mento desse vetor é acessado por vet[2]? Capítulo 3 Variáveis Indexadas Unidimensionais 79 a) primeiro elemento; b) segundo elemento; c) terceiro elemento; d) quarto elemento; e) nenhuma das respostas anteriores. 5) Considerando a declaração a seguir: int vet[30]; a instrução abaixo acessa corretamente os elementos do vetor? for(j=0; j<=30; j++) vet[j] = j*j; a) Sim b) Não Parte II - Resolução de problemas Resolva os problemas descritos a seguir, utilizando a Lin- guagem C. 1) Elabore um programa em C que leia um vetor de 15 po- sições com elementos do tipo caractere. Conte e escreva quantas vezes a letra “a” aparece no vetor. 2) Faça um programa em C que leia um vetor de 20 posi- ções do tipo real. Troque a 1ª posição com a 11ª, a 2ª 80 Algoritmos e Programação II com a 12ª, a 3ª com a 13ª, ..., 10ª com a 20ª. Escreva o vetor modificado. 3) Construa um programa que crie um vetor de 16 posições, colocando 1 nas posições cujos índices são múltiplas de 4 e 0 nas demais posições. Escreva o vetor criado. 4) Escreva um programa que crie um vetor U, com 10 ele- mentos, cujo conteúdo é formado a partir da expressão P + Q * 2, sendo que P e Q são lidas toda vez em que um elemento de U é criado. Escreva o vetor criado. 5) Faça um programa que leia dois vetores X(10) e Y(10). Crie e escreva um vetor Z que seja a diferença entre X e Y. 8 4 6 12 7 9 3 1 2 6x y 4 5 5 10 1 3 3 5 9 1 z 4 -1 1 2 6 6 0 -4 -7 5 6) Elabore um programa em C que leia um vetor de 12 posições com elementos do tipo inteiro. A seguir, ordene os elemen- tos do vetor (ordem crescente) e escreva o vetor modificado. Respostas dos exercícios da Parte I 1 - e; 2 - a; 3 - d; 4 - c; 5 - b. Strings ÂÂ Strings são cadeias de caracteres, usadas para arma-zenar e manipular dados textuais como, por exemplo, nomes, endereços e senhas com caracteres alfanuméri- cos. Em linguagem C, diferente de outras linguagens de programação, string não é um tipo de dado formal, mas, sim, um vetor de caracteres terminado pelo caractere \0 (caractere nulo, cujo código ASCII decimal é zero). Essa terminação é importante, pois é a única forma das ou- tras funções da linguagem reconhecerem o final de uma string. Os fundamentos necessários para manipular strings são apresentados nas próximas seções. Vanessa Lindemann* Capítulo 4 * Doutora em Informática na Educação pela UFRGS (2008); professora dos cursos da Computação da ULBRA 82 Algoritmos e Programação II 4.1 Declaração e inicialização Uma string deve ser declarada como um vetor de caracteres, definindo um identificador e o seu tamanho. Por exemplo, char nome[21]; declara uma string que poderá armazenar no máximo 20 caracteres, mais o caractere \0. A Figura 4.1 ilustra a estrutura criada na memória para armazenar a string declarada. 0 1 95 132 106 143 117 15 184 128 16 1917 20 nome Figura 4.1 − Estrutura da variável nome declarada como string Uma string pode ser inicializada na sua declaração, como ilustram os exemplos a seguir. char nome[21]={'A','n','a',' ','C','l','a','r','a','\0'}; char nome[21]="Ana Clara"; No primeiro exemplo, os caracteres são inicializados um a um entre apóstrofes e o conjunto de caracteres é envolto por chaves. O segundo exemplo apresenta uma forma de iniciali- zação equivalente e consideravelmente mais simples, onde a string aparece entre aspas e o caractere especial \0 é incluído automaticamente. Essas duas instruções têm o mesmo efeito, cujo resultado é ilustrado na Figura 4.2. Capítulo 4 Strings 83 0 1 95 132 106 143 117 15 184 128 16 1917 20 nome A n a a a \0rC l Figura 4.2 − Variável nome após de ser declarada e inicializada Como uma string é um vetor de caracteres, essa pode ser manipulada como tal. Para acessar um determinado caractere de uma string, por exemplo, basta utilizar o seu índice, como ilustram os exemplos a seguir. nome[0] = 'x'; printf("%c", nome[4]); 4.2 Entrada de dados A função scanf é bastante limitada para a leitura de strings, como ilustra o exemplo do Quadro 4.1, onde o usuário digita seu nome e sobrenome e o programa exibe apenas seu nome. Exemplo: leitura de uma string Resultado #include <stdio.h> #include <conio.h> main() { char nome[21]; clrscr(); gotoxy(10,5); printf("Digite seu nome: "); scanf("%s",nome); gotoxy(10,8); printf("Olá %s!", nome); getch(); } Digite seu nome: Marcos Sereno Olá Marcos! Quadro 4.1 − Entrada de dados de uma string usando a função scanf 84 Algoritmos e Programação II Isso acontece porque a função scanf("%s",nome) lê cada caractere não branco e os armazena a partir do endere- ço nome. O processo termina quando um caractere branco é encontrado. Nesse momento, o caractere \0 é incluído auto- maticamente na primeira posição livre do vetor. Então, no exemplo do Quadro 4.1, quando o usuário di- gita um espaço em branco entre seu nome e sobrenome, a função scanf inclui o caractere \0 na variável nome, exata- mente na posição em que este foi digitado. O sobrenome não é armazenado na variável e, consequentemente, não é exibido na tela. Por isso, a função scanf não é indicada para a leitura de strings. Um detalhe a ser observado na instrução scanf("%s",nome) é a ausência do operador de en- dereço (&) antes do segundo argumento da função. Esse operador não é utilizado com vetor e matriz porque os no- mes dessas variáveis já representam seus endereços iniciais (exemplo: a instrução scanf("%s",nome) é equivalente a scanf("%s",&nome[0])). Uma função adequada para a leitura de strings é a fgets,
Compartilhar