_Créditos das imagens: Copilot_
# LeetCode :: Implementando o Desafio "String to Integer (atoi)" em Harbour e TL++ (TOTVS Language Plus Plus)
A conversão de uma string para um número inteiro é uma tarefa comum em muitos algoritmos de programação, sendo frequentemente utilizada como um exercício para demonstrar manipulação de strings e números.
A técnica utilizada para implementar o [desafio "String to Integer"](https://leetcode.com/problems/string-to-integer-atoi) (ou `atoi`) pode variar significativamente dependendo da linguagem de programação escolhida.
Neste artigo, vamos explorar as nuances de duas implementações do desafio, uma utilizando **Harbour** (linguagem baseada em xBase) e outra utilizando **TL++** (TOTVS Language Plus Plus, um superconjuto do dialeto xBase), comparando o estilo e as abordagens em ambas as linguagens.
## O Desafio: Converter uma String para um Número Inteiro (atoi)
O objetivo do problema é escrever uma função que converta uma string que representa um número em seu valor inteiro correspondente, lidando com sinais positivos e negativos, ignorando espaços em branco iniciais e tratando a presença de caracteres não numéricos após o número.
Abaixo, detalharemos as duas versões de código para este problema nas linguagens **Harbour** e **TL++**.
---
### 1. Implementação em **Harbour** (xBase)
**Harbour** é uma linguagem de programação baseada no **xBase** Sua sintaxe lembra o **Clipper** e **FoxPro**, com uma estrutura que favorece a legibilidade e simplicidade.
#### Versão 8.1
A implementação do `atoi` em **Harbour** pode ser vista na [versão 8.1](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/blob/main/src/hb/008/string_to_integer_atoi.8.1.prg). Ela começa verificando se a string está vazia e, em seguida, lida caractere a caractere, convertendo os dígitos numéricos para um valor inteiro. A lógica também trata de sinais de números negativos e ignora espaços antes e depois do número. Uma diferença entre Harbour e TLPP é a estrutura switch/case/otherwise/endswitch. Abaixo exemplo do fragmento do código:
```harbour
// Verifica se o número é negativo
cFirstChar:=Left(cString,1)
switch cFirstChar
case "-"
nSign:=-1
i:=2 // Começa após o sinal negativo
exit
case "+"
nSign:=1
i:=2 // Começa após o sinal positivo
exit
otherwise
nSign:=1
i:=1 //Começa a partir da posição inicial
endswitch
```
#### Versão 8.2
Na versão [8.2](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/blob/main/src/hb/008/string_to_integer_atoi.8.2.prg), utilizamos a função Val() que faz exatamente o que o desafio propõe. Neste caso é preferivel usar a função nativa em detrimento de uma implementação customizada.
---
### 2. Implementação em **TL++** (TOTVS Language Plus Plus)
**TL++** é uma linguagem de programação desenvolvida pela **TOTVS** para ser usada principalmente em seu sistema de gestão empresarial (Protheus). Ela possui uma sintaxe similar ao **xBase** e outras particularidades implicitas da linguagem e da evolução independente bem como das necessidades específicas para o seus sistemas de gestão empresarial.
#### Versão 8.1
A versão [8.1](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/blob/main/src/tlpp/008/string_to_integer_atoi.8.1.tlpp) de **TL++** também implementa a conversão de string para inteiro de maneira similar ao **Harbour** com diferença, principal na estrutura do do case/case/end case:
```tlpp
// Verifica se o numero eh negativo
cFirstChar:=Left(cString,1)
do case
case (cFirstChar=="-")
nSign:=-1
i:=2 // Comeca apos o sinal negativo
case (cFirstChar=="+")
nSign:=1
i:=2 // Comeca apos o sinal positivo
otherwise
nSign:=1
i:=1 //Comeca a partir da posicacao inicial
end case
```
#### Versão 8.2
A versão [8.2](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/blob/main/src/tlpp/008/string_to_integer_atoi.8.2.tlpp), também utilizamos a função Val() que faz exatamente o que o desafio propõe. Neste caso é preferivel usar a função nativa em detrimento de uma implementação customizada.
---
## Nuances entre as Linguagens
Embora ambos os códigos possuam lógicas semelhantes, algumas diferenças importantes surgem devido às características de cada linguagem:
1. **Sintaxe e Abordagem**:
- **Harbour** tenta ser 100% compatível com as linguagem padrão xBase disponíveis no mercado.
- **TL++** por definição dos designers na linguagem, apesar de ter bastante semelhança com o xBase segue outra vertente e possui bastantes particularidades intrísicas ao ambiente TOTVS Protheus
2. **Desempenho e Utilização**:
- **Harbour** e **TL++** tem propósitos diferentes, apesar de semelhantes. Enquanto Harbour tenta suprir a necessidade de compatibilidade como Legado xBase TLPP tem um foco mais voltado para a integração com o ecossistema TOTVS e pode ser mais útil em empresas que já utilizam outros produtos da TOTVS.
3. **Manejo de Caracteres**:
- Ambos os códigos utilizam funções semelhantes para a manipulação de caracteres e para a conversão de caracteres em números.
---
## Conclusão
As implementações do desafio "String to Integer (atoi)" em **Harbour** e **TL++** são bastante semelhantes em termos de lógica, mas as diferenças de sintaxe e a filosofia por trás de cada linguagem podem influenciar a escolha dependendo do ambiente e da necessidade do projeto.
Se você está trabalhando em um sistema corporativo que utiliza **Harbour** ou **TL++**, entender as particularidades de cada uma dessas linguagens pode ser crucial para otimizar seu desenvolvimento e manutenção de código.
---
**Hashtags:**
#Harbour, #xBase, #TLpp, #TOTVS, #StringToInteger, #atoi, #DesafiosDeProgramação, #Leetcode, #Tecnologia, #Programação
Comentários
Postar um comentário