Curso de Introdução à Programação em C por Yudith Zamora Castell e Alfredo Peña Ricardo 1. Introdução A Linguagem C, foi criada por Dennis Ritchie (Laboratórios Bell) em 1972, quando trabalhava junto com o Ken Thompson no desenho do sistema operacional Unix. A linguagem ‘C’ se criou como ferramenta para programadores, em consequência seu principal objectivo é a criação de aplicações úteis. “C” é uma linguagem de programação de “alto nível” (alto nível quer dizer “próximo à linguagem humana”), mas com características de “baixo nível” (baixo nível = próximo à linguagem máquina). É de ALTO NÍVEL porque é racional, estruturado e fácil de aprender. É de BAIXO NÍVEL porque permite trabalhar com “bits”, registros da C.P.U. e posições de memória. A linguagem ‘C’ é poderosa e flexível: a maior parte do sistema operacional Unix está escrita em ‘C’. Inclusive estão escritos em ‘C’ os compiladores e intérpretes de outras linguagens, como Fortran, APL, Pascal, LISP, LOGOTIPO e BASIC. A linguagem ‘C’ é “amistosa” porque é o suficientemente esrtucturada para exercer bons hábitos de programação. É a linguagem de programação mais utilizada pelo programador de sistemas. A linguagem C++ foi desenvolvida inicialmente por Bjarne Stroustrup na AT&T, de 1979 a 1983, à partir da linguagem C, tendo como idéia principal a de agregar o conceito de classes, de orientação à objetos, àquela linguagem. Razão porque iniciamente chamva-se de “C com classes”. Bjarne procurou tanto quanto possível manter retrocompatibilidade com C, de modo que programas em C pudessem ser compilados por um compilador C++ com um mínimo de alterações. Entretanto, encarar C++ como um superconjunto de C é um erro, e C++ deve ser vista como uma “outra linguagem”, por diversas razões. Em primeiro lugar, nem todo o programa escrito em C é compilado em C++ sem erros, e pode nem mesmo gerar o mesmo resultado, já que a sintaxe e a semântica de algumas construções diferem. Ao ligar-se partes de um programa em C++ com partes em C, estas devem ser bem especificadas, pois as convenções de funcionamento do código compilado também diferem. Além disso, C++ oferece um conjunto de mecanismos básicos que não estavam presentes em C, e estes devem ser usados para produzir software mais modular e confiável explorando-se as verificações disponíveis no compilador. Finalmente, os mecanismos de C++ devem inspirar a programação segundo o paradigma de orientação a objetos e, portanto, não se deve programar em C++ como se faz em C. A partir da primeira versão de 1983, a linguagem foi sendo revisada e evoluindo, tornou-se disponível fora da AT&T em 1985, e após um longo processo foi padronizada pela ISO no final de 1997, pelo padrão ISO/IEC 14882. STL é uma parte do padrão C++, e consiste em uma biblioteca de funções e estruturas de dados que todo compilador C++ deve oferecer, provê as implementações mais comuns em um programa, e pode-se utilizá-la com diferentes tipos de dados. Na actualidade, a linguagem C++ é uma linguagem versátil, potente e geral. Seu êxito entre os programadores profissionais lhe levou a ocupar o primeiro posto como ferramenta de desenvolvimento de aplicações. C++ mantém as vantagens do C quanto a riqueza de operadores e expressões, flexibilidade, concisão e eficiência. Além disso, eliminou algumas das dificuldades e limitações do C original. A evolução de C++ continuou com a aparição do Java, uma linguagem criada simplificando algumas coisas de C++ e acrescentando outras, que se utiliza para realizar aplicações em Internet. I- Introdução à Programação em C Características da Linguagem C • Portabilidade entre máquinas e sistemas operacionais. • Dados compostos em forma estruturada. • Programas Estruturados. • Total interação com o Sistema Operacional. • Código compacto e rápido, quando comparado ao código de outras linguagem de complexidade análoga. Aplicações Escritas em C Atualmente, nos USA, C é a linguagem mais utilizada pelos programadores, por permitir, dadas suas características, a escrita de programas típicos do Assembler, BASIC, COBOL e Clipper, sempre com maior eficiência e portabilidade, como podemos constatar pelos exemplos abaixo relacionados: • Sistema Operacional: UNIX (Sistema Operacional executável em micro computadores e em mainframes). • Montadores: Clipper (O utilitário de banco de dados mais usado no Brasil). • Planilhas: 1,2,3 e Excel (A planilha eletrônica com maior volume de vendas mundial). • Banco de Dados: dBase III, IV e Access (o gerenciador de base de dados mais utilizado no mundo). • InfoStar: O Editor de Texto mais utilizado nos USA no Sistema Operacional UNIX. • Utilitários: FormTool (Editor de formulário mais vendido no mundo). • Aplicações Gráficas: Efeitos Especiais de filmes com Star Trek e Star War. • Linguagens como o Power Builder e o Visual Basic, respectivamente as linguagens mais utilizadas nos EUA e no Brasil. No Brasil utilizada por empresas especializadas na elaboração de vinhetas e outros efeitos especiais. C comparado a outras linguagens de programação Devemos entender Nível Alto como sendo a capacidade da linguagem em compreender instruções escritas em “dialectos” próximos do inglês (Ada e Pascal, por exemplo) e Nível Baixo para aquelas linguagens que se aproximam do assembler, que é a linguagem própria da máquina, compostas por instruções binárias e outras incompreensíveis para o ser humano não treinado para este propósito. Infelizmente, quanto mais clara uma linguagem for para o humano (simplicidade >) mais obscura o será para a máquina (velocidade <). Observemos o esquema a seguir: Nível Baixo Nível Médio Nível Alto VELOCIDADE Assembler CLAREZA Macro Assembler C Fortran Forth Basic Pascal COBOL Ada MODULA-2 Antes da linguagem C tornar-se um padrão de fato (meados de 1.988, nos USA), tínhamos aproximadamente, o seguinte perfil de mercado: • Aplicações de Banco de Dados • Mainframe: COBOL e gerenciadores • Micros: dBase, Clipper e BASIC e gerenciadores como Btrieve • Aplicações Gráficas: Pascal. • Aplicações Científicas: FORTRAN e Pascal. • Utilitários, Sistemas Operacionais e Compiladores: Assembler. A chegada de poderosos compiladores C (Borland, Microsoft e Zortech-Symantec), revolucionou totalmente estes conceitos pois passou a permitir a construção de praticamente qualquer tipo de aplicação na Linguagem C, normalmente mais rápidas do que na linguagem original e portável entre os diversos ambientes (“roda” em DOS, UNIX, etc. com poucas mudanças). Devemos entender no entanto, que apenas temos uma relativa portabilidade, pois a verdadeira portabilidade depende necessariamente da implementação do sistema operacional, necessariamente aberto, o que não existe fora do mundo Unix. Quadro de características de linguagens: Linguagens Assembler Características Ideais BASIC Clipper COBOL C Pascal Executáveis Curtos ótimo fraco péssimo fraco ótimo Executáveis Rápidos ótimo bom razoável fraco bom Portáveis péssimo bom ótimo ótimo bom Manipulação de Bits ótimo razoável péssimo fraco ótimo O quadro anterior, deixa claro o porquê da revolução causada pela Linguagem C, dados os inúmeros pontos fortes da linguagem e a inexistência de pontos fracos da mesma. Não devemos concluir apressadamente que poderemos desenvolver tudo em C e abandonarmos todas as outras linguagens, pelos seguintes motivos: • Alta base de programas escritos em Assembler, COBOL, BASIC, Pascal. • Conhecimento amplo de linguagens concorrentes como COBOL, Clipper e BASIC. • Melhor adaptação de alguma linguagem para tarefa específica como Gráficos (Pascal), Inteligência Artificial (Prolog, LISP), matemáticas (Pascal e FORTRAN), aplicações comerciais (COBOL, Clipper e BASIC). • As versões atuais das linguagens BASIC, C, Clipper, Pascal e COBOL, estão muito mais semelhantes do que o eram ao tempo em que este quadro foi elaborado, portanto na prática muitas vezes este quadro, meramente teórico, pode tornar-se inaplicável. A médio prazo, podemos afirmar que a linguagem C deverá ir desalojando as outras linguagens podendo até mesmo tornar-se um padrão de direito, porém devemos lembrar que algumas linguagens foram propostas para isto (Algol, PL/1) e não só não conseguiram atingir seus objetivos como praticamente desapareceram. A tabela anteior não esgota todas as possibilidades, pois alguns dialetos de linguagem destacam recursos que na maior parte das implementações da linguagem não são muito fortes. O inverso também pode ocorrer, de modo que as vezes uma implementação corrige algum defeito da linguagem (por exemplo aumenta drasticamente seu desempenho) e piora outras (portabilidade inexistente). Este problema afeta sensivelmente o BASIC e as implementações xBase (Fox, dBase e Clipper) e em menor grau o Pascal e a própria linguagem C. Estrutura de um programa em “C”: A ‘C’ é uma linguagem compilada, vamos ver que é isto graficamente: CÓDIGO FONTE COMPILAR LINKAR CÓDIGO OBJECTO PROGRAMA EXECUTAVEL CÓDIGO FONTE: é o programa que nós escrevemos, grava-se com a extensão CPP CÓDIGO OBJETO: é o programa fonte mas traduzido a linguagem máquina (sucessão de ceros e uns), grava-se com a extensão OBJ PROGRAMA EXECUTÁVEL: é o programa objecto mais as “livrarias do C”, grava-se com a extensão EXE. E não necessita o programa que utilizamos para criá-lo, para poder executá-lo. O código Objecto que gera um compilador de “C”, é quase tão eficiente (rápido) como se o tivéssemos escrito em linguagem ensamblador (linguagem de programação mais próxima à linguagem de máquina). Palavras Reservadas da Linguagem C Auto double if static break else int struct case entry long switch char extern register typedef continue float return union default for sizeof unsigned do goto short while Primeiros programas em C Em primeiro lugar deveria decidir em que pasta de seu ordenador quer gravar seus programas. Em segundo lugar deveria decidir o compilador do C/C++ que desejas usar. Todos os programas do livro foram provados no compilador CodeBlocks. /*Programa No 1*/ #include <stdio.h> int main() { printf("O meu primeiro programa em C"); } /* Tudo o que escrevemos entre os símbolos anteriores são “comentários” para o programador, que não influem para nada na execução do programa. */ #include <stdio.h> Ordena ao compilador que inclua no programa, as funções de entrada – saída (em nosso caso há uma: printf). stdio.h não é mais que um fichário “biblioteca”, que contém uma série de funções (instruções), em nosso caso de “entrada-salida por tela”. Se em nosso programa necessitamos uma raiz quadrada por exemplo, deveríamos incluir (include) outra “biblioteca” . int main() Função ou programa principal (main), que não devolve nada (int) { Inicio printf(“ } “) Função que escreve na tela Fim Dados em “C” /*Programa No 2*/ #include <stdio.h> int main() { char nom[20]; printf("\nEscreve o teu nome: "); scanf("%s",nom); printf("\nola %s",nom); } Na linguagem “C” existem dois tipos de dados: Constantes e Variáveis Em um programa, uma constante é um dado que não pode ser variado durante sua execução. O dado “Escreve o teu nome:” do PROG2 é uma constante, já que cada vez que executamos o programa, aparece a mesma frase: não há possibilidade de trocá-la. Em um programa, uma variável é um dado que sim pode trocar-se enquanto se executa um programa. O dado “nom” do PROG2 é uma variável, já que cada vez que executamos o programa adquire o valor correspondente ao que escrevemos diante da ordem: “Escreve o teu nome:” char nom[20] printf("\nona %s",nom) Define (declara) a variável “nom”, cujo conteúdo serão caracteres (daí a palavra char que abre a linha), em um número não superior a 20, porque assim o especifica sorte cifra entre colchetes. Em outras palavras, a linha em questão indica ao compilador que, para a execução do programa deve reservar espaço em memória para armazenar 20 dados do tipo char, isto é, caracteres, e que no resto do programa dita zona de cor será designada como “nom” A definição (declaração) de variáveis em um programa “C” é imprescindível: se não definir uma variável antes de usá-la, o programa não funcionará já que ao chegar no nome da variável, o programa não saberá o que fazer. O printf em questão, escreve em tela dois dados: Uma constante “Olá” e o valor da variável nom. O símbolo “%s” é um indicador de formato, que serve para dizer ao printf, como queremos que nos mostre o valor da variável nom. A “s” do indicador provém da palavra string (“cadeia” em inglês). Em definitiva: printf(“\nHola %s “, nom); Escreve em tela: Uma linha em branco, devida a \n Olá o símbolo scanf(“%s”, nom) %s Substitui-se pelo valor da variável nom Para que a linguagem “C” nos escreva em tela (printf), o valor de uma variável tipo char, é necessário utilizar o indicador de formato: %s Imobilizará a execução do programa, até que nós escrevamos alguma coisa. O que escrevamos se guardará na variável de nome nom Temos que introduzir o indicador de formato: %s, correspondente a dados “tipo carácter” para que o que escrevamos seja interpretado como uma cadeia de caracteres. Scanf igual a printf é uma função do ficheiro de cabeceira: stdio.h scanf() Uma das mais importantes e poderosas instruções, servirá basicamente para promover leitura de dados (tipados) via teclado. Sua forma geral será: scanf(“string de controle”, lista de argumentos); Posteriormente ao vermos sua sintaxe completa, abordaremos os recursos mais poderosos da <string de controle>, no momento bastará saber que: %d - leitura de números inteiros %f - leitura de números reais %s - leitura de caracteres A lista de argumentos deve conter exatamente o mesmo número de argumentos quantos forem os códigos de formatação na <string de controle>. Se este não for o caso, diversos problemas poderão ocorrer - incluindo até mesmo a queda do sistema - quando estivermos utilizando programas compilados escritos em C. Felizmente ao utilizarmos o Classic C, apenas uma mensagem de erro será apresentada, para que possamos corrigir o programa sem outros inconvenientes. Cada variável a ser lida, deverá ser precedida pelo caracter &, por razões que no momento não convém explicarmos, mas que serão esclarecidas no decorrer do curso. Para sequência de caracteres (%s), o caracter & não deverá ser usado. printf() É outro dos mais poderosos recursos da linguagem C, printf() servirá basicamente para a apresentação de dados no monitor. Sua forma geral será: printf(“string de controle”, lista de argumentos); Necessariamente você precisará ter tantos argumentos quantos forem os comandos de formatação na “string de controle”. Se isto não ocorrer, a tela exibirá sujeira ou não exibirá qualquer dado. Os caracteres a serem utilizados pelo printf() em sua <string de controle>, no momento serão os mesmos de scanf(). Tipos de Dados em C Toda linguagem de programação de alto nível suporta o conceito de “Tipo de Dado”, que define um conjunto de valores que a variável pode armazenar, e os tipos mais comuns encontrados nas linguagens de programação, ou seja, inteiro, real e caracteres. Diferentemente do Pascal que é fortemente tipada onde a mistura entre um número inteiro e um real podem causar erros, C suporta livremente tipos caracteres e inteiros na maioria das expressões! Em geral os compiladores C realizam pouca verificação de erros em tempo de execução, verificação de limites de matrizes ou compatibilidade entre tipos de argumentos, cabendo esta responsabilidade ao programador. Assim você decide onde uma verificação de erro é ou não mais necessário. Por ser capaz de manipular bits, bytes e endereços, C se adapta bem a programação a nível de sistema. E tudo isto é realizado por apenas 43 palavras reservadas no Turbo C, 32 nos compiladores padrão ANSI e 28 no C Padrão. Como curiosidade, o IBM BASIC que é um interpretador BASIC com fins puramente educativos tem 159 comandos. /*Programa No 3*/ #include <stdio.h> int main() { float a,b,c; printf("\nPrimeiro numero: "); scanf("%f",&a); printf("\nSegundo numero: "); scanf("%f",&b); c=a+b; printf("\n\nA Soma de %f e %f e igual a %f",a,b,c); } float a,b,c; Define (declara) 3 variáveis (a, b, c) numéricas tipo float (números reais). Tipos de Variables más importantes: int long flot double número inteiro número inteiro de dupla precisão número real número real de dupla precisão O indicador %f O número de dígitos que pode ter cada tipo de variável depende do compilador de “C”. A utilização de variáveis float, determina que o indicador de formato seja %f Variável int float double char identificador de formato %d %f %lf %s O símbolo & Uma variável simples deve aparecer no scanf precedida do símbolo &: scanf(“%f,&b”) No programa anterior Prog2: scanf(“%s,nom”) Não estava precedida do &, porque a variável nom, não era uma variável simples (um só valor), mas sim composta (chamada também array ou vetor), porque tomava um máximo de 20 valores (caracteres). c=a+b É a forma de atribuir o valor de uma variável, a partir do valor de outras Tabela de Tamanhos e Escala de Tipos Básicos Tipo Extensão Escala Numérica em bits char 8 0 a 255 int 16 -32768 a 32767 float 32 3.4E-38 a 3.4E+38 double 64 1.7E-308 a 1.7E+308 int 0 sem valor Asignação de variáveis /*Programa 4*/ #include <stdio.h> int main() { double num; printf("\nEscreve um número= "); scanf("%lf",&num); printf("\nO quadrado de %lf é %lf",num,num*num); printf("\nO cubo de %lf é %lf",num,num*num*num); } Observa a sintaxes completa de printf: Printf(“ Substitui-se pelo valor da variável1 %lf %lf “, variáve1, variável2); Substitui-se pelo valor de la variável 2 Não é necessário definir uma nova variável (atribuição), já que “variável2=variável1 * variável1” /* Programa 5*/ #include <stdio.h> int main() { int valor; valor=27; printf("\nValor= %d",valor); valor=valor+5; printf("\nValor= %d",valor); } A sentença valor=valor+5; indica que o novo valor é igual ao antigo valor mais 5 unidades. Observemos o Quadro de Operadores Especiais suportados por printf() Código Significado \b Retrocesso (BackSpace) \f Salto de Página (Form Feed) \n Linha Nova (Line Feed) \r Retorno do Carro (cr) \t Tabulação Horizontal (TAB) \’ Caracter com apóstrofo \0 Caracter Nulo ou Fim de String (Seqüência) \x Representação de byte na base hexadecimal Cadeias de caracteres: “puts – gets” /* Programa 6*/ #include <stdio.h> int main() { char texto[65]; printf("Escreve o teu nome e apelidos: "); scanf("%s",texto); printf("\nAcabas de escrever : %s",texto); } Observa que o valor da variável “texto” é tudo o que temos escrito antes do primeiro espaço. /* Programa 7*/ #include <stdio.h> int main() { char texto[65]; puts("Escreve o teu nome e dois apelidos: "); gets(texto); puts("Acabas de escrever: "); puts(texto); } Observa que agora sim, escreve tudo o que temos escrito diante da pergunta. A função gets (texto) é equivalente a scanf, mas com duas diferenças fundamentais: Só funciona para cadeias de caracteres Abrange todo o texto que escrevamos até que pulsamos a tecla [Return]. portanto é a que nos interessa se houver espaços em branco. puts é equivalente a printf, mas com duas diferenças fundamentais: Só funciona para cadeias de caracteres. Não podemos utilizar códigos de formato para “imprimir” variáveis. Melhoremos a saída na tela /* Programa 8*/ #include<stdio.h> int main() { printf("\n\n\n\n\n\n"); /* 6 linhas em branco */ printf("\t\t"); /* 2 tabuladores */ printf("BEMVINDO AO CURSO DE PROGRAMACAO EM C"); printf("\n\n\n\n\n\n\n\n"); printf("\t\t\t\t"); printf("Pulsa qualquer tecla para terminar...\n"); getch(); /* A função anterior inmoviliza a execução do programa Até que pulsamos uma tecla */ } Observa atentamente os comentários que aparecem no programa. O “manipulador” \n determina uma linha em branco, quer dizer é equivalente a pulsar a tecla [Return]. O manipulador \t é equivalente a pulsar a tecla de tabulação. Observa que podemos colocar várias sentenças de C em uma mesma linha de programa, sempre e quando separarmos cada sentença com um ponto e vírgula. Programa que calcula o número de dias vividos /* Programa 9*/ #include<stdio.h> int main() { char nome[50]; int idade; printf("\n\n\t\t\t¿Cómo te chamas? "); scanf("%s",nome); printf("\n\n\t\t\t¿Quántos anos tens? "); scanf("%d",&idade); idade=idade*365; printf("\n\n\n\t\t%s, tens vivido %d dias",nome,idade); printf("\n\n\n\n\t\t\t\t\tPulsa qualquer tecla para terminar"); getch(); } Programa para o cálculo da media entre três números /* Programa 10*/ #include<stdio.h> int main() { float numero; float media=0; printf("Digita o primeiro número: "); scanf("%f",&numero); media=media+numero; printf("Digita o segundo número: "); scanf("%f",&numero); media=media+numero; printf("Digita o terceiro número: "); scanf("%f",&numero); media=media+numero; media=media/3; printf("\n\n\nA media e %f\n\n\n",media); } II- Estruturas de Programação Operadores C é uma das linguagens com maior número de operadores, devido possuir todos os operadores comuns de uma linguagem de alto nível, porém também possuindo os operadores mais usuais a linguagens de baixo nível. Para fins didáticos, dividiremos os operadores em aritméticos, lógicos e de bits. No momento abordaremos apenas as duas primeiras classes. Operadores Aritméticos Operador Ação + Adição * Multiplicação / Divisão % Resto de Divisão Inteira - Subtração o menos unário -- Decremento ++ Incremento Operadores Relacionais e Lógicos Operador Ação > Maior que >= Maior ou igual que < Menor que <= Menor ou igual que == Igual a != Diferente de && Condição “E” || Condição “OU” ! Não Observação: Em C o resultado da comparação será ZERO se resultar em FALSO e DIFERENTE DE ZERO no caso de obtermos VERDADEIRO num teste qualquer. Programadores experientes utilizam-se desta conclusão em alguns programas, onde “inexplicavelmente” algo é testado contra ZERO. A Estrutura IF – ELSE /* Programa 11*/ #include <stdio.h> int main() { float a, b; printf("\nEscreve o primeiro número a= "); scanf("%f",&a); printf("\nEscreve o segundo número b= "); scanf("%f",&b); if (a==b) printf ("\nOs dois números sao iguais\n"); if (a!=b) printf("\nOs dois números sao diferentes\n"); if (a>b) printf("\nO número %f e maior que %f\n ",a,b); else printf("\nO número %f nao e maior que %f\n",a,b); if ((a>b) && (a<100)) { printf("\nO número %f e maior que %f ",a,b); printf("\nOs dois numeros sao menores que 100"); } else {printf("\nO número %f nao e maior que %f ",a,b); printf("\n um dos dois números e maior que 100"); } } Executa-o nos seguintes casos, observando atentamente o que aparece: 1) Se a= 70 e b= 2 2) Se a= 50 e b=30 3) Se a= 7 e b= 11 4) Se a= 100 e b= 50 5) Se a= 50 e b= 100 Estudo do programa PROGRAMA 11: •Observa o uso dos operadores relacionais e lógicos: (a == b) “a” igual a “b” (a != b) “a” diferente de “b” ((a>b) && (a<100)) “a” é maior que “b” e além “a” é menor que “100” Observa também que cada relação temos que encerrá-la entre parêntese. •Estrutura de programação IF-ELSE Observa em primeiro lugar a sintáxis diferente entre os 4 “IF” do programa: Os 2 primeiros são iguais e mais simples: IF (condição) sentencia; Que quer dizer: Se se cumprir a “condição” se executará a sentença. O terceiro “IF”: IF (condição) sentencia1; else sentencia2 ; Que quer dizer: Se cumpre-se a (condição) será executada a sentencia1, em caso contrário será executada a sentencia2. O quarto “IF” é o mais completo: IF (condição) { Sentencia1; Sentencia2; } else { Sentencia3; Sentencia4; } Que quer dizer: Se cumpre-se a “condição” sera executada a sentencia1 e a sentencia2, em caso contrário sera executada a 3 e a 4. A Estrutura WHILE /* Programa 12*/ #include <stdio.h> int main() { int x; x=0; while (x<6) { printf("\nO valor de x e igual a %d ",x); x=x+1; } } Estrutura de programação WHILE: While (condição) { sentencia1; sentencia2; sentencia3; ------------; ------------; } Que quer dizer: enquanto se cumpra a “condição”, executa as sentenças que há entre chaves. . Observemos nosso programa: 1) Definimos uma variável inteira (int) de nome: x 2) Inicializamos o valor da variável “x” a 0 3) while (x<6) { printf("\nEl valor de x é igual a %d,x "); x=x+1; } Quer dizer: Enquanto o valor da variável “x” seja inferior ao número 6 Escreve em tela o valor de “x” O valor de “x” é igual ao anterior valor de “x” mas + 1 Vejamos: Inicialmente o valor de x=0, portanto se cumpre a condição do “While”: Em tela aparecerá 0 E o novo valor de “x” será 1. Como o valor atual de “x” é 1, cumpre-se a condição: Em tela aparecerá 1 E o novo valor de “x” será 2. Como o valor atual de “x” é 2, cumpre-se a condição: Em tela aparecerá 2 E o novo valor de “x” será 3. Como o valor atual de “x” é 3, cumpre-se a condição: Em tela aparecerá 3 E o novo valor de “x” será 4. Como o valor atual de “x” é 4, cumpre-se a condição: Em tela aparecerá 4 E o novo valor de “x” será 5. Como o valor atual de “x” é 5, cumpre-se a condição: Em tela aparecerá 5 E o novo valor de “x” será 6. Como o valor actual de “x” é 6, já não cumprirá a condição. Quer dizer “sairemos do While” e se acaba nosso programa. O contador: A sentença x=x+1 se chama “contador” e é muito usada em programação como irá vendo. Contadores: /* Programa 13*/ #include <stdio.h> int main() { int i,j; i=2; j=7; while (i<j) { printf("\n i= %d e j= %d ",i,j); i++; j--; } } i++ É equivalente a escrever i=i+1 j-- É equivalente a escrever j=j -1 vamos fazer um programa que repita 10 vezes nosso nome. Está claro que a solução ao problema é o uso de um “contador” dentro de um “While”. /* Programa 14 */ #include <stdio.h> int main() { int x; char nome[20]; x=1; printf("\nEscreve o teu nome: "); scanf("%s",nome); while (x<=10) { printf("%d - ",x); printf("%s \n",nome); x++; } } /* Programa 15*/ #include <stdio.h> int main() { double numero,soma,produto; soma=0; produto=1; printf("\nEscreve um número diferente de 0 = "); scanf("%lf",&numero); while (numero != 0) { soma=soma+numero; produto=produto*numero; printf("\nNúmero= %lf Soma= %lf Produto= %lf ",numero,soma,produto); printf("\nNovo número (para terminar escreve 0)= "); scanf("%lf",&numero); } printf("\n\n\nSoma Total= %lf Produto Total= %lf",soma,produto); } Observa: •Contador SOMA: soma = soma + numero É a forma que conseguimos acumular na soma (variável soma) os diferentes valores de numero. •Contador PRODUTO: produto = produto * numero É a forma que conseguimos acumular no produto (variável produto) os valores de numero. •Observa também que a soma temos que inicializá-la por zero e o produto por 1. A Estrutura de Programação FOR Um dos grandes benefícios dos sistemas de processamento de dados está em sua confiabilidade (precisão nos cálculos) e rapidez (infinitamente superior ao ser humano), desta forma é ideal para processamento de elevado número de operações repetitivas. O processamento de uma Folha de Pagamentos, a Emissão de Notas Fiscais, a Geração de Estatísticas de Faturamento, são típicas tarefas a serem realizadas por processamento eletrônico de dados. Todas as linguagens importantes dispõe de recursos destinados a forçar a repetição de execução de um determinado número de instruções. Diferentemente do BASIC e do Pascal, o “loop” for é a instrução mais poderosa na criação de estruturas de repetição. Neste momento, abordaremos apenas sua sintaxe simplificada, que lembra bastante a sintaxe do FORTRAN (comando DO) e semelhante àquelas linguagens citadas anteriormente. /* Programa 16 */ #include <stdio.h> int main( ) { int x; for(x=1;x<=10;x=x+1) { printf("\nAgora x= %d\n",x); } } •A Estrutura FOR: For (valor inicial;valor final; passo) { Sentencia 1; Sentencia 2; -------------; -------------; } Que quer dizer: Repete a execução das sentenças de programa que encerrou entre chaves, tantas vezes como indica em “valor inicial, valor final, passo”. •for (x=1;x<=10;x=x+1) As linhas de programa de nosso “for” se repetiram: desde x=1 até x=10 de 1 em 1, quer dizer 10 vezes. Se escrevêssemos: for (x=23;x<=76;x=x+4), quereria dizer: repete as linhas de programa desde x=23 até x=76 de 4 em 4. Poderíamos fazê-lo mais sofisticado: for(i=-0.23;i>= - 67.78; i=i -1.567). Que traduzido diz: repete as linhas de programa que há dentro do “for” desde i=0.23 até i=-67.78 de –1.567 em –1.567 /* Programa 17*/ #include <stdio.h> int main() { int idade,indice; char nome[25]; printf("\nEscreve o teu nome: "); scanf("%s",nome); printf("\nEscreve a tua idade: "); scanf("%d",&idade); for(indice=1;indice<=idade;indice++) printf("\n%s",nome); } Observa: •Se for uma só a sentença a repetir pelo “for”, não se encerra entre chaves (neste aspecto funciona igual à estrutura IF-ELSE). •Recorda que indique++ é equivalente a indique=indique+1 •Podemos introduzir nos limites do for” uma variável (em nosso caso idade) /* Programa 18 */ #include <stdio.h> int main() { int multiplo; float total; total=0; for(multiplo=11;multiplo<3000;multiplo=multiplo+11) { printf("%d-",multiplo); total=total+multiplo; } printf("\n\nSoma= %f",total); } Vamos fazer um programa que sirva para calcular o factorial de um número. Recorda que o factorial de um número x é 1*2*3*4....*x /* Programa 19*/ #include <stdio.h> int main( ) { int a,numero; double factorial; factorial=1; printf("\nDigita o número: "); scanf("%d",&numero); for (a=1; a<=numero; a++) factorial=factorial*a; printf("\nO Factorial de %d e igual a %lf\n",numero,factorial); } Vamos fazer um programa que calcule a soma dos 10 primeiros múltiplos do número que queiramos. /* Programa 20 */ #include <stdio.h> int main() { int numero,i; double soma,multiplo; printf("\nDigita o número: "); scanf("%d",&numero); soma=0; for(i=1;i<=10;i++) { multiplo=numero*i; printf("\nMúltiplo= %lf",multiplo); soma=soma+multiplo; printf("\nSoma Parcial= %lf",soma); } printf("\nSoma Total= %lf",soma); } Vamos fazer um programa que calcule a tabela de valores de uma função dada. /* Programa 21 */ #include <stdio.h> int main() { float x1,x2,paso; float y,i; printf("\nTabela de valores para a funcao Y=X*X-5*X+10"); printf("\n\n Digita o valor menor de X: "); scanf("%f",&x1); printf("\nDigita o valor maior de X: "); scanf("%f",&x2); printf("\nDigita o incremento do valor de X: "); scanf("%f",&paso); for(i=x1;i<=x2;i=i+paso) { y=i*i-5*i+10; printf("\nX= %15f Y= %15f",i,y); } } A notação %15f indica que a variável correspondente ocupará 15 espaços em tela. Ao executar o programa anterior, podemo-nos encontrar com uma série de problemas, por exemplo se introduzirmos no valor menor de x (x1), um valor que seja maior que o introduzido na variável x2, ou também pode acontecer que na variável passo escrevamos um número negativo. Escreve a partir do Programa 21: /* Programa 22*/ #include <stdio.h> int main() { float x1,x2,paso; float y,i; printf("\nTabela de valores para a funcao Y=X*X-5*X+10"); printf("\n\nDigita o valor menor de X: "); scanf("%f",&x1); printf("\nDigita o valor maior de X: "); scanf("%f",&x2); if (x1>x2) { printf("\nSinto muito, volta a tentar"); return; } printf("\nDigita o incremento do valor de X: "); scanf("%f",&paso); if(paso<=0) { printf("\nSinto muito, volta a tentar"); return; } for(i=x1;i<=x2;i=i+paso) { y=i*i-5*i+10; printf("\nX= %15f Y= %15f",i,y); } } Executa-o várias vezes, provando os casos “conflitivos”: x1>x2 ou passo=0 ou passo negativo. Está claro que a sentença return, serve para acabar o programa. A biblioteca <math.h> /* Programa 23*/ #include <stdio.h> #include <math.h> int main( ) { double cateto1,cateto2,hipotenusa; printf("\nCalculo da hipotenusa de um Triangulo Rectangulo"); printf("\n____________________________________________"); printf("\n\nDigita o valor de um cateto: "); scanf("%lf",&cateto1); printf("\nDigita o valor do outro cateto: "); scanf("%lf",&cateto2); hipotenusa=sqrt(cateto1*cateto1+cateto2*cateto2); printf("\n\nHIPOTENUSA: %lf ",hipotenusa); } •No programa utilizamos a função sqrt, que calcula a raiz quadrada. •Para poder utilizar a função matemática sqrt, precisamos “incluir” a biblioteca “C”, que contém as funções matemática. Em nosso caso é a biblioteca: math.h, por esta razão necessitamos a sentença #include <math.h> Nós gostaríamos da possibilidade de calcular 300 hipotenusas. Vamos melhorar o programa anterior para que seja mais cómodo as calcular. /* Programa 24*/ #include <stdio.h> #include <math.h> int main() { double cateto1,cateto2,hipotenusa; char pergunta[1]; pergunta[0]='s'; while ((pergunta[0]=='s')||(pergunta[0]=='S')) { printf("\nCalculo da hipotenusa de um Triangulo Rectangulo"); printf("\n================================================"); printf("\n\nDigita o valor de um cateto: "); scanf("%lf",&cateto1); printf("\nDigita o valor do outro cateto: "); scanf("%lf",&cateto2); hipotenusa=sqrt(cateto1*cateto1+cateto2*cateto2); printf("\n\nHIPOTENUSA: %lf",hipotenusa); printf("\n\n\nSe queres calcular outra hipotenusa pulsa"); printf(" a tecla [s] e a continuacao [Return], em caso"); printf(" contrario pulsa cualquer outra "); scanf("%s",pergunta); } } /* Programa 25*/ #include <stdio.h> #include <math.h> /* Programa que calcula o tipo de solucao */ /* de uma ecuacao polinómica de 2º grau */ int main() { double a,b,c,discriminante; /* a,b,c representam os coeficientes da */ /* ecuacao /* */ */ /* discriminante= e o discriminante da ecuacao*/ /* discriminante= b*b - 4*a*c */ printf("\nEscreve o coeficiente do termino de 2do grau: "); scanf("%lf",&a); if(a==0) { printf("\nEste programa so serve para ecuacoes de 2do grau"); return; } printf("\nEscreve o coeficiente do termino de 1r. grau: "); scanf("%lf",&b); printf("\nEscreve o termino independente: "); scanf("%lf",&c); discriminante=b*b-4*a*c; printf("\nDiscriminante da ecuación= %lf",discriminante); if(discriminante==0) printf("\n\nSolucao Dupla"); if(discriminante<0) printf("\n\nSolucoes Imaginarias"); if(discriminante>0) printf("\n\nSolucoes Reais e diferentes"); } - Prova varias veces o programa 25, por exemplo para: a=1, b=1, c=1 a=0 a=2, b=-6, c=-20 a=1, b=4, c=4 /* Programa 26*/ #include <stdio.h> #include <math.h> int main() { double A,B,C,x1,x2,Discriminante; printf("Resolucao da ecuacao Ax^2+Bx+C=0 \n"); printf("\nEscreve os valores de A, B e C\n"); printf("A="); scanf("%lf",&A); printf("B="); scanf("%lf",&B); printf("C="); scanf("%lf",&C); if(A==0) { printf("\nErro!, isto e uma ecuacao de 1r. grau"); return; } else { Discriminante=B*B-4*A*C; if(Discriminante>0) { x1=(-B+sqrt(Discriminante))/(2.0*A); x2=(-B-sqrt(Discriminante))/(2.0*A); printf("\nSolucao x1= %lf",x1); printf("\nSolucao x2= %lf",x2); } else if(Discriminante==0) { x1=(-B)/(2.0*A); printf("\nSolucao Dupla= %lf",x1); } else printf("\nErro: Raizes Imaginarias"); } } Observa no programa 26 o “anidamiento” de if – else. /* Programa 27*/ #include <stdio.h> #include <math.h> int main() { double grau,rad; double pi=3,141592; printf(" Graus Radianes Seno Coseno Tangente"); for(grau=0;grau<=270;grau=grau+15) { rad=pi*grau/180; printf("\n%11lf %11lf %11lf %11lf %11lf",grau,rad,sin(rad),cos(rad),tan(rad)); } } sen(), cos(), tão() são funções que contém a biblioteca math.h Como pode observar as fórmulas anteriores funcionam em radianes (e double). /* Programa 28*/ #include <stdio.h> #include <math.h> int main() { double numero; char voltar[1]; voltar[0]='s'; while ((voltar[0]=='s')||(voltar[0]=='S')) { printf("\nEscreve um numero: "); scanf("%lf",&numero); if (numero<=0) { printf("\nOs logaritmos de este número nao existem"); return; } printf("\n\n\nO Logaritmo Neperiano de %lf e igual a %lf ",numero,log(numero)); printf("\nO Logaritmo Decimal de %lf e igual a %lf ",numero,log10(numero)); printf("\n\n¿Queres voltar a comecar (S/N)? "); scanf("%s",voltar); } } As funções log( ), log10( ) estão na biblioteca math.h. Quer dizer, quando precisar as utilizar deverá incluir em seu programa: #include <math.h> As sentencias BREAK e CONTINUE /* Programa 29*/ #include <stdio.h> int main() { int x; for(x=5;x<15;x++) { if(x==8) break; printf("\n x= %d",x); } printf("\n\n"); for(x=5;x<15;x++) { if(x==8) continue; printf("\n x=%d ",x); } } A sentença break nos obriga a sair do ciclo for. Por esta razão o primeiro “for” do programa, só escreve do 5 até o 7. A sentença continue salta ao final do ciclo for e contínua executando o ciclo. Por esta razão o segundo ciclo for escreve todos os números do 5 aos 14 exceptuando o 8. /* Programa 30*/ #include <stdio.h> int main() { int i; char sn[1]; char sn2[1]; printf("2"); for(i=4;i<=1000;i=i+2) { printf("\nQueres continuar (S/N)? "); scanf("%s",sn); if ((sn[0]=='n')||(sn[0]=='N')) break; printf("\nQueres que salte o próximo número par (S/N)?"); scanf("%s",sn2); if ((sn2[0]=='s')||(sn2[0]=='S')) continue; printf("\n%d",i); } } A estrutura de programação SWITCH /* Programa 31*/ #include <stdio.h> #include <math.h> int main() { int x; double num; char sn[1]; sn[0]='s'; while ((sn[0]=='s')||(sn[0]=='S')) { printf("\n (1) O TRIPLO"); printf("\n (2) O QUADRADO"); printf("\n (3) LOGARITMO NATURAL"); printf("\n (4) LOGARITMO DECIMAL"); printf("\n (5) SENO"); printf("\n (6) COSENO"); printf("\n\n\n Escreve o número da opcao que deseja: "); scanf("%d",&x); switch(x) { case 1: printf("\n\nEscreve um número: "); scanf("%lf",&num); printf("\nO triplo de %lf e %lf",num,3*num); break; case 2: printf("\n\nEscreve um número: "); scanf("%lf",&num); printf("\nO quadrado de %lf e %lf",num,num*num); break; case 3: printf("\n\nEscreve um número: "); scanf("%lf",&num); printf("\nO logaritmo neperiano de %lf e %lf",num,log(num)); break; case 4: printf("\n\nEscreve um número: "); scanf("%lf",&num); printf("\nO logaritmo decimal de %lf e %lf",num,log10(num)); break; case 5: printf("\n\nEscreve um número: "); scanf("%lf",&num); printf("\nO seno de %lf e %lf",num,sin(num)); break; case 6: printf("\n\nEscreve um número: "); scanf("%lf",&num); printf("\nO coseno de %lf e %lf",num,cos(num)); break; default: printf("\n\nIsto nao e nenhuma opcao "); break; } printf("\n\n\nQueres voltar a calcular (S/N)? "); scanf("%s",sn); } } Estrutura de programação SWITCH: switch(x) { case valor1: linha de programa1; linha de programa2; -----------------------; -----------------------; break; case valor2: linha de programa3; linha de programa4; -----------------------; -----------------------; break; default: linha de programa1; linha de programa2; -----------------------; -----------------------; break; } Segundo o valor que tome a variável x, executarão-se as linhas de programa do case correspondente. Observa que cada case termina com break. Se a variável x não toma o valor de nenhum case, executaram-se as linhas correspondentes ao “default”, que termina com o correspondente break. Outro código de formato: %o /* Programa 32*/ /* Programa que converte um número decimal inteiro a octal */ #include<stdio.h> #include<conio.h> /* Porque utilizo: getch() */ int main() { int numero; printf("Numero inteiro em decimal: "); scanf("%d", &numero); printf("\n\nSua representação em octal é %o"); /* Observa que não é necessário escrever o nome da variável. Toma nota do código de formato de um número em octal: %o */ printf("\pressione qualquer tecla para terminar...\n"); getch(); } Um número inteiro em decimal quer dizer em base 10, um número em octal quer dizer em base 8 Se tivéssemos de passar um número em base 10 a base 8 “à mão”, deveríamos fazer o seguinte, por exemplo com o número 85: 85: 8 = 10, resto=5 10:8 = 1, resto = 2 Iríamos dividindo o número e seus quocientes sucessivos por 8, até que não pudéssemos mais. O número correspondente em base 8, seriam os diferentes restos e o último quociente, escritos ao reverso, em nosso exemplo: 85 em base 10 = 125 em base 8. Como pode comprovar se executar Em Programa 32 e diante da pergunta “Número inteiro em decimal:” escreve 85 Mais funçoes de <math.h> /* Programa 33*/ /* Uso das funções: pow e fabs de <math.h> */ /* Programa que encontra as raízes de uma equacao quadrada, de acordo as fórmulas: (-b±raiz(b^2-4ac))/2a */ #include <stdio.h> #include <math.h> #include <conio.h> int main() { float a,b,c,x1,x2; printf("Este programa encontra as raízes reais\n"); printf("da equação da forma\n"); printf(" ax^2+bx+c=0 \n"); printf("A continuação, escreva os coeficientes\n"); printf("da ecuacao:\n"); printf("a= "); scanf("%f",&a); printf("b= "); scanf("%f",&b); printf("c= "); scanf("%f",&c); x1=pow(b,2); /* a função "double pow(double base, double exp)" é uma função que se encontra em math.h, que devolve "base" elevado a "exp". */ x1=x1-(4*a*c); x1=-b+sqrt(fabs(x1)); /* a função "double fabs(double num)" é uma função que se encontra em math.h, que devolve o valor absoluto de "num" */ x1=x1/(2*a); x2=pow(b,2); x2=x2-(4*a*c); x2=-b-sqrt(fabs(x2)); x2=x2/(2*a); printf("x1= %f\n",x1); printf("x2= %f\n",x2); getch(); } A função toupper /* Programa 34*/ #include <ctype.h> /* funcao toupper */ #include <stdio.h> /* funcoes printf() e scanf() */ #include <math.h> /* funcao fabs() */ #include <conio.h> /* funcao getch() Int main() { char resposta; resposta='\0'; while (resposta!='N') { float x; printf("Digita um número: "); scanf("%f",&x); x=fabs(x); printf(" valor absoluto e: %f\n",x); printf("Pressione 'N' para sair...\n"); resposta=toupper(getch()); /* a funcao "int toupper(int ch)" que está no fichero "ctype.h", devolve a maiúscula de "ch" sempre e quando seja uma letra. */ } } */ /* Programa 35*/ /* Este programa elabora o ticket de entrada e os resumos de arrecadação de um espectaculo. O preço do Ticket depende da idade do espectador (menino, jovem, adulto ou aposentado). */ #include <stdio.h> #include <conio.h> #include <ctype.h> int main() { const int precio=800; /* Preço da butaca */ int idade,tarifa,butacas,totalPtas; char opcion,tecla; totalPtas=0;butacas=0;opcion=' '; while (opcion != 'F') { printf("\nOpción (Ticket, Resumo ou Fim) ? \n"); opcion=getche(); opcion=toupper(opcion); /* a função 'toupper' está em <ctype.h> e devolve a letra maiúscula. */ printf("\n\n"); if (opcion == 'T') { tecla=' '; while (tecla != 'N') { printf("\n Idade= ? ");scanf("%d,&edad"); butacas=butacas+1; printf("\n======================================"); printf("\n TICKET DE ENTRADA"); if (idade<6) {printf("\n | Menino |");tarifa=0;}; if ((idade>=6) && (idade<18)) {printf("\n | Jovem|");tarifa=precio/2;}; if ((idade>=18) && (idade<65)) {printf("\n | Adulto|");tarifa=precio;}; if (idade>=65) {printf("\n | Aposentado|");tarifa=precio/4;}; totalPtas=totalPtas+tarifa; printf("\n\n Preço = %5d,tarifa"); printf("\n\n====================================="); printf("\n\n"); printf("Outro Ticket (S/N) ? \n"); tecla=toupper(getche()); }; }; if (opcion=='R') { printf("\n\n RESUMO DE VENDAS"); printf("\n========================================"); printf("\n\n printf("\n\n printf("\n\n"); } } } %d Butacas,butacas"); Total arrecadado = %d,totalPtas");