|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4735
|
@TausB: Eigentlich habe ich ja gerade an einer C-Variante gebastelt, aber hier ist mein erstes Fortran77-Program. Zu Ehren Deines Profilbilds und dem DOS-Veteran in Deiner Signatur habe ich das unter DOS geschrieben und mit dem OpenWatcom Fortran77 Compiler in eine EXE übersetzt. ☺
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | program merge_arrays
implicit none
integer n
parameter (n = 3)
character*3 as(n)
integer bs(n)
character*16 cs(n)
integer i
data as/'foo','bar','baz'/, bs/1,2,3/
do 10 i = 1, n
write(cs(i),'(A,X,I3)') as(i), bs(i)
10 continue
do 20 i = 1, n
print *, cs(i)
20 continue
stop
end
|
|
|
TausB
Anmeldungsdatum: 26. November 2009
Beiträge: 1570
|
@Marc_BlackJack_Rintsch: Welche eine Ehre - ich danke Dir! ☺ *invergangenheitschwelg* Lang lang ist es her ... (so lange, dass mir bei Fortran nichts mehr bekannt vorkommt ...)
|
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4735
|
@TausB: Hilft es beim Wiedererkennungswert wenn die Schlüssworte gross geschrieben sind? Das war ja früher üblich bei vielen Sprachen bei denen Gross-/Kleinschreibung egal ist. Oder ist Dein ”damals” gar noch mit Lochkarten gewesen? ☺ Hier noch mal in Grossbuchstaben und mit Kommentaren:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 | PROGRAM merge_arrays
C Kein impliziter Typ fuer undeklarierte Variablen.
IMPLICIT NONE
C Konstante fuer die Anzahl der Array-Elemente.
INTEGER n
PARAMETER (n = 3)
C Drei Arrays: as und bs fuer die Ausgangsdaten, und cs fuer das
C Ergebnis.
C Die Zeichenketten in as sind maximal 3 Zeichen lang. Fuer das
C Ergebnis ist mit maximal 16 Zeichen pro Zeichenkette genug Platz
C fuer den Wert aus as, einem Leerzeichen, und der jeweiligen Zahl
C aus bs.
CHARACTER*3 as(n)
INTEGER bs(n)
CHARACTER*16 cs(n)
INTEGER i
C as und bs mit den Eingabedaten vorbelegen.
DATA as/'foo','bar','baz'/, bs/1,2,3/
C Schleife ueber die Elemente und Schreiben von den Werten von as
C und bs an den entsprechenden Index in cs.
DO 10 i = 1, n
WRITE(cs(i),100) as(i), bs(i)
10 CONTINUE
C Eine Zeichenkette, gefolgt von einem Leerzeichen, gefolgt von
C einer ganzen Zahl mit maximal drei Ziffern.
100 FORMAT (A,X,I3)
C Ausgabe der Ergebniswerte in einer Schleife.
DO 20 i = 1, n
PRINT *, cs(i)
20 CONTINUE
STOP
END
|
Und hier die Lösung in C. Getestet unter Linux mit Clang, auf dem C64 mit cc65, und weil ich ja gerade mit DOS beschäftigt war, auch dort mit dem Watcom C-Compiler. ☺
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | #include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3
int main(void)
{
char *as[N] = {"foo", "bar", "baz"};
int32_t bs[N] = {1, 2, 3};
char *cs[N];
int i;
size_t length;
for (i = 0; i < N; ++i) {
length = (strlen(as[i]) + 16) * sizeof **cs;
cs[i] = malloc(length);
snprintf(cs[i], length, "%s %"PRIu32, as[i], bs[i]);
}
for (i = 0; i < N; ++i) puts(cs[i]);
for (i = 0; i < N; ++i) free(cs[i]);
return 0;
}
|
|
|
TausB
Anmeldungsdatum: 26. November 2009
Beiträge: 1570
|
Marc_BlackJack_Rintsch schrieb: @TausB: ... Oder ist Dein ”damals” gar noch mit Lochkarten gewesen? ☺
Am Unigroßrechner waren die Lochstreifen gerade ausgelaufen, der neue Standard waren Magnetbänder. Man hat die "Schrankwand" über diverse Knöpfe in Betrieb genommen ... Bin selber mit einem 8088 (nicht 8086!) und ZWEI Diskettenlaufwerken (an der Uni) groß geworden. Mit DOS 1.x fing es an ...
Hier noch mal in Grossbuchstaben und mit Kommentaren:
Sehr nett von Dir - und ja ein gewisses Feeling kehrte zurück ... ☺
|
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4735
|
@TausB: Uni… das erinnert mich daran das es noch keine Java-Lösung hier gibt. Bei mir war das ein Weilchen nach Grossrechnern und DOS. ☺ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | import java.util.Arrays;
public final class Main {
private Main() {}
public static void main(String... args) {
String as[] = {"foo", "bar", "baz"};
int bs[] = {1, 2, 3};
if (as.length != bs.length) {
throw new RuntimeException("arrays not of the same length");
}
String cs[] = new String[as.length];
for (int i = 0; i < cs.length; i++) {
cs[i] = as[i] + ' ' + bs[i];
}
System.out.println(Arrays.toString(cs));
}
}
|
Edit: Mit Grossrechnern hatte ich eigentlich nie etwas zu tun, aber Rexx kenne ich vom Amiga, und das hat IBM ja auch gerne auf Grossrechnern eingesetzt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | main_routine:
as.1 = 'foo'
as.2 = 'bar'
as.3 = 'baz'
bs.1 = 1
bs.2 = 2
bs.3 = 4
DO i = 1 TO 3
cs.i = as.i bs.i
END
DO i = 1 TO 3
SAY cs.i
END
EXIT 0
|
Und ich habe gerade Red/Rebol wiederentdeckt:
| Red []
xs: ["foo" "bar" "baz"]
ys: [1 2 4]
zs: collect [forall xs [keep form reduce [first xs ys/(index? xs)]]]
foreach z zs [print z]
|
|