44
`ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych z danymi wejściowymi. Należy jednak pamiętać, że w niektórych przypadkach mogą zawierać one od kilkudziesięciu do kilkuset linii tekstu, tak, aby bezcelowe byłoby „ręczne” podliczanie rozwiązań. Często na konkursach wymaga się, aby wyniki znalazły się także w plikach. Rozwiązania zadań przedstawiane będą kilkoma sposobami, tak aby zachować różnorodność stosowanych narzędzi i metod. Zadanie 1: W pliku tekstowym IMIONA.TXT znajdują się imiona oddzielone spacjami. Oblicz, ile w tym zbiorze znajduje się imion rozpoczynających się literą Z. Przykładowa zawartość pliku: Tadeusz Zofia Marek Ewa Paweł Jerzy Elżbieta Dorota Krzysztof Agata Bartłomiej Teresa Genowefa Zygmunt Zenobiusz Arkadiusz Stefan Zygfryd Franciszek Zenona Barbara Leon Uwaga: Pierwsze litery imion pisane są z wielkiej litery, pozostałe litery są małe. Propozycja rozwiązania - arkusz kalkulacyjny EXCEL. 1. Otwórz plik tekstowy w arkuszu kalkulacyjnym, wybierając opcję Z SEPARATORAMI i ustawiając dalej rodzaj separatora na SPACJĘ, tak, aby każde z imion zostało umieszczone w osobnej komórce. 2. Zastosuj funkcję arkusza =FRAGMENT.TEKSTU(adres; 1; 1), pobierając w ten sposób pierwsze litery imion oraz funkcję =JEŻELI(adres=”Z”; 1; 0). 3. Zsumuj wszystkie liczby będące wynikami operacji (2) przy pomocy funkcji =SUMA(adres1:adres2). Propozycja rozwiązania – program w języku C++ #include <iostream> #include <cstring> #include <fstream> using namespace std; main() { int ile = 0; string s; fstream plik; plik.open ("imiona.txt" , ios::in) ; while ( plik >> s) { cout<<s<<endl; if (s[0]=='Z') ile++; } plik.close(); cout<<"Ilość imion zaczynających się na literą Z = "<<ile; return 0; }

ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

`ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych z danymi wejściowymi. Należy jednak pamiętać, że w niektórych przypadkach mogą zawierać one od kilkudziesięciu do kilkuset linii tekstu, tak, aby bezcelowe byłoby „ręczne” podliczanie rozwiązań. Często na konkursach wymaga się, aby wyniki znalazły się także w plikach. Rozwiązania zadań przedstawiane będą kilkoma sposobami, tak aby zachować różnorodność stosowanych narzędzi i metod. Zadanie 1: W pliku tekstowym IMIONA.TXT znajdują się imiona oddzielone spacjami. Oblicz, ile w tym zbiorze znajduje się imion rozpoczynających się literą Z. Przykładowa zawartość pliku: Tadeusz Zofia Marek Ewa Paweł Jerzy Elżbieta Dorota Krzysztof Agata Bartłomiej Teresa

Genowefa Zygmunt Zenobiusz Arkadiusz Stefan Zygfryd Franciszek Zenona Barbara Leon

Uwaga: Pierwsze litery imion pisane są z wielkiej litery, pozostałe litery są małe. Propozycja rozwiązania - arkusz kalkulacyjny EXCEL. 1. Otwórz plik tekstowy w arkuszu kalkulacyjnym, wybierając opcję Z SEPARATORAMI

i ustawiając dalej rodzaj separatora na SPACJĘ, tak, aby każde z imion zostało umieszczone w osobnej komórce.

2. Zastosuj funkcję arkusza =FRAGMENT.TEKSTU(adres; 1; 1), pobierając w ten sposób

pierwsze litery imion oraz funkcję =JEŻELI(adres=”Z”; 1; 0). 3. Zsumuj wszystkie liczby będące wynikami operacji (2) przy pomocy funkcji

=SUMA(adres1:adres2).

Propozycja rozwiązania – program w języku C++

#include <iostream> #include <cstring> #include <fstream> using namespace std; main() { int ile = 0; string s; fstream plik; plik.open ("imiona.txt" , ios::in) ; while ( plik >> s) { cout<<s<<endl; if (s[0]=='Z') ile++; } plik.close(); cout<<"Ilość imion zaczynających się na literą Z = "<<ile; return 0; }

Page 2: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Propozycja rozwiązania – program w języku SMALL BASIC Imiona powinny być zapisane są w pliku w jednej linii, jeśli nie, to trzeba najpierw obliczyć ilość wierszy do wczytania.

s=File.ReadLine("D:\Konkurs\imiona.txt",1) dlug=Text.GetLength(s) ile=0 For k = 1 to dlug x=Text.GetSubText(s, k, 1) If x="Z" Then ile=ile+1 EndIf EndFor TextWindow.WriteLine(ile)

Propozycja rozwiązania – program w języku PASCAL Imiona zapisane są dowolnie. Pierwsze litery imion pisane są z wielkiej litery, pozostałe litery są małe. program wspak; uses crt; var ile,i: integer; im: string; p: text; begin clrscr; ile:=0; assign(p,'imiona.txt'); reset(p); repeat readln(p,im); for i:=1 to length(im) do if im[i]='Z' then inc(ile); until eof(p); close(p); writeln('Ilość imion zaczynających się na literę Z = ',ile); readln; end.

Page 3: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Zadanie 2: Używając dowolnego sposobu przedstaw na ekranie rysunek dwóch sześciokątów foremnych, tak, aby wierzchołki jednego z nich leżały w połowie

boków drugiego. Propozycja rozwiązania - edytor WORD

1. Ustaw siatkę rysowania w poziomie i pionie na 0,01 cm (RYSUJ /SIATKA). 2. Wybierz AUTOKSZTAŁTY/KSZTAŁTY PODSTAWOWE/ sześciokąt.

3. Rysuj sześciokąt z trzymanym klawiszem SHIFT.

4. Skopiuj rysunek, wklej, zmień rozmiar i obróć

RYSUJ/OBRÓĆ lub PRZERZUĆ/DOWOLNY OBRÓT.

5. Przesuń w odpowiednie miejsce.

Propozycja rozwiązania – program PAINT ETAP 1: ETAP 2:

komp
zobacz inne
Page 4: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

ETAP 3: ETAP 4: obliczamy współrzędne środków ze wzorów xs=(x1+x2)/2 ys=(y1+y2)/2 Wierzchołkami sześciokąta mogą być w przybliżeniu punkty: (3;9) (7;16) (15;16) (19;9) (15;2) (7;2) Uzasadnienie matematyczne:

Odcinek [(7;16)(15;16)] ma długość 864)1616()157( 22 ,

natomiast odcinek [(3;9)(7;16)] 06,8)167()93( 22

Propozycja rozwiązania – program w języku PROCESSING void setup() // funkcja inicjująca { size(800,800); // rozmiar okna graficznego strokeWeight(2); // grubość pisaka noFill(); // brak wypełnienia noLoop(); } void draw() { int x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6; float xs1,ys1,xs2,ys2,xs3,ys3,xs4,ys4,xs5,ys5,xs6,ys6; x1=7; y1=2; x2=3; y2=9; x3=7; y3=16; x4=15; y4=16; x5=19; y5=9; x6=15; y6=2; xs1=(x1+x2)/2; ys1=(y1+y2)/2; xs2=(x2+x3)/2; ys2=(y2+y3)/2; xs3=(x3+x4)/2; ys3=(y3+y4)/2; xs4=(x4+x5)/2; ys4=(y4+y5)/2;

komp
zobacz inne
Page 5: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

xs5=(x5+x6)/2; ys5=(y5+y6)/2; xs6=(x6+x1)/2; ys6=(y6+y1)/2; line(50+x1*20,50+y1*20,50+x2*20,50+y2*20); line(50+x2*20,50+y2*20,50+x3*20,50+y3*20); line(50+x3*20,50+y3*20,50+x4*20,50+y4*20); line(50+x4*20,50+y4*20,50+x5*20,50+y5*20); line(50+x5*20,50+y5*20,50+x6*20,50+y6*20); line(50+x6*20,50+y6*20,50+x1*20,50+y1*20); line(50+xs1*20,60+ys1*20,50+xs2*20,60+ys2*20); line(50+xs2*20,60+ys2*20,50+xs3*20,50+ys3*20); line(50+xs3*20,50+ys3*20,50+xs4*20,60+ys4*20); line(50+xs4*20,60+ys4*20,50+xs5*20,60+ys5*20); line(50+xs5*20,60+ys5*20,50+xs6*20,50+ys6*20); line(50+xs6*20,50+ys6*20,50+xs1*20,60+ys1*20); } Zadanie 3: Wykonaj na ekranie napis KONKURS czcionką wielokolorową (przynajmniej w trzech kolorach).

Propozycja rozwiązania – edytor tekstów WORD i program PAINT

1. Wykonaj napis w programie WORD - czcionka: Arial, rozmiar : 40, format: kontur

2. Skopiuj napis do okna programu PAINT i podziel napis na trzy części.

Page 6: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

3. Pokoloruj części różnymi kolorami i usuń kolor czarny. Usuwanie polega na wylaniu jako tła koloru czarnego, a potem w tym samym miejscu białego.

Zadanie 4: W pliku TEKST.TXT znajduje się pewien zaszyfrowany tekst. Wiadomo, że szyfrowanie polegało na zastąpieniu każdej z liter alfabetu inną z przesunięciem o 2 pozycje w kodzie ASCII. Nie wiemy tylko, czy przesunięcie odbyło się w prawo, czy w lewo. Odczytaj zaszyfrowany tekst. Przykładowa zawartość pliku:

Rciqr-rcl-qncah_jlgc-npxwemrmu_lm-g-x_qxwdpmu_lm-l_-imlispq-gldmpk_rwaxlw,-R_igc-qxwdpmu_lgc-hcqr-`_pbxm-npmqrc*-_-l_ucr-npwkgrwulc*-_jc-qisrcaxlgc-afpmlg-rciqr-npxcb-agci_uqigkg-max_kg,

Propozycja rozwiązania – program w języku PASCAL program kody; uses crt; var kod: integer; s: string ; zn:char; p1,p2: text; begin clrscr;

s:=''; {’’tekst pusty, między apostrofami nie ma spacji!}

assign(p1,'tekst.txt'); reset(p1); assign(p2,'nowy.txt'); rewrite(p2); while not(eof(p1)) do

{eof – end of file, szukanie znacznika końca pliku}

begin read(p1,zn); kod:=ord(zn); zn:=char(kod+2);

{char – zamiana liczby (kodu) na znak}

write(p2,zn); end; close(p1); close(p2);readln; end.

Jeżeli w pliku nowy.txt ukaże się niezrozumiały tekst to polecenie zn:=char(kod+2); należy zamienić na zn:=char(kod-2); gdyż nie wiemy jak został przesunięty kod. Rozkodowany tekst:

Tekst ten specjalnie przygotowano i zaszyfrowano na konkurs informatyczny. Takie szyfrowanie jest bardzo proste, a nawet prymitywne, ale skutecznie chroni tekst przed ciekawskimi oczami.

Page 7: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Zadanie 5: Oblicz wartość wyrażenia 1+2+3+ ... +n, dla podanego nN, n<1000.

Zadanie 6: Oblicz wartość wyrażenia 1 2 3 4 … n , dla podanego nN, n<1000.

Propozycja rozwiązania – arkusz kalkulacyjny EXCEL (Wadą takiego rozwiązania jest to, że podana liczba jest stałą, a nie zmienną.)

Zawartości komórek:

D1: ilość liczb, D2: =suma(A1:A40), D3: =iloczyn(A1:A40) Zapis 8,15915E+47 oznacza liczbę 8,15915 1047

Propozycja rozwiązania – program w języku SMALL BASIC suma=0 iloczyn=1 TextWindow.Write("Ile liczb? ") ile=TextWindow.Read() For i = 1 to ile suma=suma+i iloczyn=iloczyn*i EndFor TextWindow.WriteLine(" Suma="+suma) TextWindow.WriteLine("Iloczyn="+iloczyn)

Propozycja rozwiązania – program w języku C++ #include <iostream>

using namespace std; main() { long double suma=0, iloczyn=1; int n, i; cout<<"Podaj ilość n: "; cin>>n; for (i=1; i<=n; i++) { suma=suma+i; iloczyn=iloczyn*i;

Page 8: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

} cout<<"Suma="<<suma<<endl; cout<<"Iloczyn="<<iloczyn<<endl; return 0; }

Zadanie 7: Oblicz ile upłynęło godzin od podanych dwóch wartości: godzina początkowa i godzina końcowa (pełne godziny bez minut).

Propozycja rozwiązania – arkusz kalkulacyjny E

Zawartości komórek:

B1: godzina początkowa B2: godzina końcowa D2: =jeżeli(B1<B2; B2-B1; 24-B1+B2) Zadanie 8: W pliku tekstowym LICZBY.TXT znajdują się liczby naturalne

z zakresu 1 20. Traktując każde kolejne cztery liczby jako współrzędne końców odcinków w kartezjańskim układzie współrzędnych, przedstaw rysunek ukazujący te odcinki.

Przykładowa początkowa zawartość pliku:

3, 1, 3, 18 3, 18, 7, 18 7, 18, 7, 11 7, 11, 13, 18 13, 18, 17, 18 17, 18, 10, 9 10, 9, 17, 1 17, 1, 13, 1 13, 1, 7, 8 7, 8, 7, 1 7, 1, 3, 1 Propozycja rozwiązania - program PAINT

komp
zobacz inne
Page 9: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Propozycja rozwiązania – program w języku PROCESSING void setup() // funkcja inicjująca { size(800,800); // rozmiar okna graficznego strokeWeight(2); // grubość pisaka noFill(); // brak wypełnienia noLoop(); } void draw() // procedura rysowania, wykonywana jest wielokrotnie, // aż do zamknięcia okna, funkcja noLoop() likwiduje powtarzanie { int i,x1,y1,x2,y2; int l[]=new int [100]; // tabliaca - "na zapas" do 100 l[4]=3; l[5]=1; l[6]=3; l[7]=18; l[8]=3; l[9]=18; l[10]=7; l[11]=18; l[12]=7; l[13]=18; l[14]=7; l[15]=11; l[16]=7; l[17]=11; l[18]=13; l[19]=18; l[20]=13; l[21]=18; l[22]=17; l[23]=18; l[24]=17; l[25]=18; l[26]=10; l[27]=9; l[28]=10; l[29]=9; l[30]=17; l[31]=1; l[32]=17; l[33]=1; l[34]=13; l[35]=1; l[36]=13; l[37]=1; l[38]=7; l[39]=8; l[40]=7; l[41]=8; l[42]=7; l[43]=1; l[44]=7; l[45]=1; l[46]=3; l[47]=1; for (i=0; i<12;i++) { x1=l[4+i*4]*20;y1=l[5+i*4]*20;x2=l[6+i*4]*20;y2=l[7+i*4]*20; line(100+x1,100+y1,100+x2,100+y2); } }

komp
zobacz inne
Page 10: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Zadanie 9: Wyświetl na ekranie wszystkie możliwe ustawienia (permutacje) czterech liter A, B, C, D

Propozycja rozwiązania – arkusz kalkulacyjny EXCEL Algorytm: Wypisujemy wszystkie liczby naturalne czterocyfrowe od 1234 do 4321, a następnie eliminujemy te liczby, w których powtarza się jakaś cyfra. Pozostałe liczby (te o różnych cyfrach) generują rozwiązanie.

1) Od komórki A1 wstawiamy SERIĘ DANYCH - liczby naturalne od 1234 do 4321 2) W komórce B1 pozyskujemy czwartą cyfrę liczby z A1 =MOD(A1;10) - reszta z dzielenia liczby z komórki A1 przez 10

3) Kopiujemy wzór na zakres B2:B3088 4) W komórce C1 pozyskujemy trzecią cyfrę liczby z A1

=MOD((A1-B1)/10;10)

5) Kopiujemy wzór na zakres C2:C3088 6) W komórce D1 pozyskujemy drugą cyfrę liczby z A1 =MOD((A1-B1-C1*10)/100;10) 7) Kopiujemy wzór na zakres D2:D3088 8) W komórce E1 pozyskujemy pierwszą cyfrę liczby z A1

=MOD((A1-B1-C1*10-D1*100)/1000;10)

9) Kopiujemy wzór na zakres E2:E3088 10) Sprawdzamy, czy cyfry są różne =JEŻELI(ORAZ(B1<>C1;B1<>D1;B1<>E1;C1<>D1;C1<>E1;D1<>E1);1;0)

Page 11: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

11) Sprawdzamy, czy cyfry są to 1, 2, 3, 4 =JEŻELI(ORAZ(B1>0;B1<5);1;0)

=JEŻELI(ORAZ(C1>0;C1<5);1;0) =JEŻELI(ORAZ(D1>0;D1<5);1;0) =JEŻELI(ORAZ(E1>0;E1<5);1;0)

12) Sprawdzamy, czy wszystkie cyfry są różne =JEŻELI(ORAZ(G1=1;H1+I1+J1+J1=4);1;0)

13) Wybieramy te liczby, dla których wszystkie cyfry są różne i z zakresu od 1 do 4 =JEŻELI(L1=1;A1;0)

14) Przetwarzamy liczby na znaki o kodach odpowiadających kodom ASCII =JEŻELI($M1=0;"";ZNAK(64+B1)) =JEŻELI($M1=0;"";ZNAK(64+C1)) =JEŻELI($M1=0;"";ZNAK(64+D1)) =JEŻELI($M1=0;"";ZNAK(64+E1))

15) Odrzucamy te wiersze, w których w kolumnie M występuje cyfra 0 - zaznaczamy kolumnę M, - CTTRL + F (ZNAJDŹ), - wpisujemy znak 0, następnie ZNAJDŹ WSZYSTKO, - CTRL + A dla zaznaczenia wszystkich komórek z zerami, - klikamy na dowolną komórkę z zerem / PRAWY PRZYCISK MYSZY / USUŃ WSZYSTKO

W kolumnach N, O, P, Q mamy wszystkie permutacje.

Page 12: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

…………………………………………………………………………………………………………….. Poradnik jak usunąć niepotrzebne wiersze arkusza:

https://www.youtube.com/watch?v=xkRXcss9xyQ ……………………………………………………………………………………………………………..

Propozycja rozwiązania – program w języku PASCAL Program tworzy permutacje wielkich liter, nie tylko w ilości 4, ale dowolnego ciągu od A do Z.

Wystarczy podać tą ilość. Dla n=4 mamy litery ABCD.

Wykorzystany jest pomysł z rozwiązania w arkuszu EXCEL.

Tworzymy wszystkie liczby naturalne czterocyfrowe od 1234 do 4321, a następnie eliminujemy

te liczby, w których powtarza się jakaś cyfra. Pozostałe liczby (te o różnych cyfrach) generują

rozwiązanie.

program permut; uses Crt; { potęga liczby 10 }

function pot(w: integer):longint; var i, j: integer; p: longint; begin p:=1; if w>0 then for i:=1 to w do p:=p*10; pot:=p; end; { drukowanie permutacji }

procedure permutacja(n: integer); var x,y,z: longint; i,j,k,l, czy: integer; stary, nowy: string; zn: char; begin { generowanie liczb x=1234...n i y=n...321 }

x:=0; y:=0; for k:=1 to n do x:=x+k*pot(n-k); for k:=n downto 1 do y:=y+k*pot(k-1); { pętla z wykorzystaniem zmiennych tekstowych }

for z:=x to y do begin str(z, stary); czy:=0; nowy:=''; for i:=1 to n do begin zn:=stary[i]; for j:=1 to n do { sprawdzenie, czy cyfry się powtarzają }

if (j<>i) and (zn=stary[j]) then czy:=1;

Page 13: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

{ odejmujemy 48, gdyż kod (ord) cyfry zero to 48 }

if (czy=0) and (ord(zn)-48>0) and (ord(zn)-48<=n) then nowy:=nowy+zn; end; if length(nowy)=n then for l:=1 to n do if l<n then write(char(ord(nowy[l])+16)) else writeln(char(ord(nowy[l])+16)); end; end; {--------------PROGRAM GŁÓWNY -----------------------} var n, i: integer; begin ClrScr; write('Podaj ilość: '); readln(n); permutacja(n); writeln; readLn; end. Zadanie 10: Wykonaj rysunek przedstawiający tęczę.

Propozycja rozwiązania – program PAINT ETAP 1:

Page 14: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

ETAP 2:

ETAP 3:

Propozycja rozwiązania – program w języku SMALL BASIC

GraphicsWindow.Show() GraphicsWindow.Title = "TĘCZA" GraphicsWindow.Height = 600 GraphicsWindow.Width = 600 GraphicsWindow.BackgroundColor = "White" GraphicsWindow.PenWidth = 1 kolor[0]="Red" kolor[1]="Orange" kolor[2]="Yellow"

Page 15: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

kolor[3]="Green" kolor[4]="Cyan" kolor[5]="Blue" kolor[6]="White" For n=0 To 6 GraphicsWindow.PenColor =kolor[n] GraphicsWindow.BrushColor = kolor[n] GraphicsWindow.FillEllipse(100+n*25, 100+n*25, 400-n*50, 400-n*50) EndFor GraphicsWindow.PenColor ="White" GraphicsWindow.BrushColor = "White" GraphicsWindow.FillRectangle(70, 300, 500, 400)

Propozycja rozwiązania – program w języku PROCESSING void setup() // funkcja inicjująca { size(800,800); // rozmiar okna graficznego strokeWeight(1); // grubość pisaka background(255); noLoop(); } void draw() { fill(255,0,0); stroke(255,0,0); ellipse(400,400,430+0*50,430+0*50); fill(255,128,0); stroke(255,128,0); ellipse(400,400,430-1*50,430-1*50); fill(255,255,0); stroke(255,255,0); ellipse(400,400,430-2*50,430-2*50); fill(0,255,0); stroke(0,255,0);

Page 16: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

ellipse(400,400,430-3*50,430-3*50); fill(50,200,200); stroke(50,200,200); ellipse(400,400,430-4*50,430-4*50); fill(0,0,255); stroke(0,0,255); ellipse(400,400,430-5*50,430-5*50); fill(255); stroke(255); ellipse(400,400,430-6*50,430-6*50); fill(255); stroke(255); rect(20,400,800,300); }

Zadanie 11: Na osiach X i Y pierwszej ćwiartki układu współrzędnych zaznaczono kilkanaście punktów w równych odległościach.

Połącz odcinkami punkty z osi X z punktami z osi Y, tak, aby pierwszy punkt z osi X łączył się z ostatnim na osi Y, drugi z przedostatnim itd.

Propozycja rozwiązania – program PAINT

Page 17: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Propozycja rozwiązania – program w języku SMALL BASIC

GraphicsWindow.Show() GraphicsWindow.Title = "KRESKI" GraphicsWindow.Height = 600 GraphicsWindow.Width = 600 GraphicsWindow.BackgroundColor = "White" GraphicsWindow.PenWidth = 1 GraphicsWindow.PenColor = "Black"

for i=0 To 30 GraphicsWindow.DrawLine(100,100+10*i,100+10*i,400) EndFor

Propozycja rozwiązania – program w języku PROCESSING

void setup() // funkcja inicjująca { size(800,800); // rozmiar okna graficznego strokeWeight(1); // grubość pisaka noFill(); // brak wypełnienia noLoop(); } void draw() // procedura rysowania, wykonywana jest wielokrotnie, // aż do zamknięcia okna, funkcja noLoop()likwiduje powtarzanie

Page 18: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

{ int i, x1,y1,x2,y2; for (i=0; i<31;i++) { x1=0; y1=10*i; x2=10*i; y2=0; line(100+x1,100+y1,100+x2,400+y2); } }

Zadanie 12: W pojemniku znajdowało się pełno cieczy. Wylano z niego dziesięciokrotnie 33% jego aktualnej zawartości. Przedstaw wykres kolumnowy (słupkowy) kolejnych stanów pojemnika.

Propozycja rozwiązania: arkusz kalkulacyjny EXCEL Należy przyjąć początkową zawartość pojemnika, np. 100. Stany po każdym wylaniu obliczane są przy pomocy formuły (=adres-0,33*adres), która została następnie skopiowana.

100 67

44,89

30,0763

20,15112

13,50125

9,045838

6,060712

4,060677

2,720653

1,822838

Page 19: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Zadanie 13: W pliku tekstowym ZBIOR.TXT znajduje się zbiór liczb naturalnych oddzielonych od siebie spacjami. Znajdź największą i najmniejszą z nich oraz oblicz ich średnią arytmetyczną.

Przykładowa zawartość pliku:

12 134 34 56 123 67 4 567 25 111

Propozycja rozwiązania: arkusz kalkulacyjny EXCEL Dane należy wprowadzić metodą opisaną w zadaniu 1. Do znalezienia najmniejszej i największej wartości można posłużyć się statystycznymi funkcjami arkusza MAX i MIN, a do obliczenia średniej funkcji ŚREDNIA. Parametrami tych funkcji są zakresy komórek arkusza, np. =MAX(a1:a100).

Propozycja rozwiązania: program w języku C++ #include <iostream> #include <fstream> using namespace std; main() { int maks, mini, suma=0, i, ile = 0, tab[1000]; fstream plik; plik.open ("zbior.txt" , ios::in) ; while ( plik >> tab[ile]) ile++; plik.close(); maks=tab[0]; mini=tab[0]; for (i=0;i<ile;i++) { if (tab[i]>maks) maks=tab[i]; if (tab[i]<mini) mini=tab[i]; suma=suma+tab[i]; } cout<<"maks="<<maks<<endl; cout<<"min="<<mini<<endl; cout<<"srednia="<<suma/ile<<endl; return 0; }

Page 20: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Zadanie 14: Dane są dwa ułamki zwykłe a/b i b/d. Wykonaj na nich wszystkie cztery podstawowe działania arytmetyczne tzn. +, -, /, * ale, tak, aby wynik pozostał nadal ułamkiem zwykłym. Zadanie nie wymaga skracania ułamków po wykonaniu obliczeń.

Przykładowe dane:

a = 258, b = 1026, c = 105, d = 314.

Propozycja rozwiązania: arkusz kalkulacyjny EXCEL a/b + c/d = (ad + bc)/(bd) a/b - c/d = (ad - bc)/(bd) (a/b) • (c/d) = (ac)/(bd) (a/b) : (c/d) = (ad)/(bc) suma = 188742 / 322164, różnica = -26718 / 322164, iloczyn = 27090 / 322164, iloraz = 81012 / 107730.

Propozycja rozwiązania: program w języku SMALL BASIC TextWindow.Write("LICZNIK I UŁAMKA = ") a=TextWindow.Read() TextWindow.Write("MIANOWNIK I UŁAMKA = ") b=TextWindow.Read() TextWindow.Write("LICZNIK II UŁAMKA = ") c=TextWindow.Read() TextWindow.Write("MIANOWNIK II UŁAMKA = ") d=TextWindow.Read() l1 = a*d + b*c l2 = a*d - b*c l3 = a*c l4 = a*d m1 = b*d m2 = b*c TextWindow.WriteLine(a+"/"+b+" + "+c+"/"+d+" = "+l1+"/"+m1) TextWindow.WriteLine(a+"/"+b+" - "+c+"/"+d+" = "+l2+"/"+m1) TextWindow.WriteLine(a+"/"+b+" * "+c+"/"+d+" = "+l3+"/"+m1) TextWindow.WriteLine(a+"/"+b+" : "+c+"/"+d+" = "+l4+"/"+m2) Zadanie 15: Dany jest ułamek zwykły a/b. Skróć ten ułamek.

Propozycja rozwiązania: arkusz kalkulacyjny EXCEL

Page 21: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Zawartość komórek:

A1 - licznik ułamka, B1 - mianownik A2:A8 =JEŻELI(A1>B1;A1-B1;A1) B2:B8 =JEŻELI(B1>A1;B1-A1;B1) D1: = A1/A8 E1: B1/B8 Do znalezienia największego wspólnego dzielnika dwóch liczb zastosowany został algorytm

Euklidesa. Formuła „jeżeli” jest kopiowana do momentu, aż oba wyniki się wyrównają. Dla

liczb 26 i 44 stało się to w wierszu nr 8, oczywiście dla innych danych zakres ten może się

zmienić.

Propozycja rozwiązania: program w języku SMALL BASIC TextWindow.Write("LICZNIK = ") a=TextWindow.Read() m=a TextWindow.Write("MIANOWNIK = ") b=TextWindow.Read() l=b 'obliczamy najwiêkszy wspólny dzielnik - algorytm Euklidesa While(a<>b) If a>b Then a=a-b else b=b-a EndIf EndWhile TextWindow.WriteLine(m+"/"+l+" = "+m/a+"/"+l/b)

Page 22: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Propozycja rozwiązania: program w języku C++ #include <iostream> using namespace std; main() { int a, b, licznik, mianownik; cout<<"Licznik: "; cin>>a; cout<<"Mianownik: "; cin>>b; licznik=a; mianownik=b; //obliczamy największy wspólny dzielnik - algorytm Euklidesa while(a!=b) if (a>b) a=a-b; else b=b-a; cout<<licznik<<" / "<<mianownik<<" = " <<licznik/a<<" / "<<mianownik/a<<endl; return 0; } Zadanie 16: W pliku tekstowym TELEFONY.TXT znajdują się nazwiska i numery telefonów pewnej ilości abonentów. Dane zapisane są w ten sposób, że

w każdym kolejnym wierszu pliku umieszczone jest nazwisko, imię i 6 cyfrowy numer telefonu w formacie xx-xx-xx, np. Kowalski Jan 23-45-67. Ilu jest wszystkich abonentów, u których pierwsza i ostatnia cyfra numeru telefonu są jednakowe?

Przykładowa zawartość pliku:

Kowalski Jan 23-45-67 Nowak Zenon 34-20-53 Jankowski Jan 45-00-14 Twardowski Jan 56-12-45 Maciejewski Maciej 40-47-53

Propozycja rozwiązania: arkusz kalkulacyjny EXCEL

Zawartości komórek:

E1: =FRAGMENT.TEKSTU(C1;1;1) F1: =FRAGMENT.TEKSTU(C1;8;1) G1: =JEŻELI(E1=F1;1;0) G8: =SUMA(G1:G5)

Page 23: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Zadanie 17: Znajdź wszystkie dzielniki podanej liczby naturalnej.

Propozycja rozwiązania: program w języku PYTHON print ("n=") s=input() n=int(s) for i in range(2,n): if n%i==0: print(i) input()

Propozycja rozwiązania: program w języku SMALL BASIC

TextWindow.Write("LICZBA = ") n=TextWindow.Read() For k=1 To n If Math.Remainder(n, k)=0 Then TextWindow.WriteLine(k) EndIf EndFor

Propozycja rozwiązania: program w języku PASCAL

var n, k: integer; begin ClrScr; write('Liczba= '); readln(n); for k:=1 to n do if n mod k = 0 then writeln(k);

readln; end.

Zadanie 18: W pliku tekstowym BINARNE.TXT zapisany jest ciąg zer (0)

i jedynek (1) nie oddzielonych żadnymi odstępami. Traktując każde kolejne osiem cyfr jako liczbę zapisaną w systemie dwójkowym odkoduj zaszyfrowany tymi liczbami pewien tekst, przyjmując, że każda z liczb jest kodem ASCII szukanej litery.

Przykładowa zawartość pliku:

01001011010011110100111001001011010101010101001001010011

Page 24: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Propozycja rozwiązania: arkusz kalkulacyjny EXCEL

Zawartości komórek:

A1: Wczytany ciąg. A2: =FRAGMENT.TEKSTU(A1;1;8) A3: =FRAGMENT.TEKSTU(A1;9;8) itd. B2: =BIN2DEC (A2) B3: =BIN2DEC (A3) itd. Uwaga: Jeżeli ta funkcja nie działa, trzeba dołączyć do programu dodatki

NARZĘDZIA / DODATKI / ANALYSIS TOOLPACK i ANALYSIS TOOLPACK – VBA

D2: przekopiowane liczby z kolumny B jako wartości (KOPIUJ / WKLEJ SPECJALNIE) E2: =ZNAK(D2) E3: =ZNAK(D3) itd.

Propozycja rozwiązania: program w języku C++ #include <iostream> #include <cstring> #include <cmath> #include <fstream> using namespace std; main() { string s;char znak; int dl, i, k, kod; fstream plik; plik.open ("binarne.txt" , ios::in) ; plik >> s; plik.close(); dl=s.length(); dl=dl/8; for (k=0;k<dl;k++) { kod=0; for (i=0;i<8;i++) kod=kod+(int(s[i+k*8])-48)*pow(2,7-i); znak=kod; cout<<kod<<" - "<<znak<<endl; } return 0; }

Page 25: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Zadanie 19: Oblicz, nie rozróżniając liter wielkich od małych, ile razy w podanym tekście wystąpił wyraz zaczynający się tekstem „konkurs”.

Przykład tekstu:

Konkurs informatyczny dla uczniów będzie miał charakter konkursu przedmiotowego, a zatem będzie konkursem dającym laureatom etapu wojewódzkiego konkretne korzyści, zgodnie z odpowiednim zarządzeniem Ministra Edukacji Narodowej o konkursach.

Propozycja rozwiązania: edytor tekstów WORD. Przy niewielkich rozmiarach tekstu wystarczy użyć operacji EDYCJA /ZNAJDŹ w wyniku czego uzyskamy wyróżnienie miejsc, gdzie występuje szukany napis, bez względu na wielkość liter i umiejscowienie w wyrazie. Należy jedynie zadbać o pozostawienie tego wyróżnienia np. poprzez zaznaczenie miejsca dodatkowym, specjalnym znakiem umożliwiającym potem obliczenie ilości występowań. Dla tekstu o dużych rozmiarach, należy napisać program wyszukujący i zliczający albo zastosować tekstowe funkcje arkusza kalkulacyjnego.

Propozycja rozwiązania: program w języku C++ #include <iostream> #include <cstring> #include <fstream> using namespace std; main() { int ile=0; string s; fstream plik; plik.open ("tekst.txt" , ios::in) ; while(plik >> s) { if ((toupper(s[0])=='K') && (toupper(s[1])=='O') && (toupper(s[2])=='N') && (toupper(s[3])=='K') && (toupper(s[4])=='U') && (toupper(s[5])=='R') && (toupper(s[6])=='S')) ile++; } plik.close(); cout<<ile<<endl; return 0; }

Page 26: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Zadanie 20: Sprawdź czy podana liczba naturalna jest liczbą pierwszą.

Liczba naturalna jest pierwsza jeśli posiada tylko dwa dzielniki.

Propozycja rozwiązania: program w języku SMALL BASIC

TextWindow.Write("LICZBA = ") n=TextWindow.Read() ile=0 For k=1 To n If Math.Remainder(n, k)=0 Then ile=ile+1 EndIf EndFor If ile=2 Then TextWindow.WriteLine("Jest PIERWSZA") Else TextWindow.WriteLine("NIE JEST pierwsza") EndIf

Propozycja rozwiązania: program w języku PYTHON print ("n=") s=input() n=int(s) ile=0 if (n<2): ile=0 else: for i in range(1,n+1): if n%i==0: ile=ile+1 if ile==2: print("TAK") else: print("NIE") input()

Zadanie 21: W pliku tekstowym ZDANIE.TXT znajduje się zdanie zapisane w jednym wierszu.

Zdanie to nie zawiera wewnątrz żadnych znaków przestankowych i kończy się kropką po której nie ma spacji. Oblicz ile wyrazów zawiera to zdanie.

Page 27: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Propozycja rozwiązania: arkusz kalkulacyjny EXCEL

Należy wprowadzić zdanie przy pomocy polecenia PLIK/ OTWÓRZ – pliki tekstowe.

W komórce A4 znajduje się funkcja =ILE.NIEPUSTYCH(A1:IV1).

Page 28: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Propozycja rozwiązania: program w języku C++

Wskazówka:

ILOŚĆ WYRAZÓW = ILOŚĆ SPACJI + 1

#include <iostream> #include <cstring> #include <fstream> using namespace std; main() { int k, ile=0, dlug;string s; fstream plik; plik.open ("zdanie.txt" , ios::in) ; getline(plik,s); plik.close(); dlug=s.length(); for (k=0;k<dlug;k++) if (s[k]==' ') ile++; cout<<"Ilość wyrazów = "<<ile+1<<endl; return 0;}

Zadanie 22: Oto średnie, prawidłowe wagi mężczyzn w wieku powyżej 25 lat w zależności od wzrostu:

160 cm - 61 kg

164 cm - 63 kg

168 cm - 65 kg

172 cm - 68 kg

176 cm - 71 kg

180 cm - 74 kg

184 cm - 77 kg

188 cm - 80 kg

192 cm - 83 kg

a) Przedstaw dowolny wykres tego zestawienia uwzględniający wzrost i wagę.

Page 29: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

b) Pan Jan Kowalski ma 178 cm wzrostu i waży ok. 73 kilogramów.

Czy jego waga odpowiada średniej normie? Aby nie komplikować zagadnienia nie będziemy uwzględniać błędów wynikających z przybliżeń. Przyjmujemy, że wykres jest zbliżony do linii prostej y=0,6875x-49. Dla x=178 wartość funkcji y=0,6875x-49 wynosi 73,375. Możemy zatem przyjąć, że waga pana Jana Kowalskiego jest prawidłowa i nie odbiega od normy. c) Jaka powinna być średnia waga Zenona Nowaka, który ma 165 cm wzrostu? Jest to zadanie podobne do problemu z poprzedniego punktu. f(165) = 64,4375 ≈ 64,44. Zadanie 23: Oblicz jaka jest różnica między dwiema temperaturami podanymi w stopniach Celsjusza.

Propozycja rozwiązania: arkusz kalkulacyjny EXCEL

Zawartości komórek:

A1: Temperatura początkowa. A2: Temperatura końcowa. C1: =JEŻELI(A1<0;-A1+A2; JEŻELI(A1>A2;A1-A2;A2-A1) ) Zadanie 24: Zbuduj algorytm, który przez kolejne odejmowanie 2 od danej liczby sprawdzi, czy jest ona parzysta.

Propozycja rozwiązania: schemat blokowy

komp
zobacz inne
Page 30: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Zadanie 25: Dawniej do zapisu danych stosowano taśmę papierową, na której wykonywano otwory

(„dziurki”) kodując w ten sposób dane. Z tego powodu taśmy te nazywano dziurkowanymi albo

perforowanymi. Przyjmując, że gęstość zapisu na taśmie papierowej wynosiła ok. 10 znaków na

1 cal oraz wiedząc, że obecnie na zapamiętanie jednego znaku potrzeba 1 bajta pamięci, oblicz

ile maksymalnie metrów taśmy potrzeba na zapisanie informacji znajdującej się na standardowej

płycie DVD 4,7 GB.

Propozycja rozwiązania: arkusz kalkulacyjny EXCEL.

Zawartość komórek: C1: =B1*1024*1024*1024 B3:=C1/10 B5: =B3*2,54 B6:=B5/1000000

Odpowiedź: Aby zapamiętać informacje zawarte na jednej płycie DVD potrzeba ok. 12818 kilometrów papierowej taśmy dziurkowanej, czyli w przybliżeniu tyle ile trasa samochodowa z Madrytu do Pekinu.

Page 31: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Zadanie 26: Oblicz ile jest liczb z zakresu od 1 do 2019, których chociaż jedna z cyfr to 9.

Propozycja rozwiązania: arkusz kalkulacyjny EXCEL

Zawartość komórek: A1:A2019 Liczby naturalne od 1 do 2019 (można wypełnić serią danych)

B1: =MOD(A1;10) C1: =MOD((A1-B1)/10;10) D1: =MOD((A1-B1-C1*10)/100;10) E1: =MOD((A1-B1-C1*10-D1*100)/1000;10) G1: =JEŻELI(B1=9;1;0) H1: =JEŻELI(C1=9;1;0) I1: =JEŻELI(D1=9;1;0) J1:=JEŻELI(E1=9;1;0) Powyższe wzory kopiujemy aż do wiersza nr 2019. L1: =SUMA(G1:J2019) (tyle jest szukanych liczb)

Propozycja rozwiązania: program w języku C++ #include <iostream> #include <cstring> #include <sstream> using namespace std; main() { int k, i, dl, ile=0; stringstream ss; string s; for (k=1;k<=2019;k++) { ss.clear(); ss<< k; ss>>s; dl=s.length(); for(i=0;i<dl;i++) if (s[i]=='9') ile++; } cout<<"Ilość liczb z 9 = "<<ile<<endl; return 0; }

Page 32: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Zadanie 27: Narysuj 20 okręgów o wspólnym środku i zmniejszającym się promieniu. Pokoloruj tak powstałe pierścienie kołowe, aby powstał tzw. gradient czyli odcieniami tej samej barwy, od bardzo ciemnego do bardzo jasnego, łącznie z brzegami!

Propozycja rozwiązania: Ponieważ nie została określona różnica ciągu długości promieni,

zatem możemy wykonać rysunek w programie graficznym PAINT. Należy jedynie pamiętać o

tym, że procedura rysowania okręgów w tym programie nie prowadzi kreślenia od środka

okręgu, lecz od lewego, górnego wierzchołka opisanego na nim kwadratu.

W celu ułatwienia rysowania należy zatem:

1. Narysować najpierw ciąg kwadratów, a dopiero potem umieścić w nich okręgi.

2. Zastosować podczas rysowania klawisz SHIFT, który trzymany powoduje rysowanie

kwadratów i okręgów, a nie prostokątów i elips nimi nie będących.

3. Zastosować zmianę wartości składowych RGB.

4. Nie wymazywać mozolnie „pod lupą” brzegów kół powstałych po wylaniu farby, gdyż

jest to metoda zawodna i nieefektywna, lecz zastosować naprzemienne wylewanie farby,

pobierając jako kolor rysowania kolor brzegu, a jako kolor tła - kolor wypełnienia

sąsiadującego pierścienia kołowego (albo na odwrót - wszystko jedno!).

Z metodą rysowania można się zapoznać w rozwiązaniu zadania 10 , o tęczy.

Propozycja rozwiązania: program w języku PROCESSING

Page 33: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

void setup() // funkcja inicjująca { size(800,800); // rozmiar okna graficznego strokeWeight(1); // grubość pisaka background(255); noLoop(); } void draw() { int k; for (k=1;k<=20;k++) { fill(200-k*10); stroke(200-k*10);

ellipse(400,400,300-k*15,300-k*15); } }

Zadanie 28: Odczytaj tekst znajdujący się w pliku WSPAK.TXT, zapisany w jednym wierszu, wiedząc, że zawiera on wyrazy napisane każde wspak, czyli od końca. Wyrazy oddzielone są spacjami. Tekst nie zawiera kropki.

Propozycja rozwiązania: program w języku PASCAL. Przykładowa zawartość pliku: yzaryW oget utsket onasipan kapsw

program wspak; uses crt; var dlug, dl, i, k: integer; wiersz, s, wyraz: string; znak: char; p: text; begin clrscr; assign(p,'wspak.txt');reset(p); readln(p,wiersz); close(p); wiersz:=wiersz+' ';

{ Trzeba dopisać spację, żeby poprawnie zadziałała linia * } writeln(wiersz); dlug:=length(wiersz); k:=1; while k<dlug do begin s:=''; repeat znak:=wiersz[k];

Page 34: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

s:=s+znak; k:=k+1; until znak=' '; * dl:=length(s); wyraz:=''; for i:=dl-1 downto 1 do wyraz:=wyraz+s[i]; write(wyraz,' '); end; readln;end.

Wynik: Wyrazy tego tekstu napisano wspak.

Zadanie 29: W szkolnych zawodach sportowych każdy z zawodników jest oceniany przez 10 sędziów

otrzymując od każdego od 0 do 10 punktów. Jedna najwyższa i jedna najniższa nota są

odrzucane, a z pozostałych ośmiu obliczana jest średnia arytmetyczna. Zbuduj algorytm

wyznaczający wynik dla pojedynczego zawodnika.

Propozycja rozwiązania: arkusz kalkulacyjny EXCEL. Typowe zadanie do zastosowania arkusza kalkulacyjnego i jego funkcji statystycznych, w tym MAX, MIN i SUMA.

Zadanie 30: Sprawdź, czy zamieniając dowolną ilość plusów (+) na minusy (-) można z poniższej fałszywej równości otrzymać równość prawdziwą. 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 0

Page 35: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Propozycja rozwiązania: arkusz kalkulacyjny EXCEL

Ze względu na niedużą ilość kombinacji znaków (+) i (-) proponujemy użycie arkusza kalkulacyjnego EXCEL. Przyjmijmy, że cyfra 1 oznaczać będzie MINUS (-), natomiast cyfra 0 PLUS (+). Mamy zatem następujące zestawy w systemie binarnym:

000000000 - liczba 0 w systemie dziesiątkowym, 000000001 - liczba 1 w systemie dziesiątkowym, 000000010 - liczba 2 w systemie dziesiątkowym, 000000011 - liczba 3 w systemie dziesiątkowym, . . . 111111111 - liczba 511 w systemie dziesiątkowym, Razem: 512 możliwości.

Fragment arkusza:

A B C D E F G H I J K 114 0 0 1 1 1 0 0 1 0 001110010 115 0 0 1 1 1 0 0 1 1 001110011 116 0 0 1 1 1 0 1 0 0 001110100 117 0 0 1 1 1 0 1 0 1 001110101 118 0 0 1 1 1 0 1 1 0 001110110 119 0 0 1 1 1 0 1 1 1 001110111 120 0 0 1 1 1 1 0 0 0 001111000 121 0 0 1 1 1 1 0 0 1 001111001 122 0 0 1 1 1 1 0 1 0 001111010 123 0 0 1 1 1 1 0 1 1 001111011 124 0 0 1 1 1 1 1 0 0 001111100 125 0 0 1 1 1 1 1 0 1 001111101

126 0 0 1 1 1 1 1 1 0 001111110

kolumna A - kolejna liczba dziesiętna, kolumna K - postać dwójkowa (funkcja DEC2BIN), kolumny B, C, ... , J - kolejne cyfry postaci dwójkowej (funkcja FRAGMENT.TEKSTU) L M N O P Q R S T U V W

2 3 -4 -5 -6 7 8 -9 10 7 nie

2 3 -4 -5 -6 7 8 -9 -10 -13 nie

2 3 -4 -5 -6 7 -8 9 10 9 nie

2 3 -4 -5 -6 7 -8 9 -10 -11 nie

2 3 -4 -5 -6 7 -8 -9 10 -9 nie

2 3 -4 -5 -6 7 -8 -9 -10 -29 nie

2 3 -4 -5 -6 -7 8 9 10 11 nie

2 3 -4 -5 -6 -7 8 9 -10 -9 nie

2 3 -4 -5 -6 -7 8 -9 10 -7 nie

2 3 -4 -5 -6 -7 8 -9 -10 -27 nie

2 3 -4 -5 -6 -7 -8 9 10 -5 nie

2 3 -4 -5 -6 -7 -8 9 -10 -25 nie

2 3 -4 -5 -6 -7 -8 -9 10 -23 nie

Page 36: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

kolumny L, M, ..., T - liczby od 2 do 10 z (+) albo (-) np. =B115*(-1)*2+(1-B115)*2 kolumna U - pusta, kolumna V - suma liczb np.=1+ SUMA(L115:T115) kolumna W - komunikat, czy suma wynosi 0.

Odpowiedź: Żadna kombinacja plusów i minusów nie pozwoli na otrzymanie wyniku 0.

Propozycja rozwiązania: program w języku C++ #include <iostream> using namespace std; main() { int n,k,j,dl,suma; string s; for (k=1;k<512;k++) { n=k;s="";suma=1; while(n) { s = (n%2?"1":"0") + s; n /= 2; } dl=s.length(); for (j=0;j<9-dl;j++) s="0"+s; for (j=0;j<9;j++) suma=suma+(s[j]=='1'?-1:1)*(j+2); if (suma==0) cout <<s<<" "<<suma<<endl; else suma=1; } if (suma==1) cout<<"NIE ZNALEZIONO!"; return 0; }

Odpowiedź: Żadna kombinacja plusów i minusów nie pozwoli na otrzymanie wyniku 0. Zadanie 31:

Zbuduj algorytm drukujący daną liczbę naturalną „od końca”, tzn. rozpoczynając od cyfry

jedności. Podana liczba jest mniejsza niż milion.

Propozycja rozwiązania: arkusz kalkulacyjny albo własny program.

Informacja, że liczba jest mniejsza od miliona pozwala wykonać tylko kilka dzieleń z resztą.

Jeżeli operator obliczania reszty nazwiemy „mod”, a operator dzielenia całkowitego „div”, to

powtarzając operacje c = n mod 10 | n = n – c | n = n div10 otrzymamy

wszystkie cyfry c danej liczby n.

Page 37: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Propozycja rozwiązania: program w języku C++ #include <iostream> #include <cstring> using namespace std; main() { int n, k, x; cout<<"Liczba = "; cin>>n; k=n; while(k) { x=k%10;cout<<x; k=k-x; k=k/10; } return 0; }

Zadanie 32: Polska norma żywieniowa określa, że chłopcy w wieku 13-15 lat powinni spożyć na dobę posiłki

o łącznej wartości energetycznej wynoszącej 13800 kJ („kilodżuli”), natomiast dziewczęta

w tym samym wieku - 11700 kJ. Wiedząc, że 100 g truskawek dostarcza zaledwie 134 kJ

kalorii oraz, że w koszyku mieści się ok. 2 kg truskawek, oblicz ile musisz ich zjeść, aby

zaspokoić dobową normę żywieniową. Smacznego!

Propozycja rozwiązania: arkusz kalkulacyjny EXCEL.

Kj Ilość porcji 100 g Ilość koszyków

CHŁOPCY 13800 102,985 5,149

DZIEWCZĘTA 11700 87,313 4,366

100 g truskawek 134

1 koszyk 2680

Odpowiedź: Aby zaspokoić dzienną (dobową) normę żywieniową chłopiec musi zjeść w przybliżeniu 5 koszyków, a dziewczynka ok. 4 i pół koszyka truskawek. Zadanie 33: Oblicz ile obrotów musi wykonać koło roweru o promieniu r, aby pokonać drogę o długości 100 km.

Page 38: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Propozycja rozwiązania: arkusz kalkulacyjny EXCEL

Należy zastosować wzór na obwód koła = 2r. Zadanie 34: Oblicz ile razy podana litera występuje w tekście znajdującym się w pliku TEKST.TXT.

Propozycja rozwiązania: program w języku PASCAL. Uwaga: Nie wiemy ile linii tekstu znajduje się w pliku. Dlatego należy to zbadać.

program szukam; uses crt; var i,j, ile, k, dl: integer; wiersz: string; litera: char; p: text; begin clrscr; ile:=0; write('Podaj literę do wyszukania '); readln(litera); k:=0; assign(p,'tekst.txt'); reset(p); repeat readln(p,wiersz); inc(k); until eof(p); close(p); reset(p); for i:=1 to k do begin readln(p,wiersz); dl:=length(wiersz); for j:=1 to dl do if wiersz[j]=litera then inc(ile); end; close(p); writeln('Litera ', litera, ' wystąpiła ', ile , ' razy.'); readln; end.

Page 39: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Zadanie 35:

Korzystając z mapki znajdującej się w pliku MAPKA.BMP zaprojektuj, zaznacz i opisz etapy

jednodniowej wycieczki szkolnej z Gdańska do Torunia. Wyróżnij (np. chorągiewkami czy też

wg własnego pomysłu) odwiedzone miejscowości pośrednie.

Wskazówka: zastosuj programy PAINT i WORD.

Zadanie 36: Palindrom to tekst, który czyta się tak samo normalnie i wspak np. kajak, zakaz. Sprawdź, czy podany wyraz jest palindromem. Propozycja rozwiązania: program w języku C++.

#include <iostream> #include <cstring> using namespace std; main() { string s, nowy=""; bool czy=1; int i, dlug1, dlug2=0, kod; char znak; cout<<"Wpisz wyraz ";cin>>s; dlug1=s.length(); for (i=0; i<dlug1;i++) if ((s[i]!= ' ') && (s[i]!= '.') && (s[i]!= ',') && (s[i]!= '-') && (s[i]!= '?') && (s[i]!= '!')) { nowy=nowy+s[i]; dlug2=dlug2+1; } for (i=0; i<dlug2;i++) { znak=toupper(nowy[i]); nowy[i]=znak; } for (i=0; i<dlug2; i++) if (nowy[i]!=nowy[dlug2-i-1]) czy=0; if (czy) cout<<"Palindrom"; else cout<<"NIE"; return 0; }

komp
zobacz inne
Page 40: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Zadanie 37: Oblicz ile samogłosek zawiera podane zdanie nie zawierające samogłosek diaktrycznych ą, ę, ó.

Wskazówka: Sprawdź, czy któraś z liter w zdaniu to e, y, o, a, i, lub u. Zadanie 38: Korzystając z arkusza kalkulacyjnego zbuduj swój własny kalkulator, który wykona działania dodawania, odejmowania, mnożenia, dzielenia, obliczy potęgę o wykładniku naturalnym oraz pierwiastek stopnia drugiego i stopnia trzeciego. Wskazówka: wykorzystaj odpowiednie funkcje arkusza. Zadanie 39: Zamień podaną liczbę naturalną w zapisie dziesiętnym na system dwójkowy i szesnastkowy. Wskazówka: wykorzystaj odpowiednie funkcje arkusza kalkulacyjnego EXCEL. system dziesiętny na dwójkowy =DEC2BIN(liczba) system dziesiętny na ósemkowy =DEC2OCT(liczba) system dziesiętny na szesnastkowy =DEC2HEX(liczba)

Uwaga: Jeżeli te funkcje nie działają, trzeba dołączyć do programu dodatki

NARZĘDZIA / DODATKI / ANALYSIS TOOLPACK i ANALYSIS TOOLPACK - VBA

Zadanie 40: Zaprojektuj przedmiotowy test wyboru dla ucznia gimnazjum, sprawdzający jego wiadomości z określonego zakresu wiedzy. Przedstaw tylko wstępny projekt z kilkoma pytaniami i sprawdzeniem poprawności odpowiedzi.

Propozycja rozwiązania: projekt LAZARUS-a Należy przygotować 3 pliki tekstowe:

test_pyt.txt – zawierający tekst pytań, test_odp.txt – zawierający proponowane odpowiedzi, test1.txt – zawierający numery poprawnych odpowiedzi.

Gdyby była taka potrzeba to dane w pliku z poprawnymi odpowiedziami można zaszyfrować. Przygotowaliśmy test zawierający 10 pytań, ale w łatwy sposób można to rozszerzyć na dowolną

ilość pytań. Program jest uproszczony i nie wskazuje na właściwe i błędne odpowiedzi,

a jedynie podlicza ilość poprawnych odpowiedzi.

Page 41: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

W programie należy przygotować 3 tablice, do których zostaną pobrane dane z plików tekstowych:

pytania: array [1..10] of string; odpowiedzi: array [1..10,1..4] of string; numery: array [1..10] of byte;

Program wyświetla pytanie i 4 odpowiedzi do wyboru. Po zakończeniu udzielania odpowiedzi następuję podsumowanie testu. Zastosowane kontrolki:

4 etykiety - LABEL, 1 obraz - IMAGE, 2 przyciski - BUTTON, 4 przyciski opcji - RADIOBUTTON

Page 42: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

Kod w języku OBJECT PASCAL: var Form1: TForm1; i, j, n, ktory, ile: integer; s: string; pytania: array [1..10] of string; odpowiedzi: array [1..10,1..4] of string; numery: array [1..10] of byte; pyt,odp,nr: text; implementation {$R *.lfm} { TForm1 } procedure TForm1.poczatek(Sender: TObject); begin assignfile(pyt,'test_pyt.txt'); assignfile(odp,'test_odp.txt'); assignfile(nr,'test1.txt'); reset(pyt); reset(odp); reset(nr); for i:=1 to 10 do readln(pyt,pytania[i]); for i:=1 to 10 do readln(nr,numery[i]); for i:=1 to 10 do for j:=1 to 4 do readln(odp,odpowiedzi[i,j]); closefile(pyt); closefile(odp); closefile(nr); n:=0; ile:=0; radiobutton1.visible:=false; radiobutton2.visible:=false; radiobutton3.visible:=false; radiobutton4.visible:=false;

Page 43: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

label6.visible:=false; label7.visible:=false; label8.visible:=false; end; procedure TForm1.RadioButton1Change(Sender: TObject); begin if radiobutton1.checked then ktory:=1 else ktory:=0; if ktory=numery[n] then inc(ile); end; procedure TForm1.RadioButton2Change(Sender: TObject); begin if radiobutton2.checked then ktory:=2 else ktory:=0; if ktory=numery[n] then inc(ile); end; procedure TForm1.RadioButton3Change(Sender: TObject); begin if radiobutton3.checked then ktory:=3 else ktory:=0; if ktory=numery[n] then inc(ile); end; procedure TForm1.RadioButton4Change(Sender: TObject); begin if radiobutton4.checked then ktory:=4 else ktory:=0; if ktory=numery[n] then inc(ile); end; procedure TForm1.Button1Click(Sender: TObject); begin button1.left:=160; button1.caption:='NASTĘPNE PYTANIE'; if n=0 then begin image1.visible:=false; radiobutton1.visible:=true; radiobutton2.visible:=true; radiobutton3.visible:=true; radiobutton4.visible:=true; label6.visible:=true; end; n:=n+1; if n>10 then begin button1.visible:=false; radiobutton1.visible:=false; radiobutton2.visible:=false; radiobutton3.visible:=false; radiobutton4.visible:=false; label6.visible:=false; button2.visible:=true;

Page 44: ROZDZIAŁ III Rozwiązania zadań · 2019-09-12 · `ROZDZIAŁ III Rozwiązania zadań Dla naszych, ćwiczeniowych celów podawane będą jedynie początkowe fragmenty plików tekstowych

image1.visible:=true; end else begin radiobutton1.checked:=false; radiobutton2.checked:=false; radiobutton3.checked:=false; radiobutton4.checked:=false; label6.caption:=pytania[n]; radiobutton1.caption:=odpowiedzi[n,1]; radiobutton2.caption:=odpowiedzi[n,2]; radiobutton3.caption:=odpowiedzi[n,3]; radiobutton4.caption:=odpowiedzi[n,4]; end; end; procedure TForm1.Button2Click(Sender: TObject); begin button2.visible:=false; label7.visible:=true; label7.caption:='Ilość poprawnych odpowiedzi = '; label7.caption:=label7.caption+IntToStr(ile)+' na 10 pytań'; label8.visible:=true; label8.caption:=IntToStr(ile*10)+'%'; end; end. -------------------------------------------------------------------------------------------------------------- W bardzo łatwy sposób można zmodyfikować program dla innej ilości pytań niż 10. Odpowiedzi znajdujące się w pliku można zaszyfrować, ta, aby użytkownik nie mógł ich podejrzeć.