RESUMO Linguagem C
RESUMO Linguagem C
RESUMO Linguagem C
Histria
A linguagem C foi criada por Dennis M. Ritchie e Ken Thompson em 1972, no
laboratrio Bell. Seu desenvolvimento comeou com uma linguagem mais antiga,
chamada BCPL, criada por Martin Richards. Esta linguagem influenciou o
desenvolvimento da linguagem B, criada por Ken Thompson, e posteriormente levou ao
desenvolvimento de C.
A verso de C fornecida com o sistema Unix verso 5 foi o padro da linguagem por
muitos anos. Um grande nmero de implementaes, porm, foi criado, com a
popularidade dos microcomputadores, e isso gerou certa incompatibilidade entre essas
implementaes. Foi baseado nesta situao que em 1983 o ANSI (American National
Standards Institute) estabeleceu um comit para criar um padro para definir a
linguagem C. Atualmente, todos os principais compiladores de C implementam o
padro C ANSI.
Caractersticas
Isto significa que C possui recursos de alto nvel, e ao mesmo tempo permite a
manipulao de bits, bytes e endereos - os elementos mais bsicos para a
funcionalidade de um computador.
COMPILADOR
LINKER
(cdigo-fonte) ------------------> (cdigo-objeto) -----------> (programa executvel)
#include <stdio.h>
int main()
{
printf(Meu Primeiro Programa!\n);
}
Agora vamos explicar linha por linha. A linha 1 contm a diretiva #include <stdio.h>, e
serve para incluir as funes de uma biblioteca em seu programa. Neste caso, estamos
incluindo a biblioteca de entrada e sada padro (standard input/output), necessria para
a utilizao da funo printf(). C uma linguagem que diferencia minsculas de
MAISCULAS (case sensitive). As palavras-chave e os comandos da linguagem
devem ser escritos em minsculo. Se voc declarar variveis, funes, tipos, etc,
utilizando caracteres maisculos, no se esquea de referenci-los da forma correta.
A linha 2 no contm nada... Est em branco. Voc pode adicionar linhas em branco,
espaos e tabulaes em seu cdigo para torn-lo mais fcil de ser lido.
A linha 3 contm o incio da funo main(). Esta funo marca o incio da execuo do
programa e deve existir em algum lugar do cdigo para este funcionar corretamente. Se
o seu programa tiver somente uma funo, ela dever ser main(). Este int, antes do
main(), est dizendo que main() deve retornar um valor para o sistema, indicando
sucesso ou falha. Este valor um nmero inteiro, por isso int.
Mas na linha 5 que o nosso programa cumpre a sua crucial misso: escrever a
mensagem Meu Primeiro Programa! na tela. O que voc precisa saber agora que a
funo printf() a principal funo para escrita no console (sada padro. O \n um
caractere especial, e serve para pular para a prxima linha, assim que acabar de escrever
a mensagem.
OBS: os comandos em C so terminados com um ; (ponto-e-vrgula). No
esquea.
#include <stdio.h>
int main() {
O compilador aceitar sem problemas se voc escrever seu cdigo assim, tudo em uma
linha. claro que desta forma o cdigo fica muito mais difcil de entender do que da
outra forma, mas o compilador aceita. Tambm uma prtica saudvel e
recomendvel deixar seu cdigo fcil de ser lido e entendido utilizando espaos,
tabulaes e quebras de linha.
Bibliotecas
Uma biblioteca uma coleo de funes. Quando seu programa referencia uma funo
contida em uma biblioteca, o linkeditor (responsvel por ligar o cdigo-fonte) procura
essa funo e adiciona seus cdigos ao seu programa. Desta forma somente as funes
que voc realmente usa em seu programa so acrescentados ao arquivo executvel.
Cada funo definida na biblioteca C padro tem um arquivo de cabealho associada a
ela. Os arquivos de cabealho que relacionam as funes que voc utiliza em seus
programas devem ser includos (usando #include) em seu programa.
H duas razes para isto. Primeiro muitas funes da biblioteca padro trabalham com
seus prprios tipos de dados especficos, aos quais seu programa deve ter acesso. Esses
tipos de dados so definidos em arquivos de cabealho fornecidos para cada funo.
Um dos exemplos mais comuns o arquivo STDIO.H, que fornece o tipo FILE
necessrio para as operaes com arquivos de disco. A segunda razo para incluir
arquivos de cabealho obter os prottipos da biblioteca padro.
Se os arquivos de cabealho seguem o padro C ANSI, eles tambm contm prottipos
completos para as funes relacionadas com o arquivo de cabealho. Isso fornece um
mtodo de verificao mais forte que aquele anteriormente disponvel ao programador
Arquivo de
Cabealho
ASSERT.H
CTYPE.H
ERRNO.H
FLOAT.H
LIMITS.H
LOCALE.H
MATH.H
SETJMP.H
SIGNAL.H
STDARG.H
STDDEF.H
STDIO.H
STDLIB.H
STRING.H
TIME.H
Finalidades
Define a macro assert()
Manipulao de caracteres
Apresentao de erros
Define valores em ponto flutuante dependentes da implementao
Define limites em ponto flutuante dependentes da implementao
Suporta localizao
Diversas definies usadas pela biblioteca de matemtica
Suporta desvios no-locais
Suporta manipulao de sinais
Suporta listas de argumentos de comprimento varivel.
Define algumas constantes normalmente usadas
Suporta e/s com arquivos
Declaraes miscelneas
Suporta funes de string
Suporta as funes de horrio do sistema
Observe que o nome da biblioteca estar entre os sinais de menor e maior (<>). Se o
nome da biblioteca for delimitado pelos sinais de maior e menor, o compilador C
procurar o arquivo especificado no sue diretrio de arquivos de cabealho. Se o
arquivo for encontrado, ser utilizado, se o compilador no o encontrar, ele ir procurar
ento no diretrio atual, ou em um diretrio que voc especificar.
Se o nome da biblioteca for delimitado por aspas duplas (), o compilador procurar o
arquivo no diretrio atual. Se o nome da biblioteca for delimitado por aspas duplas
significa que esta biblioteca foi criada pelo usurio.
Os Tipos de Dados
Descrio
Tamanho em
bytes
Faixa mnima
char
int
float
double
void
caractere
-127 a 127
nmero inteiro
-32767 a 32767
seis dgitos de
preciso
dez dgitos de
preciso
sem valor
O tamanho em bytes da cada tipo de dado pode variar de acordo com o tipo do
processador, da implementao do compilador, etc. Por exemplo, em Linux um inteiro
possui 4 bytes, enquanto que no DOS um inteiro possui 2 bytes. O que o padro ANSI
estipula apenas a faixa mnima de cada tipo, no o seu tamanho em bytes.
O tipo void usado quando declaramos funes que no retornam nenhum valor,
quando queremos declarar explicitamente que uma funo no possui argumentos, ou
para criar ponteiros genricos.
O que so Variveis?
Para voc poder manipular dados dos mais diversos tipos, necessrio poder
armazen-los na memria e poder referenci-los quando for preciso. para isso que
existe as variveis, que nada mais so do que um espao reservado na memria, e que
possuem um nome para facilitar a referncia. As variveis podem ser de qualquer tipo:
int, char, float, double, void.
Como o prprio nome diz, as variveis podem ter o seu contedo alterado durante a
execuo do programa, ou seja, o programador tem a liberdade de atribuir valores ao
decorrer da execuo.
Declarao de Variveis
Todas as variveis em C devem ser declaradas antes de serem usadas. A forma geral
de declarao de uma varivel a seguinte:
tipo nome_da_variavel;
Exemplos:
Uma varivel de cada vez:
int id;
float aux;
Onde tipo pode ser qualquer tipo vlido da linguagem C, e nome_da_variavel deve ser
um nome dado pelo programador, sendo o primeiro caractere uma letra e os demais,
letras, nmeros ou _.
NUM
PESO
ALUNO_1
CARAC
ID_OBJ
AUX
-IDADE
ID@AL
Inicializando Variveis
Incluso de Biblioteca
Inicio da Funo Principal
Declarao de Variveis
Processamento
NUM1= 3;
NUM2= NUM1;
NUM3= 200;
printf(NUM1: %d, NUM2: %d, NUM3: %d, NUM1, NUM2, NUM3);
printf(CH: %c, CH);
Impresso na tela
}
Constantes
Constantes em C so valores fixos, que no mudam durante a execuo. Elas podem ser
de qualquer tipo bsico: inteiras, ponto flutuante, caractere
Na maioria dos casos C escolhe o menor tipo de dado possvel para tratar uma
constante, com exceo das constantes em ponto flutuante, que so tratadas como
double, por default.
#include <stdio.h>
int main()
{
char ch= a;
int n= 10;
float f= 10.4;
printf(%c %d %f , ch, n, f);
}
A funo printf permite que dados sejam escritos na tela do computador. O formato ao
mesmo tempo de uso simples e bastante flexvel, permitindo que os dados possam ser
apresentados de diversas maneiras.
A forma geral :
printf (controle, arg1, arg2, ...);
O controle, que deve aparecer sempre entre , define como sero impressos os
argumentos. Neste controle podem existir dois tipos de informaes: caracteres comuns
e cdigos de formatao. Os caracteres comuns, como no exemplo (Estamos no ano)
so escritos na tela sem nenhuma modificao. Os cdigos de formatao aparecem
precedidos por um % e so aplicados aos argumentos na ordem em que aparecem. Deve
haver um cdigo de formatao para cada argumento. O cdigo %d indica que o valor
armazenado em ano deve ser impresso na notao inteiro decimal.
Cdigos de Converso
Comentrio
Caractere simples
Inteiro decimal com sinal
Inteiro decimal com sinal
%E
%e
%f
%G
%g
%o
%s
%u
%x
%X
%p
%%
#include <stdio.h>
int main( void)
{
int ano = 2006;
printf(Justificado para direita Ano = %8d\n, ano);
printf(Justificado para esquerda Ano = %-8d\n,
ano);
return 0;
}
Tamanho do Campo
Especificador de Preciso
#include <stdio.h>
main()
{
float r = 1.0/3.0;
printf(O resultado e = %9.3f \n, r);
}
Cdigo
\n
\t
\b
\f
\0
\xhh
\nnn
Comentrio
Passa para uma nova linha
Tabulao
Retorna um caractere
Salta uma pgina
Caractere nulo
Caractere representado pelo cdigo ASCII hh (hh
em notao hexadecimal)
Representao de um byte em base octal
Observar que deve haver uma correspondncia exata entre os caracteres no brancos
do controle e os caracteres digitados. Neste caso a entrada deveria ser:
35, 46.3
Para ler e escrever caracteres do teclado, as funes de entrada e sada mais simples so
getchar e putchar que esto na biblioteca stdio.h, so os seguintes:
int getchar(void);
int putchar(int c);
Apesar da funo getchar retornar um parmetro inteiro possvel atribuir este valor a
uma varivel do tipo char porque o cdigo do caractere est armazenado no byte de
ordem mais baixa. O mesmo acontece com a funo putchar que recebe um inteiro, mas
somente o byte de ordem mais baixa passado para a tela do computador.
O programa getcha.c abaixo mostra exemplos de uso destas funes.
#include <stdio.h>
int main ()
{
char c;
int i;
printf(Entre com um caractere entre 0 e 9.\n);
c = getchar();
printf(O caractere lido foi o: );
putchar(c);
}
A funo getch espera at que uma tecla seja apertada e retorna este valor
imediatamente. O caractere lido no ecoado na tela. A funo getche opera da
mesma maneira, mas ecoa o caractere lido.
Quando definir o tamanho do vetor observar que todo string em C termina com o
caractere null (\0), que automaticamente inserido pelo compilador. Portanto o vetor
nome pode armazenar no mximo 39 caracteres.
Aps este passo a varivel nome pode ser usado durante a execuo do programa.
O exemplo stscf.c mostrado abaixo mostra como ler e imprimir um string usando os
comandos scanf e printf respectivamente.
#define DIM 40
/* Definies Constantes*/
#include <stdio.h>
/* Biblioteca usada pelo programa */
void main (void)
{
char nome[DIM];
/* linha de caracteres lidos do teclado */
printf(Por favor, qual o seu nome.);
scanf(%s, &nome);
/* Entrada de dados do vetor */
printf(Eu sou um computador PC, em que posso ajud-lo %s? \n, nome);
}
Caso o nome digitado tenha sido Antonio da Silva, o programa imprimiria somente o
seguinte:
Eu sou um computador PC, em que posso ajud-lo Antonio.
A funo gets l toda a string at que a tecla ENTER seja teclada, no vetor o cdigo da
tecla ENTER no armazenado, sendo substitudo pelo cdigo null (\0). Caso a
funo scanf do exemplo anterior fosse substituda pela gets o programa imprimiria:
Eu sou um computador PC, em que posso ajud-lo Antonio da Silva.
#include<stdio.h>
int puts (const char *str);
Ela imprime a string apontada por str. O programa exemplo stput.c, mostrado abaixo,
semelhante ao exemplo anterior com as funes printf substitudas por puts.
Observe que a impresso sempre termina passando para a prxima linha.
#define DIM 40
#include <stdio.h>
void main ( )
{
char nome[DIM]; /* linha de caracteres lidos do teclado */
/* Entrada de dados do vetor */
puts(Entre com o seu nome, por favor.);
gets( nome);
puts(Alo );
puts(nome);
puts(Eu sou um computador PC, em que posso ajud-lo?);
}
Operadores em C
O Operador de Atribuio
O operador de atribuio, (o smbolo de igual =) coloca o valor de uma expresso
(do lado direito) em uma varivel (do lado esquerdo). Uma expresso neste caso pode
ser um valor constante, uma varivel ou uma expresso matemtica mesmo.
um operador binrio, ou seja, trabalha com dois operandos. Exemplos:
Atribuies mltiplas:
x = y = z = 20;
Os Operadores Aritmticos
Estes so, de longe, os mais usados. Os operadores aritmticos em C trabalham
praticamente da mesma forma que outras linguagens. So os operadores + (adio), (subtrao), * (multiplicao), / (diviso) e % (mdulo ou resto da diviso
inteira), todos esses binrios (de dois operandos). Temos tambm o - unrio, que
muda o sinal de uma varivel ou expresso para negativo. Veja a tabela a seguir:
Operador
Descrio
Exemplo
- unrio
Multiplicao
3*5, num*i
Diviso
2/6, n/(2+5)
5%2, n%k
Adio
8+10, exp+num
Subtrao
3-6, n-p
Este apenas um de vrios problemas que podem ser resolvidos com o uso do
operador %.
Os operadores relacionais so 6:
Operador
Ao
<
Menor que
<=
>
Maior que
>=
==
Igual
!=
Diferente
#include <stdio.h>
/* necessrio para printf e scanf */
int main(){
int n;
/* Declarao de uma varivel inteira */
printf(Digite um nmero: );
Tente fazer alguns testes com os outros operadores relacionais. Seja criativo!
Voc o programador.
Os operadores lgicos so 3:
Operador
Ao
Formato da expresso
&&
and (e lgico)
p && q
||
or (ou lgico)
p || q
!p
Outro exemplo:
if ((n == 0) || (n == 1)) /* se n for IGUAL a 0 OU n for igual a 1 ... */
printf(zero ou um\n);
/* ... imprime isto. */
Os parnteses tambm podem ser usados para mudar a ordem de avaliao das
expresses, como no caso das expresses aritmticas.
varivel= varivel-1;
ou depois da varivel:
n++;
Exemplo 1:
n= 5;
p= ++n;
printf(%d ,p);
/* imprime na tela: 6 */
Exemplo 2:
n= 5;
p= n++;
printf(%d ,p);
/* imprime na tela: 5 */
que igual a:
varivel= varivel [operador] [expresso]
Forma resumida
x= x+10
x+=10
x= x-10
x-=10
x= x*10
x*=10
x= x/10
x/=10
x= x%10
x%=10
Estruturas de Deciso
Os comandos para tomadas de deciso em C so: if, if ... else, switch e o
operador ternrio (?).
O comando if
O comando if, presente na maioria das linguagens de programao, usado
para a construo de estruturas de deciso simples. A forma geral do comando assim:
if (expresso condicional)
{
comandos;
}
OU
if (expresso condicional)
comando nico;
interessante sempre manter o cdigo identado, com tabulaes, para ficar claro de
qual bloco de cdigo determinado comando.
Forma geral:
if (expresso condicional)
{
comandos;
}
else {
comandos; }
Se os blocos de cdigo tiverem mais que um comando, deve-se delimit-los com abre
e fecha chaves. Vejam alguns exemplos:
if ((num % 2) == 0)
/* Se o resto da diviso entre num e 2 for 0... */
printf(Nmero par.);
/* ...imprime mensagem nmero par. */
else { /* ... Seno... */
printf(Nmero mpar.); /* ... imprime mensagem nmero mpar. */
}
Neste exemplo, se num % 2 for igual zero (se esta expresso for verdadeira), executa
o primeiro printf(). Caso contrrio (se for falsa), executa o segundo printf().
Dentro de um bloco de cdigo, pode aparecer qualquer comando, at mesmo ifs e
else.
Voc pode at criar construes para decises mltiplas, criando uma espcie de
escada de ifs e else.
O Comando switch
O comando switch usado como alternativa escada de ifs e else's, e torna o cdigo
mais elegante e legvel. Forma geral:
Este comando possui algumas restries. Como a expresso constante, ele s aceita
valores inteiros e caracteres. Como expresso condicional, s so aceitas igualdades
(se a constante1 for igual expresso constante, executa comandos; e assim por
diante).
Para cada case existe um conjunto de comandos que s sero executados caso a
condio seja verdadeira. Se a expresso constante no casar com nenhum case, ento
os comandos do bloco default so executados. O bloco de cdigo dos case NO
PRECISAM ser delimitados com chaves; basta coloc-los, um aps o outro, aps o
rtulo case:
Vamos ver um exemplo para poder clarear:
#include <stdio.h>
int main()
{
float n1, n2;
char op;
printf(*** Calculadora ***\n);
printf(Digite um nmero: );
scanf(%f, &n1);
printf(Digite o operador (+ - * /): );
scanf(%c, &op);
printf(Digite outro nmero: );
scanf(%f, &n2);
switch(op)
{
case +:
case -:
printf(Subtrao: %.2f\n, n1-n2);
break;
case *:
printf(Multiplicao: %.2f\n, n1*n2);
break;
case /:
if (n2 == 0)
{
printf(Erro: impossvel dividir por zero!\n);
return 1;
}else {
printf(Diviso: %.2f\n, n1/n2);
}
break;
default:
printf(Operador invlido: %c\n, op);
break;
}
}
Usando o switch, neste exemplo, temos 25 linhas de cdigo, enquanto que usando a
construo de ifs e elses temos 11 linhas.
O switch bastante usado em menus, quando o usurio tem que digitar o nmero ou a
letra de alguma opo.
Estruturas de Repetio
Suponhamos que voc queira fazer um programa que l 100 nmeros do teclado e para
cada nmero verifique se mltiplo de 3, imprimindo a resposta para cada um.
printf(Digite um nmero: );
scanf(%d, &num);
if ((num %3) == 0)
printf( mltiplo de 3\n);
else printf(no mltiplo de 3\n);
printf(Digite um nmero: );
scanf(%d, &num);
if ((num %3) == 0)
printf( mltiplo de 3\n);
else printf(no mltiplo de 3\n);
.
.
.
etc .....................
}
Como voc pode ver, no uma tcnica nada vivel, pois temos que repetir a mesma
sequncia de comandos vrias vezes. Mas no se desespere o C, assim como outras
linguagens, tem vrios comandos que nos ajudam em tarefas repetitivas, como esta.
Estes comandos so conhecidos como estruturas de repetio ou laos de repetio.
Veremos tambm algumas tcnicas bsicas que nos ajudaro a criar programas
iterativos.
O lao for
O lao for uma estrutura de repetio controlada por varivel, onde devemos saber
de antemo a quantidade de iteraes. O lao for tem a seguinte forma geral:
for ( inicializao ; teste condicional ; incremento ou decremento )
{
comandos;
}
OU
if ((num %3) == 0)
printf( mltiplo de 3\n);
else
printf(no mltiplo de 3\n);
}
}
As 3 expresses do lao podem conter vrias instrues separadas por vrgula. Vamos
ver um exemplo:
#include <stdio.h>
main()
{
int i, j, num;
for (i=0, j=0; i+j <100; i++, j++)
printf(%d\n, i+j);
return 0;
}
Veja que na inicializao, temos duas variveis sendo atribudas com 0: i e j, separadas
por vrgula. Na parte de incremento, i e j so incrementadas com 1, tambm separadas
por vrgula. Isto torna o lao for bastante flexvel, onde o limite a sua criatividade.
Mas cuidado para no construir laos for monstros, com expresses enormes e de
difcil compreenso...
Alm disso, podemos omitir qualquer uma das expresses do lao for. Por exemplo:
Outro exemplo:
for (i=0; i<100; )
{
comandos;
}
Aqui, no h o incremento. Ele pode ser feito dentro do bloco de cdigo do lao.
Em alguns casos, podemos usar o lao for como um lao infinito. Veja como:
for ( ; ; )
{
comandos;
}
Este um lao for infinito. Sua execuo nunca terminar, a menos que haja um
return ou um break dentro dele.
O lao while
O lao while uma estrutura de repetio que s repetir o bloco de cdigo se a
condio, entre parnteses, for verdadeira. Esta condio pode ser qualquer expresso,
onde falso 0 e verdadeiro diferente de 0. Se a condio for falsa logo no incio do
while, o lao no ser executado.
Forma geral:
while (condio)
{
comandos;
}
OU
while (condio)
comando nico;
Quando o programa chega ao while, ele verifica a condio entre parnteses. Se for
verdadeira, ele executa o bloco de cdigos. Quando termina de executar os comandos
do bloco de cdigo, ele volta para o while novamente, testa a condio de novo e, se for
verdadeira, executa o bloco de cdigo novamente. Faz isso at a condio entre
parnteses ser falsa, momento em que o programa continua a execuo normalmente,
depois do while.
Vamos ver alguns exemplos:
#include <stdio.h>
#include <ctype.h>
main()
{
int cont=0, i= 0;
char ch;
while (i < 10)
{
printf(Digite um caractere: );
scanf(%c, &ch);
getchar();
if (isdigit(ch))
{
cont++;
i++;
}
}
printf(Voc digitou %d caracteres numricos\n, cont);
return 0;
}
}
printf(Somatria: %d\n, res);
return 0;
}
Lembrando que estas tcnicas podem ser exploradas em qualquer tipo de lao, desde
que sejam adaptadas para cada situao.
Assim como for, podemos fazer um lao infinito com o while tambm. Basta fazer o
seguinte:
while(1)
/* 1 verdadeiro em C */
{
comandos;
}
claro que em comandos deve haver alguma forma de sair do while, como um break,
um return, um exit(), etc.
OBS: Evite usar comandos como break ou exit() dentro de laos, pois uma prtica
pouco elegante. S use quando no houver outro jeito.
O lao do-while
Diferente do while, que testa a condio antes de executar o seu bloco de cdigo, o dowhile primeiro executa o seu bloco de cdigo para depois testar a condio. Ele til
quando temos que executar no mnimo UMA VEZ o bloco de cdigo do lao.
Forma geral:
do
{
comandos;
} while(condio);
Neste programa, que no faz nada de til, o bloco de cdigo deve ser executado pelo
menos uma vez, j que dependemos do valor da varivel num para processar a
condio, no final do lao. Aqui, o programa s sai do lao quando for digitado algum
nmero maior ou igual a 50.
Agora um exemplo mais prtico:
#include <stdio.h>
main()
{
int opt;
do
{
do
{
printf(**** Menu ****\n);
printf(1) Cadastrar\n);
printf(2) Buscar\n);
printf(3) Exibir Relatrio\n);
printf(4) Sair\n);
printf(Digite sua opo: );
scanf(%d, &opt);
getchar();
} while ((opt < 1) || (opt > 4));/* o cara fica preso at digitar um nmero vlido */
switch(opt)
{
case 1:
break;
case 2:
break;
case 3:
break;
}
} while (opt != 4);
return 0;
cadastra();
busca();
relat();
Como voc pode ver, temos dois do-while. O mais externo e principal fica vigiando se o
cara digitou 4 (se quer sair). Caso contrrio, volta e executa tudo novamente.
O lao mais interno uma tcnica usada quando o usurio tem um menu, e tem que
digitar uma opo para definir para que lado o programa vai. No nosso caso, se o
espertinho do usurio digitar algum nmero maior que 4 ou menor que 1 (invlidos), o
lao volta e joga tudo de novo na tela, esperando o esperto do usurio escolher a opo
certa.
As funes cadastra(), busca() e relat() so fictcias e s serviram para ilustrar a
situao.
Laos aninhados
Laos aninhados no so laos dentro de ninhos. So laos dentro de laos.
Exemplo de laos for aninhados:
for ( i = 1 ;i <= 10; i++ )
{
for ( j = 1 ; j <= 10 ; j++ )
{
printf(%d X %d = %d\n, i, j, i*j);
}
printf(\n\n);
ch= getchar();
}
while ( i <= 10 )
{
while ( j <= 10 )
{
printf(%d x %d = %d\n, i, j, i*j);
j++;
}
printf(\n\n);
ch= getchar();
i++;
}