2009-08-06 4 views
0

Je sais qu'il doit y avoir une méthode générique mais je ne connais même pas le terme à rechercher et je ne veux pas trop réinventer la roue.Existe-t-il un moyen générique de calculer les valeurs des composants comme l'année + mois + jour à partir des jours ou des miles + yards + pieds + pouces à partir des pouces?

« composants séparés valeurs » et « valeurs composites » ne donnent pas de bons résultats.

un autre exemple: degrés + minutes + secondes à partir des secondes d'arc, ou tonnes + livres + onces d'onces.

Je travaille en C mais il ne devrait pas être trop difficile à traduire d'une autre langue. Les entrées seraient la valeur de base, disons pouces totaux = 9534567, et les divisions unitaires, comme les pieds = 12, yards = pieds * 3, miles = yards * 1760. La sortie serait de 150 miles, 849 yards, 0 pieds et 3 pouces.

Sûrement cela peut être généralisé pour utiliser un autre ensemble de divisions d'unités. Et toute une bibliothèque semble être trop lourde, n'est-ce pas?

+0

pourriez-vous s'il vous plaît reformuler votre question ou demander quelque chose de plus précis? – ThibThib

Répondre

1

Comme mentionné, cela est plus difficile lorsqu'il s'agit de longueurs d'éléments intermédiaires non standard. Toutefois, étant donné un ensemble standard de pauses, vous pouvez calculer en utilisant les éléments suivants:

void components (long value, long * parts, int parts_sz, long * result) { 

    int i = 0; 
    for (; i < parts_sz; ++i) { 
     result[i] = value/parts[i]; 
     value %= parts[i]; 
    } 
} 

int main() { 

    int i = 0; 
    long parts[] = {10000, 1000,100,10,1}, result[] = {0,0,0,0,0}; 
    long value = 99853; 

    components (value, parts, 5, result); 

    for (; i < 5; ++i) 
     printf ("There were %ld %lds\n", result[i], parts[i]); 

    retrun 0; 
} 

qui donne:

There were 9 10000s 
There were 9 1000s 
There were 8 100s 
There were 5 10s 
There were 3 1s 
+0

Que diriez-vous si les ruptures étaient de longueurs fixes mais différentes comme les miles + yards + feet + inches? – willc2

+0

Bien, mais si les arguments étaient tous représentés par la même base, cela n'aurait pas d'importance. Par exemple yards/pieds/pouces serait composants (36,12,1) – ezpz

+0

Et ils ont dit que cela ne pouvait pas être fait. – willc2

1

Il n'y a pas de manière générique pour chaque valeur composite. Chacun des exemples que vous avez donnés est assez radicalement différent dans les «scissions» pour chacun d'eux. Le pire étant évidemment les dates en raison des différences de longueur des mois, etc.

Pour les autres, vous pourriez probablement gérer quelque chose comme fournir une liste des «seuils» pour chaque valeur et être retourné une liste de chacun. Alors vous avez juste juste eu des opérations de module et de division pour diviser la valeur vers le bas.

+0

+1 pour "modulus", ce que je pense être la réponse désirée –

0

Mathématiquement, il s'agit d'une division entière avec reste.

En C (et Java, ...), vous pouvez utiliser les opérateurs/et% pour calculer le quotient et le reste, respectivement.

Edit:

1249559005844: "6. August 2009 11:43:25 UTC" 
1249559005844 % 1000 = 844 
1249559005844/1000 = 1249559005 
1249559005 % 60 = 25 
1249559005/60 = 20825983 
20825983 % 60 = 43 
20825983/60 = 347099 
347099 % 24 = 11 
347099/24 = 14462 

jours au-dessus devient malpropre, parce que des mois et des années ont des longueurs différentes.

+0

Voulez-vous montrer un exemple aux personnes intéressées qui programment depuis peu de temps? – willc2

+1

Même au-dessous de jours il est en désordre - en raison de l'heure avancée, vous pouvez avoir une journée de 23 ou 25 heures, faisant "24 heures plus tard" et "le jour même, même temps" pas toujours la même chose. –

+0

@Michael Borgwardt Mais c'est un désordre différent. Vous pouvez prendre en compte les fuseaux horaires et autres après avoir divisé le temps brut en composants. En outre, le monde serait un meilleur endroit sans l'heure d'été, moins de complexité et plus de temps pour dormir. – starblue

0

La conversion entre unités implique simplement un simple processus de division ou de multiplication en une ou deux étapes selon le chemin que vous empruntez entre les unités. Un exemple simple est l'échelle logarithmique du système métrique: Pour aller de mètres en centimètres, vous multipliez par 100 parce qu'il y a 100 centimètres dans un mètre.

Je ne connais pas de C mais tout ce que vous devez vraiment savoir, c'est le facteur de conversion et si vous montez ou descendez en magnitude unitaire. Cela devrait fonctionner pour des systèmes bien conçus comme le système métrique où les choses vont dans une échelle logarithmique mais où les facteurs de conversion diffèrent comme dans le système impérial que vous rencontrerez en cas de problème si vous essayez de convertir avec un seul facteur. Vous pourriez juste avoir votre programme aller récursivement vers le haut ou vers le bas différentes unités. Donc, vous pouvez aller:

Metres (n*100)-> cm (cm*10) -> mm (mm*1000) -> µm 

Et puis la division irait simplement en sens inverse, en gardant les mêmes facteurs de conversion.

Morale de l'histoire: n'utilisez pas le système impérial.

+0

C'est une bonne chose que nous utilisions le système métrique pour le moment. – willc2

+0

http://zapatopi.net/metrictime/ Mais les 60 secondes/minute remontent à quand les Babyloniens pensaient qu'il y avait 360 jours dans une année. –

1

Dans la plupart des cas, les calculs sont assez simples, mais il peut être fastidieux de coder tous les facteurs de conversion.

Cependant, les calculs impliquant une durée sont conceptuellement difficiles. Combien de jours y a-t-il dans une année? Est-ce 365 ... ou 366? Combien de secondes dans une année?

+1

même le nombre d'heures dans une journée n'est pas fixe ... –