SZIMP2

A MathWikiből
(Változatok közti eltérés)
(Házi feladatok)
307. sor: 307. sor:
  
 
  export HISTSIZE=9999     
 
  export HISTSIZE=9999     
 +
 +
Ha egy programnak többször akarjuk ugyanazt a bemenetet adni, akkor a bemenetet írjuk be fájlba (pl. ''prog.in''), és irányítsuk át. Ennek segítségével könnyen ellenőrizhető, hogy a program két változata (''prog1'' és ''prog2'') ugyanazt a kimenetet produkálja-e:
 +
 +
$ ./prog1 <prog.in >prog1.out
 +
$ ./prog2 <prog.in >prog2.out
 +
$ diff prog1.out prog2.out
 +
 +
A diff program kimenetét kell figyelni.
 +
 +
Ha a program bemenetét UNIX-on a terminálon gépeljük be, akkor az alábbiakra figyeljünk:
 +
 +
* Egy egész sort be kell írni (és ''Enter''-rel lezárni), és a program csak ezután kapja meg az egész sort.
 +
* A sorvégi ''Enter''-t a program <code>'\n'</code>-ként kapja.
 +
* A bemenet végét (EOF, -1) ''Enter'', majd Ctrl-''D'' lenyomásával jelezhetjük. Ezután a program következő getchar() hívása -1-et ad vissza, a scanf() pedig (általában) nullát.
 +
* Windows alatt Ctrl-''D'' helyett ''Enter'', Ctrl-''Z'', ''Enter''.
 +
* Ha Ctrl-''C''-t nyomunk, az örökre megszakítja a program futását, tehát ha a program kilépés előtt még kiírt volna valamit, akkor azt már nem fogja kiírni.
 +
 +
Számkitalálós program (embergondol.c: ember gondol, gép talál ki):
 +
 +
#include <stdio.h>
 +
int main(void) {
 +
  int a=1, b=100;
 +
  printf("Gondolj egy szamot %d es %d kozott (zart)!\n", a, b);
 +
  ...
 +
  return 0;
 +
}
 +
 +
Számkitalálós program (gepgondol.c: gep gondol, ember talál ki):
 +
 +
#include <stdio.h>
 +
#include <math.h>
 +
#include <time.h>
 +
int main(void) {
 +
  int a=1, b=100;
 +
  int gondolt, tipp;
 +
  srand(time());
 +
  gondolt=rand()%(b-a)+a;
 +
  printf("Gondoltam egy szamot %d es %d kozott (zart), talald ki!\n", a, b);
 +
  while (1) {
 +
    printf("Mit tippelsz?\n");
 +
    scanf("%d",&tipp);
 +
    if (gondolt>tipp) {
 +
      printf("A gondolt szam nagyobb, mint %d\n", tipp);
 +
    } else {
 +
      printf("A gondolt szam nem nagyobb, mint %d\n", tipp);
 +
    }
 +
    ...
 +
  }
 +
  return 0;
 +
}
  
 
== Házi feladatok ==
 
== Házi feladatok ==
 +
 
A házi feladatokat a [[SIO]] rendszer segítségével kell beadni. Csak azokat kell beadni, amelyeknek a beadási határideje itt fel van tüntetve.
 
A házi feladatokat a [[SIO]] rendszer segítségével kell beadni. Csak azokat kell beadni, amelyeknek a beadási határideje itt fel van tüntetve.
  
314. sor: 365. sor:
  
 
=== Technikai részletek ===
 
=== Technikai részletek ===
 +
 
A C fordításhoz használt szoftver a <tt>gcc</tt>, verziószám <tt>gcc (GCC) 3.4.6 (Debian 3.4.6-4)</tt>, a házi feladatokat a következő módon fordítjuk:
 
A C fordításhoz használt szoftver a <tt>gcc</tt>, verziószám <tt>gcc (GCC) 3.4.6 (Debian 3.4.6-4)</tt>, a házi feladatokat a következő módon fordítjuk:
  
 
  gcc -x c -O2 -std=c99 -static -o <forrásfájl>.o <forrásfájl> -lm
 
  gcc -x c -O2 -std=c99 -static -o <forrásfájl>.o <forrásfájl> -lm
  
Fontos, hogy a beadott C forrásfájlok <tt>.c</tt>-re végződjenek, ellenkező esetben a rendszer fordítási hibát jelez (<b>Compile error</b>)
+
Fontos, hogy a beadott C forrásfájlok <tt>.c</tt>-re végződjenek, ellenkező esetben a rendszer fordítási hibát jelez (<b>Compile error</b>).
 +
 
 +
A main függvénynek <code>return 0;</code>-ra kell végződnie.
  
 
=== Kiírt házi feladatok ===
 
=== Kiírt házi feladatok ===

A lap 2007. február 20., 14:10-kori változata

Ez a wikioldal a 2007 februárjától az alkalmazott matematikusok számára Informatika 2 (más néven SZIMP2) tárgy honlapja.

Tartalomjegyzék

Oktatók

  • Az előadásokat és a gyakorlatokat tartja Szabó Péter <pts+i@math.bme.hu>, beceneve pts.
  • A házi feladatokat és a ZH-kat javítja, a konzultációk egy részét tartja Sisak Áron <aron@math.bme.hu>.

Egyéb személyek:

  • Tárgyfelelős Wettl Ferenc <wettl@math.bme.hu>.
  • A Live CD-t készíti Erő Zsolt <zsero@math.bme.hu>.
  • Az előző félévben Pröhle Péter és Rácz Balázs oktatta a SZIMP2-t, akkor ez volt

a tárgy honlapja: http://www.ilab.sztaki.hu/~bracz/p/cimp2_2006tavasz.html

Hallgatók

A gyakorlati ismeretek kellő elsajátításához elengedhetetlen, hogy a gyakorlati kurzuson mindenki saját számítógéppel dolgozzon. Az H.27-es laborban 14 munkára alkalmas gép van, amiből hallgatók számára kényelmesen használható 12 db. A biztonság kedvéért az egyik gépet hagyjuk meg tartaléknak, tehát van 11 gép, 3 gyakorlati kurzus, és összesen 33 hallgató, akiket a fentiek miatt 3 egyenlő részre kell osztani. A felosztás 2007-02-16 (pénteken) 9:10-kor, az előadás előtti 5 percben fog megtörténni. Két lehetséges megvalósuás van.

  1. A hallgatók egyeztetnek, majd összeállítanak egy nekik megfelelő felosztást, és azt írásban benyújtják a jelzett időpontban. A formai követelmények: 3 lista lesz, melyeken a tárgyat felvett hallgatók felhasználónevei vannak egyértelműen szétosztva. Minden hallgató pontosan egy listán szerepel. Minden listán minimum 11, maximum 12 felhasználónév található.
  2. Ha a fenti felosztás nem kerül benyújtásra a jelzett időpontban, akkor az előzetes gyakorlati kurzusbeosztás lép életbe (lásd lent).

Indokolt esetben utólag is lehet cserélni (2 hallgató egymás között cserél). A csere módja: a hallgatók egymással egyeztetnek, majd mindketten küldenek pts-nek és a másik hallgatónak egy e-mailt legalább 24 órával a korábbi gyakorlat előtt.

A Neptunban levő hallgatói kurzus-hozzárendelés módosításának intézésével a hallgatóknak nem kell törődniük.

Aktuális gyakorlati kurzusbeosztás (közös megegyezéssel):

  • végleges kedd 14:15-re:
    • bartazsu Barta Zsuzsanna
    • btimi Borsos Katalin
    • czirakit Cziráki Tamás
    • zsero Erő Zsolt
    • farbas Fárbás Tamás
    • kristofh Hörömpöly Kristóf
    • jgabor Janecskó Gábor
    • macsakos Mácsai Ákos
    • molnarg Molnár Gábor
    • semdan Semler Dániel
    • tbarbara Tőke Barbara
    • wlaci Winkler László
  • végleges kedd 15:15-re:
    • szape Szabó Péter
    • szbence Szűcs Benedek
    • agiesze Esze Ágnes
    • daraib Darai Borbála
    • diagy Győri Klaudia
    • dsziraki Sziráki Dorottya
    • hutivi Hutvágner Ivett
    • jocika Pinczés József
  • végleges péntek 8:15-re: (a kivéve munkanapok helyett ugyanazon héten kedd 15:15-re kell jönni)
    • csizbal Csizmadia Balázs (kivéve február 23., március 2.)
    • gszj Göbölös-Szabó Julianna (kivéve március 2., március 9.)
    • vhalasz Halász Veronika (kivéve március 9., és március 23.)
    • istvanko Kolossváry István (kivéve március 23., és március 30.)
    • rkozma Kozma Róbert Thijs (kivéve március 30., április 6.)
    • nagyal Nagy Attila (kivéve április 6., április 13.)
    • pintye Pintye Norbert (kivéve április 13., április 20.)
    • sepsir Sepsi Róbert (kivéve április 20., április 27.)
    • tuzcsaba Tűz Csaba (kivéve április 27., május 4.)
    • urbane Urbán Eszter (kivéve május 4., május 11.)
    • szabov Szabó Viktor (kivéve május 11., május 18.)
    • fukoildi Fűkő Ildikó (kivéve május 18., feburár 23.)
    • csata Csata Árpád (kivéve március 2., március 9.)
    • gubeka Gubek Andrea (kivéve március 9., március 23.)
    • kbotond Koszta Botond (kivéve március 23., és március 30.)
    • mikulan Mikulán Attila (kivéve március 30., április 6.)
    • ivajda Vajda István

Tárgykövetelmények

A szorgalmi időszakban teljesítendő:

  • A kiadott házi feladatok megoldása és beadása a SIO rendszerbe. Csak azt a feladatot kell beadni, amelynek a beadási határideje ezen a wikioldalon szerepel. Addig kell próbálkozni, amíg a rendszer OK-val el nem fogadja a megoldást. Az el nem fogadott megoldás és a meg sem kisérelt megoldás is 0 pontot ér feladatonként. Az elfogadott megoldás 1 pontot ér.
  • Az első ZH megírása. A ZH valószínűleg papíralapú lesz. Az első ZH témája: C programozási nyelv és egyszerű algoritmusok. Csak azt kell tudni, ami előadáson vagy gyakorlaton elhangzott. Puskát lehet majd használni.
  • A második ZH megírása. A ZH valószínűleg számítógéppel megoldandó lesz. A második ZH témája: Ruby programozási nyelv és objektum-orientált programozás. Csak azt kell tudni, ami előadáson vagy gyakorlaton elhangzott. Puskát lehet majd használni.

A félévközi jegy a fentieket összesítve kerül meghatározásra.

Katalógus

A gyakorlatok látogatása kötelező, minden gyakorlaton van katalógus.

Az előadások látogatása nem kötelező.

A hallgatók munkája

Előadáson a hallgatók figyelnek és jegyzetelnek. Legalább annyit leírnak, amennyi a táblára kerül.

Gyakorlaton a gyakorlat ideje alatt a hallgatók megcsinálják a kitűzött feladatot. Minden hallgatónak saját számítógépe van, amivel a feladatot megoldja. A gyakorlatvezető segít, és ellenőrzi is a megoldást. Amelyik hallgató kész van, és unatkozik, plusz feladatot kér vagy talál ki magának, és azt is megoldja. Gyakorlaton általában nem kell jegyzetelni. Füzetbe jegyzetelés helyett ajánlott tömören, de egyértelműen fájlba írni. A begépelendő kódrészleteket a hallgatók megkapják fájlban.

Gyakorlaton a hallgatók úgy ülnek le, hogy minden kezdő mellé üljön egy profi. Profinak számít az, aki az alábbiakból sokat tud: Linux grafikus felületek haladó felhasználói szintű ismerete, Linux parancssor felhasználói szintű ismerete, hatékony munka Linux parancssorban, hatékony munka Midnight Commanderben, angol nyelvtudás, jó hibadiagnosztizálási és hibajavítási készség, az órán kívül is gyakran használ Linuxot, tetszőleges programozási nyelv hobbi-szintű ismerete, tetszőleges programozási nyelv munkaerőpiacon versenyképes ismerete, ismeretlen program működésének megértése weben fellelhető információk alapján, ismeretlen program működésének megértése man page alapján, tetszőleges program telepítése Windowsra, tetszőleges program telepítése valamely Linux-disztribúcióra. A profinak nem kell ismernie se a C nyelvet, se a Ruby nyelvet.

A hallgatók otthon tanulnak, például az ajánlott irodalomból, esetleg az órai jegyzetükből. A ZH-kra való felkészülés legjobb eszköze a gyakorlás: az elmélet bebiflázása helyett sokkal eredményesebb (a ZH és a jövő szempontjából is) egy adott feladatot adott módon megoldó program elkészítése, vagy ilyen példaprogramok tanulmányozása.

A hallgatók egyénileg (pl. otthon vagy a számítógép-laborban) megcsinálják a házi feladatokat, és beküldik a SIO rendszerbe. A beküldéshez internetelérés (web) szükséges.

A hallgatók megírják a ZH-kat.

A hallgatók a félév végén beiratják a jegyet.

Ajánlott szoftverek

C nyelvhez Linux alatt ajánlott:

  • sima szövegszerkesztő: kate
  • fordítóprogram: gcc
  • fejlesztőkörnyezet: Kdevelop
  • egyéb segédprogramok: strace, valgrind

C nyelvhez Windows alatt ajánlott:

Ruby nyelvhez Linux alatt ajánlott:

Ruby nyelvhez Windows alatt ajánlott:

Erő Zsolt egy Live CD-t készít, amin a fenti linuxos szoftverek megtalálhatók, és hosszadalmas telepítés nélkül kipróbálhatók.

Tananyag

  • algoritmusok C nyelven
  • objektum-orientált programozás Ruby nyelven

Ajánlott irodalom:

Konvenciók

A konvenciók mind a hallgatók, mind az oktatók számára kötelezően betartandók.

  • A tárggyal kapcsolatos fájlokat mindenki a ~/szimp2 mappába helyezze.
  • Minden fájlnév és mappanév kisbetűs.
  • A fájlnevek ékezetes betűket nem tartalmaznak.
  • A forrásfájlok (*.c és *.rb) ékezetes betűket nem tartalmaznak.
  • Minden program forráskódja külön (*.c vagy *.rb) fájlba kerül. Tehát nem írunk felül egyetlen korábban létrehozott fájlt sem, hanem lemásoljuk a fájlt, és más néven mentjük el. A más néven mentés még a fájl tartalmának módosítása előtt történik.

1. gyakorlat (2007-02-13 és 2007-02-16)

A gyakorlat célja, hogy a C nyelvű programozáshoz használandó eszközökkel megismerkedjünk. A bemutatott eszközök: kate, gcc, terminálablak. A gyakorlatnak nem célja megtanítani, hogy a program (pl. hello100.c) hogyan működik, miért azt csinálja, amit csinál, ezt majd előadáson tanuljuk meg.

Az szimp2 mappát és a tartalmát csupa kisbetűvel kell létrehozni, vagy ha nagybetűs lett, akkor át kell nevezni kisbetűre.

~/szimp2/hello.c:

#include <stdio.h>
int main(void) {
  printf("Hello, World!\n");
  return 0;
}

A sor elején levő szóközök (ún indentation) nem a gép számára, hanem a programot olvasó ember számára hasznosak.

Hasznos parancsok (csak a $ utáni részt kell begépelni, a többit a gép írja ki).

$ mkdir ~/szimp2
$ cd ~/szimp2
$ kate hello.c
$ gcc -W -Wall -s -O2 -o hello hello.c
$ ./hello
Hello, World!

~/szimp2/hello100.c:

#include <stdio.h>
int main(void) {
  int c;
  for (c=0;c<100;c++) {
    printf("Hello, World!\n");
  }
  return 0;
}

Hasznos parancsok:

$ cd ~/szimp2
$ kate hello100.c
$ gcc -W -Wall -s -O2 -o hello100 hello100.c
$ ./hello100
Hello, World!
...
Hello, World!
$ ./hello100 | wc -l
100
$ ./hello100 >hello100.out
$ kate hello100.out
$ ./negyzet100 | more
$ ./negyzet100 | less

~/szimp2/negyzet100.c:

#include <stdio.h>
int main(void) {
  int c;
  for (c=0;c<=100;c++) {
    printf("szam: %3d, negyzete: %5d\n", c, c*c);
  }
  return 0;
}

~/szimp2/kettohatvany100.c:

#include <stdio.h>
int main(void) {
  int c;
  for (c=0;c<=100;c++) {
    printf("szam: %3d, kettohatvany: %d\n", c, 1<<c);
  }
  return 0;
}

Figyeljük meg, hogy 1<<31 már negatív, és 1<<32 == 1. Ezek a túlcsordulás miatt vannak.

1. előadás (2007-02-16)

Megtanultuk:

  • bemenet
  • kimenet
  • processzor
  • memória
  • program
  • bájt: 1 bájt == 8 bit; 0..255
  • folyamatábra
  • *
  • +
  • <<
  • < <= == > >=
  • a=b=0
  • if
  • for
  • while
  • goto
  • printf-ből a %d és a \n
  • getchar: while (0<=(c=getchar()))
  • putchar
  • else: csak érintettük. Példa: if (a<0) b=-1; else b=1;

~/szimp2/bajtszamlalo.c:

/* Megszámolja és kiírja, hogy a bemenet hány bájtból áll.
 * `n=n+1' helyett `n++'-ot írtunk.
 */
#include <stdio.h>
int main(void) {
  int n=0;
  while (0<=getchar()) n++;
  printf("%d\n", n);
  return 0;
}

Kipróbálás:

$ echo sok | ./bajtszamlalo
4
$ echo -n sok | ./bajtszamlalo
3

~/szimp2/sorszamlalo.c:

/* Megszámolja és kiírja, hogy a bemenet hány sorból áll.
 * Az utolsó sor nem számít, ha nincs a végén soremelés.
 */
#include <stdio.h>
int main(void) {
  int c, n=0;
  while (0<=(c=getchar())) {
    if (c=='\n') n++;
  }
  printf("%d\n", n);
  return 0;
}

Kipróbálás:

 $ ls /bin/bash /usr/bin/id /dev/null /etc/inputrc | ./sorszamlalo
 4

2. gyakorlat

Ugyanazt a parancsot sosem írjuk be kétszer, hanem a korábbi beírást hasznosítjuk újra.

A PageUp-pal és PageDown-nal történő history-kereséshez az ~/.inputrc fájlukba írjuk bele:

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
"\e[5~": history-search-backward
"\e[6~": history-search-forward

Ezután vagy nyissunk új terminálablakot, vagy adjuk ki:

$ bind -f ~/.inputrc

Az aktuális terminálablakban használhatjuk a history parancsot, egy már becsukott terminálablak esetén pedig a ~/.bash_history fájlt. Érdemes e fájlból a legfontosabb parancsokat másik fájlba írni, mert a bash a régi bejegyzéseket eldobja. A limit megnövelhető, ha a ~/.bashrc-nkbe elhelyezzük az alábbi sort:

export HISTSIZE=9999    

Ha egy programnak többször akarjuk ugyanazt a bemenetet adni, akkor a bemenetet írjuk be fájlba (pl. prog.in), és irányítsuk át. Ennek segítségével könnyen ellenőrizhető, hogy a program két változata (prog1 és prog2) ugyanazt a kimenetet produkálja-e:

$ ./prog1 <prog.in >prog1.out
$ ./prog2 <prog.in >prog2.out
$ diff prog1.out prog2.out

A diff program kimenetét kell figyelni.

Ha a program bemenetét UNIX-on a terminálon gépeljük be, akkor az alábbiakra figyeljünk:

  • Egy egész sort be kell írni (és Enter-rel lezárni), és a program csak ezután kapja meg az egész sort.
  • A sorvégi Enter-t a program '\n'-ként kapja.
  • A bemenet végét (EOF, -1) Enter, majd Ctrl-D lenyomásával jelezhetjük. Ezután a program következő getchar() hívása -1-et ad vissza, a scanf() pedig (általában) nullát.
  • Windows alatt Ctrl-D helyett Enter, Ctrl-Z, Enter.
  • Ha Ctrl-C-t nyomunk, az örökre megszakítja a program futását, tehát ha a program kilépés előtt még kiírt volna valamit, akkor azt már nem fogja kiírni.

Számkitalálós program (embergondol.c: ember gondol, gép talál ki):

#include <stdio.h>
int main(void) {
  int a=1, b=100;
  printf("Gondolj egy szamot %d es %d kozott (zart)!\n", a, b);
  ...
  return 0;
}

Számkitalálós program (gepgondol.c: gep gondol, ember talál ki):

#include <stdio.h>
#include <math.h>
#include <time.h>
int main(void) {
  int a=1, b=100;
  int gondolt, tipp;
  srand(time());
  gondolt=rand()%(b-a)+a;
  printf("Gondoltam egy szamot %d es %d kozott (zart), talald ki!\n", a, b);
  while (1) {
    printf("Mit tippelsz?\n");
    scanf("%d",&tipp);
    if (gondolt>tipp) {
      printf("A gondolt szam nagyobb, mint %d\n", tipp);
    } else {
      printf("A gondolt szam nem nagyobb, mint %d\n", tipp);
    }
    ...
  }
  return 0;
}

Házi feladatok

A házi feladatokat a SIO rendszer segítségével kell beadni. Csak azokat kell beadni, amelyeknek a beadási határideje itt fel van tüntetve.

A többi SIO-beli feladatot szorgalmi feladatként lehet beadni. A szorgalmi feladatok megoldása elmélyíti a hallgató tudását, növeli a hallgató gyakorlati rátermettségét, és nagyban segíti a ZH-ra való felkészülést.

Technikai részletek

A C fordításhoz használt szoftver a gcc, verziószám gcc (GCC) 3.4.6 (Debian 3.4.6-4), a házi feladatokat a következő módon fordítjuk:

gcc -x c -O2 -std=c99 -static -o <forrásfájl>.o <forrásfájl> -lm

Fontos, hogy a beadott C forrásfájlok .c-re végződjenek, ellenkező esetben a rendszer fordítási hibát jelez (Compile error).

A main függvénynek return 0;-ra kell végződnie.

Kiírt házi feladatok

kód leírás beadási határidő
uc https://sioweb.math.bme.hu/user.phtml?op=inc&id=6 2007. március 5., 24:00 CET
lcuc https://sioweb.math.bme.hu/user.phtml?op=inc&id=7 2007. március 5., 24:00 CET

A házi feladatok listája elérhető a SIO rendszerben is: https://sioweb.math.bme.hu/user.phtml?op=zadania

Személyes eszközök