Jump to content

[Pascal] Verificar se um número é capicua


maiden

Recommended Posts

Boas,

Com o aparecimento do tópico "Caça às Capicuas" verifiquei que algum pessoal ainda não percebeu o que é uma capicua.

Deixo aqui um aplicativo que não tem utilidade para além da verificação se um numero é capicua ou não (e a aprendizagem claro).

Program Capicuas;
Uses crt;
Var i,ilen,inum:integer;
snum:string;
capicua:boolean;

Begin
clrscr;
write('Introduza um numero: ');
readln(inum);
str(inum,snum);
ilen:=length(snum);
for i:=1 to ilen div 2 do begin
	if snum[i] = snum[ilen-i+1] then
		capicua:=True
	else capicua:=False;
end;
if capicua = True then
	writeln('O numero e capicua')
else writeln('O numero nao e capicua');
readln;
End.

Abaixo fica um ficheiro comprimido com o código e o executável.

Espero que seja útil.

Cumps,

Link to comment
Share on other sites

Em 05/06/2006 às 23:58, ®idelight disse:

Está interessante, mas encontrei 2 bugs.

Acho que 3226 não é uma capicua.

Se introduzires 3225 fecha o programa automaticamente nem dá feedback!

EDIT# com o 2226 fecha a aplicação também e o 2225 diz que é capicua !

:x

Um bug a verificar com mais tempo.

Se alguém souber uma solução não se acanhe. :shame:

Link to comment
Share on other sites

Tenta assim !

PROGRAM Capicuas(INPUT,OUTPUT);

VAR n,potencias,i,num,auxnum,totalnumcont,quoc,resto,numerocont:WORD;

BEGIN
     WRITE('Quantos d¡gitos compõe o número? ');
     READLN(n);
     potencias:=1;
     FOR i:=1 TO n-1 DO
     BEGIN
          potencias:=potencias*10
     END;
     WRITE('Digite o número-> ');
     READLN(num);
     auxnum:=num;
     totalnumcont:=0;
     REPEAT
           quoc:=num DIV 10;
           resto:=num MOD 10;
           numerocont:=resto*potencias;
           totalnumcont:=totalnumcont+numerocont;
           potencias:=potencias DIV 10;
           num:=quoc;
     UNTIL quoc=0;
     IF totalnumcont=auxnum THEN WRITELN('O número inserido é palindrómico')
                            ELSE WRITELN('O número inserido não é palindrómico');
END.
Link to comment
Share on other sites

Há muito que não brincava com C e aproveitando a deixa....

#include <stdio.h>
#include <conio.h>
#include <string.h>

char *noBufferOverflowReading(char *, int);

int main(int argc, char *argv[])
  {
  char buffer[101], *value, *secondString;
  int z, x, max;
  value = noBufferOverflowReading(buffer, 100);
  secondString = (char *) malloc((sizeof(char) * strlen(value)) + 1);
  max = strlen(value);
  for(z = 0, x = max-1; z < max; z++, x--)
    secondString[z] = value[x];
  if(!strcmp(value, secondString))
    printf("Capicua!\n");
  else
    printf("Nao Capicua!\n");
  printf("Prima qualquer tecla para terminar....");
  getch();
  return 0;
  }

char *noBufferOverflowReading(char *buffer, int count)
  {
  /*Codigo criada ha' alguns anos atrás! Alteracoes minimas.
  Notar que nao e' tido em conta a ocorrencia de sinais, logo 
  este codigo nao devera' ser usado em ambientes unix sem as 
  devidas correccoes!*/
  
  char *result = buffer, *np;
  if ((buffer == NULL) || (count < 1))
    result = NULL;
  else
    if (count == 1)
      *result = '\0';
    else 
      if ((result = fgets(buffer, count, stdin)) != NULL)
        if (np = strchr(buffer, '\n'))
          *np = '\0';
  return result;
  }

Único problema, se introduzirem "olo" o programa indicará uma capicua, mas não creio que será um problema 😁.

Segue código fonte... http://www.student.estg.ipleiria.pt/~ei10635/downloads/just4fun/capicua.c

Link to comment
Share on other sites

  • 3 years later...

Aqui está um excerto dum programa meu antigo, que calcula se qualquer número de qualquer tamanho (va va nao exageremos) é capicua, a função recebe valores em formato texto para permitir uma maior extensão (e principalmente porque o programa original era direccionado para valores binários).

function palindromic(str: string): boolean;
var
tamanho: byte;
auxchar: char;
palok: boolean;
map: array[1..maxmap] of char;
map2: array[1..maxmap] of char;
begin
for cont1:=1 to last do map[cont1]:='%';
palok:=true;  

Cortei esta parte para poupar espaço, devolvia o tamanho da string, deve haver uma funçao imbutida para fazer o mesmo, esta é outra coisa que não sabia fazer quando este programa foi feito lol

if tamanho>1 then begin  
assign(ficheiro,'temp');
reset(ficheiro);
for cont1:=1 to trunc(tamanho/2) do
read(ficheiro,map[cont1]);
if tamanho mod 2<>0 then read(ficheiro,auxchar);
for cont1:=1 to trunc(tamanho/2) do begin
read(ficheiro,map2[cont1]);
if map[trunc(tamanho/2)+1-cont1]<>map2[cont1] then palok:=false;
end;
close(ficheiro);        
end;
palindromic:=palok;
last:=tamanho+1;
end;

Como se pode ver conhecendo Pascal, o código perde tempo ao retirar chars do meio da string, porque quando este programa foi feito não sabia outra maneira  😕 não pensem menos de mim por isso ?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.