Skrypty serwerowe

Transkrypt

Skrypty serwerowe
Ćwiczenie 6
Temat:
Wprowadzenie do
skryptów
serwerowych
Cel ćwiczenia:
W ramach ćwiczenia student zapozna się z zasadami osadzania skryptów
serwerowych ASP.NET. Nauczy się wykorzystywać je do dynamicznej generacji
zawartości strony internetowej oraz do przetwarzania danych nadesłanych z
formularza HTML.
Język C#
Język C# wywodzi podobnie jak JavaScript wywodzi się z języka C. Z tego powodu posługuje
się tym samym zestawem operatorów i instrukcji, jednak w przeciwieństwie do JS wymaga
deklaracji zmiennych i jawnego typowania.
Zmienne
Podstawowe typy zmiennych C# to:
Typ
Opis
sbyte
byte
short
ushort
int
uint
long
ulong
float
double
decimal
char
string
bool
Liczba całkowita 8-bitowa ze znakiem
Liczba całkowita 8-bitowa bez znaku
Liczba całkowita 16-bitowa ze znakiem
Liczba całkowita 16-bitowa bez znaku
Liczba całkowita 32-bitowa ze znakiem
Liczba całkowita 32-bitowa bez znaku
Liczba całkowita 64-bitowa ze znakiem
Liczba całkowita 64-bitowa bez znaku
Liczba rzeczywista pojedynczej precyzji
Liczba rzeczywista podwójnej precyzji
Liczba rzeczywista wysokiej precyzji, mniejszego zakresu
Pojedynczy znak Unicode
Łańcuch tekstowy
Wartość boolowska
Zmienne deklarujemy analogicznie do języków C, C++.
typ_zmiennej nazwa_zmiennej
Przykład
int x,y=4;
double z = 4.3;
string t = "Ola";
Zmienne
41
Instrukcje
1. Instrukcja warunkowa wykonująca jeden z dwóch bloków poleceń w zależności od wartości
logicznej warunku.
if (warunek)
polecenia wykonywane, jeŜeli warunek jest spełniony
else
polecenia wykonywane jeŜeli warunek nie jest spełniony
Przykład:
if (a>0)
Response.Write("Wartość przekroczona");
if (b>0)
{
// blok instrukcji
Response.Write('Wartość przekroczona');
}
else
Response.Write('Wartość poprawna');
2. Instrukcja wyboru wykonująca jeden z wielu bloków poleceń w zależności od wartości
zmiennej:
switch (zmienna) {
case wartość1: polecenia wykonywane, jeŜeli zmienna=wartość1
break;
case wartość1: polecenia wykonywane, jeŜeli zmienna=wartość1
break;
:
:
default: polecenia wykonywane, jeŜeli zmienna ma inną wartość
break;
}
Przykład:
switch (liczba) {
case 1: Response.Write("jeden");
break;
case 2: Response.Write("dwa");
break;
case 3: Response.Write("trzy");
break;
default: Response.Write("liczba "+liczba);
break;
Instrukcje
42
}
3. Pętla for stosowana najczęściej w przypadku znanej przy jej rozpoczęciu liczbie powtórzeń,
nieskomplikowanej metodzie inkrementacji zmiennej i warunku ograniczającym. Wykonuje
się, jeżeli warunek jest spełniony.
for (inicjalizacja; warunek; inkrementacja)
polecenia wielokrotnie wykonywane w pętli
Przykład:
for (int i=10;i>=1;i--)
Response.Write(i+'<br />');
4. Pętla while wykonywana, jeżeli warunek jest spełniony. W wypadku początkowego
niespełnienia warunku pętla nie wykona się ani razu. Zakres zastosowań tej pętli jest
identyczny z pętlą for. Pętle while stosuje się przy bardziej skomplikowanej logice iteracji trudne
do opisania w nagłówku pętli for.
while (warunek)
polecenia wielokrotnie wykonywane w pętli
Przykład:
int i=10;
while (i>=1)
{
Response.Write(i+"<br />");
i--;
}
5. Pętla do..while wykonywana, jeżeli warunek jest spełniony. W wypadku początkowego
niespełnienia warunku pętla nie wykona się raz, ponieważ warunek jest sprawdzany na
końcu pętli;
do
polecenia wielokrotnie wykonywane w pętli
while (warunek)
Przykład:
int i=10;
do
{
Response.Write(i+'<br />');
i--;
}
Instrukcje
43
while (i>=1)
6. Pętla foreach nie występuje w JavaScipt. Jest wykonywana dla każdego elementu kolekcji
(tablicy). Zmienne sterująca w kolejnych iteracjach reprezentuje element tej kolekcji.
foreach(typ_elementu zmienna in kolekcja
polecenia wielokrotnie wykonywane w pętli
Przykład:
string[] imiona=new string[]{"Ala","Ola","Ela"}; // tablic string’ów
foreach(string imie in imiona)
Respone.Wrtie(imie+"<br />");
Metody
Metody (odpowiednik funkcji w JavaScript) także definiujemy z jawną podaniem typu
zwracanego i typów parametrów. W przypadku metody proceduralnej (niezwracającej
wartości) określamy typ zwracany, jako void
Przykład
void WyswietlSume(double a, double b) //nagłówek metody
{
double wynik = a + b;
Response.Write("Suma=" + wynik);
}
WyswietlSume(3, 4); //wywołanie metody
W przypadku metod zwracających wartość obowiązkowe jest użycie w ciele takiej metody
słowa kluczowego return.
Przykład
double ObliczSume(double a, double b) //nagłówek metody
{
double wynik = a + b;
return wynik;
}
double s = ObliczSume(3, 4); //wywołanie metody
Response.Write("Wynik=" + s);
Metody
44
Konwersja typów
Ponieważ język C# wymaga jawnego typowania, dlatego w często wymaga także jawnej konwersji
typów. Wyjątek stanowi konwersja z typu o mniejszej pojemności (np. byte) na typ o pojemności
większej (np. int). W platformie .NET istnieje przydatna klasa Convert, która zawiera zestaw metod
konwersji na podstawowe typy.
Metoda
ToSByte
ToByte(x)
ToInt16(x)
ToUInt16(x)
ToInt32(x)
ToUInt32(x)
ToInt64(x)
ToUInt64(x)
ToSingle(x)
ToDouble(x)
ToDecimal(x)
ToString(x)
Opis
Konwersja wartości x na sbyte (typ C#)
Konwersja wartości x na byte (typ C#)
Konwersja wartości x na short (typ C#)
Konwersja wartości x na ushort (typ C#)
Konwersja wartości x na int (typ C#)
Konwersja wartości x na uint (typ C#)
Konwersja wartości x na long (typ C#)
Konwersja wartości x na ulong (typ C#)
Konwersja wartości x na float (typ C#)
Konwersja wartości x na double (typ C#)
Konwersja wartości x na decimal (typ C#)
Konwersja wartości x na string (typ C#)
Metodą ToString dysponują także wszystkie typy .NET. W przypadku typów numerycznych daje ona
duże możliwości formatowania.
W poniżej tabelce zamieszczono przykłady dla zmiennej x typu double i wartości 1234,1234.
Przykład
x.ToString()
x.ToString("F2”)
x.ToString("F6”)
x.ToString("E2”)
x.ToString("G2”)
x.ToString("N3”)
x.ToString("P”)
x.ToString("C”)
Opis
Konwersja bez formatowania
Konwersja z dokładnością do 2 cyfr po przecinku
Konwersja z dokładnością do 6 cyfr po przecinku
Konwersja na postać naukową z dokładnością do 2 cyfr
Konwersja na najbardziej zwartą postać (notacja standardowa lub
naukowa) przy 2 cyfrach znaczących
Konwersja z dokładnością do 3 cyfr po przecinku i rozdziałem „tysięcy”
Konwersja z na procenty
Konwersja na aktualną walutę
Wynik
1234,1234
1234,12
1234,123400
1,23E+003
1,2E+003
1 234,123
123 412,34 %
1,23 zł
Osadzanie skryptów serwerowych ASP.NET
Przed osadzeniem skryptu serwerowego należy na początku strony aspx w dyrektywie Page określić,
jakim językiem programowania będziemy się posługiwali w skryptach.
<%@ Page Language="C#" %>
Następnie mamy kilka metod osadzenia skryptu serwerowego. Najbardziej lokalną jest metoda inline,
stosowana gdy tylko pojedynczą informację chcemy wygenerować przy pomocy skryptu
Przykład
45
serwerowego. Skrypt osadzamy wówczas wewnątrz symboli <% %>, a wartość generowaną
poprzedzamy znakiem =.
Przykład
<%@ Page Language="C#" %>
<html>
<head>
<title>Skrypty</title>
</head>
<body>
Iloczy 5 razy 4 wynosi <%=(5*4) %>
</body>
</html>
Kolejną metodą jest utworzenie całego bloku skryptowego przy pomocy symboli <% %>. W jego
wnętrzu możemy stosować dowolne konstrukcje programistyczne. Blok tego typu powinien być
osadzany jedynie we wnętrzu sekcji body i służy zwykle do dynamicznej generacji treści strony.
Przykład
<%@ Page Language="C#" %>
<html>
<head>
<title>Skrypty</title>
</head>
<body>
<%
for (int i = 1; i <= 10; i++)
Response.Write(i + "<br />");
%>
</body>
</html>
Kolejną możliwością jest zdefiniowanie bloku skryptowego na początku strony w bloku <script> ..
</script>. W celu odróżnienia tego bloku od bloku skryptu klienckiego znacznik skrypt uzupełniany
jest o atrybut runat=”server”. W bloku tym powinny się znaleźć definicje metod.
Przykład
<%@ Page Language="C#" %>
<script runat="server">
double ObliczSume(double a, double b)
{
return a + b;
}
</script>
<html>
<head>
Przykład
46
<title>Skrypty</title>
</head>
<body>
Suma liczb 5 i 4 wynosi <%=ObliczSume(5,4) %>
</body>
</html>
Ostatnią możliwością jest całkowite rozdzielenie skryptu serwerowego i kodu HTML do odrębnych
plików. W tym celu należy uzupełnić dyrektywę Page o w wskazanie, w którym pliku znajduje się kod
skryptowy powiązany ze stroną i zdefiniować wspólną nazwę klasy dla elementów strony i skryptu.
Przykład
<%@ Page Language="C#" CodeFile="Skrypty.aspx.cs" Inherits="Skrypty" %>
<html>
<head>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
Suma liczb 4 i 5 wynosi <% =ObliczSume(4,5) %>
</div>
</form>
</body>
</html>
W pliku aspx znajdują się wówczas tylko odwołania do metod zdefiniowanych w pliku kodu.
Końcówka nazwy pliku kodu zależy od używanego języka skrypu. Plik ten zawiera jedynie definicje
odpowiednich klas oraz wypełniające je definicje metod, pól lub właściwości.
Przykład
using System;
public partial class Skrypty : System.Web.UI.Page
{
public double ObliczSume(double a, double b)
{
return a + b;
}
}
Przykład
47
Dynamiczna generacja kodu HTML
W chwili nadejścia z przeglądarki żądania pobrania strony w pamięci serwera tworzony jest dla tego
żądania obiekt klasy Page (niszczony po zakończeniu obsługi żądania).
Obiekt Page zawiera w sobie zagnieżdżony obiekt Response odpowiedzialny za wszystkie dane
przekazywane z serwera do przeglądarki.
Jego najważniejsze metody zwiera poniższa tabela:
Metoda
Write(x)
WriteFile(nazwa)
End()
Redirect(url)
Opis
Pisze wartość x do kodu HTML wysyłanej strony
Dopisuje zawartość pliku do wysyłanej strony
Natychmiast kończy przetwarzanie i wysyła stronę
Wysyła do przeglądarki żądanie przekierowania po
adres url
Do dynamicznej generacji zawartości strony będziemy używać metody Write,
Przykład
<%@ Page Language="C#"%>
<html>
<head>
<title>Liczby</title>
</head>
<body>
<%
for (int i = 1; i <= 7; i++)
{
Response.Write("<font size=\"" + i + "\">");
Response.Write("Tekst1");
Response.Write("</font>");
}
%>
</body>
</html>
Symbol \” pozwala wygenerować cudzysłowy wokół atrybutu HTML z wnętrza łańcucha tekstowego
C#.
Obsługa daty i czasu
Przykład
48
Platforma .NET udostępnia klasę DateTime, która pozwala pozyskać informacje o aktualnej dacie i
czasie. Żeby skorzystać z jej funkcjonalności należy utworzyć przy jej pomocy zmienną obiektową
reprezentującą aktualny czas.
DateTime czas = DateTime.Now;
Po utworzeniu takiego obiektu możemy skorzystać z zestawu jego metod i właściwości.
Metoda, właściwość
ToString()
ToLongTimeString()
ToShortTimeString()
ToLongDateString()
ToShortDateString()
Hor
Minute
Second
Year
Month
Day
DayOfWeek
DayOfYear
Opis
Konwersja na tekst daty i czasu
Konwersja na pełny tekst czasu
Konwersja na skrócony tekst czasu
Konwersja na pełny tekst czasu
Konwersja na skrócony tekst czasu
Godzina
Minuta
Sekunda
Rok
Miesiąc
Dzień miesiąca
Angielska nazwa dnia tygodnia
Numer dnia roku
Przykład
<%@ Page Language="C#"%>
<html>
<head>
<title>Czas</title>
</head>
<body>
<%
DateTime czas = DateTime.Now;
Response.Write("Dzisiaj mamy: "+czas.ToLongDateString()+"<br />");
if (czas.Hour > 16) Response.Write("Pora kończyć !");
%>
</body>
</html>
Przykład
49
Zadanie 1
1. Wyświetl na stronie aktualny czas w formie skróconej.
2. Wyświetl poziomą, jednowierszową tabelę z liczbami od 1 do numeru akutalnego dnia
miesiąca. Wewnątrz komórek użyj wielkości czcionki 6px.
1
2
3
4
5
3. Wyświetl nazwę dnia tygodnia, a jeżeli jest to niedziela to automatycznie przejdź na stronę
http://www.polsl.pl.
Przetwarzanie danych przesłanych z formularza
Obiekt Page, oprócz obiektu zagnieżdżonego Response, który jest odpowiedzialny za informacje
wysyłane z serwera do przeglądarki, dysponuje także obiektem Request pozwalającym przetwarzać
wszelkie informacje płynące z przeglądarki do serwera, takie jak dane formularza czy parametry
przeglądarki. Poniższa tabela zawiera najważniejsze właściwości tego obiektu.
Właściwość
Opis
Browser
Obiekt zawierający informacje o nazwie, wersji i
możliwościach przeglądarki użytkownika
Kolekcja wartości pól formularza wysłanego metodą
GET
Kolekcja wartości pól formularza wysłanego metodą
POST
QueryString
Form
Najczęściej obiekt Request będziemy wykorzystywać do odbierania danych formularza, tak jak
prezentuje to poniższy przykład dla formularza wysyłanego metodą GET.
Przykład
<%@ Page Language="C#" %>
<html>
<head>
<title>Prostokąt</title>
</head>
<body>
<form action="Prostokat.aspx" method="get">
Szerokość <input name="szer" type="text" /><br />
Wysokość <input name="wys" type="text" /><br />
<input type="submit" value="Oblicz" />
</form>
<%
Przykład
50
if (Request.QueryString["szer"] != null && Request.QueryString["wys"] !=
null)
//sprawdzenie czy dane z formularza nadeszły
{
double a = Convert.ToDouble(Request.QueryString["szer"]);
double b = Convert.ToDouble(Request.QueryString["wys"]);
double P = a * b;
Response.Write("Pole=" + (a * b).ToString("F2"));
}
%>
</body>
</html>
Podobnie będziemy obsługiwać formularz wysyłany metodą POST. Zmieniamy tylko wykorzystywaną
kolekcję z QueryString na Form.
Przykład
<%@ Page Language="C#" %>
<html>
<head>
<title>Prostokat</title>
</head>
<body>
<form action="Prostokat.aspx" method="post">
Szerokość <input name="szer" type="text" /><br />
Wysokość <input name="wys" type="text" /><br />
<input type="submit" value="Oblicz" />
</form>
<%
if (Request.Form["szer"] != null && Request.Form["wys"] != null)
//sprawdzenie czy dane z formularza nadeszły
{
double a = Convert.ToDouble(Request.Form["szer"]);
double b = Convert.ToDouble(Request.Form["szer"]);
double P = a * b;
Response.Write("Pole=" + (a * b).ToString("F2"));
}
%>
</body>
</html>
Przykład
<%@ Page Language="C#" %>
<html>
<head>
<title>Przeglądarka</title>
</head>
<body>
<table border=1 cellpadding=10 cellspacing=0>
<tr>
<td width="30%"><b>Właściwość</b></td>
<td><b>Wartość</b></td>
</tr>
<tr>
<td>Przeglądarka</td>
Przykład
51
<td> <%= Request.Browser.Browser %></td>
</tr>
<tr>
<td>Pliki Cookie</td>
<td> <%= Request.Browser.Cookies %></td>
</tr>
<tr>
<td>Ramki</td>
<td> <%= Request.Browser.Frames %></td>
</tr>
<tr>
<td>JavaScript </td>
<td> <%= Request.Browser.JavaScript %></td>
</tr>
<tr>
<td>Wersja</td>
<td> <%= Request.Browser.Version %></td>
</tr>
</table></body></html>
Operacje matematyczne
Podobnie, jak w wypadku JavaScript mamy w C# do dyspozycji klasę Math udostępniającą zestaw
metod i właściwości przydatnych w obliczeniach matematycznych.
Metoda, Właściwość
Sqrt(x)
Abs(x)
Pow(a,n)
Round(x)
, Ceiling(x)
Floor(x)
Sin(rad),Cos(rad), Tan(rad),
Sinh(rad), Cosh(rad), Tanh(rad),
Asin(x),Acos(x),Atan(x), Atan2(x,y)
Log(a,p)
Log10(x)
Max(x1,x2)
Min(x1,x2)
Exp(n)
PI
E
Opis
Pierwiastek drugiego stopnia z x
Wartość bezwzględna z x
n
Potęga a
Zaokrąglenie do najbliższej liczby całkowitej
Zaokrąglenie w górę
Zaokrąglenie w dół
Funkcje trygonometryczne, stopnie podawane w
radianach
logp(n)
log10(n)
Wartość maksymalna z dwóch liczb
Wartość minimalna z dwóch liczb
n
e
π
e
Przykład
<%@ Page Language="C#" %>
<html>
<head>
<title>Kula</title>
</head>
<body>
<form method="get">
Przykład
52
Promień <input name="promien" type="text" /><br />
<input type="submit" value="Oblicz" />
</form>
<%
if (Request.QueryString["promien"] != null)
{
double r = Convert.ToDouble(Request.QueryString["promien"]);
double V = 4.0/3.0*Math.PI*Math.Pow(r,3);
Response.Write("Objętość="+V.ToString("F2"));
}
%>
</body>
</html>
W powyższym przykładzie należy zwrócić uwagę na pozornie nielogiczny zapis 4.0/3.0. Jest to
spowodowane różną realizacją działań matematycznych dla różnych typów. Zapis 4/3 oznaczałby
dzielenie dwóch liczb całkowitych, co w C# daje wynik całkowity, czyli 1, co zafałszowałoby obliczenia.
Skrajnym
przykładem
jest
wzór
na
objętość
stożka,
w
przypadku
którego
zapis
V=1/3*Math.PI*Math.Pow(r,3) zawsze dałby wynik równy 0.
Wyrażenia regularne
Także po stronie serwerowej możemy wykorzystywać wyrażenia regularne, czyli wzorce,
które opisują łańcuchy symboli. Szczególnie przydatne będą one do kontroli danych
wprowadzonych przez użytkownika do formularza. Zarówno w języku JavaScript (po stronie
klienckiej), w języku C# (po stronie serwerowej), jak i w każdym innym języku
programowania stosujemy ten sam, standardowy zastaw symboli wyrażeń regularnych:
Symbol
Opis
Przykład
Ciągi zgodne
Ciągi niezgodne
^
Początek ciągu
^kot
kot, kotka, kotwa
pies, pokot
$
Koniec ciągu
$a
Ania, kotka
Jan, kot
.
Jeden dowolny znak
.asia
Kasia,Basia
Ela, Joasia
[…]
Jeden z wymie-nionych
k[oa]t
kot,kat
kit, koat, kotek
Z[0-5]
Z2,Z4
Zx,Z9
k[^oa]t
kit,ket
kat, kot, kotek
[B||Jo|Mich]
Basia, Michasia
Kasia, Ela
znaków
[^…]
Jeden z
niewymienionych
[…|...]
Jeden z ciągów
Przykład
53
?
Zero lub jeden znak
list?owy
lisowy, listowy
listy, lisa
+
Jeden lub wiele znaków
[A-Z][a-z]+
Joanna, Kamil
anna, 123, kot
*
Zero lub wiele znaków
ko*t
kt,kot,koooot
lot,gyy
{n}
Dokładnie n znaków
[0-9]{2}-[0-9]{7}
32-6034111
32-603, 997
{n,}
Co najmniej n znaków
[A-Z][a-z]{3,}
Janek,Ania
Ola, Ela
{n,m}
Pomiędzy n i m znaków
[0-9]{2,4}
12, 432, 4223
4, 12345
\d
Cyfra
\d{3}
123, 223
A21, 1234
\D
Znak niebędący cyfrą
\D+
Asad, ada
Sdd1, 123
\w
Litera, cyfra, _
\w{3}
A12,123, 1_2
1+3
\W
Znak niebędący literą,
\W{3}
+!!, ---
Ala, 123
Jan\sKowalski
Jan Kowalski
Jan-Kowalski
\S+
Jan, 1234, Jaks
Jan Kowalski
([A-Z][a-z]+)(-[A-
Kowalski, Kowalski-
Kow2,
Z][a-z]+)*
Nowak
cyfrą, _
\s
Spacja, tabulacja, nowa
linia
\S
Każdy znak niebędący
spacją, tabulacją i nl
(…)
Blok znaków
Kowalski—Nowak
I ten sam zestaw znaków specjalnych:
\.
\*
\/
\\
\?
\:
\^
\+
\\
\=
\|
W języku C# zmienia się jednak sposób wykorzystania mechanizmu wyrażeń regularnych. W
tym celu wykorzystujemy klasę Regex z przestrzeni nazw System.Text.RegularExpressions.
Ponieważ jest to przestrzeń niestandardowa należy ją jawnie dołączyć przez dyrektywę
Import. Poniższa tabela prezentuje podstawowe metody udostępnianie przez obiekty klasy
Regex.
Metody
Opis
IsMatch
Sprawdza, czy łańcuch jest zgodny ze wzorcem
opisanym wyrażeniem regularnym
Matches
Zwraca kolekcję wystąpień wzorca
Replace
Zastępuje wystąpienia wzorca łańcuchem tekstowym
Przykład
54
Przykład
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Text.RegularExpressions" %>
<html>
<head>
<title>Osoba</title>
</head>
<body>
<form method="get">
Imię <input name="imie" type="text" /><br />
Nazwisko <input name="nazwisko" type="text" /><br />
<input type="submit" value="Oblicz" />
</form>
<%
if (Request.QueryString["imie"] != null &&
Request.QueryString["nazwisko"] != null)
{
Regex wzorzecImienia = new Regex("^[A-Z][a-z]+$");
if (wzorzecImienia.IsMatch(Request.QueryString["imie"]))
Response.Write("Imię poprawne <br />");
else
Response.Write("Imię niepoprawne <br />");
Regex wzorzecNazwiska = new Regex(@"^[A-Z][a-z]+(-[A-Z][a-z]+)*$");
if (wzorzecNazwiska.IsMatch(Request.QueryString["nazwisko"]))
Response.Write("Nazwisko poprawne <br />");
else
Response.Write("Nazwisko niepoprawne <br />");
}
%>
</body>
</html>
Zadanie 2
1. Przygotuj formularz, jak na rysunku poniżej. Formularz ma być wysyłany metodą
GET..
Przykład
55
2. Zaimplementuj w skrypcie serwerowym wyznaczanie masy walca na podstawie jego
wymiarów i zastosowanego materiału.
3
Materiał
Gęstość [kg/m ]
Stal
7860
Aluminium
2700
Tytan
4507
3. W oparciu o skrypt serwerowy zablokuj obliczenia i wyświetl komunikat, jeżeli
podano wartość wysokości inną niż liczba całkowita.
4. W oparciu o skrypt serwerowy zablokuj obliczenia i wyświetl komunikat, jeżeli
podano wartość promienia inną niż liczba rzeczywista z dokładnością do dwóch cyfr
po przecinku (np. 2,35).
5. Uzupełnij weryfikację formularza o sprawdzenie, czy wysokość i promień są większe od 0.
Zadanie 3 (fakultatywne)
1. Przygotuj test wiadomości z zakresu C# składający się z 15 pytań (otwartych, jednokrotnego i
wielokrotnego wyboru) przesyłany metodą POST.
2. Stwórz skrypt serwerowy oceniający odpowiedzi na poszczególne pytania.
3. Uzupełnij system testujący o zliczanie punktów i wystawianie ocen.
Przykład
56

Podobne dokumenty