web-dev-qa-db-fra.com

Existe-t-il d'autres langages "similaires à c" ou non "similaires à c" avec une position de tableau d'index non nulle?

Le langage de programmation C est connu comme un langage de tableau à index zéro. Le premier élément d'un tableau est accessible à l'aide de 0. Par exemple double arr[2] = {1.5,2.5} Le premier élément du tableau arr est à la position 0. arr[0] === 1.5 Quels langages de programmation sont des index basés sur 1?

J'ai entendu parler de ces langages commençant à 1 au lieu de 0 pour l'accès aux baies: ALGOL, Matlab, Action !, Pascal, Fortran, Cobol. Est-ce complet?

Plus précisément, un tableau basé sur 1 accéderait au premier élément avec 1, pas zéro.

74
Alec Jacobson

Une liste peut être trouvée sur wikipedia .

ALGOL 68
APL
AWK
CFML
COBOL
Fortran
FoxPro
Julia
Lua
Mathematica
MATLAB
PL/I
Ring
RPG
Sass
Smalltalk
Wolfram Language
XPath/XQuery
61
LJM

Fortran commence à 1. Je sais que parce que mon père avait l'habitude de programmer Fortran avant ma naissance (j'ai 33 ans maintenant) et il critique vraiment les langages de programmation modernes pour commencer à 0, disant que ce n'est pas naturel, pas comment les humains pensent, contrairement aux mathématiques, et bientôt.

Cependant, je trouve les choses commençant à 0 assez naturelles; mon premier vrai langage de programmation était C et * (ptr + n) n'aurait pas si bien fonctionné si n n'avait pas commencé à zéro!

18
Adrian Smith

Une assez grande liste de langues est sur Wikipedia sous Comparaison des langages de programmation (tableau) sous la table "Liste de références croisées du système de tableau" (colonne d'index de base par défaut)

This a une bonne discussion sur 1- contre 0- indexé et les abonnements en général

Pour citer le blog:

EWD831 par E.W.Dijkstra, 1982.

Lorsqu'il s'agit d'une séquence de longueur N, dont nous souhaitons distinguer les éléments par indice, la prochaine question vexante est quelle valeur d'indice attribuer à son élément de départ. Le respect de la convention a) donne, au début de l'indice 1, la plage d'indices 1 ≤ i <N + 1; commencer par 0, cependant, donne la plus belle plage 0 ≤ i <N. Laissons donc nos ordinaux commencer à zéro: l'ordinal d'un élément (indice) est égal au nombre d'éléments qui le précèdent dans la séquence. Et la morale de l'histoire est que nous devrions mieux considérer - après tous ces siècles! - zéro comme un nombre le plus naturel.

Remarque :: De nombreux langages de programmation ont été conçus sans tenir dûment compte de ce détail. Dans FORTRAN, les indices commencent toujours à 1; en ALGOL 60 et en Pascal, la convention c) a été adoptée; la plus récente SASL s'est repliée sur la convention FORTRAN: une séquence en SASL est en même temps une fonction sur les entiers positifs. Pitié! (Fin de la remarque.)

14
DVK

Dans Ada, vous pouvez également définir vos indices de tableau selon vos besoins:

A : array(-5..5) of Integer;       -- defines an array with 11 elements
B : array(-1..1, -1..1) of Float;  -- defines a 3x3 matrix

Quelqu'un pourrait soutenir que les plages d'index de tableau définies par l'utilisateur entraîneront des problèmes de maintenance. Cependant, il est normal d'écrire du code Ada d'une manière qui ne dépend pas des indices de tableau. À cette fin, le langage fournit des attributs d'élément, qui sont automatiquement définis pour tous les types définis:

A'first   -- this has the value -5
A'last    -- this has the value +5
A'range   -- returns the range -5..+5 which can be used e.g. in for loops
11
Schedler

Fortran, Matlab, Pascal, ALGOL, Smalltalk et bien d'autres.

11

Vous pouvez le faire en Perl

$[ = 1;  # set the base array index to 1

Vous pouvez également commencer par 42 si vous en avez envie. Cela affecte également les index de chaîne.

En fait, l'utilisation de cette fonctionnalité est fortement déconseillée.

11
Thilo

JDBC (pas un langage, mais une API)

String x = resultSet.getString(1);  // the first column
7
Thilo

Index tuples et listes d'Erlang commençant à 1.

7
Greg Hewgill

Lua - décevant

5
matja

Trouvé un - Lua (langage de programmation)

Vérifiez la section des tableaux qui dit -

"Les tableaux Lua sont basés sur 1: le premier index est 1 plutôt que 0 comme c'est le cas pour de nombreux autres langages de programmation (bien qu'un index explicite de 0 soit autorisé)"

4
Sachin Shanbhag

VB Classic, au moins à travers

Option Base 1
4
Dario

Les chaînes en Delphi commencent à 1.

(Les tableaux statiques doivent avoir une limite inférieure spécifiée explicitement. Les tableaux dynamiques commencent toujours à 0.)

4
gabr

PL/SQL . Un résultat de cela est lorsque vous utilisez des langues qui commencent à partir de 0 et que vous interagissez avec Oracle, vous devez gérer vous-même les conversions 0-1 pour l'accès aux tableaux par index. En pratique, si vous utilisez une construction comme foreach sur des lignes ou accédez à des colonnes par nom, ce n'est pas vraiment un problème, mais vous voudrez peut-être la colonne la plus à gauche, par exemple, qui sera la colonne 1.

3
Gaius

L'ensemble des langages wirthiens, y compris Pascal, Object Pascal, Modula-2, Modula-3, Oberon, Oberon-2 et Ada (ainsi que quelques autres que j'ai probablement négligés) permettent aux tableaux d'être indexés à partir de n'importe quel point que vous aimez, y compris, évidemment, 1.

Erlang indexe les tuples et les tableaux à partir de 1.

Je pense - mais je ne suis plus positif - que ALGOL et PL/1 indexent tous les deux à partir de 1. Je suis également assez sûr que Cobol indexe à partir de 1.

Fondamentalement, la plupart des langages de programmation de haut niveau avant C indexés à partir de 1 (avec les langages d'assemblage étant une exception notable pour des raisons évidentes - et la raison pour laquelle les index C à partir de 0) et de nombreux langages extérieurs à l'hégémonie dominée par C le font encore à ce jour.

Les index commencent à un dans CFML.

3
davidcl

ColdFusion - même s'il est Java sous le capot

3
andrewWinn

Ada et Pascal.

3
Dave

Personne n'a mentionné XPath.

2
Grzegorz Oledzki

Mathematica et Maxima, en plus d'autres langues déjà mentionnées.

2
Lorenzo Stella

Il y a aussi Smalltalk

2
Dawie Strauss

informix, en plus d'autres langues déjà mentionnées.

2
Javi Moya

Visual FoxPro, FoxPro et Clipper utilisent tous des tableaux où l'élément 1 est le premier élément d'un tableau ... Je suppose que c'est ce que vous entendez par 1 indexé.

2
PilotBob

De base - pas seulement VB, mais toutes les anciennes versions numérotées de la ligne des années 1980.

Richard

2
winwaed

Je vois que la connaissance de fortran ici est toujours sur la version '66.

Fortran a variable à la fois les limites inférieures et supérieures d'un tableau.

Signification, si vous déclarez un tableau comme:

real, dimension (90) :: x

alors 1 sera la borne inférieure (par défaut).

Si vous le déclarez comme

real, dimension(0,89) :: x

cependant, il aura une limite inférieure de 0.

Si au contraire vous le déclarez comme

real, allocatable :: x(:,:)

alors vous pouvez l'allouer à ce que vous voulez. Par exemple

allocate(x(0:np,0:np))

signifie que le tableau aura les éléments

x(0, 0), x(0, 1), x(0, 2 .... np)
x(1, 0), x(1, 1), ...
.
.
.
x(np, 0) ...

Il existe également des combinaisons plus intéressantes possibles:

real, dimension(:, :, 0:) :: d
real, dimension(9, 0:99, -99:99) :: iii

qui sont laissés comme devoirs pour le lecteur intéressé :)

Ce ne sont que ceux dont je me suis souvenu du haut de ma tête. Étant donné que l'une des principales forces de fortran est la capacité de gestion des baies, il est clair qu'il existe de nombreuses autres entrées et sorties non mentionnées ici.

2
Rook

RPG, y compris RPGLE moderne

1
Internet man

FoxPro tableaux utilisés à partir de l'index 1.

1
Robert Cartaino

dBASE a utilisé des tableaux à partir de l'index 1.

Tableaux (début) en dBASE

1
Robert Cartaino

Bien que C soit de par sa conception 0 indexé, il est possible d'organiser l'accès à un tableau en C comme s'il était indexé 1 (ou toute autre valeur). Ce n'est pas quelque chose que vous attendez d'un codeur C normal, mais cela aide parfois.

Exemple:

#include <stdio.h>
int main(){
    int zero_based[10];
    int* one_based;
    int i;
    one_based=zero_based-1;

    for (i=1;i<=10;i++) one_based[i]=i;
    for(i=10;i>=1;i--) printf("one_based[%d] = %d\n", i, one_based[i]);
    return 0;
}
0
MAK