staging.inyokaproject.org

Merge Array

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

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

Avatar von 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 Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

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

Avatar von 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 Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

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:

1
2
3
4
5
6
7
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]
Antworten |