jimp.doc

(114 KB) Pobierz

1.

A) Czym różni się pamięć „stosu danych” od pamięci „sterty danych” programu?
B) Zilustrować odpowiedź przykładami kodu w C#.

 

Sterta (heap):

- alokacja danych o zmiennej długości (zwykle istnieje operator „new”)

Stos danych przechowuje aktualną historię wykonania:

- wywołania (rekordy aktywacji) podprogramów (procedur, funkcji, metod)

- definicje zmiennych globalnych (o ustalonej w czasie kompilacji strukturze)

 

Ze stosu zdejmuje się obiekty w kolejności odwrotnej do kładzenia.

Na stercie alokuje się i zdejmuje obiekty w dowolnej kolejności.

 

Każdy program w czasie pracy ma do dyspozycji i stos i stertę.

 

Stos to obszar pamięci, który jest przede wszystkim używany jako miejsce do organizowania wywoływania funkcji i powrotów z nich, a także do przechowywania parametrów funkcji i zmiennych automatycznych

wykorzystywanych wewnątrz funkcji. Wszystko to odbywa się niejako samoistnie, bez specjalnych starań ze strony programisty. Zazwyczaj obszar stosu nie jest zbyt wielki.

 

Nieco inaczej przedstawia się sprawa ze stertą. Jest to obszar pamięci służący do dynamicznego przydzielania bloków pamięci według potrzeb. Aby z tej możliwości skorzystać, programista musi wyraźnie to powiedzieć,

np. używając operatora "new" lub funkcji "malloc". Wszystkie obiekty tworzone w programie w ten sposób, otrzymują wymagany kawałek pamięci właśnie na stercie. Również zadaniem programisty jest zwalnianie

niepotrzebnych już obszarów (operator "delete" lub funkcja "free"), w przeciwnym razie dojdzie do "przecieków" pamięci. W porównaniu ze stosem, obszar pamięci dostępny dla sterty jest dużo większy.

 

Stos mogący przechowywać dowolny typ danych:

class Stack

{

//tablica przechowująca obiekty

private object[] array; 

public void Push(object elem) { ... }

public object Pop() { ... }

  //...

}

//Użycie takiego stosu do przechowywania liczb całkowitych:

Stack stack = new Stack();

stack.Push( 1 );

int number = (int)stack.Pop();

 

2.

A) Podać i krótko opisać sposoby przekazywania argumentów w wywołaniach metod i role pełnione przez te argumenty w C#.

B) Zilustrować odpowiednimi przykładami w kodzie C#

 

Poprzez wartość (value types):
- w wywołaniu podprogramu tworzona jest kopia danej przekazywanej przez argument wywołania
- podprogram działa na kopii a nie na zmiennej zewnętrznej, zdefiniowanej po stronie wywołania
- ewentualna modyfikacja argumentu w podprogramie nie pozostawia żadnego śladu w odpowiadającej jej zmiennej zewnętrznej
- argument przekazany przez wartość ma charakter 1-kierunkowy (wejściowy dla podprogramu)

Poprzez referencję (reference types) lub wskaźnik (pointer types):
- w wywołaniu podprogramu tworzona jest referencja (ukryty adres) lub wskaźnik (jawny adres) do danej przekazywanej przez argument wywołania
- podprogram działa na zmiennej zewnętrznej, zdefiniowanej po stronie wywołania
- ewentualna modyfikacja argumentu w podprogramie zmienia odpowiadającą jej zmienną zewnętrznej
- Argument przekazany przez referencję lub wskaźnik ma charakter 2-kierunkowy (wejściowy i wyjściowy dla podprogramu) a w niektórych realizacjach może mieć jeszcze charakter jedynie wyjściowy (wtedy, gdy przekazywana jest zerowa referencja lub wskaźnik do podprogramu)


              void ABC (int x); //deklaracja
              …..
              int i=10;
              ABC(i); //wywołanie

Poprzez referencję lub wskaźnik:

void ABC(ref int x) {…}
              ……
              int i=10;
              ABC(ref i); //wywołanie


3.

Podać i krótko wyjaśnić zasadnicze cechy programowania obiektowego

Podstawowe cechy:
- abstrakcyjne typy danych (klasy)
- dziedziczenia klas (klasy pochodne)
- wielopostaciowość (poliformizm) obiektów i operacji
- ukrywanie szczegółów (kapsułkowanie, hermetyzacja)

Wady i zalety OOP:
- zmniejsza efektywność czasową i pamięciową programu
- ułatwienie konserwacji i modyfikacji programów – klasy, dobrze określone interfejsy
- systematyczność tworzenia całej rodziny aplikacji z określonej dziedziny – dziedziczenie, poliformizm
- lepsza ochrona przed propagowaniem się błędów – wbudowane mechanizmy kontroli dostępu (kapsułkowania), istnienie składników typu „puzzle”
- możliwość przeniesienia terminologii  stosowanej w dziedzinie zastosowań bezpośrednio do projektu oprogramowania poprzez definiowanie odpowiednich klas i obiektów

 

1. (4pkt)

A) Podać i krótko opisać sposoby przekazywania argumentów w wywołaniach metod i role pełnione przez te argumenty w C#

B) Zilustrować odpowiednimi przykładami kodu C#

 

2. (5pkt)

Czy i jakie metody klas string i token są wywoływane podczas wykonywania funkcji mojaFun() zdefiniowanej w klasie Token? Podać deklarację wywoływanych metod

 

public string mojaFun(Token token, out string name) //

{

sting src = token.toString();  //

name = token.getName();  //

int i = src.Length;  //

string dst;  //

switch (name[i]) {  //

case ‘<’ : dst = „&lt;”; break;

default : dst = new string (name[i],1); //

break;

     } return dst; //

}

 

3. (6pkt) W języku C# zrealizować podane niżej zadanie:

A) Zdefiniować przykładową klasę Figure o polu statycznym counter, dwóch polach typu Circle, metodzie wirtualnej Draw, metodzie statycznej Execute i metodzie toString. Zainicjować pole statyczne.

B) Zdefiniować metodę toString realizującą inicjalizację obiektu klasy - korzystając w tym celu z metod toString dla pól obiektu.

 

 

Zestaw złoty

1.

A) Co oznaczają i czym się różnią od siebie pojęcia „przeciążanie metod” i „ polimorfizm

B) Zilustruj odpowiedz przykładami kodu w C# 

 

2.

Czy i jakie metody klas string i figure są wywołane podczas wykonania funkcji moja Fun() zdefiniowanej w klasie figure ? Podać deklaracje wywołanych metod

 

Public int mojaFun(figure, out string out data)//

{

string in = Figure.ToString();//

string name = figure.GetName(this);

int I = int.lenght;//

switch (name[I])}//

case {‘:outData=”&lt;”; break;

default:out data = new string(name[I];1);//

break;

}

return I;//

 

3. (6pkt) W języku C# podać kod realizujący podane niżej zagadnienia.

A) Zdefiniować przykładową klasę Line o polu statycznym counter, dwóch polach typu Point, metodzie wirtualnej Draw, metodzie statycznej Execute i metodzie toString. Zainicjalizować pole statyczne

B) Zdefiniować metode toString, realizującą serializację obiektu klasy – korzystającą w tym celu z metod toString dla pól obiektu

C) W metodzie Execute należy utworzyć obiekt klasy Line i zrealizować aktywację śledzenia i obsługę sytuacji wyjątkowych dla wywołania funkcji fun pewnej klasy

D) Zdefiniować metodę fun o argumencie typu Line i o następującej treści: utworzyć identyfikator referencyjny klasy Line i związać z nim argument; pobrać oba obiekty klasy Point  z obiektu argumentu. Czy można je przypisać do wcześniej utworzonego identyfikatora referencyjnego typu Line? Jeśli nie, to należy zgłosić wyjątek typu InvalidCastException; jeśli tak, to należy wywołać metodę Draw dla obu obiektów klasy Point

E) Zdefiniować przykładowy konstruktor bezargumentowy w klasie Line korzystający z listy inicjalizacyjnej.

 

 

Zestaw pomarańczowy

1.

A) Wyjaśnić mechanizm obsługi sytuacji wyjątkowych

B) Odpowiedź zilustrować przykładami  kodu w C#.

 

2.

Wyjaśnić znaczenie składniowe wierszy poniższego fragmentu programu:

 

class Blank    //

{

   public void setup( )   //

     {

        Number Setter set (this);    //

        Balance = OM ;   //

       }

     private Class Number Setter  //

     public static void Set ( Account a )     //

     {

     a number = next Number = 2311 ;   //

     } private number    //

       private decimal balance ;   //

 

1. (4p.)

A) Czym różni się pamięć „stosu danych” od „pamięci danych” programu?

B) Zilustrować odpowiedź przykładami kodu w C#.

 

sterta danych - alokacja danych o zmiennej długości(zwykle istnieje operator „new”)

stos danych - przechowuje aktualną historię wykonania:

·          wywołania (rekordy aktywacji) podprogramów (procedur, funkcji, metod) i

·          definicje zmiennych globalnych (o ustalonej w czasie kompilacji strukturze)

 

Przykład:

class Stack

{

//tablica przechowująca obiekty

private object[] array;

public void Push(object elem) { ... }

public object Pop() { ... }

}

//Użycie takiego stosu do przechowywania liczb całkowitych:

Stack stack = new Stack();

stack.Push( 1 );

int number = (int)stack.Pop();

 

1.

Wyjaśnić znaczenie interface, object, is, as i podać ich przykłady w kodzie

 

 

2. (3p.)

Wyjaśnić znaczenie składowe wierszy poniższego fragmentu programu.

 

try// Rozpoczęcie bloku, który wypróbuje kod

              r1.Test( );  // Wywołanie metody

      }

finally// Rozpoczęcie kodu, który zawsze zostanie wykonany

              if(r1 != null// Warunek: jeśli zasób nie jest pusty to wykonaj

              ((IDisposable)r1).Dispose( );  // Wymuszenie zwolnienia tego zasobu

}

 

3. (3p.)

Wyjaśnić znaczenie składowe wierszy poniższego fragmentu programu. Podać wynik wykonania programu.

 

class SourceFile

{              public SourceFile( ) { }  // Konstruktor bezargumentowy klasy SourceFile

              public readonly ArrayList lines;  // Deklaracja publicznego obiektu klasy kolekcyjnej tylko do odczytu (typu ArrayList)

}

Class Test

{              static void Main( )  // Statyczna metoda Main która nie zwraca wartości- pkt. startowy programu

              {

              SourceFile src = new SourceFile( );  // Inicjacja zmiennej src obiektem SourceFile

              Console.WriteLine(src.lines == null);  // Wypisanie na konsoli wyniku operatora równości

              }

}

 

4. (5p.)

Wyjaśnić znaczenie składowe wierszy poniższego fragmentu programu. Jakie błędy występują?

 

class MyMat

{              private int x,y;  // Deklaracja pól

              static MyMat(int sx, int sy) : this(sx, sy)  // Błąd: statyczny konstruktor nie może posiadać parametrów i nie może się odwoływać to “this”

              {

              this.x = sx; this.y = sy;  // Przypisanie zmiennej x zmienną sx; Przypisanie zmiennej y zmienną sy

              }

static int[,] Multiply(int[,] a, int[,] b)  // Deklaracja statycznej metody o dwóch parametrach, która zwraca wynik w postaci tablicy dwuwymiarowej; Błąd: metoda statyczna musi być publiczna

{

              int[,] result = new int [x, y];  // Inicjacja tablicy dwuwymiarowej o wielkości ustalanej w czasie wykonywania programu

              for(int r = 0; r < x; r++) {

                            for(int c = 0; c < y; c++) {  // Iteracja przez wszystkie elementy tablic

                                          for(int k = 0; k < y; k++) {

                                                        result[r][c] += a[r][k] * b[k][c]; ...

Zgłoś jeśli naruszono regulamin