Kompilator: a) gcc [cc, g++]

Slides:



Advertisements
Podobne prezentacje
Tablice 1. Deklaracja tablicy
Advertisements

Katarzyna Szafrańska kl. II ti
Mgr inż.Marcin Borkowski Podstawy Java Krótkie wprowadzenie dla studentów Wyższej Szkoły Ekologii i Zarządzania
Zmienne i Typy.
Prowadzący: mgr inż. Elżbieta Majka
Języki programowania C++
argumenty wiersza poleceń: getopt
formatowanie kodu źródłowego
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 3: Podstawowe elementy języka.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 8: Wykorzystanie procedur i funkcji © Jan Kaczmarek.
Zakres i zasięg deklaracji Zakres : obszar programu, w którym identyfikator może być użyty zakres globalny : cały program zakres lokalny : definicja pojedynczej.
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
Programowanie imperatywne i język C
Programowanie imperatywne i język C Copyright, 2005 © Jerzy R. Nawrocki Wstęp.
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
Tablice.
1 Dygresja: cztery płyty główne…. 2 Dygresja: osobliwości C /* cos o nieistniejacym typie Boolean */ /* oraz o operatorze przecinkowym */ #include int.
Języki programowania C++
Język ANSI C Operacje we/wy
Wykład 2 struktura programu elementy języka typy zmienne
PASCAL Dr Anna Kwiatkowska.
Wprowadzenie do programowania w języku Turbo Pascal
KOMPUTEROWE WSPOMAGANIE PRAC BADAWCZYCH FORTRAN - wprowadzenie Adam FIC INSTYTUT TECHNIKI CIEPLEJ.
Podprogramy.
Polsko – Japońska Wyższa Szkoła Technik Komputerowych
nowe operatory & . (kropka) * operator rzutowy -> , (przecinek)
Programowanie w języku Fortran 95
AWK Zastosowania Informatyki Wykład 1 Copyright, 2003 © Adam Czajka.
Programowanie imperatywne i język C Copyright, 2006 © Jerzy R. Nawrocki Wstęp do.
Podstawy programowania
Podstawy programowania II
Podstawy programowania II Wykład 2: Biblioteka stdio.h Zachodniopomorska Szkoła Biznesu.
Podstawy programowania w języku C i C++
Programowanie strukturalne i obiektowe
Algorytmy z przykładami w Turbo Pascal 7.0
Podstawy programowania w języku C i C++
Struktura programu w Turbo Pascalu.
© A. Jędryczkowski – 2006 r. © A. Jędryczkowski – 2006 r.
Poznaj bliżej program Microsoft Office Word 2007
Informatyka I Wykład 10 WSKAŹNIKI I ADRESY Jerzy F. Kotowski.
Pierwsze programy.
Wyrażenia w Turbo Pascalu.
Podstawy programowania
Procedury i funkcje.
Definicja pliku tekstowego Operacje wykonywane na plikach tekstowych
Podstawy programowania
Pliki Pojęcie i rodzaje plików Definicja typu plikowego Operacje wykonywane na plikach elementowych.
STEROWANIE Ale nie tylko
Informatyka I Wykład 4 Stałe Stałe liczbowe Stałe znakowe Stałe tekstowe Jerzy Kotowski Politechnika Wroclawska var = 5L - 0xA; -5.
Jerzy Kotowski Politechnika Wrocławska
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie strukturalne i obiektowe
Programowanie strukturalne – język C
Historia Języka C Idea C pochodzi od języka BCPL, opracowanego przez M. Richardsa 1970 – język B stworzony przez K. Thompsona Język C wprowadzono po raz.
Podstawy informatyki 2013/2014
PWSZ Gniezno // codefly 2009 Łukasz Tomczak
Podstawy programowania
Podstawy języka Instrukcje - wprowadzenie
Zmienne i typy danych w C#
PWSW Mechatronika Wykład 7 Matlab cd.
Podstawowe struktury danych. Typy danych.
Wybrane aspekty programowania w C++ (i nie tylko)
Typy liczbowe, zmienne, operatory Zajęcia 4. Zmienne Zmienna – to w programowaniu element programu, który może mieć przypisaną pewną wartość (wartość.
Programowanie imperatywne i język C Copyright, 2007 © Jerzy R. Nawrocki Wstęp do.
Wstęp do programowania Wykład 2 Dane, instrukcje, program.
P ASCAL Definicje, deklaracje, podstawowe instrukcje 1.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Wprowadzenie do edytorów tekstu.
Wprowadzenie do programowania obiektowego
Język C++ Typy Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego.
Zapis prezentacji:

1. ELEMENTARZ http:\\hermes.umcs.lublin.pl\~czmpf Kompilator: a) gcc [cc, g++] gcc [-opcje] nazwa_pliku.c -lm [-o nazwa_programu] b) ifc ifc [-opcje] nazwa_pliku.c -lm [-o nazwa_programu] STANDARDOWA NAWZW PROGRAMU: a.out Informacje o opcjach kompilatora: man gcc ifc --help /opt/intel/compilers/docs/ Głowny blok programu

printf(``control’’, agr1,arg2,...) INSTRUKCJE WYJŚCIA printf(``control’’, agr1,arg2,...) Funkcja printf pod nadzorem argumentu tekstowego control przekształca, formatuje i wypisuje argumenty (agr1, agr2,...) do standardowego wyjscia (ekran). UWAGA: control w cudzyslowie. Tekst sterujący zawiera obiekty dwojakiego rodzaju: zwykłe znaki (kopiowane do strumienia wyjściowego) specyfikacje przekształceń (podające sposób przekształcanie i wypisywania kolejnego argumentu) Wszystkie specyfikacje rozpoczynają się znakiem % i kończą znakiem przekształcenia. Miedzy % a znakiem przekształcenia mogą się znajdować: - (znak minus) oznacza żądanie dosunięcia wyprowadzonego argumentu do prawego marginesu pola ciąg cyfr określający minimalny rozmiar pola. Jeśli wyprowadzany argument jest mniejszy niż rozmiar pola, pozostałe „miejsce” jest uzupełniane znakami odstępu; jeśli argument jest większy - pole zostanie rozszerzone . (znak kropki) oddziela jedną specyfikacje wielkości pola od drugiej l (liketa „el”) wskazuje, że odpowiedni argument jest typu „long”

LISTA ZNAKÓW PRZEKSZTAŁCEŃ: d - argument drukowany w postaci dziesiętnej o - argument drukowany w postaci ósemkowej (bez znaku +, -!) x - w postaci szestnastkowej (bez znaku!) u - dziesiętna bez znaku c - argument jako jeden znak („character”) s - argument jest tekstem znakowym, znaki tekstu będą wypisywane do napotkania znaku zerowego e - agrument w postaci wykładniczej x.xxxxxExx, liczba znaków po kropce zależna od precyzji f - liczba zmiennoprzecinkowa, ale nie w postaci wykładniczej g - to e albo f, zależnie od wielkości liczby

PRZYKŁADY: :%20s: : ala ma kota: (pole 20 znaków, część jest zajęta :%-20s: :ala ma kota : (minus powoduje przesunięcie na lewo) :%-20.3s: :ala : (pole 20, wyprowadzamy 3 znaki tekstu) :%.5s: :ala m: (pole „nieokreślone”, dopasowywane automatycznie, 5 znaków) :%6d% :123456:; : 3456:, itd. JAK DZIAŁA: printf(“%4d %6.1f”,a,b)? printf(“%.0f”,a)? printf jest odpowiednikiem write w PASCALU, odpowiednikiem writeln jest umieszczenie \n w argumencie kontrolnym

przykład: printf((“ala ma kota”) ; printf(“i psa”); -> ala ma kota i psa printf((“ala ma kota\n”) ; printf(“i psa\n”); ala ma kota i psa tutaj będzie kursor po wypisaniu Najprostszy program: main() { printf(“ A KUKU/n”); }

INSTRUKCJA WEJŚCIA: Formatowane wejście - funkcja scanf scanf(control,arg1,arg2,...) UWAGA1: wprowadzenie zmiennych liczbowych WYMAGA poprzedzenia argumentu znakiem &. Jak dowiemy się później, znak & oznacza wskazanie. argumenty liczbowe funkcji MUSZĄ BYĆ WSKAŹNIKAMI!! UWAGA2: w funkcji scanf znak f jest synonimem e ! PRZYKŁADY: 1) scanf(“%d %f %s”, &i,&x,nazwisko) instrukcja ta dla danych wejściowych: 25 54.32E-1 Kowalski powoduje przypisanie zmiennej i (stałoprzecinkowa) wartości 25 zmiennej x (zmiennoprzecinkowa) wartości 5.432 zmiennej nazwisko - wartości Kowalski

2) scanf(“%2d %f %*d %2s”, &i,&x,nazwisko) instrukcja ta dla danych wejsciowych 56789 0123 45a72 spowoduje przypisanie i wartości 56 (2d!); zmiennej x - wartości 789.0 (czyta do znaku zerowego - spacji!), pole *d (co oznacza *?) spowoduje „przeskoczenie” 0123 (do kolejnego znaku spacji), a zmienna nazwisko będzie miala wartośc 45, ale nie jako liczba, ale jako ciag znaków!

ZMIENNE 1. nazwy zmniennych - podobnie jak w PASCALU. UWAGA: w zależności od kompilatora jedynie kilka pierwszych znaków w nazwie zmiennej jest wazne. W standardzie ANSI jest to 8 znaków. Dlatego w STANDARDZIE nazwy alamakot oraz alamakota nie byłyby rozrózniane. 2. Typy i rozmiary zmiennych Zmienne proste, dalsze typy później char - jeden bajt, jeden znak int - typ calkowity (w PASCALU integer) float - typ rzeczywisty (real) double - rzeczywisty długi (extended) short int - „krótkie” integer long int long float = double unsigned int - bez znaku 3) deklaracja zmiennych int arg1,arg2,..... float arg11,arg12,....

Arytmetyka: operatory +, -,*,/ , % (reszta z dzielenia, modulo) operator przypisania = ( w PASCALU :=) Komentarz: /* tutaj wpisujemy komentarz*/ Grupowanie: { ... } (w pascalu begin .... end) Koniec instrukcji - znak ; PRZEYKŁAD: /*ten program przeliczy temperatury Fahrenheita na Celsjusz*/ main() { int dolna,gorna,krok; float fahr,cels; dolna=0; /*najnizsza temp Fahr.*/ gorna=300; /*najwysza temp Fahrr.*/ krok=10; /*krok tablicowania */ fahr=dolna; while(fahr <= gorna) cels=(5.0/9.0)*(fahr-32.0); /*uwaga NIE 5/9 DLACZEGO?*/ printf(``%4.0f %6.1f\n”, fahr,cels); fahr=fahr+krok; }

Zadanie 1. Napisac program, który czyta dwie liczby rzeczywiste ZADANIE DO WYKONANIA: Zadanie 1. Napisac program, który czyta dwie liczby rzeczywiste i oblicza ich sumę, różnicę oraz iloczyn. Wyniki wypisuje a) w jednej linii; b) każdy wynik w odrębnej linii.

W nagłówku poczty należy podać: NAZWISKO, IMIE, NUMER ZADANIA KAŻDY JEST ZOBOWIĄZANY WYKONAĆ ZADANIA. WYKONANE ZADANIA NALEŻY WYSŁAĆ NA ADRES: sokol@hermes.umcs.lublin.pl W nagłówku poczty należy podać: NAZWISKO, IMIE, NUMER ZADANIA termin wykonania - 1 tydzień, przekroczenie terminu jest równoważne niewykonaniu zadania. Brak odpowiedzi na więcej niż połowa zadań oznacza brak zaliczenia wykładu. Odpowiedzi przyjmuję jedynie poprzez e-mail. Za błędy w przesłaniu poczty odpowiedzialność ponosi wysyłający

Pliki z zadaniami mogą być również automatycznie sprawdzane w celu eliminacji przesłania przez dwie lub więcej osób tych samych rozwiązań. Program sprawdzający eliminować będzie wszystkie pliki, w których stwierdzona wzajemna zgodność będzie większa niż 75% (kryteria zgodności to kryteria systemu PLAGIAT, stosowanego w UMCS do sprawdzania prac magisterskich i dyplomowych). Eliminacja - usuwanie zbiorów - oznacza, że nie ma możliwości „odwołania się”. Stosować więc należy długie nazwy zmiennych, np. zamiast suma - suma_a_i_b, suma_ab;

w ostatnim programie zamiast nadawania wartości: dolna=0 możemy wartość dolna (podobnie: gorna, krok) zdefiniować jako STAŁE SYMBOLICZNE #define dolna 0 #define gorna 300 #define krok 10 main() {.... } INSTRUKCJE #DEFINE NA POCZĄTKU PROGRAMU! Podobnie jak w PASCALU pewne stałe są PRE-DEFINIOWANE np. EOF - znak końca zbioru

Funkcje: getchar() i putchar() (funkcja getchar() to analog readkey w WEJŚCIE I WYJŚCIE ZNAKOWE Funkcje: getchar() i putchar() (funkcja getchar() to analog readkey w PASCALU) INSTRUKCJA „FOR” SKŁADNIA: int i,krok; scanf(“%d”,&krok); for (i=0; i<=100;i=i+krok) { instrukcje wykonywane „wewnatrz” for} OPERATORY RELACJI: < - mniejszy, <= - mniejszy lub równy, >- większy, >= - większy lub równy OPERATORY PRZYRÓWNANIA == - równy, != - różny (! jest zaprzeczeniem), ILOCZYN LOGICZNY („AND”) i SUMA LOGICZNA („OR”) || - lub, && - i UWAGA: OPERATORY LOGICZNE != OPERATORY BITOWE OPERATORY BITOWE: & - koniunkcja, | -alternatywa, ^ - różnica symetryczna („XOR”)

PRZYKŁADY PROSTYCH PROGRAMÓW: Program 1. Zlicza ilość znaków wejściowych, do momentu pojawienia się znaku końca zbioru (EOF) main() { long liczba_znakow; liczba_znakow=0; while{getchar()!=EOF) /* 1 */ ++liczba_znakow; /*w petli jedna instrukcja, nie trzeba {}, ale mozna 2 */ printf(“%ld\n”,liczba_znakow); /* 3 */ } KOMENTARZE: 1. jaki znak jest znakiem końca zbioru w Linuxie (Unixie): stty -a 3. liczba_znakow zadeklarowana jako „long”, stąd formad wydruku %ld; \n powoduje przeskok kursora do następnego wiersza po wykonaniu instrukcji. Jeśli znaków jest duzo należy deklarować double! (c.f. PASCAL!). wówczas format wydruku trzeba zmienić (jak? - np. % . 0f) 2. ++n jest „skrótem” dla n=n+1; podobnie --n to skrót n=n-1 ALE: istnieje też n++ oraz n--. W przypadku ++n wartość LEWEJ STRONY jest wyznaczana PO wykonaniu operacji NA PRAWEJ STRONIE, zaś dla n++ - PRZED wykonaniem operacji (podobnie --n oraz n--

UWAGA: najprostsze wprowadzanie danych z pliku (znak EOF jest automatycznie generowany przez edytor: nazwa_programu < nazwa_pliku_danych a.out < nazwa_pliku_danych

Program 2. Zlicznie linii a) Wersja „jak w pascalu” main() { int c,numer_linii; c=getchar(); /* C, ZNAK ALE TYP INTEGER!!*/ while(c!=EPF) { if( c==‘\n’) /* \n to znak konca linii */ ++ numer_linii; c=getchar(); } printf((“%d\n”,numer_linii); b) wersja „typu c” while((c=getchar())!=EOF) /*PRZYPISANIE I WARUNEK*/ if(c==‘\n’) ++numer_linii; printf (“%d\n”,numer_linii);

Program 3. Zliczanie słów, wierszy, znaków (słowo kończy się albo znakiem nowej linii, albo odstępem. Odstęp może być spacją, lub znakiem tabulacji!) #define tak 1 #define nie 0 main() { int c,n_l,n_s,n_z,i_s; /*n_l-linia, n_s-slowo, n_z-znak*/ { i_s=nie; n_l=n_w=n_z=0; /* wielokrotne przypisanie! */ while((c=getchar())!=EOF) { ++n_z; if(c==‘\n’) ++n_l; if(c==‘ ‘||c==‘\n’||c==‘\t’) i_s=nie; /* else if(i_s==nie) i_s=tak; ++ n_s; }} printf(``%d %d %d/n”, n_l,n_s,n_z); }

TABLICE JEDNOWYMIAROWE int tablica[10]; float tablica[10]; itp. - tablica[0],tablica[1],...,tablica[9] w deklaracji 10 elementow, elementy liczymy od 0 ! PRZYKŁAD: program sprawdzający ile jest cyfr poszczególnego rodzaju w wyedytowanym zbiorze.

UWAGA 1: Czytamy stosując funkcje getchar() wprowadzania ZNAKÓW UWAGA 1: Czytamy stosując funkcje getchar() wprowadzania ZNAKÓW. Nie możemy stosować scanf, bo nie wiemy, czy mamy do czynienia z cyfra, czy tez z innym znakiem (np.. a,n,k,..). Ale w C MOŻEMY deklarować czytane znaki jako int; w istocie w komputerze znaki pamiętane są jako kody ASCI Znaki (kody) są uporządkowane w kolejności 0,1,2,3,...9 a więc stosowanie relacji porządku <, >, itd. jest uzasadnione. Podobnie litery są uporządkowane: a,b,c,...z. Podobnie pisaliśmy w PASCALU. UWAGA 2: Zadeklarowaliśmy tablice ile[10] o elementach ile[0], ile[1], ile[2], ..., ile[9]. Element ile[i] (i=0,1,..,9) zawierać będzie ilośc zer, jedynek,.. dziewiątek. c jest „character”, tj. kodem znaku (kodem 0,1,2,..9). ‘0’ jest kodem zera. Ponieważ kody 0,1,2,..9 są KOLEJNYMI liczbami całkowitymi różnica c-’0’ jest liczbą całkowita z przedziału [0,9], a więc INDEKSEM tablicy.

ZADANIE 2 DO SAMODZIELNEGO ROZWIĄZANIA: napisać analogiczny program wyznaczający liczbę wystąpień kolejnych liter a-z, A-Z ZADANIE 3: Napisać program wyznaczający HISTOGRAM długości słów w dokumencie. Przjąć, że wszystkie słowa o długości > 15 należą do jednej kategorii. Słowa oddziela \n, ‘ ‘(spacje) lub ‘\t’

napisz funkcję, która oblicza potęgi całkowite liczby całkowitej FUNKCJE - wstęp napisz funkcję, która oblicza potęgi całkowite liczby całkowitej /* program główny*/ main() { int i; for(i=0;i<=10;++i) printf(“%d %d %d\n”,i,potega(2,i),potega(-2,i)) } /* funkcja */ potega(x,n) int(x,n); /*deklaracja typow argumentow funkcji*/ { int i,p; p=1; for(i=1;i<=n;++i) p=p*x return(p); /*to jest podstawienie potega=p !! */

Wszystkie funkcje maja postać: nazwa(lista argumentów - jeśli występują) deklaracja argumentów { deklaracje instrukcje } Deklaracje argumentów umieszcza się po nazwie funkcji, między nazwą funkcji a otwierającym nawiasem klamrowym. Po nawiasie klamrowym mogą wystąpić nazwy zmiennych używanych w funkcji. Są to nazwy lokalne i niedostępne dla wszystkich innych funkcji. Wartość obliczana zwracana jest to programu głównego (main()) poprzez instrukcję return. Nie wszystkie funkcje muszą zwracać wartość. Instrukcja return bez nawiasu i zmiennej (wyrażenia) oznacza, że od tego momentu następuje powrót do programu głównego.

ZADANIE 4. Funkcja lower(c ) zwraca c, jeśli c nie jest literą, lub wartość małej litery, jeśli c jest dużą literą. Np. dla c=‘A’, lower(c )=a; dla c=‘9’ - wartość lower(c )=9. Napisz funkcję lower(c ). Wskazówki: Pamietaj, że znaki ASCI mogą być podstawiane pod zmienne typu int Pamietaj, że w kodzie ASCI litery są uporządkowane. Najpierw wystepują duże litery (alfabetycznie), później małe (alfabetycznie) Jeśli c jest dużą litera, to c>=‘A’ && c<=‘Z’ Pamiętaj, że jeśli c jest dużą literą, to c+’a’-’A’ jest odpowiadającą jej małą literą

0 1 2 3 4 5 6 7 kolejne bity, każdy z nich ma Uzupełnienie: kod ASCI. Każdy znak kodowany jest na 2 bajtach (8 bitach): 0 1 2 3 4 5 6 7 kolejne bity, każdy z nich ma wartość 0 lub 1 Bit 7 w standardowym kodzie ASCI nie jest stosowany, stosowany jest w rozszerzeniach (np. polskich). Jeśli znak jest litera, bit 6 ma wartość 1, w przeciwnym wypadku 0. Bit 5 ma wartość 0 - jest to duża litera; wartość 1 - mała litera lub inny znak; bit 4 ma wartość zero - litera od a-o (A-O, zależnie od bitu 5), wartość 1 -> p-z lub nie jest literą. Kod litery p to 01101001 q 10111010 Ile wynosi p&q ? 00101000 p|q ? ??????????

Zauważ, że reprezentacja binarna liczby 223 to 11011111 =1*2**0+1*2**1+1*2**2+....0*2**5+1*2**6+ 1*2**7 co będzie wynikiem działania c&223 ?? jeśli c jest mała litera? Może duża litera? Reprezentacja binarna liczby 32 to 00100000 = 2**5 co będzie wynikiem c|32, jeśli c jest dużą literą? Może mała litera? Czy potrafisz więc rozwiązać zadanie 4, wykorzystując powyższe informacje?

ARGUMETY FUNKCJI SĄ PRZEKAZYWANIE PRZEZ WARTOŚĆ. Oznacza to, że jeśli w funkcji fun(x), wywoływanej z argumentem x, wartość argumentu będzie zmieniona, to w programie głównym pozostanie ona niezmieniona. Podczas wywołania funkcji tworzona jest „kopia” argumentu i na niej wykonywane są działania. Jeśli potrzeba, to można spowodować, aby funkcja zmieniała wartość argumentu. W tym celu podczas wywołania musimy przekazać adres zmiennej (WSKAŹNIK DO ZMIENNEJ), funkcja wywoływana musi zadeklarować odpowiedni argument jako adres (WSKAŹNIK). Będziemy o tym mówić poźniej

ZASIĘG ZMIENNYCH: Zmienne zadeklarowane wewnątrz funkcji są zmiennymi lokalnymi („prywatnymi” danej funkcji). Każda zmienna lokalna funkcji „zaczyna istnieć” w momencie wywołania funkcji i znika po zakończeniu jej działania. Zmienne lokalne określane są także jako „automatyczne” Przeciwieństwem do zmiennych lokalnych są zmienne zewnętrzne - globalne. Są to zmienne dostępne przez nazwę w dowolnej funkcji. Ze względu na to, że zmienne globalne są ogólnie dostepne, mogą być stosowane zamiast list argumentów funkcji. Do definiowania zmiennych globalnych stosuje się definicję extern (deklaracja w sposób jawny), albo deklarację niejawną, poprzez kontekst (por. PASCAL) Stałe definiowane instrukcja #define są globalne Przykład programu: w czytanym zbiorze wierszy znajdujemy wiersz najdłuższy i wypisujemy go

if(max>0) printf(``%s”,pamieta); } getline() /* funkcja */ { int c,i; extern char linia[]; for(i=0;i<maxlinia-1 && (c=getchar()) !=EOF &&c!=‘\n’; ++i) linia[i]=c; if(c==‘\n’) ++i; linia[i]=‘\0’; return(i); #define maxlinia 1000 char linia[maxline]; char pamieta[maxline]; int max; main() /* glowny */ { int dlugosc; exctern int max; extern char pamieta[]; max=0; while ((dlugosc=getline())>0) if(dlugosc>max) max=dlugosc; copy(); }

copy() /* funkcja */ { int i; extern char linia[]; pamietaj[]; i=0; while((pamietaj[i]=linia[i])!=‘\0’) ++i; } znak ‘\0’ to „null” - znak pusty znak równości w tej instrukcji to znak przypisania! (a nie znak logiczny)

ZADANIE 5 DO WYBORU 2 z 3 a) Napisz program wypisujący wszystkie wiersze wejściowe dłuższe niż 56 znaków b) Program, który z czytanego wiersz usuwa wszystkie znaki „puste” (odstępy, znaki tabulacji) c) Program, który przeczytany wiersz zapisuje „od końca”