C# :: Aufgabe #279

5 Lösungen Lösungen öffentlich

ÜBUNG ARRAYS- Wie viele Türen stehen am Ende dieses Algorithmus offen?

Anfänger - C# von sinanoz05 - 31.01.2020 um 08:39 Uhr
Ein mittelalterlicher Herrscher nahm bei einem Feldzug 100 Feinde gefangen, die er in 100 Einzelzellen steckte. An seinem Geburtstag sollten einige freigelassen werden, und zwar nach einem sehr speziellen Verfahren. Zunächst werden alle Zellentüren aufgeschlossen. Dann wird in einem zweiten Durchgang jede zweite Türe wieder geschlossen. Im dritten Durchgang wird jede dritte Tür geschlossen, falls sie offen steht, oder geöffnet falls sie geschlossen ist. Und so geht es im nächsten Durchgang weiter, bis zum hundertsten Durchgang. Wieviele Türen stehen am Ende dieses Algorithmus offen?

Verwenden Sie ein Array vom Datentyp bool mit 100 Elementen. True soll eine offene Türe repräsentieren und false eine geschlossene. Erstellen Sie ein Programm um die Anzahl der offenen Türen zu bestimmen und geben Sie das Ergebnis auf der Konsole aus

Lösungen:

vote_ok
von miami666 (290 Punkte) - 01.02.2020 um 17:04 Uhr
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace aufgabe_279
{
    class Program
    {

        static void Main(string[] args)
        {
            bool[] bArray = new bool[100];
            int anzahlTueren(bool val)
            {
                return bArray.Count(c => c == val);
            }
            for (int i = 0; i < bArray.Length; i++)
            {
                bArray[i] = true;
            }
            for (int y = 2; y <= 100; y++)
            {
                for (int i = 0; i < bArray.Length; i++)
                {
                    if ((i + 1) % y == 0 && (bArray[i] == true || bArray[i] == false))
                    {
                        bArray[i] = !bArray[i];
                    }
                }
            }
            Console.WriteLine($"Am Ende sind {anzahlTueren(true)} Zellentueren offen");
            Console.ReadKey();
        }
    }
}
vote_ok
von Waldgeist (390 Punkte) - 02.02.2020 um 20:39 Uhr
Mein erstes Programm war fehlerhaft!
Hier die richtige Lösung.
Es stehen 10 Türen offen...

Quellcode ausblenden C#-Code
using System;

namespace Tueren
{
    class Program
    {
        static void Main(string[] args)
        {
           
            Console.WriteLine("Programm zur Ermittlung wieviele Türen offen stehen.");
            Console.WriteLine();


            
            bool[] Zellen = new bool[100];
            for (int i=1; i <= 100; i++) { Zellen[i-1] = true; }

            
           
            for (int d = 2; d<=100; d++)
            {
                for (int c = 1; c<=100; c++)
                {
                    if ((c % d == 0) & (Zellen[c - 1]))
                        {
                            Zellen[c - 1] = false;                        
                        }
                    else if ((c % d == 0) & (!Zellen[c - 1]))
                    {
                        Zellen[c - 1] =true;
                    }



                }
            }

            int anzahl = 0;
            for (int a = 0; a <= 99; a++)
            {

                if (Zellen[a])
                {
                    anzahl++;
                }
            }
            Console.WriteLine("Anzahl offener Tueren: " + anzahl);
            Console.ReadKey();
        }
        
    }
   
}

                            
vote_ok
von hollst (12020 Punkte) - 05.02.2020 um 18:11 Uhr
Quellcode ausblenden C#-Code
using static System.Console;
using System.Text;

/*
Ein mittelalterlicher Herrscher nahm bei einem Feldzug 100 Feinde gefangen, die er in 100 Einzelzellen steckte. 

An seinem Geburtstag sollten einige freigelassen werden, und zwar nach einem sehr speziellen Verfahren:
 
Zunächst werden alle Zellentüren aufgeschlossen. 
Dann wird in einem zweiten Durchgang jede zweite Türe wieder geschlossen. 
Im dritten Durchgang wird jede dritte Tür geschlossen, falls sie offen steht, oder geöffnet falls sie geschlossen ist. 

Und so geht es im nächsten Durchgang weiter, bis zum hundertsten Durchgang. 

Wieviele Türen stehen am Ende dieses Algorithmus offen?     
*/

namespace aufgabe_279
{
    static class Program
    {
        static void Main()
        {
            const int anzahl_feinde = 100;
            bool[] zellen = new bool[anzahl_feinde];

            for(var i = 0; i < anzahl_feinde; i++)
            {
                var pointer = i;
                while(pointer < anzahl_feinde)
                {
                    zellen[pointer] = !zellen[pointer];
                    pointer += i + 1;
                }

                var counter = 0;
                for (var icounter = 0; icounter < anzahl_feinde; icounter++)
                    if (zellen[icounter])
                        counter++;

                WriteLine($"Durchgang: {i + 1,3} {zellen.boolarray_tostring()}   Offene Türen: {counter,3}");
            }
            ReadKey();
        }

        static string boolarray_tostring(this bool[] b)
        {
            StringBuilder sb = new StringBuilder();
            for (var i = 0; i < b.Length; i++)
                if (b[i])
                    sb.Append("1");
                else
                    sb.Append("0");
            return sb.ToString();
        }
    }
}
vote_ok
von hollst (12020 Punkte) - 07.02.2020 um 08:53 Uhr
Quellcode ausblenden C#-Code
using System;
using static System.Console;

namespace aufgabe_279_loesung_in_kurzform   {
    class Program    {
        static void Main()        {
            int sinanoz05_algorithm(int feinde) => (int)Math.Sqrt(feinde);
            const int anzahl_feinde = 100;
            WriteLine($"anzahl feine: {anzahl_feinde,5} offene türen: {sinanoz05_algorithm(anzahl_feinde),5}");
            ReadKey();
        }
    }
}
vote_ok
von PuZZleS (140 Punkte) - 17.02.2020 um 16:32 Uhr
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TYP_Aufgabe_279
{
    class Program
    {
        static void Main(string[] args)
        {
            Kriegsgefangene Gefangene = new Kriegsgefangene();
            System.Console.WriteLine("Es werden heute {0} Gefangene freigelassen!", Gefangene.Freigelassen );
            System.Console.ReadKey();
            //Ausgabe 10 Gefangene werden freigelassen!"
        }
    }
}


Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TYP_Aufgabe_279
{
    public class Kriegsgefangene
    {
        private int offeneZellenTüren;
        private const int anzahlZellen = 100;
        private bool[] Gefangene = new bool[anzahlZellen];

        public int Freigelassen
        {
            get
            {
                this.FreilassungDurchführen();
                return offeneZellenTüren;
            }
        }

        private void FreilassungDurchführen()
        { 
            for (int i = 0; i < Gefangene.Length; i++)
            {                
                for (int j = 0; j < Gefangene.Length; j++)
                {
                   j += i;
                   if (j > anzahlZellen) { break; }
                   Gefangene[j] = öffnen_schließen(Gefangene[j]);
                }
            }
            offeneZellenTüren = geöffneteZellenAusgeben();
        }

	    private bool öffnen_schließen(bool zellenTür)
        {            
            if (zellenTür == true) { zellenTür = false; }
            else { zellenTür = true;}
            return zellenTür;
        }

        private int offeneTürenZählen()
        {
            int offen = 0;
            for (int i = 0; i < Gefangene.Length; i++)
            {
                if (Gefangene[i] == true) { ++offen; }
            }
            return offen;
        }

        private int geöffneteZellenAusgeben()
        {
            int offeneZellenTüren = offeneTürenZählen();
            return offeneZellenTüren;
        }
    }
}