Katedra Elektrotechniki Teoretycznej i Informatyki. sem. II - wykład 6. Dr hab. inż. M. Czyżak

Podobne dokumenty
Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 3 - sem.iii. Dr inż. M. Czyżak

Katedra Elektrotechniki Teoretycznej i Informatyki. sem. III. Dr inż. M. Czyżak

Wstęp do Programowania, laboratorium 02

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Część 4 życie programu

Wstęp do programowania

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

Programowanie komputerowe. Zajęcia 2

W języku C dostępne są trzy instrukcje, umożliwiające tworzenie pętli: for, while oraz do. for (w1;w2;w3) instrukcja

Programowanie - wykład 4

Język C zajęcia nr 11. Funkcje

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Programowanie strukturalne i obiektowe. Funkcje

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

Funkcja (podprogram) void

I - Microsoft Visual Studio C++

1 Podstawy c++ w pigułce.

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Wstęp do programowania

5 Przygotował: mgr inż. Maciej Lasota

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Zmienne, stałe i operatory

Tablice, funkcje - wprowadzenie

1 Podstawy c++ w pigułce.

Język ANSI C tablice wielowymiarowe

Wstęp do informatyki- wykład 11 Funkcje

Wstęp do informatyki- wykład 9 Funkcje

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Co nie powinno być umieszczane w plikach nagłówkowych:

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

typ_zwracanej_wartości nazwa_funkcji(lista deklaracji argumentów) { ciało(treść) funkcji return Val; //zwracana wartość }

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Prof. Danuta Makowiec Instytut Fizyki Teoretycznej i Astrofizyki pok. 353, tel danuta.makowiec at gmail.com

Podział programu na moduły

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

4. Funkcje. Przykłady

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

Wstęp do programowania. Wykład 1

Wykład 3. Instrukcje powtarzające

2 Przygotował: mgr inż. Maciej Lasota

Wskaźniki. Informatyka

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

Ćwiczenie nr 3. Temat: Definicje i wykorzystanie funkcji, parametry funkcji

Jerzy Nawrocki, Wprowadzenie do informatyki

do instrukcja while (wyrażenie);

Wykład 1 Wprowadzenie do algorytmów. Zawartość wykładu 1. Wstęp do algorytmów i struktur danych 2. Algorytmy z rozgałęzieniami.

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Język C, tablice i funkcje (laboratorium)

Warto też w tym miejscu powiedzieć, że w C zero jest rozpoznawane jako fałsz, a wszystkie pozostałe wartości jako prawda.

// Funkcja glowna int main() { // zmienne int kont='t'; double x1, y1, x2, y2, x3, y3, a, b, c, p1, p2, p3, pole, ha, hb, hc;

Języki i metodyka programowania. Wprowadzenie do języka C

dr inż. Jarosław Forenc

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

3 Przygotował: mgr inż. Maciej Lasota

IX. Wskaźniki.(3 godz.)

Argumenty wywołania programu, operacje na plikach

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Języki i paradygmaty programowania 1 studia stacjonarne 2018/19

Struktury Struktura polami struct struct struct struct

Funkcje. czyli jak programować proceduralne. Programowanie Proceduralne 1

Język C, tablice i funkcje (laboratorium, EE1-DI)

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Jak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest

Metody Metody, parametry, zwracanie wartości

Proste typy zmiennych języka C++ *) Zapis 3.4 e-38 jest równoważny zapisowi 3,

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Techniki Programowania wskaźniki 2

typ_zwracanej_wartości nazwa_funkcji(lista deklaracji argumentów) { ciało(treść) funkcji return Val; //zwracana wartość }

Proste algorytmy w języku C

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

Język C zajęcia nr 7. Uwagi dotyczące stylu programowania

Język C++ zajęcia nr 2

Wykład 4: Klasy i Metody

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Programowanie w języku Python. Grażyna Koba

Alokacja pamięci dla tablicy dwuwymiarowej

Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne

Część 4 pętla FOR. Instrukcja pętli iteracyjnej FOR. Postać pętli for jest następująca: a)dla jednej instrukcji wykonywanej przez pętlę.

Podstawy programowania skrót z wykładów:

Funkcje. czyli jak programować proceduralne. Programowanie Proceduralne 1

dr inż. Jarosław Forenc

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Funkcje i tablice. Elwira Wachowicz. 23 maja 2013

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

Wstęp do programowania

x szereg(x)

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Transkrypt:

Katedra Elektrotechniki Teoretycznej i Informatyki sem. II - wykład 6 Dr hab. inż. M. Czyżak

Ogólna budowa programu w języku C W języku C program składa się z jednego lub większej liczby segmentów kodu zwanych funkcjami, z których jedna musi nazywać się main(). Wykonanie programu zaczyna się od funkcji main() i program powinien kończyć się wraz z zakończeniem działania funkcji main(). Program również może się zakończyć, gdy pojawi się sytuacja nienormalna - wyjątek, np. dzielenie przez zero, albo też gdy zostanie zakończony w sposób jawny ( ctrl-break, zamknięcie okna w systemie Windows), powodem zakończenia może być też wywołanie funkcji exit().

Powody stosowania funkcji w programach (1) 1. Korzystanie z bibliotek lub funkcji stworzonych przez innych programistów. 2. Podział zadania programistycznego na mniejsze, które mogą być opracowywane niezależnie( np. w różnym czasie lub równocześnie przez różnych programistów).

Powody stosowania funkcji w programach (2) 3. Ułatwienia w uruchamianiu dużych programów ( można niezależnie uruchamiać i testować poszczególne funkcje). 4. Program jest zbyt duży, by pisać go jako jedną funkcję main(). 5. Unikanie powtarzania w programie tego samego kodu, gdy pewne zadania trzeba wykonywać wielokrotnie.

Funkcje a struktura programu w języku C (1) Program w języku C może być programem jednoplikowym lub wieloplikowym. W programie jednoplikowym wszystkie funkcje znajdują się w jednym pliku źródłowym lub są do niego dołączane przy zastosowaniu dyrektywy #include. W programie wieloplikowym pliki są łączone w sposób zależny od środowiska (np. w środowisku Dev C++ opcja Projekt->Dodaj do projektu).

Funkcje a struktura programu w języku C (2) - Funkcje nie muszą występować w pliku źródłowym w określonym porządku ( pewne sposoby uporządkowania mogą wymagać dodatkowych deklaracji), jednak umieszczenie main() jako pierwszej funkcji w pliku ułatwia analizę programu. - Każda funkcja może wywoływać dowolną inną funkcję. - Nie jest dopuszczalne zagnieżdżanie funkcji, tzn. nie można jednej funkcji definiować wewnątrz innej funkcji. - W programie występuje tylko jedna funkcja main() i musi ona wystąpić niezależnie od liczby plików źródłowych.

Przykład. Prosty program stosujący funkcję kwadratdo obliczania kwadratu pewnej wartości. #include <stdio.h> // lub #include <cstdio> int kwadrat (int num){ int main() { int pom; // zmienna lokalna funkcji pom=num*num; return pom; } int kw, wartosc; // zmienna pom nie jest konieczna, //być return num*num; printf("\n Podaj wartosc :"); scanf("%d",&wartosc);

Wywołanie funkcji - (uruchomienie kodu funkcji) kw= kwadrat(wartosc); /* zmienna wartosc jest tzw. argumentem funkcji, zmienna wartość zawiera liczbę, która ma być podniesiona do kwadratu */ printf ("\n Kwadrat liczby %d wynosi :%d",wartosc, kw); system("pause"); return 0;} W momencie zakończenia działania, funkcja kwadrat przesyła do funkcji main() obliczoną wartość i wartość ta jest wstawiana w miejsce wywołania funkcji. W kolejnym etapie następuje wstawienie tej wartości do zmiennej kw.

#include <stdio.h> Język C funkcje Przykład. Zastosowanie deklaracji funkcji. int kwadrat (int); // deklaracja funkcji int main() { int kw, wartosc; printf("\n Podaj wartosc :"); scanf("%d",&wartosc); kw=kwadrat(wartosc); printf("\n Kwadrat liczby %d wynosi:%d \n", wartosc,kw); system ("PAUSE"); return 0;} int kwadrat (int num){ int pom; pom=num*num; return pom;}

Wynik działania programu ------------------------ Podaj wartosc :25 Kwadrat liczby 25 wynosi:625 Aby kontynuować, naciśnij dowolny klawisz...

Przykład. (do wykonania w trakcie wykładu) Napisać i wywołać w main() następujące funkcje: a) funkcję obliczającą sumę swoich argumentów typu int b) funkcję obliczającą różnicę swoich argumentów typu int c) funkcję obliczającą iloczyn swoich argumentów typu double Funkcje obliczające sumę i różnicę wywołać dla pary argumentów.

#include <stdio.h> int sum (int a, int b); // deklaracje funkcji int roznica (int a, int b); double iloczyn (double a, double b); int main() { int a,b,c,d,sum,roz; double e,f,ilo; printf("\n Podaj a :"); scanf("%d",&a); printf("\n Podaj b :"); scanf("%d",&b); sum=suma(a,b);// a,b to argumenty wywołania funkcji

cz 2. programu printf("\n Suma %d + %d =%d ", a,b,sum); printf("\n Podaj c :"); scanf("%d",&c); printf("\n Podaj d :"); scanf("%d",&d); sum=suma(c,d); printf("\n Suma %d + %d =%d ", c,d,sum); roz=roznica(a,b); printf("\n Roznica %d - %d =%d ", a,b,roz); roz=roznica(c,d); printf("\n Roznica %d - %d =%d \n", c,d,roz);

cz 3. programu printf("\n Podaj e :"); scanf("%lf",&e); printf("\n Podaj f :"); scanf("%lf",&f); ilo=iloczyn(e,f); printf("\n Iloczyn %f * %f =%f \n", e,f,ilo); system ("PAUSE"); return 0;}

cz 4. programu int suma (int a, int b){ int sum; sum=a+b; return sum;} int roznica (int a, int b){ int roz; roz=a-b; return roz;} double iloczyn (double a, double b){ double ilo; ilo=a*b; return ilo;}

Wynik działania programu --------------------------------- Podaj a :2 Podaj b :3 Suma 2 + 3 =5 Podaj c :4 Podaj d :5 Suma 4 + 5 =9 Roznica 2-3 =-1 Roznica 4-5 =-1 Podaj e :2.5 Podaj f :3.5 Iloczyn 2.500000 * 3.500000 =8.750000

Przykład. Napisać i zastosować w programie funkcję silnia. #include <stdio.h> int silnia (int n ){ int i, sil=1; if (n>0) for (i=1;i<=n;i++) sil=sil*i; return sil; } int main() { int l1=5, l2=6; int sil1,sil2; sil1=silnia (l1); sil2=silnia (l2); printf("\n % d! wynosi %d", l1,sil1); printf("\n % d! wynosi %d\n", l2,sil2); system("pause"); return 0;}

Przykład. Napisać i zastosować w programie funkcję silnia. Wynik działania programu 5! wynosi 120 6! wynosi 720 Aby kontynuować, naciśnij dowolny klawisz...

Przykład. Napisać i zastosować w programie funkcję wczytajd wczytującą zmienną typu double. #include <stdio.h> double wczytajd (void ){ int k; double x; do{ printf("\n Podaj zmienna :"); k=scanf("%lf",&x); if (k==0) printf("\n Niepoprawny format liczby!"); fflush(stdin); } while (k==0); // można też while (!k); return x;} int main() { double x1,x2; x1=wczytajd (); x2=wczytajd(); printf("\n x1 wynosi %f", x1); printf("\n x2 wynosi %f \n", x2); system("pause"); return 0;}

Wynik działania programu ------------------------ Podaj zmienna :12 Podaj zmienna :23 x1 wynosi 12.000000 x2 wynosi 23.000000 Aby kontynuować, naciśnij dowolny klawisz...

Przykład. Użycie funkcji silnia w obliczania sumy częściowej szeregu (cz.1 ) n-1 i x x e = i= 0 #include <stdio.h> #include <math.h> double silnia (int); int main(int argc, char *argv[]) { int i,j,n; double xn,s,sil,x; while(1)// wielokrotne wykonanie programu { printf("\n Podaj x:"); scanf("%lf",&x); printf("\n Podaj liczbe wyrazow szeregu:"); scanf("%d",&n); i!

Przykład. Użycie funkcji silnia w obliczania wartości szeregu (cz. 2) s=0; for ( i=0;i<n;i++) { xn=pow(x,i)/silnia(i); s=s+xn; } printf("\n Wartosc e_do_x z szeregu:%f",s); printf("\n Wartosc e do x: exp %f\n", exp(x));} // koniec while system("pause"); return 0; } double silnia (int n) { int i; double sil=1; for (i=1;i<=n;i++) sil=sil*i; return sil;}

Wynik działania programu ------------------------ Podaj x: 2 Podaj liczbe wyrazow szeregu:6 Wartosc e_do_x z szeregu:7.266667 Wartosc e do x: exp 7.389056 Podaj x: 2 Podaj liczbe wyrazow szeregu: 7 Wartosc e_do_x z szeregu:7.355556 Wartosc e do x: exp 7.389056 Podaj x: 2 Podaj liczbe wyrazow szeregu:8 Wartosc e_do_x z szeregu:7.380952 Wartosc e do x: exp 7.389056

Przykład. Użycie funkcji silnia i funkcji szerege w obliczaniu wartości szeregu (cz. 1) #include <stdio.h> #include <math.h> double silnia (int); double szerege(double x, int n); int main(int argc, char *argv[]) { int i,j,n; double xn,s,sil,x; while(1) { printf("\n Podaj x:"); scanf("%lf",&x); printf("\n Podaj liczbe wyrazow szeregu:"); scanf("%d",&n);

Przykład. Użycie funkcji silnia i funkcji szerege w obliczaniu wartości szeregu (cz. 1) #include <stdio.h> #include <math.h> double silnia (int); double szerege(double x, int n); int main(int argc, char *argv[]) { int i,j,n; double xn,s,sil,x; while(1) { printf("\n Podaj x:"); scanf("%lf",&x); printf("\n Podaj liczbe wyrazow szeregu:"); scanf("%d",&n);

Przykład. Użycie funkcji silnia i funkcji szereg w obliczaniu wartości szeregu (cz. 2) s=szerege(x,n); printf("\n Wartosc e_do_x z szeregu:%f",s); printf("\n Wartosc e do x: exp %f\n", exp(x));} system("pause"); return 0;} double silnia (int n){ int i; double sil=1; for (i=1;i<=n;i++) sil=sil*i; return sil; } double szerege (double x, int n){ int i; double s=0,xn; for ( i=0;i<n;i++){ xn=pow(x,i)/silnia(i); s=s+xn; } return s;}

Przykład. Użycie funkcji silnia i funkcji szeregs w obliczaniu wartości sumy częściowej dla funkcji sinus(cz. 1) sin x n 0 ( 1) i x (2i 2i 1 1)! #include <stdio.h> #include <math.h> double silnia (int); double szeregs(double x, int n); int main(int argc, char *argv[]) { int i,j,n; double xn,s,sil,x; while(1) { printf("\n Podaj x:"); scanf("%lf",&x); printf("\n Podaj liczbe wyrazow szeregu:"); scanf("%d",&n);

Przykład. Użycie funkcji silnia i funkcji szeregs w obliczaniu wartości szeregu dla funkcji sinus(cz. 2) s=szeregs(x,n); printf("\n Wartosc sin x z szeregu:%f",s); printf("\n Wartosc sin x: sin(x)); } } system("pause"); return 0; double silnia (int n) { } int i; double sil=1; for (i=1;i<=n;i++) sil=sil*i; return sil; Język C funkcje %f\n",

Przykład. Użycie funkcji silnia i funkcji szeregs w obliczaniu wartości szeregu dla funkcji sinus(cz. 3) double szeregs(double x, int n) { int i; double s=0,xn; int wsp=-1; for (i=0;i<n;i++) { wsp*=(-1); xn=pow(x,2*i+1)/silnia(2*i+1)*wsp; s=s+xn; } return s; }

Podaj x:1.85 Język C funkcje Wynik działania programu ------------------------ Podaj liczbe wyrazow szeregu: 3 Wartosc sin x z szeregu:0.975312 Wartosc sin x: 0.961275 Podaj x:1.85 Podaj liczbe wyrazow szeregu: 6 Wartosc sin x z szeregu: 0.961275 Wartosc sin x: 0.961275 Podaj x:

umieszczona w jednym pliku). Język C funkcje Ogólna budowa funkcji Definicja funkcji Typ_zwracanej_wartości nazwa_funkcji (deklaracja parametrów formalnych, jeśli występują) { } deklaracje instrukcje Definicje poszczególnych funkcji mogą się pojawić w jednym pliku lub większej liczbie plików źródłowych, przy czym żadna funkcja nie może być rozdzielona między plikami źródłowymi (definicja funkcji musi być

int kwadrat (int, int); int echo_line (void); // void oznacza tutaj, że funkcja nie //ma parametrów void print_hist ( int size);// void oznacza tutaj, że funkcja // nic nie zwraca void print_prompt( void); Deklaracja funkcji Deklaracja funkcji stanowi informację dla innych funkcji stosujących daną funkcję o typie zwracanej wartości, liczbie i typach parametrów funkcji. Deklaracja ma postać skróconego nagłówka funkcji zakończonego średnikiem. Przykład. Deklaracje funkcji. Nazwy po typach parametrów są opcjonalne i są ignorowane przez kompilator. Nazwy parametrów stosować można dla celów dokumentacji, pozwalają one zorientować się co do roli poszczególnych parametrów bez sięgania do

Definicja a deklaracja funkcji Definicja funkcji może występować jednokrotnie. 1. Deklaracja funkcji f może występować wewnątrz funkcji g, która wywołuje daną funkcję f lub też na zewnątrz wszystkich funkcji. 2. Deklaracja funkcji f wewnątrz funkcji g służy tylko funkcji g. 3. Deklaracja funkcji f na zewnątrz wszystkich funkcji służy wszystkim tym funkcjom, których definicje umieszczono po deklaracji funkcji f.

// funkcja g - definicja { // deklaracja funkcji f f(...); // wywołanie f } // funkcja h -definicja { f(...); // wywołanie f } // funkcja f - definicja { } // deklaracja funkcji f // funkcja g - definicja { f(...); // wywołanie f } // funkcja h -definicja { f(...); // wywołanie f } // funkcja f -definicja { }

Instrukcja return (1) Instrukcja return ( ang. powróć, zwróć) pełni dwie zasadnicze funkcje: 1. Zwraca sterowanie programem do miejsca wywołania funkcji ( do funkcji wywołującej). 2. Umożliwia przekazanie wartości obliczonej przez funkcję do funkcji wywołującej.

- Funkcja, która zwraca wartość, powinna mieć przynajmniej jedną instrukcję return w formie Instrukcja return (2) return (wyrażenie); lub return wyrażenie; gdzie wyrażenie jest jakimkolwiek legalnym wyrażeniem języka C. - Obie formy mają to samo znaczenie. - Do funkcji wywołującej zwracana (przekazywana) jest wartość wyrażenia. - Funkcja przy wywołaniu może zwrócić co najwyżej jedną wartość.

Instrukcja return (3) Przykład. Instrukcja return. a) return 25*5 + fun2(x); b) return (25*5+ fun2(x)); c) double modul ( double x) { return x>0? x : -x; } Niezależnie od tego czy wyrażenie po return jest skomplikowane, czy też nie, zwracana jest jedna wartość.

Instrukcja return (4) Funkcja może posiadać kilka instrukcji return, jednak w czasie danego wywołania funkcji może zostać wykonana tylko jedna instrukcja return. Nie powinno się stosować w funkcji kilku instrukcji return, gdyż funkcja staje się mniej zrozumiała oraz trudniejsza do testowania i modyfikacji. Instrukcja return nie jest konieczna w funkcji, która nie zwraca żadnej wartości, ale jeśli jest używana to w postaci return; Jeśli nie ma instrukcji return wykonywane są kolejne instrukcje w treści funkcji, aż do momentu dojścia do nawiasu zamykającego funkcję.