Labo 1 Programmeren II L. Schoofs
K. van Assche
Voor de OA Labo Programmeren II programmeren we in C# en met Microsoft Visual Studio 2005 als ontwikkelomgeving (voorlopig beta2). Deze IDE maakt gebruik van Microsoft .NET Framework SDK v2.0. In eerste instantie zullen we een paar C# programmaatjes beschouwen zonder gebruik te maken van de Visual Studio omgeving. Vervolgens zullen we gebruik maken van de ontwikkelomgeving.
Kennismaking met de C# compiler van Microsoft. 1. Eerste C# programma: HalloWereld Volg de instructies van je cursus (hoofdstuk 1.2) Opmerking: De compiler csc.exe bevindt zich normaliter in folder C:\WINDOWS\Microsoft.NET\Framework\v2.0.50215 Je kan ervoor opteren om het pad op te nemen in de PATH environment variabele, zodat je niet telkens het pad expliciet moet vermelden in je DOS prompt. Een handig alternatief is om de voorziene SDK Command Prompt te gebruiken: Start > Alle Programma’s > Microsoft .NET Framework SDK v2.0 > SDK Command Prompt 2. Maak een programma dat je naam 10 keer op het scherm drukt. Je naam moet gestockeerd worden in een constante. Wat je hierbij moet weten is dat static final in java overeenkomt met const in C#. Vergeet niet in je hoofdprogramma een object aan te maken waarvan je een methode oproept om je naam te drukken. Schrijf aan het begin van je programma de nodige XML-documentatie. Dit doe je op de volgende manier: 1
• Op elke regel van je documentatie schrijf je drie (3) slashen /// • Schrijf twee XML-tags: <summary> en • Tussen de tags schrijf je een korte samenvatting van je programma. Consulteer je cursus voor bijkomende informatie (hoofdstuk 1.4) 3. Schrijf 2 testprogramma’s die het gemiddelde van gehele getallen bepalen. Het eerste programma doet dit voor 20 random gegenereerde getallen met waarde tussen 0 en 10. Het tweede programma doet dit voor 5 gehele getallen die ingelezen worden door de gebruiker. Let hierbij op het volgende: • Het inlezen van gegevens van het toetsenbord doe je aan de hand van Console.ReadLine(). Deze statische methode geeft een string terug. string s = Console.ReadLine(); • Het converteren van een string naar een int doe je aan de hand van het volgende statement: int i = int.Parse(s); • Het genereren van een random nummer tussen 0 en 10 doe je aan de hand van volgende statements: private Random random = new Random(); int nummer = random.Next(0,10); Voorzie een centrale klasse (Gemiddelde) die de logica bevat om van een set getallen het gemiddelde te berekenen. Maak vervolgens de 2 gevraagde testprogramma’s (TestGemiddelde en TestUserGemiddelde) die de centrale klasse gebruiken. Voorzie in elke klasse XML documentatie. • Compileer de code en voer uit: K:\>csc TestGemiddelde.cs Gemiddelde.cs K:\>TestGemiddelde.exe K:\>csc TestUserGemiddelde.cs Gemiddelde.cs K:\>TestUserGemiddelde.exe
2
Kennismaking Visual C#.NET IDE van Microsoft. Opstarten van de IDE kan als volgt: Start > Alle Programma’s > Microsoft Visual Studio 2005 beta2 > Microsoft Visual Studio 2005 beta2 In de labo’s is normaliter een shortcut op je desktop voorzien. 4. Een bestaande toepassing (Solitaire) inladen, compileren en uitvoeren: Maak in Visual Studio eerst een nieuw project aan: • Menu: File > New Project • In de New Project Dialog box, kies: Visual C# Windows (links) en Empty Project (rechts) • Wijzig de naam Project1 naar Solitaire • Wijzig de locatie naar een folder op je K-schijf (daar waar je alle programmeren II code zal onderbrengen). Importeer nu het Solitaire labo (cfr. Modeloplossing 1ICT): • Menu: Project > Add Existing Item • In de Add Existing Item Dialog box, selecteer: Solitaire.java. (Stream.java zal je niet nodig hebben.) Hernoem je bestand naar Solitaire.cs (in Solution explorer venster) Door te dubbelklikken op Solitaire.cs in het ’Solution Explorer’ venster, kan je nu de broncode bekijken. In het ’Code View venster’ kan je blokken code samentrekken of opnieuw uitrekken (grijze + en - tekens). Zo kan je in 1 oogopslag zien dat de code uit volgende 3 klassen bestaat : • class Positie • class SpelBord • public class Solitaire Een overzicht van de velden, constructoren en methoden bekom je met de class view (Menu : View > Class View). Een grafische voorstelling verkrijg je door in solution venster voor het project View Class Diagram) te kiezen : Compileer nu even je programma : 3
Figuur 1: Overzicht van de character classes • Menu: Build > Build Solution (of functietoets F6) Je merkt dat een aantal aanpassingen zijn vereist om te komen tot een werkend C# programma: • main wordt Main • System.out.println wordt Console.WriteLine • System.out.print wordt Console.Write • in.readString wordt Console.Read (declaratie van variabele in van type Stream mag verwijderd worden) • clausule throws IOException mag verwijderd worden uit Main • boolean wordt bool • static final wordt const • String wordt string. • Math.abs wordt Math.Abs. • toUpperCase wordt ToUpper. • equals wordt == (om strings te vergelijken). • random.nextInt wordt random.Next. • Wijzig de syntax voor tweedimensionele rijen : [][] wordt [,] (zowel bij declaratie als in gebruik). 4
• Om i-de karakter in een string te bekomen gebruik je nu een indexer: naam.charAt(i) wordt naam[i] • Vervang de import statements door using System; using System.Text.RegularExpressions; De System namespace leest een aantal basisstructuren van C# in) en . De namespace voor reguliere expressies is te vinden in klassebibliotheek System.dll. Deze bibliotheek voeg je toe aan je project via de optie Add References In het popup venster ga je op zoek naar betreffende .NET component. Vervang : return Pattern.matches(pattern, zet); door : Regex regex = new Regex(pattern); return regex.IsMatch(zet); • Ter vervanging van de String.valueOf() statements doe je de omzetting van char naar string en van int naar string als volgt: string s2 = char.ToString(c)); string s1 = i.ToString(); Compilatie zou hiermee in orde moeten zijn. Je moet echter nog ´e´en aanpassing doorvoeren in je programma om correcte uitvoer op je console te komen: • public override string ToString() gebruiken in klasse Positie 5. Integreer de eerder geschreven testprogramma’s TestGemiddelde en TestUserGemiddelde in Visual Studio. Je kan ervoor opteren op 2 afzonderlijke solutions aan te maken. Het is echter mogelijk om alles in 1 solution te doen, zo vermijd je dupplicatie van de gemeenschappelijke klasse Gemiddelde: In de Visual Studio Solution maak je 3 projecten aan: • een klassebibliotheek voor de centrale klasse (>> Gemiddelde.dll) • een console applicatie voor het random testprogramma (>> TestGemiddelde.exe) • een tweede console applicatie voor testprogramma met gebruikersingave (>> TestUserGemiddelde.exe) 5
Laat elke van deze testprojecten de gemeenschappelijke bibliotheek dll gebruiken (project > add references). Via de solution explorer kan je beslissen welk testproject het actieve is: Set as Startup Project. 6. Als verdere kennismaking met C# gaan we het programma Router omzetten van java naar C#. • Download de java code van toledo en zet ze op je k-schijf. • Open de commandolijn, compileer het Router programma en verifieer de werking : K:\> javac Router.java K:\> java Router 556.028.717.445 223.601.443.913 652.136.807.060 279.439.120.500 404.424.455.786 ...
-
data data data data data
d d d a a
-
2 1 3 0 3
-
2 3 1 4 1
-
0 0 0 1 1
• Neem de 6 bestanden binnen in een nieuwe C# solution (console toepassing). • Hernoem alle .java bestanden naar .cs bestanden: Invoer.cs Pakket.cs Router.cs Scheduler.cs Tabel.cs Uitvoer.cs Hieronder geven we aanwijzingen om de conversie tot een goed einde te brengen. Er wordt bij sommige punten slechts summier uitleg gegeven, vermits ze later in de theorie uitvoerig beschreven zullen worden. Let tijdens het veranderen op de omringende code, zodat je de gelijkenissen tussen C# en java ineens meepikt. (a) Schrijf aan het begin van elk bestand: using System; Dit leest een aantal basisstructuren van C# in. Aan het begin van het bestand Pakket.cs verwijder je het import statement en vervang je het door using System.Text;.
6
(b) Verander overal het type String in het type string. De hoofdletter moet dus een kleine letter worden. (c) Verander alle constanten (static final) naar const. Laat hierbij het type en de access modifier onveranderd. Doe dit overal, behalve voor het veld DATA in het bestand Invoer.cs. Daar schrijf je het volgende: public static string[] DATA = new string[4]{"data a", ... }; (d) Verander in alle bestanden het opvragen van de lengte van een rij door .Length i.p.v. .length. (e) Kijk in alle bestanden na of de haakjes van de rijen na het type komen en niet na de identifier. (f) Verander de naam van het hoofdprogramma van main naar Main (in het bestand Router.cs). (g) Verander in het bestand Invoer.cs alle Math.random statements door random.NextDouble(). Zorg ervoor dat je een veld hebt met de naam random, waarin je een object stockeert van het type Random: private random = new Random(); Doe dit ook in het bestand Uitvoer.cs. (h) Verander in het bestand Uitvoer.cs het statement System.out.println naar Console.WriteLine. Hiermee druk je tekst op het scherm. Het argument pakket moet nu expliciet de methode tostring() (kleine letters) oproepen (vergeet dit niet te veranderen, anders worden er rare dingen op het scherm gedrukt). (i) Verander in het bestand Pakket.cs de naam van StringBuffer naar StringBuilder. De functionaliteit van beide klassen is gelijkaardig. Pas de naam van append aan en schrijf het overal met een hoofdletter. Verander in het return statement toString naar ToString. (j) Verander in het bestand Pakket.cs de eerste constructor naar de volgende signatuur. Laat hierbij de parameters onveranderd: public Pakket(...): this(...) { (k) Verander in het bestand Scheduler.cs de dubbele rij [][] in [,]. Doe dit voor de declaratie, maar ook voor het gebruik van de tweedimensionale rij. 7
(l) In het bestand Scheduler.cs verander je het type byte naar sbyte in alle statements waar queueTeller wordt gebruikt. Indien er geen type in het statement voorkomt, moet je niets veranderen. Het type byte kan geen negatieve getallen stockeren, sbyte wel. De s staat dan ook voor signed. (m) In het bestand Tabel.cs moet je overal de equals() methode vervangen door ==. Dit zijn de string-vergelijkingen. (n) Compileer de code met het volgende commando: K:\>csc Router.cs Pakket.cs Invoer.cs Uitvoer.cs Tabel.cs Scheduler.cs
Indien er nog fouten optreden, moet je die eerst oplossen. (o) Voer de code uit: K:\>Router.exe. Je zou een uitvoer moeten krijgen die er ongeveer als volgt uit ziet. Doorloop de code en maak een kort verslag van de grootste structurele overeenkomsten tussen C# en Java.
8