Nada

LÖSNING TILL DATALOGIÖVNING 4

Det kan vara praktiskt med globala variabler N och kortlek, eftersom alla använder dom. Skriv main först, sedan ordna, sedan visa och sist blanda (den är jättesvår, så rita upp ett exempel med N=6).
class Blanda1                                              {
  static int N                                             ;
  static int[] kortlek                                     ;
  static void ordna()                                      {
    for(int i=0; i<N; i++) kortlek[i]=i                    ;} 
  static void visa()                                       {
    for(int i=0; i<N; i++) System.out.print(kortlek[i]+" ");}
  static void blanda()                                     {
    int[] halvlek = new int[N/2]                           ;
    for(int i=0; i<N/2; i++) halvlek[i]=kortlek[i]         ;
    for(int i=0; i<N/2; i++) kortlek[2*i]=kortlek[N/2+i]   ;
    for(int i=0; i<N/2; i++) kortlek[2*i+1]=halvlek[i]     ;} 
  public static void main(String[] args)                   {
    System.out.print("Antal kort: ")                       ;
    N=Mio.GetInt()                                         ;
    kortlek= new int[N]                                    ;
    ordna()                                                ;
    while(Mio.GetLine().equals(""))                        {
      visa()                                               ;
      blanda()                                             ;}}}
Ett kortobjekt är en låda med två tal i. Man kan sedan tolka färg 0 som spader, färg 1 som hjärter etc. Visa att i/13 och i%13 gör att alla spader kommer först, sedan alla hjärter etc. Klassen Kort ska så småningom få en metod toString också, men vänta med det till allra sist, så blir det lite enklare.
class Kort                                                 {
  int färg,valör                                           ;}}

class Blanda2                                              {
  static int N=52                                          ;
  static Kort[] kortlek                                    ;   // ändrad
  static void ordna()                                      {   
    for(int i=0; i<N; i++)                                 {
      kortlek[i]=new Kort()                                ;   // ändrad
      kortlek[i].färg=i/13                                 ;   // ändrad
      kortlek[i].valör=i%13                                ;}} // ändrad
  static void visa()                                       {
    for(int i=0; i<N; i++) System.out.print(kortlek[i]+" ");}
  static void blanda()                                     {
    Kort[] halvlek = new Kort[N/2]                         ;
    for(int i=0; i<N/2; i++) halvlek[i]=kortlek[i]         ;
    for(int i=0; i<N/2; i++) kortlek[2*i]=kortlek[N/2+i]   ;
    for(int i=0; i<N/2; i++) kortlek[2*i+1]=halvlek[i]     ;} 
  public static void main(String[] args)                   {
    System.out.print("Antal kort: ")                       ;
    N=Mio.GetInt()                                         ;
    kortlek= new Kort[N]                                   ;   // ändrad
    ordna()                                                ;
    while(Mio.GetLine().equals(""))                        {
      visa()                                               ;
      blanda()                                             ;}}}
..och den här metoden i Kort anropas av System.out.print för att förvandla objekt till String
  public String toString()                                 {
    String[] f={"sp","hj","ru","kl"}                       ;
    String[] v={" E"," 2"," 3"," 4"," 5"," 6"," 7",
		" 8"," 9","10","kn"," D"," K"}             ;
    return f[färg]+v[valör]                                ;}}
Klassen IntStack har metoderna push(x), pop() och show() och då kan vektorerna ersättas med tre stackar, så här: (det är bara dom markerade satserna som är intressanta)
class Blandning                                            {
  static int N                                             ;
  public static void main(String[] args)                   {
    IntStack kortlek,halvlek1,halvlek2                     ;
    kortlek=new IntStack()                                 ;
    System.out.print("Antal kort: ")                       ;
    N=Mio.GetInt()                                         ;
    for(int i=N;i>0;i--) kortlek.push(i)                   ;     // viktig
    halvlek1=new IntStack()                                ;
    halvlek2=new IntStack()                                ;
    while(Mio.GetLine().equals(""))                        {
      kortlek.show()                                       ;
      for(int i=0;i<N/2;i++) halvlek2.push(kortlek.pop())  ;     // viktig
      for(int i=0;i<N/2;i++) halvlek1.push(kortlek.pop())  ;     // viktig
      for(int i=0;i<N/2;i++)                               {     // viktig
	kortlek.push(halvlek2.pop())                       ;     // viktig
	kortlek.push(halvlek1.pop())                       ;}}}} // viktig