You are on page 1of 19

Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆.

Αδαµόπουλος

Ασκήσεις – Γλώσσα Προγραµµατισµού C#

Κατανεµηµένη Αντικειµενοστρεφής Τεχνολογία Ιανουάριος 2004


Τµήµα ∆ιδακτικής της Τεχνολογίας & Ψηφιακών Συστηµάτων

∆ρ. ∆. Αδαµόπουλος

Άσκηση 1

Να γραφτεί ένα πρόγραµµα που να εµφανίζει στην οθόνη “Hello World”.

Απάντηση

class HelloWorld
{
public static void Main()
{
System.Console.WriteLine(“Hello World”);
}
}

Παρατηρήσεις:

Όπως φαίνεται από την εντολή:

System.Console.WriteLine(“Hello World”);

η WriteLine είναι µια στατική µέθοδος του αντικειµένου Console. Το System είναι ο χώρος ονοµάτων
(namespace) µέσα στον οποίο περιέχεται το αντικείµενο Console. Επειδή δεν είναι πρακτικό να
αναγράφετε σε κάθε κλήση µιας µεθόδου όπως η WriteLine ο χώρος ονοµάτων, ο πιο πάνω κώδικας
µπορεί να αποκτήσει τη µορφή:

using System;

class HelloWorld
{
public static void Main()
{
Console.WriteLine(“Hello World”);
}
}

Άσκηση 2

Γράψτε ένα πρόγραµµα που να διαβάζει το όνοµα του χρήστη και να τυπώνει ένα προσαρµοσµένο στο
όνοµα του χρήστη “Hello” µήνυµα.

1
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

Απάντηση

using System;

class ΙnputOutput
{
public static void Main()
{
Console.Write(“Please enter your name: ”);
String strName = Console.ReadLine();
Console.WriteLine(“Hello “ + strName);
}
}

Άσκηση 3

Γράψτε το πιο πάνω πρόγραµµα χρησιµοποιώντας για την εµφάνιση του ονόµατος του χρήστη µια
συµβολοσειρά µε διάταξη.

Απάντηση

using System;

class ΙnputOutput
{
public static void Main()
{
Console.Write(“Please enter your name: ”);
String strName = Console.ReadLine();
Console.WriteLine(“Hello {0}“, strName);
}
}

Παρατηρήσεις:

Η συµβολοσειρά µε διάταξη είναι η “Hello {0}“.

Το {0} αντικαθίσταται µε την πρώτη µεταβλητή που ακολουθεί τη συµβολοσειρά σε διάταξη στη λίστα
ορισµάτων της µεθόδου WriteLine. Μπορούν να διαταχτούν µέχρι τρεις µεταβλητές µε αυτή την τεχνική,
όπως για παράδειγµα:

Console.WriteLine(“Hello {0} {1}, from {2}”, strFirstname, strLastname,


strCity);

Επισηµαίνεται ότι δεν υπάρχει περιορισµός για την παράθεση µόνο µεταβλητών συµβολοσειράς. Μπορεί
να χρησιµοποιηθεί οποιοσδήποτε τύπος δεδοµένων.

Tύποι Απαρίθµησης

Όταν είναι επιθυµητό να οριστεί ένας διακριτός τύπος που αποτελείται από ένα σύνολο από ονοµαστικές
τιµές, χρησιµοποιείται ο τύπος απαρίθµησης που ορίζεται από τη λέξη κλειδί enum. Ένα απλό παράδειγµα
είναι το εξής:

2
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

enum MonthNames { January, February, March, April };

Επισηµαίνεται ότι τα στοιχεία της απαρίθµησης είναι τύπου int και το πρώτο στοιχείο έχει την τιµή 0.
Κάθε επόµενο στοιχείο έχει τιµή που αυξάνεται κατά 1. Για να οριστεί µια συγκεκριµένη τιµή για το πρώτο
στοιχείο, πρέπει να τεθεί η τιµή του σε 1:

enum MonthNames { January=1, February, March, April };

Για να οριστούν αυθαίρετες τιµές σε κάθε στοιχείο (ακόµα και διπλές τιµές):

enum MonthNames { January=31, February=28, March=31, April=30 };

Η τελευταία επιλογή πρέπει να είναι τύπος δεδοµένων διαφορετικός από int:

enum MonthNames : byte { January=31, February=28, March=31, April=30 };

Οι τύποι δεδοµένων που µπορούν να οριστούν περιορίζονται σε long, int, short και byte.

Tύποι Αναφοράς

Σε αντίθεση µε τους τύπους τιµής, οι τύποι αναφοράς δεν αποθηκεύουν τα πραγµατικά δεδοµένα, αλλά
µια αναφορά στα πραγµατικά δεδοµένα. Τέτοιοι τύποι είναι οι κλάσεις, ο τύπος string (συµβολοσειρές)
και οι πίνακες.

Ο τύπος string

H C# παρέχει ένα βασικό τύπο string για το χειρισµό δεδοµένων συµβολοσειρών.

Η χρήση του είναι ως εξής:

string myString = “some text”;

Η ένωση συµβολοσειρών γίνεται ως εξής:

string myString = “some text” + “ and a bit more”;

Για την προσπέλαση ενός χαρακτήρα, χρησιµοποιείται ο κατάλληλος δείκτης:

char chFirst = myString[0];

Η σύγκριση δύο συµβολοσειρών για ισότητα γίνεται µε χρήση του τελεστή ελέγχου ισότητας:

if (myString == yourString) ...

Πίνακες

Ένας πίνακας (array) περιέχει µεταβλητές που προσπελαύνονται µέσω δεικτών. Όλες οι µεταβλητές που
περιέχονται σε έναν πίνακα (ονοµάζονται στοιχεία του πίνακα) πρέπει να είναι του ίδιου τύπου. Μπορεί για
το σκοπό αυτό να χρησιµοποιηθεί οποιοσδήποτε τύπος.

3
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

Οι διαστάσεις ενός πίνακα ονοµάζονται τάξη και καθορίζει τον αριθµό από δείκτες που σχετίζονται µε το
κάθε στοιχείο. Ο πιο συνηθισµένος πίνακας είναι ο µονοδιάστατος πίνακας (τάξη ένα). Ένας πολλαπλών
διαστάσεων πίνακας έχει τάξη µεγαλύτερη από ένα. Ο δείκτης της κάθε διάστασης έχει τιµή που ξεκινάει
από µηδέν και φθάνει µέχρι το µήκος της διάστασης µείον ένα.

Η αρχικοποίηση ενός πίνακα γίνεται ως εξής:

string[] arrLanguages = { “C”. “C++”, “C#” };

Αυτό είναι συντόµευση για το:

arrLanguages[0]=”C”; arrLanguages[1]=”C++”; arrLanguages[2]=”C#”;

To ίδιο ισχύει και για πίνακες πολλών διαστάσεων

ïnt[ , ] arr = {{0,1}, {2,3}, {4,5}};

Αυτό είναι συντόµευση για το:

arr[0,0] = 0; arr[0,1] = 1;
arr[1,0] = 2; arr[1,1] = 3;
arr[2,0] = 4; arr[2,1] = 5;

Αν δεν είναι επιθυµητό να αρχικοποιηθεί ένας πίνακας µέχρι τέλους, αλλά είναι γνωστές οι διαστάσεις
του, η δήλωση είναι η εξής:

int[ , ] myArr = new int[5,3];

Αν το µέγεθος του πίνακα πρέπει να υπολογιστεί δυναµικά, η δήλωση για τη δηµιουργία του πίνακα
γίνεται:

int nVar = 5;
int[] arrToo = new int[nVar];

Κλάσεις

Μια κλάση αποτελείται από ιδιοχαρακτηριστικά (δεδοµένα) και από µεθόδους (λειτουργίες). Τα
ιδιοχαρακτηριστικά και οι µέθοδοι µιας κλάσης µπορεί, είτε να είναι προσβάσιµοι από παντού (οπότε πριν
από το όνοµά τους χρησιµοποιείται η λέξη κλειδί public), είτε να είναι προσβάσιµοι µόνο από το
εσωτερικό της κλάσης (οπότε πριν από το όνοµά τους χρησιµοποιείται η λέξη κλειδί private).

Kάθε κλάση πρέπει να έχει έναν δηµιουργό (constructor), που είναι µια ειδικού τύπου µέθοδος που δίνει
αρχικές τιµές στα ιδιοχαρακτηριστικά της κλάσης. Η µέθοδος αυτή έχει πάντα το ίδιο όνοµα µε την κλάση,
δεν έχει κάποιο τύπο δεδοµένων ως επιστροφή και είναι public:

class TestClass
{
public TestClass()
{
Κώδικας αρχικοποίησης για ιδιοχαρακτηριστικά, κ.λπ.
}
}

Αν δεν ορίσει ο προγραµµατιστής ένα δηµιουργό, τότε δηµιουργείται ένας αυτόµατα από το
µεταγλωττιστή.

4
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

Άσκηση 4

Γράψτε ένα απλό πρόγραµµα που να υπολογίζει το τετράγωνο ενός αριθµού. Τη σχετική λειτουργία
πρέπει να την εκτελεί κατάλληλη µέθοδος µιας κλάσης. Χρησιµοποιείστε µια in παράµετρο για να περάσετε
µια τιµή στη µέθοδο αυτή. Επισηµαίνεται ότι στην περίπτωση αυτή η µεταβλητή της µεθόδου αρχικοποιείται
µε ένα αντίγραφο της τιµής.

Απάντηση

using System;

public class SquareSample


{
public int CalcSquare(int nSideLength)
{
return nSideLength*nSideLength;
}
}

class SquareApp
{
public static void Main()
{
SquareSample sq = new SquareSample();
Console.WriteLine(sq.CalcSquare(25).ToString());
}
}

Άσκηση 5

Γράψτε ένα απλό πρόγραµµα που να υπολογίζει το τετράγωνο ενός αριθµού. Τη σχετική λειτουργία
πρέπει να την εκτελεί κατάλληλη µέθοδος µιας κλάσης. Χρησιµοποιείστε µια ref παράµετρο (παράµετρο
αναφοράς) για να περάσετε µια αναφορά (διεύθυνση µνήµης) στη µέθοδο αυτή.

Απάντηση

// class SquareSample
using System;

public class SquareSample


{
public void CalcSquare(ref int nOne4All)
{
nOne4All *= nOne4All;
}
}

class SquareApp
{
public static void Main()
{
SquareSample sq = new SquareSample();

int nSquaredRef = 20; // must be initialized


sq.CalcSquare(ref nSquaredRef);
Console.WriteLine(nSquaredRef.ToString());
}
}

5
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

Άσκηση 6

Γράψτε ένα απλό πρόγραµµα που να υπολογίζει το τετράγωνο ενός αριθµού. Τη σχετική λειτουργία
πρέπει να την εκτελεί κατάλληλη µέθοδος µιας κλάσης. Χρησιµοποιείστε µια out παράµετρο για να
περάσετε το αποτέλεσµα πίσω από τη µέθοδο αυτή στο κυρίως πρόγραµµα.

Απάντηση

using System;

public class SquareSample


{
public void CalcSquare(int nSideLength, out int nSquared)
{
nSquared = nSideLength * nSideLength;
}
}

class SquareApp
{
public static void Main()
{
SquareSample sq = new SquareSample();

int nSquared; // need not be initialized


sq.CalcSquare(15, out nSquared);
Console.WriteLine(nSquared.ToString());
}
}

Σε µια δοµή ιεραρχίας µια κλάση (παραγόµενη κλάση) είναι δυνατόν να παράγεται (να κληρονοµεί) µια
άλλη κλάση (κλάση βάσης). Στην περίπτωση αυτή, η παραγόµενη κλάση κληρονοµεί όλα τα
χαρακτηριστικά (ιδιοχαρακτηριστικά και µεθόδους) της κλάσης βάσης. Η παραγόµενη κλάση µπορεί να
ξαναορίσει (υπερκαλύψει) µεθόδους της κλάσης βάσης, όταν ο προγραµµατιστής της κλάσης βάσης έχει
σχεδιάσει αυτή τη µέθοδο για υπερκάλυψη. Αυτό µπορεί να γίνει χρησιµοποιώντας της λέξη κλειδί
virtual:

virtual void CanBeOverridden()

Στην περίπτωση αυτή, στην παραγόµενη κλάση χρησιµοποιείται η λέξη κλειδί override:

override void CanBeOverridden()

Άσκηση 7

∆ηµιουργείστε µια κλάση βάσης Triangle που παριστάνει ένα τρίγωνο. Η κλάση αυτή να έχει µια
µέθοδο για τον υπολογισµό της επιφάνειας ενός τριγώνου (ComputeArea), η οποία να µπορεί να
υπερκαλυφθεί.

Απάντηση

using System;

class Triangle
{
public virtual double ComputeArea(int a, int b, int c)

6
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

{
// Heronian formula
double s = (a + b + c) / 2.0;
double dArea = Math.Sqrt(s*(s-a)*(s-b)*(s-c));
return dArea;
}
}

class RightAngledTriangle:Triangle
{
public override double ComputeArea(int a, int b, int c)
{
double dArea = a*b/2.0;
return dArea;
}
}

class TriangleTestApp
{
public static void Main()
{
Triangle tri = new Triangle();
Console.WriteLine(tri.ComputeArea(2, 5, 6));

RightAngledTriangle rat = new RightAngledTriangle();


Console.WriteLine(rat.ComputeArea(3, 4, 5));
}
}

Παρατήρηση:

Στην εντολή:

class RightAngledTriangle : Triangle

οι άνω κάτω τελείες (:) στη δήλωση της κλάσης δείχνουν ότι η κλάση RightAngledTriangle παράγεται
από την κλάση Triangle.

Άσκηση 8

Ένας διαφορετικός τρόπος για τον επαναπροσδιορισµό µεθόδων είναι η απόκρυψη των µεθόδων της
βασικής κλάσης. Αυτό το χαρακτηριστικό είναι ιδιαίτερα χρήσιµο όταν η παραγόµενη κλάση παράγεται από
µία κλάση που έχει φτιαχτεί από κάποιον άλλο. Για το σκοπό αυτό χρησιµοποιείται η λέξη κλειδί new.

Γράψτε ένα απλό πρόγραµµα που να επιδεικνύει αυτό τον τρόπο επαναπροσδιορισµού µιας µεθόδου.

Απάντηση

class BaseClass
{
public void TestMethod()
{
Console.WriteLine("BaseClass::TestMethod");
}
}

class DerivedClass:BaseClass
{

7
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

new public void TestMethod()


{
Console.WriteLine("DerivedClass::TestMethod");
}
}
class TestApp
{
public static void Main()
{
DerivedClass test = new DerivedClass();
Test.TestMethod(); // Χρήση της DerivedClass
((BaseClass) test).TestMethod(); // Χρήση της BaseClass
}
}

Άσκηση 9

Τα ιδιοχαρακτηριστικά µιας κλάσης συνήθως (σχεδόν πάντα σε κατανεµηµένες αντικειµενοστρεφείς


εφαρµογές) είναι ιδιωτικά (private) για λόγους ασφαλείας. Στην περίπτωση αυτή αποκτάται πρόσβαση σε
αυτά µέσω κατάλληλων µεθόδων πρόσβασης.

Οι µέθοδοι πρόσβασεις είναι εντολές που εκτελούνται όταν είναι επιθυµητό να διαβαστεί ή να γραφτεί η
τιµή ενός ιδιοχαρακτηριστικού. Η µέθοδος πρόσβασης για το διάβασµα της τιµής ενός ιδιοχαρακτηριστικού
προσδιορίζεται µε τη λέξη κλειδί get, ενώ η µέθοδος πρόσβασης για την αλλαγή της τιµής ενός
ιδιοχαρακτηριστικού προσδιορίζεται µε τη λέξη κλειδί set.

Γράψτε ένα απλό πρόγραµµα που να επιδεικνύει αυτές τις δύο µεθόδους πρόσβασης.

Απάντηση

using System;

public class House


{
private int m_nSqFeet;

public int SquareFeet


{
get { return m_nSqFeet; }
set { m_nSqFeet = value; }
}
}
class TestApp
{
public static void Main()
{
House myHouse = new House();
myHouse.SquareFeet = 250;
Console.WriteLine(myHouse.SquareFeet);
}
}

Άσκηση 10
Γράψτε ένα πρόγραµµα που να προσδιορίζει πότε το πρώτο όρισµα που περνιέται στην εφαρµογή αρχίζει
µε κεφαλαίο γράµµα, πότε µε µικρό γράµµα και πότε µε ψηφίο.
8
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

Απάντηση

using System;

class NestedIfApp
{
public static int Main(string[] args)
{
if (args.Length != 1)
{
Console.WriteLine("Usage: one argument");
return 1; // error level
}

char chLetter = args[0][0];

if (chLetter >= 'A')


if (chLetter <= 'Z')
{
Console.WriteLine("{0} is uppercase",chLetter);
return 0;
}

chLetter = Char.FromString(args[0]);
if (chLetter >= 'a' && chLetter <= 'z')
Console.WriteLine("{0} is lowercase",chLetter);

if (Char.IsDigit((chLetter = args[0][0])))
Console.WriteLine("{0} is a digit",chLetter);

return 0;
}
}

Άσκηση 11

Γράψτε ένα πρόγραµµα που να χρησιµοποιεί µια εντολή switch για την εµφάνιση των ηµερών ανά µήνα
(αγνοώντας τα δίσεκτα έτη).

Απάντηση:

using System;

class FallThrough
{
public static void Main(string[] args)
{
if (args.Length != 1) return;

int nMonth = Int32.Parse(args[0]);


if (nMonth < 1 || nMonth > 12) return;
int nDays = 0;

switch (nMonth)
{
case 2: nDays = 28; break;
case 4:
case 6:
case 9:

9
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

case 11: nDays = 30; break;


default: nDays = 31;
}
Console.WriteLine("{0} days in this month",nDays);
}
}

Άσκηση 12

Γράψτε ένα πρόγραµµα που να υπολογίζει το παραγοντικό ενός αριθµού χρησιµοποιώντας µια εντολή
for.

Απάντηση

using System;

class Factorial
{
public static void Main(string[] args)
{
long nFactorial = 1;
long nComputeTo = Int64.Parse(args[0]);

long nCurDig = 1;
for (nCurDig=1;nCurDig <= nComputeTo; nCurDig++)
nFactorial *= nCurDig;

Console.WriteLine("{0}! is {1}",nComputeTo, nFactorial);


}
}

Άσκηση 13

Γράψτε ένα πρόγραµµα που να εµφανίζει τα περιεχόµενα ενός αρχείου πηγαίου κώδικα σε C# στην
οθόνη.

Απάντηση

using System;
using System.IO;

class WhileDemoApp
{
public static void Main()
{
StreamReader sr = File.OpenText ("whilesample.cs");
String strLine = null;

while (null != (strLine = sr.ReadLine()))


{
Console.WriteLine(strLine);
}

sr.Close();
}
}

10
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

Άσκηση 14

Γράψτε ένα πρόγραµµα που να ζητάει έναν ή περισσότερους αριθµούς από το χρήστη και να υπολογίζει
το µέσο όρο τους.

Απάντηση

: using System;

class ComputeAverageApp
{
public static void Main()
{
ComputeAverageApp theApp = new ComputeAverageApp();
theApp.Run();
}

public void Run()


{
double dValue = 0;
double dSum = 0;
int nNoOfValues = 0;
char chContinue = 'y';
string strInput;

do
{
Console.Write("Enter a value: ");
strInput = Console.ReadLine();
dValue = Double.Parse(strInput);
dSum += dValue;
nNoOfValues++;
Console.Write("Read another value?");

strInput = Console.ReadLine();
chContinue = Char.FromString(strInput);
}
while ('y' == chContinue);

Console.WriteLine("The average is {0}",dSum / nNoOfValues);


}
}

Άσκηση 15

Γράψτε ένα πρόγραµµα που να ταξινοµεί έναν πίνακα ακέραιων αριθµών, έτσι ώστε οι αριθµοί να είναι
τοποθετηµένοι στον πίνακα σε αύξουσα σειρά.

Απάντηση

Ο αλγόριθµος βασίζεται στην εξέταση όλων των στοιχείων του πίνακα µέχρι να βρεθεί ο µικρότερος
ακέραιος αριθµός, ο οποίος και τοποθετείται στην αρχή του πίνακα.

public class Exercise


{
public static void Main()
{
int[] contents = {22, 45, 6, 12, 88, 3, 19, 300};

11
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

int min, minIndex, temp;

for (int i = 0;i<contents.Length;i++)


{
min = contents[i];
minIndex = i;
for (int j =i+1;j<contents.Length;j++)
if(contents[j]<min)
{
min = contents[j];
minIndex = j;
}
temp = contents[i];
contents[i] = min;
contents[minIndex] = temp;
}

//Code to display sorted array


Console.WriteLine("After sorting the array contains");
for(int i =0;i<contents.Length;i++)
{
Console.WriteLine(contents[i]);
}
}
}

Άσκηση 16

Τροποποιείστε το πιο πάνω πρόγραµµα ώστε οι αριθµοί να τοποθετούνται στον πίνακα σε φθίνουσα
σειρά.

Απάντηση

public class Exercise


{
public static void Main()
{
int[] contents = {22, 45, 6, 12, 88, 3, 19, 300};
int max, minIndex, temp;

for (int i = 0;i<contents.Length;i++)


{
max = contents[i];
minIndex = i;
for (int j =i+1;j<contents.Length;j++)
if(contents[j]>max)
{
max = contents[j];
minIndex = j;
}
temp = contents[i];
contents[i] = max;
contents[minIndex] = temp;
}

//Code to display sorted array


Console.WriteLine("After sorting the array contains");
for(int i =0;i<contents.Length;i++)
{

12
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

Console.WriteLine(contents[i]);
}
}
}

Άσκηση 17

Γράψτε ένα πρόγραµµα που να επεξεργάζεται έναν πίνακα ακέραιων αριθµών και να τοποθετεί αυτούς
που είναι µικρότεροι του 60 σε έναν άλλο πίνακα.

Απάντηση

public class Exercise


{

public static void Main(String[] args)


{

int[] data = {23, 45,100,2, 44, 67, 100};


int[] receiver = new int[7];
//Insert code here which places in receiver
//all those int value less than 60
int counter =0, receiveCount =0;
while(counter <data.Length)
{
if(data[counter]<60)
{
receiver[receiveCount] = data[counter];
receiveCount++;
}
counter++;
}
//Display receiver
Console.WriteLine("results");
for(int i = 0;i<receiveCount;i++)
{
Console.WriteLine(receiver[i]);
}
}

Άσκηση 18

Γράψτε ένα πρόγραµµα που να συνενώνει (merge) δύο πίνακες ακέραιων αριθµών, δηµιουργώντας έναν
τρίτο πίνακα. Οι δύο αρχικοί πίνακες, αλλά και ο τελικός που δηµιουργείται είναι ταξινοµηµένοι.

Απάντηση

public class Exercise


{
public static void Main(string[] args)
{
//Merge the contents of first and second into destination

13
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

//Assume no duplicates occur in first and second and


//between first and second

int[] first = {1, 3, 8, 19, 55, 100};


int[] second = {2, 11, 31, 58, 119, 155, 1100};
int[] destination = new int[50];//Assume no more than 50 ints

int firstIndex =0, secondIndex =0, count =0;


//Loop around comparing entries
while (firstIndex<first.Length && secondIndex<second.Length)
{
if(first[firstIndex]<second[secondIndex])
{
destination[count] = first[firstIndex];
count++;
firstIndex++;
}
else
{
destination[count] = second[secondIndex];
count++;
secondIndex++;
}
}
//Clear any remaining elements from first
while(firstIndex<first.Length)
{
destination[count] = first[firstIndex];
firstIndex++;
count++;
}

//Clear any remaining elements from second

while(secondIndex<second.Length)
{
destination[count] = second[secondIndex];
secondIndex++;
count++;
}
Console.WriteLine("results");
for(int j =0;j<count;j++)
{
Console.WriteLine(destination[j]);
}

}
}

Άσκηση 19

∆ίνεται η πιο κάτω κλάση SimpleVar, η οποία έχει ένα ιδιοχαρακτηριστικό (var). Να προσθέσετε στην
κλάση αυτή δύο (2) νέες µεθόδους, έτσι ώστε η πρώτη µέθοδος (zero) να µηδενίζει το ιδιοχαρακτηριστικό
της κλάσης και η δεύτερη µέθοδος (positive) να επιστρέφει true αν το ιδιοχαρακτηριστικό της κλάσης
έχει θετική τιµή.

public class SimpleVar


{
private int var;
public void increment()

14
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

{
var++;
}

public void decrement()


{
var--;
}

public int getVar()


{
return var;
}
//Code goes here
public static void Main()
{
//Test code goes here
}

Απάντηση

public class SimpleVar


{
private int var;

public void increment()


{
var++;
}

public void decrement()


{
var--;
}

public int getVar()


{
return var;
}
public void zero() {
var =0;
}
public bool positive()
{
//Assume that positive means > 0
return var>0;
}

public static void Main()


{
//Test code goes here
}
}
}

Άσκηση 20

Γράψτε µια κλάση που να προσοµοιώνει έναν ανελκυστήρα (Lift). Η κλάση αυτή έχει δύο (2)
ιδιοχαρακτηριστικά. Το πρώτο είναι το liftPosition που φανερώνει σε ποιό όροφο βρίσκεται ο

15
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

ανελκυστήρας. Το δεύτερο είναι το top που παριστάνει τον τελευταίο (ανώτερο) όροφο. Οι µέθοδοι που
έχει η κλάση είναι οι εξής:

• upOneFloor: Mεταφέρει τον ανελκυστήρα έναν όροφο πιο πάνω, εκτός κι αν αυτός βρίσκεται ήδη στον
τελευταίο όροφο.
• downOneFloor: Μεταφέρει τον ανελκυστήρα έναν όροφο πιο κάτω, εκτός κι αν αυτός βρίσκεται ήδη
στον κατώτερο.
• getPosition: Επιστρέφει έναν ακέραιο αριθµό που παριστάνει τον αριθµό του ορόφου που βρίσκεται ο
ανελκυστήρας.

Αν ζητηθεί από τον ανελκυστήρα να µετακινηθεί σε κάποια αδύνατη θέση, τότε η αίτηση αυτή θα πρέπει
να αγνοείται.

Απάντηση

public class Lift


{
int liftPosition =0, top = 12;
//Assume building has 12 floors
public void upOneFloor()
{
if(liftPosition<top)
{
liftPosition++;
}
}
public void downOneFloor()
{
if (liftPosition>0)
{
liftPosition--;
}
}
public int getPosition()
{
return liftPosition;
}
public static void Main()
{
//Test code to go here
}
}

Άσκηση 21

Να γραφτεί µια κλάση SortedCollection που να διαχειρίζεται έναν ταξινοµηµένο πίνακα από
ακέραιους αριθµούς. Η κλάση αυτή έχει τις ακόλουθες µεθόδους:

• add: Προσθέτει έναν ακέραιο αριθµό στον πίνακα.


• remove: Αφαιρεί έναν ακέραιο αριθµό από τον πίνακα.
• display: Εµφανίζει στην οθόνη τους ακέραιους αριθµούς που περιεχονται στον πίνακα.

Ο πίνακας πρέπει να είναι πάντοτε ταξινοµηµένος. Υποθέστε ότι ο πίνακας περιέχει µόνο διαφορετικούς
ακέραιους αριθµούς.

16
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

Απάντηση

public class SortedCollection


{
private int[] collectionArray;
private int noInCollection;
private int sizeOfCollection;

public SortedCollection(int size)


{
sizeOfCollection = size;
collectionArray = new int[size];
noInCollection =0;
//Clear the array
for(int j=0;j<sizeOfCollection;j++)
collectionArray[j]=0;
}

public void display()


{
for(int j =0;j<noInCollection;j++)
Console.Write(" {0}", collectionArray[j]);
Console.WriteLine();
}

public void add(int val)


{
collectionArray[noInCollection]= val;
noInCollection++;
int index =noInCollection-1;
int temp;
//Array empty just deposit the int
if (noInCollection ==1)
return;
// Move down the array swapping until it is in order
while(collectionArray[index] < collectionArray[index-1])
{
temp = collectionArray[index];
collectionArray[index] = collectionArray[index-1];
collectionArray[index-1] = temp;
index--;
if(index==0)
break;
}
}

public void remove(int val)


{
int index =0;
while(collectionArray[index]!=val)
index++;
//Shift down the elements of the array
for (int j =index;j<noInCollection-1;j++)
collectionArray[j]=collectionArray[j+1]
noInCollection--;
}

public static void Main()


{
//Test code to be inserted here
}

17
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

Άσκηση 22

Γράψτε µια κλάση Employee που παριστάνει έναν υπάλληλο. Η κλάση αυτή περιέχει δύο
ιδιοχαρακτηριστικά που παριστάνουν το όνοµα (name) και το µισθό (salary) του υπαλλήλου. Γράψτε για
την κλάση αυτή ένα δηµιουργό που να δίνει τιµές στα ιδιοχαρακτηριστικά της κλάσης και δύο µεθόδους
πρόσβασης που να επιστρέφουν την τιµή των ιδιοχαρακτηριστικών αυτών.

Απάντηση

public class Employee


{
private string name;
private int salary;
public Employee(string name, int salary)
{
this.name = name;
this.salary=salary;
}
public string Name
{
get
{
return name;
}
}
public int Salary
{
get
{
return salary;
}
}

Άσκηση 23

Γράψτε ένα πρόγραµµα που να εµφανίζει στην οθόνη την τρέχουσα ηµεροµηνία και ώρα.

Απάντηση

public class Time


{
// public accessor methods
public void DisplayCurrentTime( )
{
System.Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”,
Date, Month, Year, Hour, Minute, Second);
}
// constructor
public Time(System.DateTine dt)
{
Year = dt.Year;
Month = dt.Month;
Date = dt.Day;
Hour = dt.Hour;
Minute = dt.Minute;

18
Ασκήσεις – Γλώσσα Προγραµµατισµού C# ∆ρ. ∆. Αδαµόπουλος

Second = dt.Second;
}
int Year;
int Month;
int Date;
int Hour;
int Minute;
int Second;
}
public class Tester
{
static void Main( )
{
System.DateTime currentTime = System.DateTime.Now;
Time t = new Time(currentTime);
t.DisplayCurrentTime( );
}
}

19

You might also like