Você está na página 1de 33

FIT - Faculdade de Informtica de Taquara Curso de Sistemas de Informao

Apostila de Programao II - Linguagem de Programao C Material at a Prova G1

Profa. Flvia Pereira de Carvalho

Maro de 2008

Apostila de Programao II Linguagem C

Sumrio Pgina
1 INTRODUO........................................................................................................................................................................ 4 2 COMPILADORES E INTERPRETADORES ...................................................................................................................... 5 2.1 COMPILADORES C ............................................................................................................................................................... 5 2.1.1 Compilador GCC (GNU Compiler Collection).......................................................................................................... 6 2.1.2 Compilador Dev-C++................................................................................................................................................ 6 2.1.3 Compilador C++ Builder - Borland .......................................................................................................................... 6 2.1.4 Compilador Turbo C Borland .................................................................................................................................... 6 2.1.5 Compilador Visual C# - Microsoft ............................................................................................................................. 7 3 CONSIDERAES INICIAIS E DICAS.............................................................................................................................. 7 3.1 A LINGUAGEM C CASE SENSITIVE ................................................................................................................................ 7 3.2 VARIVEIS .......................................................................................................................................................................... 7 3.2.1 Declaraes................................................................................................................................................................ 8 3.2.2 Notao Hngara....................................................................................................................................................... 8 3.2.3 Inicializao de Variveis (Atribuio) ..................................................................................................................... 9 3.3 CARTO DE REFERNCIA DA LINGUAGEM ANSI C........................................................................................................... 10 3.4 TIPOS DE DADOS ............................................................................................................................................................... 10 4 INCIO DO APRENDIZADO: DOIS PRIMEIROS PROGRAMAS ............................................................................... 12 4.1 PRIMEIRO EXEMPLO DE UM PROGRAMA EM C.................................................................................................................... 12 4.2 SEGUNDO EXEMPLO DE UM PROGRAMA EM C.................................................................................................................... 13 5 AUTO AVALIAO: 1. PARTE DA DISCIPLINA ........................................................................................................ 13 6 MATRIZES UNIDIMENSIONAIS - VETORES (OU ARRAY) ...................................................................................... 14 7 FUNES: SCANF( ) E PRINTF( ) ................................................................................................................................. 15 8 CARACTERES: LENDO E ESCREVENDO ..................................................................................................................... 17 9 INTRODUO A ALGUNS COMANDOS DE CONTROLE DE FLUXO .................................................................... 18 9.1 COMANDO IF .................................................................................................................................................................... 18 9.1.1 Ifs Aninhados............................................................................................................................................................ 19 10 OPERADORES.................................................................................................................................................................... 20 10.1 10.2 10.3 10.4 10.5 OPERADORES ARITMTICOS ............................................................................................................................................ 20 OPERADORES RELACIONAIS ............................................................................................................................................ 21 OPERADORES LGICOS ................................................................................................................................................... 21 OPERADOR DE ENDEREO & .......................................................................................................................................... 22 PRIORIDADES DOS OPERADORES ..................................................................................................................................... 23

11 ESTRUTURAS DE REPETIO (LAOS) .................................................................................................................... 24 11.1 11.2 11.3 11.4 WHILE (ENQUANTO-FAA) ............................................................................................................................................ 24 DO-WHILE (FAA-ENQUANTO)...................................................................................................................................... 25 FOR (PARA) .................................................................................................................................................................... 25 EXERCCIOS DE FIXAO ................................................................................................................................................ 26

12 STRINGS.............................................................................................................................................................................. 27 12.1 LENDO STRINGS DO TECLADO: COM MAIS DE UMA PALAVRA (COM ESPAOS EM BRANCO)............................................. 28 12.2 EXERCCIOS COM STRINGS (TPICOS DE PROVA)............................................................................................................... 29 13 INTRODUO S FUNES.......................................................................................................................................... 30 13.1 ARGUMENTOS (PARMETROS) ........................................................................................................................................ 30 13.2 RETORNANDO VALORES ................................................................................................................................................. 31 14 AUTO AVALIAO: 2. PARTE DA DISCIPLINA ...................................................................................................... 32 REFERNCIAS BIBLIOGRFICAS..................................................................................................................................... 33

Apostila de Programao II Linguagem C

Apostila de Programao II Linguagem C

1 Introduo A Linguagem de Programao C foi primeiramente criada por Dennis Ritchie e Ken Thompson nos laboratrios da empresa Bell, em 1972. C foi baseada na Linguagem B de Thompson, que por sua vez era uma evoluo da Linguagem BCPL (o que nos leva a concluir que uma prxima evoluo desta linguagem gerasse a linguagem P ;-D ). Esta linguagem foi inicialmente concebida para ser utilizada no Sistema Operacional Unix. A definio de C est contida em um livro escrito pelo prprio Dennis Ritchie, juntamente com Brian Kernighan cujo ttulo C - A Linguagem de Programao padro ANSI1 (American National Standards Institute). um livro quase obrigatrio para quem estiver estudando a linguagem C. Uma fonte alternativa de aprendizado so os milhares de tutoriais, apostilas e livros disponveis na Internet. bom prestar muita ateno neste tipo de fonte, pois nem sempre o material confivel. Mas a vai uma dica: o livro C / C++ e Orientao a Objetos em Ambiente Multiplataforma foi escrito pelo Prof. Sergio Villas-Boas da UFRJ e encontrado na Internet facilmente para download gratuito (no formato PDF). C uma linguagem de programao genrica que utilizada para criao de programas diversos como processadores de texto, planilhas eletrnicas, sistemas operacionais, programas de comunicao, programas para automao industrial, gerenciadores de bancos de dados, programas para soluo de problemas da Engenharia, Fsica, Qumica e outras Cincias etc. bem provvel que o Navegador Web que voc usou para acessar este material tenha sido escrito em C ou C++. C freqentemente chamada de linguagem de mdio nvel para computadores. Isso no significa que C seja menos poderosa, difcil de usar ou menos desenvolvida que uma linguagem de alto nvel como Pascal, tampouco implica que C seja similar linguagem assembly e seus problemas correlatos aos usurios. C tratada como uma linguagem de mdio nvel porque combina elementos de linguagens de alto nvel com a funcionalidade da linguagem assembly. Como uma linguagem de mdio nvel, C permite a manipulao de bits, bytes e endereos os elementos bsicos com os quais o computador funciona. Um cdigo escrito em C muito portvel. Portabilidade significa que possvel adaptar um software escrito para um tipo de computador a outro. Por exemplo, se voc pode facilmente converter um programa escrito para DOS de tal forma a executar sob Windows, ento esse programa portvel. Por haver compiladores C para quase todos os computadores, possvel pegar um cdigo escrito para uma mquina, compil-lo e rod-lo em outra com pouca ou nenhuma modificao. Esta portabilidade economiza tempo e dinheiro. Os compiladores C tambm tendem a produzir um cdigo-objeto muito compacto e rpido. Embora o termo linguagem estruturada em blocos no seja rigorosamente aplicvel a C, ela normalmente referida simplesmente como linguagem estruturada. C tem muitas semelhanas com outras linguagens estruturadas, como Pascal, por exemplo. A razo pela qual C no , tecnicamente, uma linguagem estruturada em blocos, que as linguagens estruturadas em blocos permitem que procedimentos e funes sejam declarados dentro de procedimentos e funes. No entanto, como C no permite a criao de funes dentro de funes, no pode ser chamada formalmente de uma linguagem estruturada em blocos [SCH97].

1 Esse livro pode ser adquirido diretamente na Editora Campus. Na pgina da disciplina de Programao II, na seo Downloads, est disponvel o link direcionado para a compra. E tambm tem a disposio dos alunos na nossa biblioteca. Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira 4

Apostila de Programao II Linguagem C

2 Compiladores e Interpretadores Os termos compiladores e interpretadores referem-se maneira como um programa executado. Existem dois mtodos gerais pelos quais um programa pode ser executado. Em teoria, qualquer linguagem de programao pode ser compilada ou interpretada, mas algumas linguagens geralmente so executadas de uma maneira ou de outra. A maneira pela qual um programa executado no definida pela linguagem em que ele escrito. Interpretadores e compiladores so simplesmente programas sofisticados que operam sobre o cdigo-fonte do seu programa. Um interpretador l o cdigo-fonte do seu programa uma linha por vez, executando a instruo especfica contida nessa linha. Um compilador l o programa inteiro e converte-o em um cdigo-objeto, que uma traduo do cdigo-fonte do programa em uma forma que o computador possa executar diretamente. Quando um interpretador usado, deve estar presente toda vez que voc executar o seu programa. O processo lento e ocorre toda vez que o programa for executado. Um compilador, ao contrrio, converte seu programa em um cdigo-objeto que pode ser executado diretamente por seu computador. Como o compilador traduz seu programa de uma s vez, tudo o que voc precisa fazer executar se programa diretamente, geralmente apenas digitando seu nome. Assim, o tempo de compilao s gasto uma vez, enquanto o cdigo interpretado incorre neste trabalho adicional cada vez que o programa executa [SCH97].

2.1 Compiladores C Existem diversos compiladores C / C++ disponveis para os programadores. A deciso sobre qual compilador utilizar pode ser baseada em vrios fatores, como por exemplo: Qualidade do compilador - rpido - est conforme com a padronizao da linguagem - a interface com o usurio agradvel - possui ou no um IDE (Integrated Development Enviroment) - possui diversas opes de compilao; etc. Sistema(s) Operacional(is) que o compilador funciona (e gera cdigos) Custo do compilador Documentao disponvel e Suporte

Dentro deste cenrio, temos tambm um fator determinante: quais so os compiladores mais utilizados atualmente? Esta informao muito importante, pois indicado que estejamos habituados e com experincia naquele compilador que provavelmente tenhamos que utilizar em algum futuro emprego ou projeto de pesquisa que venhamos a nos engajar.

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

Apostila de Programao II Linguagem C

2.1.1 Compilador GCC (GNU Compiler Collection) O compilador GCC (http://www.gnu.org/software/gcc/gcc.html) da GNU2 (Free Software Foundation). sem dvida um "lder" no mercado de compiladores C atualmente e o que iremos utilizar na disciplina de Programao II. o compilador padro do sistema operacional GNU/Linux e tambm foi adotado por (ou portado para) vrios outros sistemas operacionais (inclusive S.O. comerciais pagos), tais como HPUX, MS-Windows, MS-DOS, IBM OS2, IBM AIX, SUN OS, SUN Solaris etc, alm claro do prprio GNU/Linux, onde este compilador utilizado no desenvolvimento do prprio sistema operacional e de todas as ferramentas nele disponveis (ou seja, o compilador 'nativo' do Linux). Outro detalhe importante que todas as distribuies Linux j vm com um compilador GCC disponvel, ou seja, se voc tem um computador com Linux instalado, voc tem um compilador GCC pronto para ser utilizado. Mas caso voc precise instalar o GCC em outro S.O., tal como o Windows, v em: http://gcc.gnu.org/install/binaries.html (embora em um primeiro momento, por motivos de facilidade na utilizao, seja extremamente recomendado que voc utilize o GCC no Linux, e s aps estar familiarizado tente instal-lo em algum outro S.O.).

2.1.2 Compilador Dev-C++ Compilador Free Software (GPL3 - General Public License), para Windows, com um IDE 'respeitvel' (editor, compilador e debug integrados). Para efetuar o download gratuito, acesse: http://fit.faccat.br/~fpereira/devcpp-4.9.9.2_setup.zip Este compilador o mais recomendado para quem quiser trabalhar no Windows.

2.1.3 Compilador C++ Builder - Borland Outro compilador C muito conhecido e utilizado o da empresa Borland4, certamente uma das empresas mais conhecidas na rea de linguagens de programao (Delphi, Turbo Pascal, Turbo C, Kylix etc.). O compilador C++ Builder pode ser baixado gratuitamente (verso de avaliao - 60 dias) no endereo: http://www.borland.com/bcppbuilder/tryitnow.html.

2.1.4 Compilador Turbo C Borland Este um dos compiladores C mais conhecidos (e antigos) na micro-informtica. A Borland disponibiliza o Turbo C gratuitamente no site da empresa (aps um rpido cadastro). Voc pode baix-lo diretamente em: http://fit.faccat.br/~fpereira/tc201.zip Este compilador roda em "modo MS-DOS". muito simples, mas funciona perfeitamente em muitas verses de Windows. Dicas para instalao: ao descompactar o arquivo, sero criadas trs pastas (disk1, disk2 e disk3). A forma de instalao correta solicita que cada uma destas pastas seja descompactada em um disquete de 3,5" e a instalao seria ento iniciada a partir do Disk1. Mas tambm possvel realizar o procedimento de instalao da seguinte forma: 1. Descompactar todos os arquivos em uma nica pasta 2. Iniciar o processo de instalao executando o arquivo 'install.exe'

2 3 4

Maiores informaes sobre o projeto GNU em: http://www.gnu.org/ Maiores informaes em: http://www.gnu.org/copyleft/gpl.html Maiores informaes sobre a empresa Borland em: http://www.borland.com/br/ 6

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

Apostila de Programao II Linguagem C

3. To logo inicia a instalao, o software instalador solicita a informao sobre o drive de origem da instalao: digite o drive onde a pasta foi criada (possivelmente C:) e confirme o caminho da pasta que o prprio instalador ir sugerir. Tudo pronto: v em File - New e digite seu primeiro programa. Para compil-lo e rod-lo v em Run Run.

2.1.5 Compilador Visual C# - Microsoft O compilador C da Microsoft outro com muitos usurios. Algumas informaes em: http://www.microsoft.com/brasil/msdn/csharp/default.mspx http://www.microsoft.com/brasil/msdn/csharp/articles.mspx.

3 Consideraes Iniciais e Dicas Neste captulo sero apresentadas algumas dicas importantes sobre a linguagem C e alguns comentrios iniciais para que possamos iniciar os primeiros programas. Antes disso necessrio dizer algumas palavras sobre C++. Algumas vezes os novatos confundem o que C++ e como difere de C. C++ uma verso estendida e melhorada de C que projetada para suportar programao orientada a objetos (OOP, do ingls Object Oriented Programming). C++ contm e suporta toda linguagem C e mais um conjunto de extenses orientadas a objetos. Ou seja, C++ um superconjunto de C. Como C++ construda sobre os fundamentos de C, voc no pode programar em C++ se no entender C. Hoje em dia, e por muitos anos ainda, a maioria dos programadores ainda escrever, manter e utilizar programas C, e no C++. Como mencionado, C suporta programao estruturada, que tem se mostrado eficaz ao longo de todos estes anos nos quais tem sido largamente usada. C++ projetada principalmente para suportar OOP, que incorpora os princpios da programao estruturada, mas inclui objetos. Embora a OOP seja muito eficaz para uma certa classe de tarefas de programao, muitos programas no se beneficiam da sua aplicao. Com relao aos compiladores: todos os compiladores que podem compilar programas C++ tambm podem compilar programas C.

3.1 A Linguagem C case sensitive Um ponto de suma importncia: C "case sensitive", ou seja, maisculas e minsculas fazem diferena. Se declararmos uma varivel com o nome soma ela ser diferente de Soma, SOMA, SoMa ou sOmA. Da mesma maneira, os comandos (todas as palavras-chave) da linguagem C if e for, por exemplo, s podem ser escritos em minsculas, pois seno o compilador no ir interpret-los como sendo comandos, mas sim como variveis.

3.2 Variveis Primeiramente com relao aos nomes das variveis (e tambm das funes) -- em C os identificadores podem ter qualquer nome se duas condies forem satisfeitas: O nome deve comear com uma letra ou sublinhado ( _ ) Os caracteres subseqentes devem ser letras, nmeros ou sublinhado ( _ ).

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

Apostila de Programao II Linguagem C

Alm dessas duas condies acima, ainda h mais duas restries: O nome de uma varivel no pode ser igual a uma palavra reservada (palavra-chave), nem igual ao nome de uma funo declarada pelo programador, ou pelas bibliotecas do C. Variveis de at 32 caracteres so aceitas. bom sempre lembrar que C uma linguagem "case sensitive" e, portanto deve-se prestar ateno s maisculas e minsculas.

3.2.1 Declaraes Todas as variveis devem ser declaradas antes de serem usadas. Uma declarao especifica um tipo, e seguida por uma lista de uma ou mais variveis daquele tipo, tal como nos seguintes exemplos: int inicio, fim, numero; float valor; short int codigo; char c, linha [100];

3.2.2 Notao Hngara Programadores normalmente no escolhem os nomes de variveis, funes e constantes ao mero acaso. Normalmente elegem nomes que signifiquem e indiquem o motivo da existncia daquela varivel ou funo dentro do programa. O problema que determinada palavra ou sigla pode significar muito para uma determinada pessoa e nada para outra. Por este motivo muito interessante que exista uma conveno quanto a nomenclatura para esses identificadores. Voc j deve ter ouvido falar sobre algo chamado de notao hngara. Talvez nunca tenha ouvido, mas provavelmente j viu. quando voc tem variveis parecidas com as seguintes: intComputadores = 20 dtHoje = #07/01/05# strNomeComputador = "server1" A nomeao de variveis dessa forma uma prtica comum de programao. Tudo o que voc est fazendo criando um nome de varivel, como intComputadores e, em seguida, prefixando-a com o tipo de informao que ser armazenado nela. Portanto, se voc estiver usando a varivel intComputadores para manter o nmero de computadores, usar um inteiro para designar o nmero. Portanto, o prefixo int. Isso tudo. Isso ajuda a evitar que voc pense que talvez intComputadores mantenha os nomes dos computadores, o que seria uma seqncia de caracteres e no um inteiro. Por que hngara? Porque a primeira pessoa a propor esse tipo de nomenclatura de variveis foi o exengenheiro da Microsoft, Charles Simonyi, que era hngaro.

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

Apostila de Programao II Linguagem C

Mais informaes em: http://www.microsoft.com/technet/scriptcenter/guide/sas_sbp_xmzd.mspx?mfr=true http://msdn2.microsoft.com/en-us/library/aa260976.aspx A notao hngara (Hungarian Notation) uma das convenes para nomenclatura mais difundidas e utilizadas. Normalmente, um cdigo sofisticado e que tenha pretenses de ser divulgado ou publicado largamente, necessita obedecer esta notao para ser compreendido e aceito pela comunidade cientfica e comercial. Outro pequeno exemplo pode ser visto a seguir: string sPrimeiroNome; //s o prefixo para o tipo String s char cLetra; //c o prefixo para o tipo Char c button butOk; //but o prefixo para o tipo Button but Por estes motivos, grandes empresas e softwares houses costumam exigir de seus programadores e fornecedores de software a utilizao desta conveno. Xerox, Apple, 3Com e Microsoft so exemplos de empresas que utilizam esta conveno como padro de nomenclatura para seus identificadores de programas.

3.2.3 Inicializao de Variveis (Atribuio) Voc pode dar maioria das variveis em C um valor, no mesmo momento em que elas so declaradas, ou seja, pode inicializar a varivel juntamente com sua declarao, colocando um sinal de igual ( = ) e uma constante aps o nome da varivel. A forma geral de uma inicializao : tipo nome_da_varivel = constante;

Alguns exemplos de inicializar juntamente ao declarar so: char letra = a; int valor = 0; float preo = 123.23; A linguagem C permite que voc atribua o mesmo valor a muitas variveis usando atribuies mltiplas em um nico comando. Por exemplo, esse fragmento de programa abaixo, atribui a x, y e z o valor 0: x = y = z = 0; Em programas profissionais, valores comuns so atribudos a variveis usando esse mtodo. O qualificador const pode ser aplicado declarao de qualquer varivel para especificar que seu valor no deve ser mudado: const float salario_minimo = 230.00; const char mensagem[] = "Ola";

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

Apostila de Programao II Linguagem C

3.3 Carto de Referncia da Linguagem ANSI C Cartes de Referncia so clssicos entre programadores de praticamente to das as linguagens. Nestes cartes, apesar de seu tamanho reduzido (uma folha impressa nos dois lados e dobrada em forma de folder), normalmente possvel consultar todos os tipos de dados da linguagem, formas e exemplos de declarao, tipos de estruturas de deciso e repetio, as sintaxes para cada uma destas definies etc. So cartes de referncia completos e muito teis no dia-a-dia. Um carto de referncia da ANSI C muito bom, criado por Joseph Silverman, da Brown University e liberado para cpias gratuitas pode ser encontrado para download em: http://fit.faccat.br/~fpereira/C_reference_Card_ANSI.pdf Observao: No esquea que este carto pode (deve) ser impresso frente-e-verso para ficar prtico!

3.4 Tipos de Dados Tipos Bsicos: os dados podem assumir cinco tipos bsicos em C que so: char: char Caractere - o valor armazenado um caractere. Caracteres geralmente so armazenados em cdigos (usualmente o cdigo ASCII). int: int Nmero inteiro o tipo padro e o tamanho do conjunto que pode ser representado normalmente depende da mquina em que o programa est rodando. float: float Nmero em ponto flutuante de preciso simples. So conhecidos normalmente como nmeros reais. double: double Nmero em ponto flutuante de preciso dupla. void: void Este tipo serve para indicar que um resultado no tem um tipo definido. Uma das aplicaes deste tipo em C criar um tipo vazio que pode posteriormente ser modificado para um dos tipos anteriores. O tipo void declara explicitamente uma funo que no retorna valor algum ou cria ponteiros genricos, como ser visto mais adiante. Modificadores dos Tipos Bsicos: modificadores podem ser aplicados a estes tipos. Estes modificadores so palavras que alteram o tamanho do conjunto de valores que o tipo pode representar. Por exemplo, um modificador permite que possam ser armazenados nmeros inteiros maiores. Um outro modificador obriga que s nmeros sem sinal possam ser armazenados pela varivel. Deste modo no necessrio guardar o bit de sinal do nmero e somente nmeros positivos so armazenados. O resultado prtico que o conjunto praticamente dobra de tamanho. A Tabela abaixo mostra todos os tipos bsicos definidos no padro ANSI.

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

10

Apostila de Programao II Linguagem C

Tipo Char unsigned char signed char Int unsigned int signed int short int unsigned short int Signed short int long int Signed long int unsigned long int Float Double long double

Tamanho em Bytes 1 1 1 4 4 4 2 2 2 4 4 4 4 8 10

Faixa Mnima -127 a 127 0 a 255 -127 a 127 -2.147.483.648 a 2.147.483.647 0 a 4.294.967.295 -2.147.483.648 a 2.147.483.647 -32.768 a 32.767 0 a 65.535 -32.768 a 32.767 -2.147.483.648 a 2.147.483.647 -2.147.483.648 a 2.147.483.647 0 a 4.294.967.295 Seis digitos de preciso Dez digitos de preciso Dez digitos de preciso

Tipos bsicos definidos no padro ANSI

Percebemos ento que h uma srie de qualificadores que podem ser aplicados aos tipos bsicos: short e long. short int iTesteShort; long int iTesteLong; A inteno que short e long devam prover tamanhos diferentes de inteiros onde isso for possvel; int normalmente ser o tamanho natural para uma determinada mquina. short ocupa normalmente 16 bits, long 32 bits, e int, 16 ou 32 bits (de acordo com a mquina). Cada compilador livre para escolher tamanhos adequados para o seu prprio hardware, com a nica restrio de que short e int devem ocupar pelo menos 16 bits, long pelo menos 32 bits, e short no pode ser maior que int, que no maior do que long. Existem tambm os qualificadores signed e unsigned, que podem ser aplicados a char ou a qualquer inteiro. Nmeros unsigned so sempre positivos ou 0. O tipo long double especifica ponto flutuante com preciso estendida. Assim como os inteiros, os tamanhos de objetos em pontos flutuantes so definidos pela implementao.

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

11

Apostila de Programao II Linguagem C

4 Incio do Aprendizado: dois primeiros programas Nas prximas sees deste captulo so apresentados exemplos iniciais de programas feitos na linguagem C, explicando detalhadamente cada linha do cdigo.

4.1 Primeiro exemplo de um programa em C 1 2 3 4 5 6 #include <stdio.h> /*Um Primeiro Programa*/ main () { printf ("Ola! Eu estou vivo!\n"); //Escreve na tela }

Compilando e executando este programa, ele escreve na tela: Ola! Eu estou vivo! Analisando o programa acima por partes (linhas numeradas para facilitar): 1) #include <stdio.h> diz ao compilador que ele deve incluir o arquivo-cabealho padro da linguagem C stdio.h. Nesse arquivo existem declaraes de funes teis para entrada e sada de dados onde: std = standard, que significa padro, em ingls io = Input/Output, entrada e sada Ento: stdio = entrada e sada padronizadas. Toda vez que voc quiser usar uma destas funes deve incluir este comando. A linguagem C possui diversos arquivos-cabealhos. 2) Quando fazemos um programa, uma boa idia usar comentrios que ajudem a elucidar o funcionamento do mesmo. No exemplo apresentado temos um comentrio: /*Um Primeiro Programa*/ O compilador desconsidera qualquer coisa que esteja comeando com /* e terminando com */. Um */ comentrio pode, inclusive, ter mais de uma linha. Alis, se o comentrio for de apenas uma linha, podese usar // //. 3) main() indica que estamos definindo uma funo de nome main. Todos os programas em C tm que ter uma funo main, pois esta funo que ser chamada quando o programa for executado. No exemplo, a funo main no recebe argumentos (os parnteses esto vazios). 4) O corpo (contedo) da funo delimitado por chaves { } O cdigo que estiver dentro das chaves }. ser executado seqencialmente quando a funo for chamada. 5) A nica coisa que o programa realmente faz chamar a funo printf(), passando a string (uma string uma seqncia de caracteres, como veremos a seguir) "Ola! Eu estou vivo!\n" como argumento. por causa do uso da funo printf() pelo programa que devemos incluir o arquivocabealho stdio.h . A funo printf( ) neste caso ir apenas colocar a string na tela do computador. O \n uma constante chamada de constante barra invertida. No caso, o \n a constante barra invertida de "new line" e ele interpretado como um comando de mudana de linha, isto , aps imprimir Ola! Eu estou vivo! o cursor passar para a prxima linha. importante observar tambm que os comandos do C terminam com ; e que strings so delimitadas por aspas duplas. 6) As chaves, ou seja, o terminador } indica o fim da rea da funo. Programas em C so definidos em arquivos texto que normalmente possuem a extenso .c.

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

12

Apostila de Programao II Linguagem C

4.2 Segundo exemplo de um programa em C #include <stdio.h> int main () { int Dias; //Declaracao de Variaveis float Anos; printf ("Entre com o nmero de dias: "); //Entrada de Dados scanf ("%d",&Dias); //L do teclado Anos=Dias/365.25; //Conversao Dias em Anos printf ("\n\n %d dias equivalem a %f anos.\n",Dias,Anos); /* experimente trocar o %f por %5.2f */ return(0); } Vamos entender como o programa acima funciona: So declaradas duas variveis chamadas: Dias e Anos. A primeira um int (inteiro) e a segunda um float (ponto flutuante - nmeros com ponto). As variveis declaradas como ponto flutuante existem para armazenar nmeros que possuem casas decimais, como por exemplo, 5.1497. A palavra int antes de main indica que esta funo retorna um inteiro. O que significa este retorno ser visto posteriormente, quando estudarmos um pouco mais detalhadamente as funes do C. A ltima linha do programa, return(0); , indica o nmero inteiro que est sendo retornado pela funo, no caso o nmero 0. feita ento uma chamada funo printf(), que coloca uma mensagem na tela. Queremos agora ler um dado que ser fornecido pelo usurio e coloc-lo na varivel inteira Dias. Para tanto usamos a funo scanf() . A string "%d" diz funo que iremos ler um inteiro do teclado. O segundo parmetro passado funo diz que o dado lido dever ser armazenado na varivel Dias. importante ressaltar a necessidade de se colocar um & antes do nome da varivel a ser lida quando se usa a funo scanf(). O motivo disto s ficar claro mais tarde. Observe que, em C, quando temos mais de um parmetro para uma funo, eles so separados por vrgula. Temos ento uma expresso matemtica simples que atribui a Anos o valor de Dias dividido por 365.25. A segunda chamada funo printf() tem trs argumentos. A string: "\n\n %d dias equivalem a %f anos.\n" Diz funo para pular duas linhas, colocar um inteiro na tela, colocar a mensagem "dias equivalem a", colocar um valor float na tela, colocar a mensagem "anos" e pular outra linha. Os outros parmetros so as variveis, Dias e Anos, das quais devem ser lidos os valores do inteiro e do float, respectivamente.

5 Auto Avaliao: 1. Parte da Disciplina Veja como voc est: o que faz o seguinte programa? #include <stdio.h> int main() { int x; scanf("%d",&x); printf("%d",x); return(0); }

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

13

Apostila de Programao II Linguagem C

6 Matrizes Unidimensionais - Vetores (ou Array) Uma matriz uma coleo de variveis do mesmo tipo que referenciada por um nome comum. Um elemento especfico em uma matriz acessado por meio de um ndice. Os ndices iniciam em 0 em C. A matriz mais comum em C a de string, que simplesmente uma matriz de caracteres terminada por um nulo. A forma geral para declarar uma matriz unidimensional : tipo nome_vetor [tamanho];

Exemplos: 1) 2) 3) int codigos[100]; char nomes[80]; //isto eh uma string em C

float salarios[30];

No exemplo nmero 1 apresentado acima, estamos declarando um vetor de inteiros com 100 posies, chamado codigos. Os ndices vo de codigos[0] at codigos[99]. No exemplo 2, temos um vetor de caracteres com 80 posies, de nome[0] at nome[79]. Esta a forma bsica para declaraes de strings em C. No exemplo 3, temos um vetor float com 30 posies (ndices de 0 a 29), chamado salarios. Por exemplo, o seguinte programa carrega uma matriz inteira com os nmeros de 0 a 99: void main (void) { int x[100]; int t; for (t=0; t<100; ++t) { x[t]=t; } }

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

14

Apostila de Programao II Linguagem C

7 Funes: scanf( ) e printf( ) As funes scanf( ) e printf( ) so respectivamente funes de entrada e sada de dados, ou seja, scanf( ) uma funo de leitura das informaes (do teclado) e printf ( ) uma funo de escrita das informaes. A funo printf( ) tem a seguinte forma geral: printf (string_de_controle, lista_de_argumentos); Teremos, na string de controle, uma descrio de tudo que a funo vai colocar na tela. A string de controle mostra no apenas os caracteres que devem ser colocados na tela, mas tambm quais as variveis e suas respectivas posies. Isto feito usando-se os cdigos de controle, que usam a notao %. Na string de controle indicamos quais, de qual tipo e em que posies esto as variveis a serem apresentadas. muito importante que, para cada cdigo de controle, tenhamos um argumento na lista de argumentos. Resumindo, a funo printf ( ) converte, formata e imprime seus argumentos na sada padro (normalmente a tela) sob o controle da string_de_controle.

A funo scanf ( ) tem a seguinte forma geral: scanf (string_de_controle, lista_de_argumentos); A funo scanf ( ) l caracteres da entrada padro (normalmente o teclado), interpretando-os de acordo com o formato especificado na string_de_controle, e armazena os resultados nos argumentos descritos.

Na tabela a seguir so apresentados alguns dos cdigos %: Cdigo Significado Inteiro Decimal Float: nmero em ponto flutuante (nmero real, com ponto casas decimais) Caractere String: srie de caracteres Inteiro Octal Nmero Hexadecimal Decimal sem Sinal Inteiro Longo Coloca na tela um %

%d %f %c %s %o %x %u %l %%

Cdigos de Formatao das Funes: scanf( ) e printf( )

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

15

Apostila de Programao II Linguagem C

Alm dos cdigos de controle, existem tambm os cdigos especiais, tais como o '\n' que j vimos anteriormente. Na tabela abaixo esto listados esses cdigos especiais: Cdigo Significado Nova Linha Tab Retrocesso Aspas Contrabarra Salta pgina de Formulrio Nulo

\n \t \b \" \\ \f \0

Exemplos de printf( ) e o que eles exibem: printf ("Teste %% %%") printf ("%f",40.345) Teste 40.345 Um caractere D e um inteiro 120 % %

printf ("Um caractere %c e um inteiro %d",'D',120) printf ("%s eh um exemplo","Este") printf ("%s%d%%","Juros de ",10)

eh Este eh um exemplo Juros de 10%

Veja no exemplo abaixo as diversas possibilidades do uso dos cdigos de formatao nas funes scanf( ) e printf( ): main() { char a; printf ("Digite um caractere e veja-o em decimal, octal e hexadecimal: "); scanf ("%c",&a); printf ("\n %c = %d em decimal, %o em octal e %x em hexadecimal.\n",a,a,a,a); } Um exemplo de resultado de execuo do programa acima: Digite um caractere e veja-o em decimal, octal e hexadecimal: m m = 109 em decimal, 155 em octal e 6D em hexadecimal.

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

16

Apostila de Programao II Linguagem C

8 Caracteres: Lendo e Escrevendo Os caracteres so um tipo de dado: o char. A linguagem C trata os caracteres ('a', 'b', 'x' etc.) como sendo variveis de 1 byte (8 bits). Um bit a menor unidade de armazenamento de informaes em um computador. Os inteiros (int) tm um nmero maior de bytes. Dependendo da implementao do compilador, eles podem ter 2 bytes (16 bits) ou 4 bytes (32 bits). Em C tambm podemos usar um char para armazenar valores numricos inteiros, alm de us-lo para armazenar caracteres de texto. Para indicar um caractere de texto usamos apstrofes. Veja um exemplo de programa que usa caracteres: #include <stdio.h> int main () { char cLetra; cLetra='D'; printf ("%c",cLetra); c return(0); } No programa acima, %c indica que printf() deve colocar um caractere na tela. Como vimos anteriormente, um char tambm usado para armazenar um nmero inteiro. Este nmero conhecido como o cdigo ASCII correspondente ao caractere. Veja o programa abaixo: #include <stdio.h> int main () { char cLetra; cLetra='D'; printf ("%d",cLetra); /*Imprime o caractere como inteiro*/ d return(0); } Este programa vai imprimir o nmero 68 na tela, que o cdigo ASCII correspondente ao caractere 'D' (d maisculo). Muitas vezes queremos ler um caractere fornecido pelo usurio. Para isto a funo mais usada getchar(). Esta funo retorna o caractere pressionado. O equivalente a getchar() para impresso a funo putchar(). Eis um exemplo que usa as funes getchar( ) e putchar( ): #include <stdio.h> int main () { char Ch; Ch=getchar(); putchar(Ch); printf ("\nVoce pressionou a tecla %c\n",Ch); return(0); }

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

17

Apostila de Programao II Linguagem C

Programa equivalente, sem usar getchar( ): #include <stdio.h> int main () { char Ch; scanf("%c", &Ch); putchar(Ch); printf ("Voce pressionou a tecla %c",Ch); return(0); }

9 Introduo a alguns Comandos de Controle de Fluxo Os comandos de controle de fluxo so aqueles que permitem ao programador alterar a seqncia de execuo do programa. Vamos dar uma breve introduo a dois comandos de controle de fluxo. Outros comandos sero estudados posteriormente.

9.1 Comando if O comando if representa uma tomada de deciso do tipo "SE isto, ENTO aquilo". A forma geral : if (condio) comando; else comando;

A condio do comando if uma expresso que ser avaliada. Abaixo est apresentado um exemplo: #include <stdio.h> int main () { int num; printf ("Digite um numero: "); scanf ("%d",&num); if (num>10) printf ("\n\nO numero e' maior que 10"); if (num==10) { printf ("\n\nVoce acertou!\n"); printf ("O numero e igual a 10."); } if (num<10) printf ("\n\nO numero e' menor que 10"); return (0); } No programa acima a expresso num>10 avaliada e retorna um valor diferente de zero, se verdadeira, e zero, se falsa. No exemplo, se num for maior que 10, ser impressa a frase: "O nmero e' maior que 10". Repare que, se o nmero for igual a 10, estamos executando dois comandos. Para que isto fosse possvel, tivemos que agrup-los em um bloco (com chaves) que se inicia logo aps a comparao e termina aps o segundo printf. Repare tambm que quando queremos testar igualdades usamos o operador == e no = . Isto porque o operador = representa apenas uma atribuio.

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

18

Apostila de Programao II Linguagem C

Pode parecer estranho primeira vista, mas se escrevssemos: if (num=10)... /* Isto esta errado */ O compilador iria atribuir o valor 10 varivel num e a expresso num=10 iria retornar 10, fazendo com que o valor de num fosse modificado e fazendo com que a declarao fosse executada sempre. Este problema gera erros freqentes entre iniciantes, portanto, muita ateno deve ser tomada. Mais um exemplo (utilizando if-else): #include <stdio.h> int main() { int iNum = 5; if (iNum > 10) { printf ("maior que 10\n"); } else { printf ("menor que 10\n"); } return 0; }

Outra forma de escrever a mesma estrutura if-else do exemplo acima, seria: if (iNum > 10) printf ("maior que 10\n"); else printf ("menor que 10\n");

9.1.1 Ifs Aninhados if (i) { if (j) comando 1; if (k) comando 2; else comando 3; //este else esta associado ao if(k) } else comando 4; //este else esta associado ao if(i)

Uma seqncia de ifs aninhados: if (expressao) comando; else if (expressao) comando; else if(expressao) comando; ou, para diminuirmos a 'altura' do cdigo fonte: if (expressao) comando; else if (expressao) comando; else if(expressao) comando;

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

19

Apostila de Programao II Linguagem C

10 Operadores Neste captulo so apresentadas tabelas com os operadores da linguagem C: aritmticos, relacionais e lgicos.

10.1 Operadores Aritmticos Operador Significado Subtrao Adio Multiplicao Diviso Mdulo da diviso (resto) Decremento Incremento Operadores Aritmticos A operao de somar ou subtrair 1 de um contador muito comum. Os operadores unrios ++ e fazem isso diretamente sem a necessidade do comando de atribuio: i = i + 1; equivalente a i++; --; i = i 1; equivalente a i--; Podem ser usados esquerda (prefixo) ou direita (posfixo), sendo que:

+ * / % ++

esquerda: incrementa/decrementa e a seguir usa o valor. direita: usa o valor e a seguir incrementa/decrementa. i++; i--; --; ou ou ++i; --i; --i;

Em ambos os casos acima, a varivel i incrementada ou decrementada. Porm a expresso ++i incrementa i antes de usar seu valor, enquanto i++ incrementa i aps seu valor ser usado. Isso significa que num contexto onde o valor usado, ++i e i++ so diferentes. Por exemplo: se i 5, ento x = i++; Atribui 5 a x, mas x = ++i; Atribui 6 a x. Em ambos os casos, i torna-se 6. Num contexto onde o valor no usado e queremos apenas o efeito de incrementar ou decrementar, a escolha de prefixao ou posfixao de acordo com o gosto do programador.

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

20

Apostila de Programao II Linguagem C

Exemplos: b = ++a; b = a++; --a; b = --a; a---; b = a--; equivalente a {a = a + 1; b = a;} equivalente a {b = a; a = a + 1;} equivalente a {a = a 1; b = a;} equivalente a {b = a; a = a - 1;}

Esses operadores quando usados no meio de comandos, confundem um pouco. conveniente us-los em sua forma mais simples. Exemplos: a = 5; a* b = a*(a++);

b sai valendo 5*5=25 e a sai valendo 6 a = 5; a*++a; b = a*++a;

b sai valendo 5*6=36 e a sai valendo 6 a = 5; a*a++; b = a*a++;

b sai valendo 5*5=25 e a sai valendo 6

10.2 Operadores Relacionais Operador Significado igual diferente de (not equal) maior que menor que maior ou igual menor ou igual Operadores Relacionais

== != > < >= <=

10.3 Operadores Lgicos Operador Ao AND OR NOT Operadores Lgicos

&& || !

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

21

Apostila de Programao II Linguagem C

A idia de verdadeiro e falso a base dos conceitos dos operadores lgicos e relacionais. Em C, verdadeiro qualquer valor diferente de zero e falso zero. As expresses que usam operadores relacionais ou lgicos devolvem 0 para falso e 1 para verdadeiro. A tabela verdade dos operadores lgicos apresentada a seguir, usando 0s e 1s:

p 0 0 1 1

q 0 1 1 0

p&&q 0 0 1 0

p||q 0 1 1 1

!p 1 1 0 0

Tabela Verdade Na linguagem C permitido combinar diversas operaes em uma expresso como mostrado abaixo: 10>5 && !(10<9) || 3<=4 Qual o resultado da expresso acima: verdadeiro ou falso?

10.4 Operador de Endereo & A memria do computador dividida em bytes, e estes bytes so numerados de 0 at o limite de memria do computador em questo. Estes nmeros so chamados de 'endereos' de bytes. Um endereo o nome que o computador usa para identificar a varivel. Toda varivel ocupa uma certa localizao na memria, e seu endereo o do primeiro byte ocupado por ela. Um inteiro ocupa 2 bytes. Se declararmos uma varivel n como inteira e a ela atribuirmos o valor 2, quando n for referenciada devolver 2. Entretanto, se referenciarmos n precedido de & (&n), teremos como retorno o endereo do primeiro byte onde n est armazenado na memria do computador. O programa a seguir imprime o contedo da varivel n e o endereo fsico de n na memria: main() { int iNum; iNum=2; printf ("Valor = %d, Endereo = %u", num, &num); } Um endereo na memria visto como um nmero inteiro sem sinal, por isso usamos o cdigo de %u. formatao %u A sada deste programa varia conforme a mquina e a memria do equipamento (e o momento em que for utilizado, mesmo estando na mesma mquina). Mas um exemplo de sada : Valor = 2, Endereo = 1370

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

22

Apostila de Programao II Linguagem C

10.5 Prioridades dos Operadores A precedncia dos operadores aritmticos a seguinte: Mais alta

Mais baixa Prioridades dos Operadores Aritmticos

++ * / % +

A tabela seguinte mostra a precedncia dos operadores relacionais e lgicos: Mais alta

! > >= < <= == != && ||

Mais baixa Prioridades dos Operadores Relacionais e Lgicos

Como no caso das expresses aritmticas, possvel usar parnteses para alterar a ordem natural de avaliao de uma expresso relacional e/ou lgica. Por exemplo, !0 && 0 || 0 falso. Porm, quando adicionamos parnteses, como abaixo, o resultado verdadeiro: !(0 && 0) || 0 Lembre-se de que toda expresso relacional e lgica produz como resultado 0 ou 1. Ento, o seguinte fragmento de programa no apenas est correto, como imprimir o nmero 1 na tela: int x; x = 100; printf (%d, x>10);

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

23

Apostila de Programao II Linguagem C

11 Estruturas de Repetio (Laos) Basicamente, existem trs laos em C (assim como em todas as linguagens de programao modernas), sendo eles: Um lao com teste na parte "superior" (teste de entrada no lao) Outro lao com o teste na parte "inferior" (teste de sada do lao) E por ltimo, um lao adequado para situaes em que sabemos o nmero pr-determinado de repeties que devero ser realizadas.

11.1 While (Enquanto-Faa) O lao while o que realiza o teste na entrada da estrutura, ou seja, o(s) comando(s) internos ao while s sero realizados se o teste for verdadeiro e enquanto o teste for verdadeiro. Sua sintaxe : while (condio) // necessrio usar o delimitador de blocos { } caso haja mais de um comando interno ao while comando; Exemplo de utilizao do lao while: #include <stdio.h> void main (void) { int iNum; printf ("Por favor digite um numero (diferente de zero): "); scanf ("%d",&iNum); while (iNum==0) { printf ("Voce Digitou um numero invalido (zero). Por digite novo numero: "); scanf ("%d",&iNum); } printf ("OK! Voce digitou um numero valido... obrigado!"); }

favor

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

24

Apostila de Programao II Linguagem C

11.2 Do-While (Faa-Enquanto) O lao do-while o que realiza o teste ao final da estrutura, ou seja, o(s) comando(s) interno(s) ao lao sero executados no mnimo uma vez, certamente. Ao final da primeira execuo que o teste ser realizado e ento a seqncia de repeties poder (ou no) ser interrompida. Sua sintaxe geral : do { comando; // os delimitadores { } s so obrigatrios caso exista mais de um comando dentro da estrutura. } while (condio);

Exemplo de utilizao do lao do-while: #include <stdio.h> void main (void) { int iNum; do{ printf ("Por favor digite um numero (diferente de zero): "); scanf ("%d",&iNum); }while (iNum == 0); printf ("OK! Voce digitou um numero valido... obrigado!"); }

11.3 For (Para) O loop (lao) for usado (normalmente) para repetir um comando, ou bloco de comandos, um nmero pr-determinado de vezes. Se no soubermos o nmero pr-determinado de repeties que sero necessrias, provvel que as estruturas while ou do-while sejam mais adequadas. Mas nada impede que 'truques' de programao sejam criados para que o lao for seja utilizado em situaes diversas. Sua forma geral : for (inicializao;condio;incremento) declarao; A declarao no comando for tambm pode ser um bloco { }. Podemos ver que o for executa a inicializao incondicionalmente e testa a condio. Se a condio for falsa ele no faz mais nada. Se a condio for verdadeira ele executa a declarao, o incremento e volta a testar a condio. Ele fica repetindo estas operaes at que a condio seja falsa. Abaixo vemos um programa que coloca os primeiros 100 nmeros na tela: #include <stdio.h> int main () { int count; for (count=1;count<=100;count=count+1) printf ("%d ",count); return(0); }

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

25

Apostila de Programao II Linguagem C

Outro exemplo interessante mostrado a seguir: o programa l uma string e conta quantos dos caracteres desta string so iguais letra 'c': #include <stdio.h> int main () { char palavra[100]; /*String, ate 99 caracteres*/ int i, cont; printf("\n\n Digite uma palavra: "); scanf ("%s", palavra); /*Le a string*/ printf("\n\n Palavra digitada:\n %s", palavra); cont = 0; for (i=0; palavra[i] != '\0'; i=i+1) { if ( palavra[i] == 'c' ) /*Se for a letra 'c'*/ cont = cont+1; /*Incrementa o contador de caracteres*/ } printf("\n Numero de caracteres c = %d", cont); return(0); } Note o teste que est sendo feito no for: o caractere armazenado em palavra[i] comparado com '\0' (caractere final da string). Caso o caractere seja diferente de '\0', a condio verdadeira e o bloco do for executado. Dentro do bloco existe um if que testa se o caractere igual a 'c'. Caso seja, o contador de caracteres c incrementado. Mais um exemplo, agora envolvendo caracteres: /*Este programa imprime o alfabeto: letras maiusculas*/ #include <stdio.h> int main() { char letra; for(letra = 'A'; letra <= 'Z'; letra =letra+1) printf("%c ", letra); } Este programa funciona porque as letras maisculas de A a Z possuem cdigo inteiro seqencial.

AVALIAO - Veja como voc est: a) Explique porque est errado fazer if (num=10) ... O que ir acontecer?

11.4 Exerccios de Fixao 1) Escreva um programa que armazene, em um vetor, os valores de 0 a 100. Aps, todos os valores devero ser escritos (um ao lado do outro, com um espao separando cada nmero). 1.1) O mesmo exerccio anterior, mas agora os nmeros devero ser escritos um abaixo do outro.

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

26

Apostila de Programao II Linguagem C

2) Escreva um programa que coloque os nmeros de 1 a 100 na tela na ordem inversa (comeando em 100 e terminando em 1). 3) Escreva um programa que leia 10 valores do teclado. Imprima na tela a mdia dos 10 valores lidos. 4) Escreva um programa que leia 10 caracteres do teclado. Aps, todos os caracteres devero ser escritos na tela, na mesma ordem em que foram digitados. 4.1) O mesmo exerccio anterior, mas agora os caracteres devem ser escritos na tela na ordem INVERSA a que foram digitados.

12 Strings Na linguagem C uma string um vetor de caracteres terminado com um caractere nulo. O caractere nulo um caractere com valor inteiro igual a zero (cdigo ASCII igual a 0). O terminador nulo tambm pode ser escrito usando a conveno de barra invertida do C como sendo '\0' Veremos a seguir os 0'. fundamentos necessrios para que possamos utilizar strings. Para declarar uma string, podemos usar o seguinte formato geral: char nome_da_string [tamanho]; Isto declara um vetor de caracteres (uma string) com nmero de posies igual a tamanho. Note que, como temos que reservar um caractere para ser o terminador nulo, temos que declarar o comprimento da string como sendo, no mnimo, um caractere maior que a maior string que pretendemos armazenar. Vamos supor que declaremos uma string de 7 posies e coloquemos a palavra casa nela. Teremos:

\0

No caso acima, as duas clulas no usadas tm valores indeterminados. Isto acontece porque a linguagem C no inicializa variveis, cabendo ao programador esta tarefa. Portanto as nicas clulas que so inicializadas so as que contm os caracteres 'c', 'a', 's', 'a' e '\0'. Ateno: Existe um detalhe muito importante quanto a leitura de strings pelo teclado. O identificador (nome) de um vetor/matriz retorna automaticamente o endereo inicial na memria que este vetor est armazenado. Assim sendo, errado utilizar o operador de endereo (&) junto ao nome do vetor. Por exemplo, quando fazemos referncia ao vetor palavra do cdigo abaixo, equivalente a &palavra[0]. #include <stdio.h> int main () /*Este cdigo possui um ERRO!!! O & no scanf do vetor/string*/ { char sPalavra[100]; printf ("Digite uma palavra: "); scanf ("%s", &sPalavra); printf ("\n\n Voce digitou %s",sPalavra); return(0); }

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

27

Apostila de Programao II Linguagem C

Para que este mesmo cdigo fique correto, basta retirar o operador (&) que est junto ao nome da string, ficando ento da seguinte forma: #include <stdio.h> int main () /*Este codigo ESTA CORRETO!! FOI RETIRADO O & no scanf do
vetor/string*/

{ char sPalavra[100]; printf ("Digite uma palavra: "); scanf ("%s", sPalavra sPalavra); printf ("\n\n Voce digitou %s",sPalavra); return(0); } Neste programa acima, o tamanho mximo da string que voc pode entrar uma string de 99 caracteres.

12.1 Lendo Strings do Teclado: com mais de uma palavra (com espaos em branco)

gets: esta funo utilizada para ler strings do STDIN (normalmente o teclado). gets continua lendo
caracteres at que NEWLINE ou EOF seja encontrado. Sintaxe: char nome[80]; gets (nome); Observao: gets no verifica o tamanho do buffer de entrada de dados. Por este motivo, pode acabar sobrescrevendo informaes anteriormente armazenadas nesta rea de memria e corromper o funcionamento do software e at mesmo do sistema.

fgets: usado para ler linhas de dados. Pode ser utilizado tanto para leituras de arquivos como para
entradas pelo teclado. Deve ser utilizado preferencialmente no lugar de gets, pois fgets verifica se o dado que est sendo lido no excede o tamanho do buffer. Sintaxe (para leituras de strings pelo teclado): char sNome[80]; fgets (sNome, sizeof(sNome), stdin); Como as strings so vetores de caracteres, para acessar um determinado caractere de uma string, basta "indexarmos", ou seja, usar um ndice para acessar o caractere desejado dentro da string. Suponha uma string chamada str. Podemos acessar a segunda letra de str da seguinte forma: str[1] = 'a';

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

28

Apostila de Programao II Linguagem C

Por que se est acessando a segunda letra e no a primeira? Na linguagem C, o ndice de vetores comea em zero. Assim, a primeira letra da string sempre estar na posio 0. A segunda letra sempre estar na posio 1 e assim sucessivamente. Segue um exemplo que imprimir a segunda letra da string "pera". Em seguida, ele mudar esta letra e apresentar a string no final. #include <stdio.h> int main() { char str[10] = "pera"; printf("\n\n String: %s", str); printf("\n Segunda letra: %c", str[1]); str[1] = 'a'; printf("\n Agora a segunda letra eh: %c", str[1]); printf("\n\n String resultante: %s", str); return(0); }

Nesta string (" 'p' 'e' 'r' 'a' '\o' "), o terminador nulo est na posio 4. Das posies 0 a 4, sabemos que temos caracteres vlidos, e portanto podemos escrev-los. Note a forma como inicializamos a string str com os caracteres 'p' 'e' 'r' 'a' e '\0' simplesmente declarando char str[10] = "pera". No programa acima, %s indica que printf( ) deve colocar uma string na tela. Nos prximos captulos, veremos uma abordagem inicial s duas funes que j temos usado para fazer a entrada e sada.

12.2 Exerccios com strings (tpicos de prova) 1) Escreva um programa que leia duas strings do teclado e as imprima na tela. Imprima tambm a segunda letra de cada string. 2) Faa um programa que permita que o usurio digite uma string (com espaos) de at 80 caracteres. O programa deve contar quantos caracteres 'a' existem dentro da string digitada. 3) O mesmo programa anterior, mas agora o programa deve permitir que o usurio digite tambm o caractere a ser encontrado. E o programa dever contar quantos caracteres (do solicitado pelo usurio) existem dentro da string tambm digitada pelo usurio. Exemplo: - Digite uma string com at 80 caracteres: blablabla - Digite um caractere que deseja encontrar na string acima digitada: a (sada do programa) = Existem 3 caracteres 'a' na string "blablabla".

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

29

Apostila de Programao II Linguagem C

13 Introduo s Funes Uma funo um bloco de cdigo de programa que pode ser usado diversas vezes em sua execuo. O uso de funes permite que o programa fique mais legvel, mais bem estruturado. Um programa em C consiste, no fundo, de vrias funes colocadas juntas. Abaixo o tipo mais simples de funo: #include <stdio.h> int mensagem () /* Funcao simples: imprime "Ola!" */ { printf ("Ola! "); return(0); } int main () { mensagem(); printf ("Eu estou vivo!\n"); return(0); } Este programa ter o mesmo resultado que o primeiro exemplo da seo 4.1. O que ele faz definir uma funo mensagem() que coloca uma string na tela e retorna 0. Esta funo chamada a partir de main(), que, como j vimos, tambm uma funo. A diferena fundamental entre main() e as demais funes do exemplo que main() uma funo especial, cujo diferencial o fato de ser a primeira funo a ser executada em um programa.

13.1 Argumentos (Parmetros) Argumentos, ou parmetros, so as entradas que a funo recebe. atravs dos argumentos que passamos informaes para a funo. J vimos funes com argumentos. As funes printf() e scanf() so funes que recebem argumentos. Vamos ver um outro exemplo simples de funo com argumentos: #include <stdio.h> int quadrado (int iArgumento) /* Calcula o quadrado de x */ { printf ("O quadrado eh %d",(iArgumento * iArgumento)); return(0); } int main () { int iNum; printf ("Entre com um numero: "); scanf ("%d",&iNum); printf ("\n\n"); quadrado(iNum); return(0); } Na definio de quadrado() dizemos que a funo receber um argumento inteiro iArgumento. Quando fazemos a chamada funo, o inteiro iNum passado como argumento.

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

30

Apostila de Programao II Linguagem C

H alguns pontos a observar:

Em primeiro lugar, temos que satisfazer aos requisitos da funo quanto ao tipo e quantidade de argumentos quando a chamamos. Apesar de existirem algumas converses de tipo, que a linguagem C faz automaticamente, importante ficar atento. Em segundo lugar, no importante o nome da varivel que se passa como argumento, ou seja, a varivel iNum, ao ser passada como argumento para quadrado() copiada para a varivel iArgumento. Dentro de quadrado() trabalha-se apenas com iNum. Se mudarmos o valor de iNum dentro de quadrado() o valor de iNum na funo main() permanece inalterado.

Vamos ver um exemplo de funo que receba mais de uma varivel como argumento. Repare que, neste caso, os argumentos so separados por vrgula e que deve-se explicitar o tipo de cada um dos argumentos, um a um. Note tambm, que os argumentos passados para a funo no necessitam ser todos variveis porque mesmo sendo constantes sero copiados para a varivel de entrada da funo. #include <stdio.h> int mult (float a, float b,float c) /* Multiplica 3 numeros */ { printf ("%f",a*b*c); return(0); } int main () { float x,y; x=2; y=3; mult (x,y,4); return(0); }

13.2 Retornando Valores Muitas vezes necessrio fazer com que uma funo retorne um valor ao local onde ela foi chamada. As funes que vimos at aqui estavam retornando o nmero 0. Podemos especificar um tipo de retorno indicando-o antes do nome da funo. Mas para dizer ao C o que vamos retornar precisamos da palavra reservada return. Sabendo disto fica fcil fazer uma funo para multiplicar dois inteiros e que retorna o resultado da multiplicao. Veja a seguir: #include <stdio.h> int prod (int x,int y) { return (x*y); } int main () { int iSaida; iSaida=prod (12,3); printf ("A saida eh: %d\n",iSaida); return(0); } Veja que, como prod retorna o valor de 12 multiplicado por 7, este valor pode ser usado em uma expresso qualquer. No programa fizemos a atribuio deste resultado varivel iSaida, que

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

31

Apostila de Programao II Linguagem C

posteriormente foi impressa usando o printf. Uma observao adicional: se no especificarmos o tipo de retorno de uma funo, o compilador C automaticamente supe que esse tipo inteiro. Ento, no uma boa prtica no especificar o valor de retorno. Com relao funo main, o retorno sempre ser inteiro. Normalmente faremos a funo main retornar um zero quando ela executada sem qualquer tipo de erro. Mais um exemplo de funo, que agora recebe dois floats e tambm retorna um float: #include <stdio.h> float prod (float x,float y) { return (x*y); } int main () { float fSaida; fSaida=prod (2.5,4); printf ("A saida eh: %f\n",fSaida); return(0); }

14 Auto Avaliao: 2. Parte da Disciplina Veja como voc est: escreva um programa que leia dois nmeros (um inteiro e um ponto flutuante) na funo principal. Estes valores devero ser passados para uma funo que some estes dois valores lidos do teclado. Esta funo dever retornar para uma varivel da funo principal o resultado da soma. Imprimir o contedo desta varivel na funo principal.

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

32

Apostila de Programao II Linguagem C

Referncias Bibliogrficas Para elaborao desta apostila foram consultados vrios tipos de materiais, como: livros, outras apostilas, pginas web etc. Algumas das referncias consultadas esto apresentadas neste captulo, mas grande parte do material disponibilizado na apostila, como exemplos e exerccios foram fornecidos pelo Prof. Marcelo Azambuja. Esse material utilizado por ele em suas aulas de Programao II C e est disponvel em: http://professores.faccat.br/azambuja/

[CRU97] CRUZ, Adriano Joaquim de Oliveira. Material de aula sobre Linguagem C. Disponvel em: http://equipe.nce.ufrj.br/adriano/c/home.htm. Acesso em: Mar. 2008. [MAN97] MANZANO, Jos Augusto N. G. Estudo Dirigido de Linguagem C. So Paulo, rica, 1997. [OUA97] OUALLINE, Steve. Practical C Programming - 3rd. Edition. Editora O'REILLY, 1997. Disponvel em: http://www.oreilly.com/catalog/pcp3/chapter/ch13.html. Acesso em: Mar. 2008. [SCH97] SCHILDT, Herbert. C - Completo e Total 3. Edio. So Paulo, Pearson Makron Books, 1997. [ZIV02] ZIVIANI, Nivio. Projeto de Algoritmos: com implementaes em Pascal e C. So Paulo, Pioneira Thomson Learning, 2002.

Profa. Flvia Pereira de Carvalho fpereira@faccat.br http://fit.faccat.br/~fpereira

33

Você também pode gostar