A maior rede de estudos do Brasil

Grátis
Estruturas_de_Dados_e_Algoritmos_em_C.erivanildo- Blog - conhecimentovaleouro.blogspot.com by @viniciusf666

Pré-visualização | Página 11 de 50

;, surge muitas vezes associada com 
as instruções while e for quando se pretende que o corpo do ciclo repetitivo não tenha 
qualquer instrução. A Figura 1.50 apresenta um exemplo que determina o comprimento de 
uma cadeia de caracteres. Uma vez que uma cadeia de caracteres é um agregado de 
caracteres terminado obrigatoriamente com o carácter '\0', então é preciso detectar o índice 
do agregado onde ele está armazenado. O que é possível fazer através de uma instrução 
repetitiva em que a expressão de teste, recorrendo ao operador unário incremento, provoca 
o deslocamento dentro do agregado e, portanto, o ciclo repetitivo não carece de qualquer 
instrução. 
 
 
Figura 1.50 - Cálculo do comprimento de uma cadeia de caracteres. 
A instrução break é uma instrução que, genericamente, permite a saída intempestiva do 
bloco que está a ser executado. A sua utilização no caso da instrução de decisão múltipla 
switch possibilitou, como se viu, transformar operacionalmente esta instrução e adequá-la 
ao tipo de funcionalidade encontrado na instrução case do Pascal. A sua aplicação em 
conjunção com as instruções while e do while é também muito interessante, já que 
possibilita em muitas situações práticas reduzir a complexidade da expressão de terminação, 
aumentando por isso a clareza e a legibilidade do código correspondente. 
 
A Figura 1.51 apresenta um exemplo em que se pretende obter a soma de um máximo de 
10 valores não negativos lidos do dispositivo de entrada, sendo que a leitura parará mais 
cedo se for lido um valor negativo. Compare as soluções e repare na simplificação da 
condição de terminação da versão em linguagem C, devido à utilização da instrução break. 
 COMP = -1; 
 while (s[++comp] != '\0') ; 
 
/* ou em alternativa com o ciclo for */ 
 
 for (comp = 0; s[comp] != '\0'; comp++) ; 
PROGRAMAÇÃO ESTRUTURAS DE DADOS E ALGORITMOS EM C 30 
 
Figura 1.51 - Exemplo da utilização da instrução break. 
A instrução continue é uma instrução que permite interromper a execução do ciclo 
repetitivo, forçando o fim da iteração presente. A sua aplicação em conjunção com a 
instrução for possibilita em muitas situações práticas reduzir a complexidade do ciclo 
repetitivo, aumentando por isso também a clareza e a legibilidade do código 
correspondente. 
 
A Figura 1.52 apresenta um exemplo em que se pretende contar o número de caracteres 
alfabéticos de uma linha de texto e converter as vogais aí existentes de minúsculas para 
maiúsculas e vice-versa. O exemplo apresentado a seguir socorre-se das rotinas de 
manipulação de caracteres e de cadeias de caracteres das bibliotecas de execução ANSI e 
supõe, por isso, a inclusão dos ficheiros de interface ctype.h e string.h. 
 
 
Figura 1.52 - Exemplo da utilização da instrução continue. 
 N := 0; /* na linguagem Pascal */
 for I := 1 to length (LINHA) do 
 if LINHA[I] in ['A'..'Z','a'..'z'] 
 then begin 
 N := N + 1; 
 if LINHA[I] in ['A','E','I','O','U','a','e','i','o','u'] 
 then if LINHA[I] in ['A','E','I','O','U'] 
 then LINHA[I] := chr(ord(LINHA[I])-ord('A')+ord('a')) 
 else LINHA[I] := chr(ord(LINHA[I])-ord('a')+ord('A')) 
 end; 
ņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņ
 for (I = 0, N = 0; I < strlen (LINHA); I++) /* na linguagem C */
 { 
 if (!isalpha (LINHA[I])) continue; 
 N++; 
 if ((toupper(LINHA[I]) != 'A') && (toupper(LINHA[I]) != 'E') && 
 (toupper(LINHA[I]) != 'I') && (toupper(LINHA[I]) != 'O') && 
 (toupper(LINHA[I]) != 'U')) continue; 
 if (isupper (LINHA[I])) LINHA[I] = LINHA[I]-'A'+'a'; 
 else LINHA[I] = LINHA[I]-'a'+'A'; 
 } 
 N := 0; /* na linguagem Pascal */
 SOMA := 0.0; 
 readln (NUMERO); 
 while (N < 10) and (NUMERO >= 0.0) do 
 begin 
 N := N + 1; 
 SOMA := SOMA + NUMERO; 
 readln (NUMERO) 
 end; 
ņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņ
 N = 0; /* na linguagem C */
 SOMA = 0.0; 
 scanf ("%lf", &NUMERO); 
 while (N < 10) 
 { 
 if (NUMERO < 0.0) break; 
 N++; 
 SOMA += NUMERO; 
 scanf ("%lf", &NUMERO); 
 } 
31 CAPÍTULO 1 : INTRODUÇÃO AO C 
 
 
Compare as soluções e repare que as instruções condicionais na versão em linguagem C 
estão simplificadas, uma vez que não necessitam de ser encadeadas, para evitar as situações 
em que os caracteres não precisam de ser convertidos. Se o carácter não é um carácter 
alfabético, ou se é um carácter alfabético, mas não é uma vogal, então força-se a próxima 
iteração do ciclo repetitivo, usando para esse efeito a instrução continue. 
1.7.2.4 Ciclos repetitivos infinitos 
Um ciclo repetitivo infinito é um ciclo repetitivo que não tem condição de terminação, ou 
cuja condição de terminação está mal implementada. A maior parte desses ciclos repetitivos 
são criados por engano. Mas, existem situações em que se pretende de facto implementar 
um ciclo repetitivo infinito. Por exemplo, quando se pretende uma aplicação que repete 
sistematicamente uma determinada operação até que uma condição particular se verifica. 
Nessa situação é mais fácil construir um ciclo repetitivo, que é terminado através do 
recurso à instrução break. A Figura 1.53 apresenta as duas formas mais simples de 
implementar ciclos repetitivos infinitos. 
 
 
Figura 1.53 - Ciclos repetitivos infinitos. 
1.8 Entrada e saída de dados 
Tal como em qualquer outra linguagem, as instruções de entrada e de saída da linguagem C 
são instruções especiais que estabelecem uma interface com o sistema operativo na 
comunicação com os diferentes dispositivos do sistema computacional, em particular com 
os dispositivos convencionais de entrada e de saída. Normalmente, o dispositivo de entrada 
é o teclado e é mencionado pelo identificador stdin, e o dispositivo de saída é o monitor e é 
mencionado pelo identificador stdout. 
 
Os dispositivos de entrada e de saída funcionam da seguinte forma. Sempre que se prime 
uma tecla do teclado, é gerada uma palavra binária, representando o valor atribuído ao 
carácter correspondente, em código ASCII por exemplo, que é armazenada num registo do 
controlador do teclado. O sistema operativo é alertado para esse facto e, eventualmente, vai 
ler o conteúdo do registo e armazenar sequencialmente o valor lido numa região da 
memória principal que se designa por armazenamento tampão de entrada (input buffer). 
O valor é também quase sempre colocado no armazenamento tampão de saída do monitor, 
para posterior envio para o monitor, produzindo-se assim a interacção visual com o 
utilizador. Em termos da instrução de entrada, o armazenamento tampão de entrada é visto 
como uma sequência ordenada de caracteres, organizada em linhas que consistem em zero 
ou mais caracteres, com representação gráfica, ou com funções de controlo, seguidos do 
carácter de fim de linha que é o '\n'. A esta sequência de caracteres dá-se o nome de fluxo de 
caracteres (text stream). De um modo geral, só linhas completas presentes no fluxo de 
caracteres de entrada estão disponíveis para leitura. À medida que os caracteres vão sendo 
processados pela instrução de entrada, vão sendo retirados do fluxo de caracteres de 
entrada. 
 while ( 1 ) /* com o ciclo while */
 instrução simples ou composta 
ņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņņ
 for ( ; ; ) /* com o ciclo for */
 instrução simples ou composta
PROGRAMAÇÃO ESTRUTURAS DE DADOS E ALGORITMOS EM C 32 
Por outro lado, o fluxo de texto de saída é implementado numa região da memória 
principal, directamente acessível pelo sistema operativo, que se designa por 
armazenamento tampão de saída (output buffer). Após a escrita de uma sequência de 
caracteres pela instrução de saída, o sistema operativo é alertado para esse facto e, 
eventualmente, vai transferir essa sequência, carácter a carácter, para um registo do 
controlador