Cadeias de caracteres C ++ vs. matrizes de caracteres

8

Por que você acha que a maioria dos instrutores de C ++ que ensinam ciências da computação em faculdades desencorajam ou até proíbem o uso de strings para texto, em vez de exigir que os alunos usem matrizes de caracteres?

Suponho que essa metodologia tenha alguma intenção de ensinar bons hábitos de programação, mas, na minha experiência, não vejo nada de errado em usar apenas strings, e elas são significativamente mais fáceis de usar e aprender.

Taylor Huston
fonte
9
Você tem uma referência para a alegação de que "a maioria dos instrutores de C ++ que ensinam ciências da computação em faculdades desencorajam ou até proíbem o uso de strings para texto, em vez de exigir que os alunos usem matrizes de caracteres?" Não sei se isso é verdade, em geral. Se for, suspeito que seja pela mesma razão que os professores proíbem ou desencorajam o uso de qualquer biblioteca: porque os alunos aprendem mais sobre os fundamentos fazendo as próprias coisas do zero?
Patrick87
Conheço os professores da Universidade Estadual de Portland, e pelo que li em alguns fóruns sobre o uso de matrizes de caracteres versus seqüências de caracteres que geralmente pareciam verdade. Eu posso estar totalmente errado, é exatamente isso que eu acumulei na minha experiência (limitada).
Taylor Huston
3
@ TaylorHuston, você provavelmente deveria perguntar a esses professores.
svick
4
Bem-vinda! Esta é uma questão didática de programação (não exatamente de CS), e pede opinião. Votou para fechar assim. A propósito, na minha universidade eles não ensinam C ++. Professores que têm uma tendência a evitar as melhores práticas em seu código, no entanto. Eu acho que é porque eles são cientistas da computação, não programadores.
Raphael
3
@Raphael Visto que esses cursos são freqüentemente ministrados por cientistas da computação e são frequentemente uma introdução à programação e à ciência da computação ao mesmo tempo, acho que a questão está no tópico aqui, e este é um local apropriado para ela, desde o público (o respondentes em potencial) seriam cientistas da computação. Duvido da afirmação, mas perguntas com suposições erradas são válidas e devem ser respondidas com uma refutação.
Gilles 'SO- stop be evil'

Respostas:

7

Para um estudante de CS, o professor pode desencorajar std :: string e solicitar char array, para ensinar noções básicas de array. Na minha escola, o professor nos pediu para escrever rotinas C strlen, strcmpetc. , por conta própria. Não pode obter nenhum nível baixo, então este (saindo da montagem!).

Usando matriz, em vez de cadeia, você pode aprender sobre gerenciamento de memória, operações de cadeia, principalmente analisar a cadeia. Ao iterar sobre a matriz, você basicamente está analisando a string, procurando espaço em branco, caracteres especiais, tokens etc.

Mas não estou recomendando array sobre string. Estou apenas dando uma razão para lidar com matrizes, na universidade.

user1182
fonte
7

Koenig e Moe's Accelerated C ++ e Stroustrup's Programming: Principles and Practice O uso de C ++ está usando std :: string e outros componentes da biblioteca padrão desde o início. Se bem me lembro, eles nem apresentam matrizes C para Koenig e Moe e Stroustrup faz isso muito tarde no livro (talvez até mesmo em um anexo).

Essa abordagem, qualificada como moderna , é a preferida em meus círculos. A outra abordagem, muitas vezes qualificada como histórica , segue mais de perto a evolução do C ++, mas não tira proveito do desenvolvimento "mais novo" (relativamente, eles têm 15 anos agora) e não ensina o que é praticado agora (pelo menos em projetos não sobrecarregados com muito legado), mas há 10 anos (sempre há um atraso antes de ser mainstream).

AProgrammer
fonte
4

Não posso dizer nada sobre "a maioria" versus "alguns" instrutores de programação, mas posso dizer que em um currículo de CS, os primeiros cursos de programação têm dois objetivos:

  • Preparar os alunos para tópicos do tipo engenharia de software
  • Acostume os alunos às operações básicas de um computador e ao comportamento das diferentes implementações de conceitos de nível superior, como cadeias de caracteres

Às vezes, elas estão em desacordo e professores diferentes farão trocas diferentes.

Louis
fonte
2
Você esquece pelo menos um terceiro objetivo: ensinar pré-requisitos para outros cursos e estágios obrigatórios.
AProgramador
11
Se o curso é de algoritmos, a abordagem de baixo nível é melhor. Se o curso é de recuperação de informações, a abordagem de alto nível é melhor. Cursos diferentes querem coisas diferentes.
Louis
4

Acho que depende do que você está tentando ensinar nesse curso ... "Ciência da Computação" é uma definição um tanto vaga.

Se o curso for sobre Algoritmos e Estruturas de Dados, ensinar aos alunos não std::stringtem absolutamente nenhum valor didático. Usar charmatrizes como uma introdução às matrizes e operações sobre elas, no entanto, é bastante legítimo.

Se o curso é sobre design de objetos, acho que std::stringtem algum valor como exemplo de um tipo de dados abstrato.

Se o curso é apenas sobre as melhores práticas em C ++, então eu me preocuparia com o tipo de faculdade em que está e como eles projetam o currículo de Ciência da Computação.

Pedro
fonte
2

Eu acho que você não entendeu o objetivo real do seu curso, pois um bom C ++ (basicamente) usa as abstrações fornecidas pela biblioteca padrão (por que você deseja reinventar a roda?).

Há até uma citação de Stroustrup dizendo "mantenha matrizes fora das interfaces" em seu FAQ, onde ele fornece algumas dicas sobre como escrever código seguro. Portanto, duvido que você realmente seja instruído a não usá-los, porque eles são ruins, mas a aprender alguns fundamentos de como as coisas funcionam, para que você possa usar mais tarde esse entendimento se realmente precisar de otimização ou outro trabalho, para o qual deseja precisa do básico real.

Sim
fonte
0

Em alguns casos, as cordas são boas em outras, elas não são iguais para char

/ ** Exemplo 1 de uso de string, neste caso, string é cortado por Spaces na saída, se escrevermos del test.txt, a saída será Linha 1 del Linha 2 test.txt, o que não é bom ** /

#include <iostream>
#include <stdlib.h>
using namespace std ; 

string get_input ;

int main()
{
main:
    cin >> get_input ;
    system(get_input.c_str()) ;
    goto main ;
}

/ ** Exemplo 2 do mesmo programa, mas passamos a entrada em um caractere com um campo de 80 a saída para o mesmo cmd que o primeiro exemplo será del test.txt na mesma linha que é boa ** /

#include <iostream>
#include <stdlib.h>
using namespace std ; 

char input[80] ;
string get_input ;

int main()
{
main:
    cin.getline(input ,80) ;
    get_input = input ;
    system(get_input.c_str()) ;
    goto main ;
}

Strings são objetos que representam seqüências de caracteres.

A classe de sequência padrão fornece suporte para esses objetos com uma interface semelhante à de um contêiner padrão de bytes, mas adicionando recursos projetados especificamente para operar com sequências de caracteres de byte único.

A classe string é uma instanciação do modelo da classe basic_string que usa char (ou seja, bytes) como seu tipo de caractere, com seus char_traits e tipos de alocadores padrão (consulte basic_string para obter mais informações sobre o modelo).

Observe que esta classe manipula bytes independentemente da codificação usada: Se usada para manipular seqüências de caracteres de vários bytes ou de comprimento variável (como UTF-8), todos os membros desta classe (como comprimento ou tamanho), bem como seus iteradores, ainda operará em termos de bytes (não caracteres reais codificados). Referência -C ++ http://www.cplusplus.com/reference/string/string/ [1]:

eu sugiro olhar para:

TKIPAES
fonte