Você está na página 1de 13

2

a
LISTA DE EXERCCIOS DE LINGUAGEM C

1. Fazer um programa ler um vetor de inteiros e positivos e imprimir quantas vezes aparece o
nmero 1, 3 e 4, nesta ordem. O vetor ter no mximo 100 posies. Sair do programa quando
for digitado -1.

2. Fazer um programa em C para ler uma quantidade N de alunos. Ler a nota de cada um dos N
alunos e calcular a mdia aritmtica das notas. Contar quantos alunos esto com a nota acima
de 5.0. Obs.: Se nenhum aluno tirou nota acima de 5.0, imprimir mensagem: No h nenhum
aluno com nota acima de 5.

3. Seja N um nmero quadrado perfeito. Se somarmos os nmeros mpares consecutivos
(1+3+5+7+9+...) at que esta soma seja igual a N, o nmero M de termos somados ser igual a
raiz quadrada de N.
Exemplo: N = 16 16 = 1 + 3 + 5 + 7 M = 4 termos.
Logo, a raiz quadrada de 16 4.
Fazer um programa em C para ler um nmero inteiro e positivo N e responder se N quadrado
perfeito.

4. Fazer um programa em C para ler o raio R de uma esfera e calcular o volume e a rea de uma
esfera.
2 3
4 e
3
4
R A R V ! ! " ! ! " # #

5. Durante uma corrida de automveis com N voltas de durao foram anotados para um piloto, na
ordem, os tempos registrados em cada volta. Fazer um programa em C para ler os tempos das
N voltas, calcular e imprimir:
$ melhor tempo;
$ a volta em que o melhor tempo ocorreu;
$ tempo mdio das N voltas;

6. Fazer um programa em C para calcular a soma dos N primeiros mltiplos de um inteiro K, onde
N e K so lidos e so nmeros inteiros e positivos.

7. Dado dois vetores, A (5 elementos) e B (8 elementos), faa um programa em C que imprima
todos os elementos comuns aos dois vetores.

8. Faa um programa que determina o mximo e o mnimo de um conjunto de n nmeros inteiros
armazenados num vetor A de 10 elementos.

9. Suponha um vetor N com 10 elementos e outro vetor M com 10 elementos. Faa um programa
em C que calcule o produto escalar P de A por B. (Isto , P = A[1]*B[1] + A[2]*B[2] + ...
A[N]+B[N]).

10. Fazer um programa em C que leia uma frase de at 50 caracteres(utilizar o comando gets) e
imprima a frase sem os espaos em branco. Imprimir tambm a quantidade de espaos em
branco da frase.

11. Fazer um programa em C para ler um vetor de inteiros positivos de 50 posies. Imprimir a
quantidade de nmeros pares e de mltiplos de 5.

1
12. Fazer um programa que leia vrios nmeros(um por vez) e imprima 0(zero) se o nmero no for
mltiplo de 2,3, 5 nem 7. Imprimir 1(um) se o nmero for mltiplo de 2 ou 3 e 2(dois) se o
nmero for mltiplo de 5 e 7. Sair do programa quando for digitado o valor -1.(No necessrio
nenhuma consistncia ou crtica dos dados).

13. Fazer um programa em C que leia uma frase e imprima somente as vogais.

14. Fazer um programa em C para ler vrios nmeros inteiros e positivos e calcular a mdia. Imprimir
tambm o maior.

15. Fazer um programa em C que leia vrios nmeros inteiros e positivos e calcule o fatorial se o
nmero menor que 7 e a soma de 1 at o nmero lido se o nmero maior ou igual a 7. Sair
quando for digitado 1.

16. Escreva um programa que solicite dois caracteres de a a z ao usurio e imprima o nmero de
caracteres existente entre eles. Assuma que o usurio digite os 2 caracteres em ordem
alfabtica. Caso no o estejam, emitir mensagem de erro. Exemplo:

Digite 2 caracteres : j t
O numero de caracteres entre eles e: 9

17. Para os programas prontos das pginas seguintes, utilizar a seguinte estratgia:

$ Verificar os conceitos envolvidos no programa;
$ Fazer um teste de mesa do programa, exaustivamente;
$ Processar o programa e comparar o resultado com o seu;


2
#i ncl ude <st di o. h>
voi d mai n( )
{
i nt i , j , num, cont ;
char f l ag;
pr i nt f ( I nf or me umn i nt ei r o: ) ;
scanf ( %d, &num) ;
i =2;
f l ag= V ;
whi l e( ( i < num/ 2) && ( f l ag== V ) )
{
i f ( ( num%i ) == 0)
f l ag= F ;
el se
++i ;
}
i f ( f l ag== V )
pr i nt f ( %d , num) ;
}

Aps t est ar par a os nmer os:
8, 10, 12, 13, 15, 17, 18, 20, 27, 12
r esponder quai s os nmer os ser o
i mpr essos e o que f az o pr ogr ama
aci ma?

#i ncl ude <st di o. h>
#def i ne N 10
voi d mai n( )
{
i nt v[ N] , i , aux;
char par a;
f or ( i =0; i <N; ++i )
v[ i ] =0;
par a = f ;
i =1;
do
pr i nt f ( I nf or me umn I nt ei r o: ) ;
scanf ( %d, &aux) ;
f f l ush( st di n) ;
i f ( aux==0)
par a= v ;
el se
{
v[ i ] =aux;
i ++;
}
whi l e ( par a== f ) ;
f or ( j =0; j <i ; ++j )
pr i nt f ( %d , v[ j ] ) ;
}

Ler vrios nmeros quaisquer sua
escolha e responder o que ser impresso.
#i ncl ude <st di o. h>
voi d mai n( )
{
i nt n, s, auxi l i ar ;
pr i nt f ( I nf or me umn I nt ei r o: ) ;
scanf ( %d, &n) ;
s=0;
auxi l i ar = 1;
whi l e ( n >= auxi l i ar )
{
s+=auxi l i ar ;
auxi l i ar ++;
}
pr i nt f ( Val or f i nal da Soma: %d, s) ;
}

#i ncl ude <st di o. h>
voi d mai n( )
{
i nt i , n, s;
pr i nt f ( I nf or me umn I nt ei r o: ) ;
scanf ( %d, &n) ;
s = 0;
f or ( i =1; i <=n; i ++)
s+=i ;
pr i nt f ( Val or f i nal da Soma: %d, s) ;
}
=> Responder o que faz os programas
Calculo1 e Calculo2 para N=3, 5 e 8.
Os dois programas fazem a mesma coisa?

#i ncl ude <st di o. h>
voi d mai n( )
{
i nt x, y, pr odut o, auxi l i ar ;
pr i nt f ( I nf or me doi s nmer os: ) ;
scanf ( %d %d, &x, &y) ;
pr odut o=0;
auxi l i ar = y;
whi l e( auxi l i ar > 0)
{
pr odut o+=x;
auxi l i ar - - ;
}
pr i nt f ( \ nResul t ado: %d, pr odut o) ;
}

Fazer os testes com os valores:



x y
4 3
3 4
5 2
7 5
O que ser impresso?
O que faz o algoritmo
com os nmeros testados?

3

#i ncl ude <st di o. h>
voi d mai n( )
{
f l oat v[ 5] , aux, *p, *q;
i nt i , j ;
pr i nt f ( "I nf or me os val or es: ") ;
f or ( i =0; i <5; i ++)
{
scanf ( "%f ", v+i ) ;
f f l ush( st di n) ;
}
f or ( i =0; i <4; ++i )
f or ( j =( i +1) ; j <5; j ++)
{
p=( v+i ) ;
q=( v+j ) ;
i f ( *p < *q)
{
aux=*q;
*q=*p;
*p=aux;
}
}
pr i nt f ( "Resul t ado f i nal : ") ;
f or ( i =0; i <5; i ++)
pr i nt f ( "%. 2f ", *( v+i ) ) ;
}
//Testar com valores sua escolha
#i ncl ude <st di o. h>
voi d mai n( )
{
i nt a, b, c=5;
pr i nt f ( "I nf or me doi s ns i nt ei r os: ") ;
scanf ( "%d %d", &a, &b) ;
whi l e( c- - )
{
i f ( - - a<=5)
{
pr i nt f ( " Val or de a: %d\ n", a) ;
b++;
}
el se
{
pr i nt f ( " Val or de b: %d\ n", b) ;
a- =b;
}
c=( a<b) ?a: b;
}
pr i nt f ( " Val or de a: %d\ n \
Val or de b: %d", a, b) ;
}

// Testar para a=2 e b=-2.
#i ncl ude <st di o. h>
voi d mai n( )
{
i nt val , cont 1, cont 2;
pr i nt f ( I nf or me doi s ns i nt ei r os: ) ;
scanf ( %d %d, &val , &cont 2) ;
whi l e( ++val <=12)
{
f or ( cont 1=4; cont 1<=6; cont 1++)
{
i f ( cont 1%2==cont 2%3)
pr i nt f ( "cont 1: %d && \
val : %d\ n", cont 1, val ) ;
el se
{
pr i nt f ( "cont 1: %d | | \
cont 2: %d\ n", cont 1- 1, cont 2+1) ;
cont 2- - ;
}
}
}
}
// Testar para val=10 e cont2=20
#i ncl ude <st di o. h>
voi d mai n( )
{
i nt a, b, c, d;
pr i nt f ( I nf or me 3 ns i nt ei r os: ) ;
scanf ( %d %d %d, &a, &b, &c) ;
d=( a<b) ?( a%2) : ( b%3) ;
i f ( ( - - a%2) ==0)
{
pr i nt f ( "Val or de a: %d e val or de \
d: %d\ n", a, d) ;
b++;
}
el se
{
pr i nt f ( "Val or de b: %d e val or de \
d: %d\ n", b, d) ;
a- =b;
}
}
} // Testar para a=10, b=4 e c=3

whi l e( c- - )
{
4

#i ncl ude<st di o. h>
voi d mai n( )
{
f l oat
vet 1[ 5] ={3, - 76, 0. 22, 3. 00, 1. 50},
vet 2[ ] ={5, 4, 7. 78, - 9, 12}, *p, *q;
i nt j =4, a=0;
p=vet 1;
q=vet 2;
whi l e( - - j ! =0)
{
i f ( a++<1)
*( p+j ) +=*( q+j ) ;
el se
*( p+j ) =*( q+j ) *2;
pr i nt f ( "%. 2f \ n", *( q+j +1) ) ;
}
}


#i ncl ude <st di o. h>
i nt f uncao( i nt num)
{
i nt cont 1, cont 2=2;
f or ( cont 1=2; cont 1<4; ++cont 1)
{
i f ( ( cont 1%2) ==( cont 1%3) )
{
++cont 2;
cont i nue;
}
el se
cont 2+=num;
}
r et ur n( cont 2) ;
}

voi d mai n( )
{
i nt val =10;
whi l e( ++val ! =16)
{
pr i nt f ( "%d && %d\ n", val , \
f uncao( val ) ) ;
}
}
#i ncl ude <st r i ng. h>
voi d mai n( )
{
char nome1[ 5] ={' j ' , ' o' , ' a' , ' o' , ' \ 0' },
nome2[ 8] ="pedr o", *p, *q;
i nt pr i m, seg, num, cont ;
pr i m=st r l en( nome1) ;
seg=st r l en( nome2) ;
f or ( num=0; num<pr i m; ++num)
{
f or ( cont =0; cont <seg; cont ++)
{
p=nome1+num;
q=nome2+cont ;
i f ( ( *p! =*q) &&( cont %2==0) )
pr i nt f ( "%c %c\ n", *p, *q) ;
el se
br eak;
}
}
#i ncl ude <st di o. h>
}


#i ncl ude <st di o. h>
voi d mai n( )
{
i nt j , a, b;
pr i nt f ( I nf or me doi s ns: ) ;
scanf ( %d %d, &a, &b) ;
f or ( j =1 ; j <10 ; j ++)
{
i f ( ( j %a) ! = 0)
{
i f ( ( j %b) ! =0)
pr i nt f ( "%d - %d\ n", j , a) ;
}
el se
pr i nt f ( "%d - %d\ n", j , b) ;
}
}

/ / Test ar par a a=3 e b=2
5

#i ncl ude <st di o. h>
voi d mai n( )
{
i nt a, *b;
pr i nt f ( "I nf or me umn i nt ei r o: ") ;
scanf ( "%d", &a) ;
whi l e( *b > 10)
{
( *b) - - ;
( *b) - =2;
pr i nt f ( "%d %d\ n", *b, a) ;
}
}
/ / Test ar par a a=25
#i ncl ude <st di o. h>
voi d mai n( )
{
i nt a=0, *b;
b=&a;
i f ( ( *b) ==0)
{
whi l e( a<10)
{
( *b) ++;
pr i nt f ( "%d \ n", a) ;
}
}
el se
{
whi l e( a > - 5)
{

( *b) - - ;
pr i nt f ( "%d \ n", *b) ;
}
}
}
#i ncl ude <st di o. h>
voi d mai n( )
{
i nt j , a=2, b=3;
f or ( j =1; j <10; j ++)
{
i f ( ( ( j %a) >b) | | ( ( j %b) <a) )
i f ( ( a>b) | | ( a<( b/ 2) ) )
{
pr i nt f ( "%d # %d\ n", a, b) ;
a +=2;
}
el se
{
b++;
pr i nt f ( "%d ## %d\ n", j , a) ;
}
}
}
/ / Test ar par a a=2 e b=3
#i ncl ude <st di o. h>
b=&a;
voi d mai n( )
{
i nt a, b, c;
pr i nt f ( I nf or me 3 ns i nt ei r os: ) ;
scanf ( %d %d %d, &a, &b, &c) ;
i f ( ( a==0) | | ( b==3) | | ( c==3) )
{
whi l e( ( b+c) < 15)
{
i f ( b >= c)
b=c++;
el se
b=++c;
pr i nt f ( %d - %d \ n, b, c) ;
}
}
el se
{
whi l e( ( a+b) > - 5)
{
i f ( a >= b)
a=b++;
el se
a=++b;
b=a- - ;
pr i nt f ( %d - %d \ n, a, b) ;
} / / Test ar par a a=1, b=2 e c=3
} }
6
#i ncl ude <st di o. h>
}
voi d mai n( )
el se
{
i f ( ( a+j ) %3==0)
i nt a, c, *b, *d;
*( q+j ) =*( p+j ) - *( q+j ) ;
pr i nt f ( "I nf or me doi s ns
i nt ei r os: ") ;
pr i nt f ( "%6. 2f \ n", *( q+j ) ) ;
scanf ( "%d %d", &a, &c) ;
}
b=&a;
}
d=&c;
whi l e( *d<6)
/* Aps responder o que vai ser
impresso, trocar o comando acima
por b=(a++)+1 e fazer o exerccio
novamente */
#i ncl ude<st di o. h>
{
#i ncl ude<st r i ng. h>
( *d) =( *b) ++;
( *d) =( *d) +( ++*b) ;
#i ncl ude<ct ype. h>
voi d mai n( )
i f ( ( c%a) <=2)
{
{
c=( *b) *2+3;
char f r ase1[ 7] ="1a2c3e", f r ase2[ 7] ,
*p, *q;
}
i nt i , j =0, t am;
el se
c=( *b) - - ;
p=f r ase1;
q=f r ase2;
pr i nt f ( "%d %d \ n", *d, *b) ;
t am=st r l en( p) ;
}
}
f or ( i =0; i <t am; i ++)
{
//Testar para a=3 e c=1
i f ( i %2! =0| | i %5! =0)
#i ncl ude<st di o. h>
{
#i ncl ude<st r i ng. h>
voi d mai n( )
i f ( *( p+i ) >=' a' &&*( p+i ) <=' z' )
*( q+j ) =t oupper ( *( p+i ) ) ;
{
el se
char f r ase1[ 6] , f r ase2[ 6] , *f , *g;
i nt a;
*( q+j ) =( *( p+i ) ) ++;
}
pr i nt f ( "I nf or me uma f r ase : ") ;
el se
get s( f r ase1) ;
*( q+j ) =*( p+i ) +2;
f =f r ase1;
j ++;
g=f r ase2;
}
f or ( a=0; a<st r l en( f r ase1) ; ++a)
*( q+j ) =' \ 0' ;
{
pr i nt f ( "\ nFr ase f i nal : %s", q) ;
*( g+a) =*( f +a) ;
}
i f ( a%2==0)
*( g+a) =*( f +a) +1;
el se
i f ( a%3! =0)
( *( f +a) ) ++;
}
*( f r ase1+5) =' \ 0' ;
*( f r ase2+5) =' \ 0' ;
pr i nt f ( "f r ase1=%s\ n\
f r ase2=%s", f r ase1, f r ase2) ;
}
// Testar para frase1="aeiou"
#i ncl ude<st di o. h>
voi d mai n( )
{
f l oat *p, *q,
vet 1[ ] ={3. 23, - 7. 89, 6. 00, 0. 22, 2. 21},
vet 2[ ] ={98. 01, 14. 89, 0. 78, - 9. 98};
i nt j =4, a=0, b=0;
p=vet 1;
q=vet 2;
whi l e( j ! =0)
{
a=- - j ;
b=( ++a) +1; / * Comando t r ocado */
i f ( ( a+b) %2! =1)
{
*( p+j ) =*( q+j ) - 2. 99;
pr i nt f ( "%6. 2f \ n", *( p+j ) ) ;
7
Programas resolvidos e comentados


a) O que faz o seguinte programa?

#i ncl ude <st di o. h>
Soluo
A primeira linha do programa inclui a biblioteca
padro stdio.h. Esta biblioteca ser usada para as
funes 'scanf' e 'printf'. No incio do programa
declarada a varivel 'x', inteira. 'scanf' l x pelo
teclado e printf imprime o valor lido. Em tempo de
execuo o programa ir esperar at que o usurio
entre com um nmero, e exibir em seguida este
nmero.
voi d mai n( )
{
i nt x;
scanf ( "%d", &x) ;
pr i nt f ( "%d", x);
}







b) Escreva uma funo que some dois inteiros e retorne o valor da soma. O objetivo neste exerccio apenas
escrever a funo. Logo, presume-se que j existe um programa que realizar a sua chamada.

Soluo
A funo soma2 fica:

i nt soma2( i nt a, i nt b) / * Ret or na a soma dos i nt ei r os a e b */
{
i nt r esul t ado;
r esul t ado = a+b;
r et ur n r esul t ado;
}

ou de uma f or ma mai s pr at i ca. .

i nt soma2( i nt a, i nt b) / * Ret or na a soma dos i nt ei r os a e b */
{ / * Ver sao 2 */
r et ur n( a+b) ;
}

c) Escreva um programa que leia uma string (use gets()) e retire todos os caracteres 'c' da string lida. Informe
na tela quantos caracteres foram retirados.

Soluo: Uma primeira alternativa para o problema seria substituir toda letra 'c' encontrada por um
outro caracter...

8
#i ncl ude <st di o. h>
#def i ne TAMANHO 50
#def i ne OUTRO ' '

/ * Ret i r a t odas as l et r as ' c' de uma f r ase e subst i t ui por umespao em
br anco */
voi d mai n( )
{
char or i gi nal [ TAMANHO] ;
i nt i ;
pr i nt f ( "\ n\ nDi gi t e uma f r ase: ") ;
get s( or i gi nal ) ;
pr i nt f ( "\ n\ nFr ase di gi t ada: \ n%s", or i gi nal ) ;
f or ( i =0; or i gi nal [ i ] ! = ' \ 0' ; i ++)
{
i f ( ( or i gi nal [ i ] == ' c' ) | | ( or i gi nal [ i ] == ' C' ) ) / * Se f or l et r a
' c' */
or i gi nal [ i ] = OUTRO; / * Subst i t ui por out r o
car act er . . */
}
pr i nt f ( "\ n\ nFr ase al t er ada: \ n%s\ n", or i gi nal ) ;
}


#i ncl ude <st di o. h>
#def i ne TAMANHO 50
/ * RETI RA t odas as l et r as ' c' de uma st r i ng */
mai n( )
{
char or i gi nal [ TAMANHO] ;
Uma outra alternativa
a de realmente
RETIRAR todas as
letras 'c' do conjunto..
i nt i , j ;
pr i nt f ( "\ n\ nDi gi t e uma f r ase: ") ;
get s( or i gi nal ) ;
pr i nt f ( "\ n\ nFr ase di gi t ada: \ n%s", or i gi nal ) ;
f or ( i =0; or i gi nal [ i ] ! = ' \ 0' ; i ++)
{
i f ( ( or i gi nal [ i ] == ' c' ) | | ( or i gi nal [ i ] == ' C' ) )
{
f or ( j =i ; or i gi nal [ j ] ! =' \ 0' ; j ++)
or i gi nal [ j ] = or i gi nal [ j +1] ;
i - - ;
}
}
pr i nt f ( "\ n\ nFr ase al t er ada: \ n%s\ n", or i gi nal ) ;
}

9
d) Diga o resultado das variveis x, y e z depois da seguinte sequncia de operaes:

i nt x, y, z;
x=y=10;
z=++x;
Comentrios:
- Em z = ++x, x incrementado e
ento o seu valor e atribudo a z
- Em x = x+y-(z--), z e atribudo a x e
ento acontece o decremento
x=- x;
y++;
x=x+y- ( z- - ) ;

Sol uo:
x = - 11
y = 11
z = 10

e) Faa um programa que inverta uma string (uma sequncia de caracteres). Use o comando for para varrer a
string at o seu final. Lembre-se que a string sempre termina com o caracter '\0'.

Soluo:
Neste exerccio existem alguns detalhes interessantes. Muitas pessoas no conseguiram chegar
ao resultado por causa de um pequeno detalhe na 'linha em destaque'. Lembre-se sempre que se
voc tem um string de 10 posies, o seu ndice pode variar de 0 a 9, e o '\0' vai estar na posio 9.
Logo, voc deve inverter a posio 8 com a 0, 7 com a 1, e assim por diante. por isto que a
expresso fica:

copia[i] = str[strlen(str)-i-1]

No podemos tambm deixar de colocar o '\0' no final da nova string.

#i ncl ude <st di o. h>
#i ncl ude <st r i ng. h>
#def i ne MAX 15

voi d mai n( )
{
char st r [ MAX] , copi a[ MAX] ;
i nt i ;
pr i nt f ( "\ n\ nEnt r e comuma pal avr a: ") ;
get s( st r ) ;
f or ( i =0; st r [ i ] ! = ' \ 0' ; i ++)
{
copi a[ i ] = st r [ st r l en( st r ) - i - 1] ; / * Li nha emdest aque */
}
copi a[ i ] = ' \ 0' ;
pr i nt f ( "\ n\ nSt r i ng I nver t i da: %s\ n", copi a) ;
}
10
f) Faa um programa que leia vrias palavras pelo teclado, e armazene cada palavra em uma string. Depois,
concatene todas as strings lidas numa nica string. Por fim apresente esta como resultado ao final do
programa.

Soluo:
A segue o programa segundo o enunciado requere.

/ * Le 5 st r i ngs: - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#i ncl ude <st di o. h>
#i ncl ude <st r i ng. h>
#def i ne TAM 15
#def i ne MAX 5
voi d mai n( )
{
char pal avr a[ TAM] , f r ase[ TAM*MAX] ;
i nt i ;
/ * I ni ci al i za a st r i ng f r ase */
f r ase[ 0] = ' \ 0' ;

pr i nt f ( "\ n\ n Di gi t e 5 pal avr as, t ecl ando <ENTER> ao f i nal de cada
uma: \ n") ;

/ * Le t odas as st r i ngs */
f or ( i =0; i <MAX; i ++)
{
get s( pal avr a) ;
st r cat ( f r ase, pal avr a) ;
}

/ * Apr esent a o r esul t ado */
pr i nt f ( "\ n\ n Resul t ado: %s\ n", f r ase) ;
}

g) O que o programa a seguir faz? Qual o resultado obtido se a string fornecida for:

a) "Ah! Eu to maluco!"
b) "5*4+(3^3)+4*5"

#i ncl ude <st di o. h>
#i ncl ude <st r i ng. h>
#def i ne TAM 20
voi d mai n ( )
{
char s[ TAM] ;
i nt c, i , j ;
f or ( i =0, j =st r l en( s) - 1; i <j ; i ++, j - - )
{
c = s[ i ] ;
s[ i ] = s[ j ] ;
s[ j ] = c;
}
}

11


Soluo:
A funo inverte a string fornecida. Assim, obtm-se:

a) "Ah! Eu t o mal uco! " => "! ocul amot uE ! hA"
b) "5*4+( 3^3) +4*5" => "5*4+) 3^3( +4*5"

Comentrios:
- a funo comea com i no incio e j no final da string. A medida que i incrementa e j
decrementa, o contedo das posies i e j trocado, resultando na string invertida.
- repare que a funo vlida para strings de comprimento par ou mpar: Se for par, existiro 2
elementos medianos, que sero trocados; se for mpar, ao atingir o elemento mediano, a string j
estar toda invertida.
- todo string terminado com \0 (caracter nulo), que no contado pela funo strlen(). Se um
string s possui n caracteres (descontando o \0), strlen(s) = n, e existiro elementos no string de s[0]
ate s[n-1].


h) Aprendemos, pelo curso, que o valor de uma varivel ou expresso do tipo vetor o endereo do elemento
zero do vetor. Seja a[] um vetor qualquer, independente de tipo e tamanho, e pa um ponteiro para o mesmo
tipo de a[]. Responda V ou F, justificando as que forem falsas:

( ) Qualquer expresso de vetor e ndice equivalente a uma outra expresso escrita com um
apontador e um deslocamento;
( ) Aps a atribuio pa=&a[0]; pa e a possuem valores idnticos;
( ) A atribuio pa=&a[0]; pode ser escrita como pa=a;
( ) Uma referencia a a[i] pode ser escrita como *(a+i)
( ) &a[i] e a+i so idnticos
( ) a+i e' o endereo do i-simo elemento aps a
( ) pa[i] e' idntico a *(pa+i)
( ) pa=a e' uma operao valida
( ) pa++ e' uma operao valida
( ) a=pa e' uma operao valida
( ) a++ e' uma operao valida

RESPOSTAS COMENTADAS:

(V) Qualquer expresso de vetor e ndice equivalente a uma outra expresso escrita com um
apontador e um deslocamento
(V) Aps a atribuio pa=&a[0]; pa e a possuem valores idnticos
(V) A atribuio pa=&a[0]; pode ser escrita como pa=a;
(V) Uma referncia a a[i] pode ser escrita como *(a+i)
(V) &a[i] e a+i so idnticos
(V) a+i o endereo do i-simo elemento aps a
(V) pa[i] idntico a *(pa+i)
(V) pa=a uma operao vlida
(V) pa++ uma operao vlida
(F) a=pa uma operao vlida= o nome de um vetor no pode ser usado como uma varivel
(F) a++ uma operao vlida= o nome de um vetor no pode ser usado como uma varivel

12
Comentrios:

- Se pa aponta para um elemento particular de um vetor, ento, por definio, pa+1 aponta para o
prximo elemento, pa+i aponta para i elementos aps pa e pa-i aponta para i elementos antes de
pa. Assim, se pa aponta para a[0], *(pa+1) refere-se ao conteudo de a[1], pa+i o endereo de a[i]
e *(pa+i) o contedo de a[i].
- Estas observaes aplicam-se independentemente do tipo ou tamanho das variveis no vetor a.

- A correspondncia entre indexao e aritmtica com ponteiros evidentemente muito estreita. Por
definio, o valor de uma varivel ou expresso do tipo vetor o endereo do elemento zero do
vetor. Assim, aps a atribuio pa=&a[0]; pa e a possuem valores idnticos. Como o nome de um
vetor sinnimo para o local do elemento inicial, a atribuicao pa=&a[0] tambm pode ser escrita
como pa=a;


- a[i] pode ser escrita como *(a+i). Na avaliao de a[i], o C a converte para *(a+i) imediatamente;
as duas formas so equivalentes. Aplicando-se o operador & a ambas as partes dessa
equivalncia, segue-se que &a[i] e a+i tambm so idnticos: a+i o endereo do i-esimo elemento
aps a. Por outro lado, se pa um apontador, expresses podem us-lo como um subscrito; pa[i]
idntico a *(pa+i). Em suma, qualquer expresso de vetor e indice equivalente a uma escrita com
um apontador e um deslocamento.

- Existe uma diferena importante entre o nome de um vetor e um apontador que deve ser sempre
lembrada: um apontador uma variavel, de forma que pa=a e pa++ so operaes vlidas. Mas o
nome de um vetor no uma varivel (poderia ser visto como um ponteiro constante, mas no uma
varivel); construes como a=pa e a++ so ilegais.

i) O programa abaixo est errado. Por qu?

voi d mai n( voi d) / * esse pr ogr ama est a er r ado */
{
i nt x, *p;
x = 10;
p = x;
pr i nt f ( "%d", *p) ;
}

Soluo comentada:

- O erro aqui apresentado provocado por um simples equvoco sobre como usar um ponteiro. A
chamada de printf() no imprime o valor de x, que 10. Imprime um valor desconhecido porque a
atribuicao p=x; est errada. Esse comando atribui o valor 10 ao ponteiro p, que se supe conter um
endereo, no um valor. Para corrig-lo, basta escrever p=&x;

13

Você também pode gostar