summaryrefslogtreecommitdiffstats
path: root/Aufgabe7/programmierung-praktikum.tex
blob: 52bb5a2afc5980dc2986e083298ebe4abbd85f33 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
%%=====================================================================================
%%         FILE:  programmierung-uebungen.tex
%%       AUTHOR:  Dr.-Ing. Fritz Mehner
%%        EMAIL:  mehner@fh-swf.de
%%      VERSION:  1.1
%%     REVISION:  02.12.2002
%%      CREATED:  01.08.2002
%%=====================================================================================

%%%%%%%%%%%%%%%%%%%%%%  LATEX-Vorspann  %%%%%%%%%%%%%%%%%%%%%%

\documentclass[oneside,10pt,a4paper]{book}
\newcommand{\Seitenformat}{1}

%%\documentclass[doubleside,10pt,a4paper]{book}
%%\newcommand{\Seitenformat}{2}

\usepackage{gastex}
\usepackage{german}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage{makeidx}
\makeindex
\usepackage{geometry}
\geometry{verbose,a4paper,tmargin=20mm,bmargin=15mm,lmargin=20mm,rmargin=20mm}
\setlength\parskip{\medskipamount}
\setlength\parindent{0pt}

\usepackage{listings}
\usepackage{graphicx}
\usepackage{floatflt}
\usepackage{amsmath}
\usepackage[hang]{subfigure}
\usepackage{setspace}
\usepackage{ifthen}

\usepackage[usenames]{color}
\usepackage{fancyhdr}
\usepackage{pstricks}

%\usepackage[ps2pdf]{hyperref}

\newcommand{\DokumentAusgabestand}{02.12.2002}

%%%%%%%%%%%%%%%%%%%%%%  LATEX-Dokument  %%%%%%%%%%%%%%%%%%%%%%

\begin{document}

%%----------------------------------------------------------------------
%%  Abschnittsüberschriften umbenennen
%%----------------------------------------------------------------------
\renewcommand{\chaptername}{Übung}
\renewcommand{\indexname}{Stichwortverzeichnis}

%%----------------------------------------------------------------------
%%  Einstellungen für fancyhdr
%%----------------------------------------------------------------------
\pagestyle{fancyplain}      %% fancyplain erzeugt Kopf- und Fußeinträge
                            %% auf auf den Seiten mit Kapitelanfängen
\fancyhf{}
\fancyfoot[c]{\thepage}
\ifthenelse{\Seitenformat = 1 }
{ %% ----- einseitig -------------------------------------
\fancyhead[RE,RO]{\leftmark}
\fancyfoot[RO,RE]{\scriptsize Praktikum Programmierung}
\fancyfoot[LE,LO]{\scriptsize Stand \DokumentAusgabestand}
}
{ %% ----- doppelseitig -------------------------------------
%%\fancyhead[RE,LO]{\leftmark}
\fancyhead[LO]{\rightmark}
\fancyhead[RE]{\leftmark}
\fancyfoot[RO,LE]{\scriptsize Praktikum Programmierung}
\fancyfoot[RE,LO]{\scriptsize Stand \DokumentAusgabestand}
}


%%----------------------------------------------------------------------
%%  Einstellungen für das Paket listings
%%----------------------------------------------------------------------
\lstset{basicstyle={\ttfamily,\footnotesize},tabsize=2,frame=single}
\lstset{extendedchars=true,numbers=left,stepnumber=5,numberstyle=\tiny}
\lstset{framesep=2mm}
\lstset{linewidth=166mm}
\lstset{xleftmargin=6mm}
\lstset{identifierstyle=\ttfamily,keywordstyle=\bfseries}
\lstset{commentstyle=\normalfont}
\lstset{showstringspaces=false}
\lstdefinestyle{ANSI}{language=C}
\lstdefinestyle{C++}{alsolanguage=C++}

\renewcommand\lstlistlistingname{Programmlisten}
\renewcommand\lstlistingname{Liste}


%%----------------------------------------------------------------------
%%  Titelblatt - Vorderseite
%%----------------------------------------------------------------------

%\title{\textbf{\textsc{\Huge Praktikum Programmierung}}}


\title{
\begin{onehalfspace}
\textbf{\textsc{
\Huge{Praktikum}\\
\large{zu den Veranstaltungen}\\
\Huge{Programmierung I}\\
\Huge{Programmierung II}\\
}}
\end{onehalfspace}
}
\author{\textbf{\textsc{Prof. Dr.-Ing. Fritz Mehner }}\\
\\
Fachhochschule Südwestfalen\\
Fachbereich Informatik und Naturwissenschaften}

\date{Stand \DokumentAusgabestand}
\maketitle

%%----------------------------------------------------------------------
%%  Titelblatt - Rückseite
%%----------------------------------------------------------------------

\newpage

\begin{quote}
\textbf{\textsc{Prof. Dr.-Ing. Fritz Mehner}}\\
Fachhochschule Südwestfalen\\
Fachbereich Informatik und Naturwissenschaften\\
Frauenstuhlweg 31\\
58644 Iserlohn\\
\\
Tel. 02371-566-201\\
Email: mehner@fh-swf.de\\
Raum: Z-127\\
\end{quote}

%%----------------------------------------------------------------------
%%  Buchvorspann
%%----------------------------------------------------------------------
\frontmatter

%%----------------------------------------------------------------------
%%  Einführung
%%----------------------------------------------------------------------
\chapter*{Einführung}
\addcontentsline{toc}{chapter}{Einführung}

Das vorliegende Dokument enthält die Übungen zu den Veranstaltungen \textbf{Programmierung 1} 
und \textbf{Programmierung 2} für die folgenden Studiengänge:

\begin{doublespace}
\begin{center}
  %%~~~~~ TABULAR : begin ~~~~~~~~~~
  \begin{tabular}[]{|l|l|l|}
  \hline \textbf{Studiengang} & \textbf{Fachbereich} & \textbf{Semester} \\
  \hline
  \hline Angewandte Informatik & Informatik und Naturwissenschaften & 1. und 2. Sem. \\ [0.0ex]
  \hline Physikalische Technik & Informatik und Naturwissenschaften & 1. und 2. Sem. \\
  \hline Mechatronik & Maschinenbau & 3. und 4. Sem. \\
  \hline
  \end{tabular} \\ [0.0ex]
  %%~~~~~ TABULAR :  end  ~~~~~~~~~~
\end{center}
\end{doublespace}
\vspace{ 10mm}

Die Durchführung der Aufgaben gibt Gelegenheit, das in der Vorlesung Gehörte 
anzuwenden und zu vertiefen.

Die Teilnahme am Praktikum und die Durchführung der Übungen sind Pflicht. 
Die selbständige und erfolgreiche Lösung der Aufgaben wird im Praktikum bescheinigt 
und ist eine Voraussetzung für die Teilnahme an der Klausur.

Programmieren kann man nur lernen indem man programmiert.
Wenn keine Vorkenntnisse vorhanden sind, können die Anfänge durchaus mühevoll sein.
Die alleinige Teilnahme am Praktikum, d.h. Programmieren am Rechner
im Umfang von 2 Semesterwochenstunden, reicht \textit{keinesfall} zum Erwerb 
gefestigter Grundkenntnisse aus.

\begin{quote}
Es ist zwingend erforderlich auch außerhalb der Lehrveranstaltungen 
das in der Vorlesung erworbene Wissen praktisch nachzuvollziehen, anzuwenden und zu vertiefen.
\end{quote}

Dazu sollte auf dem eigenen Rechner eine entsprechende Entwicklungsumgebung zur 
Verfügung stehen . 
Grundsätzlich ist jeder  Compiler oder jede Entwicklungsumgebung geeignet, sofern 
die ANSI-C-Verträglichkeit gegeben ist. 
Aus Kostengründen bietet sich freie Software an (LINUX oder FreeBSD).
Selbstverständlich können auch die Einrichtungen der Fachhochschule benutzt werden. 


%%----------------------------------------------------------------------
%%  Zur Darstellung
%%----------------------------------------------------------------------
\section*{Zur Darstellung}

Programmcode, Programmausgaben, Programm- und Dateinamen, Schlüsselwörter von Programmiersprachen
und Menüeinträge erscheinen in \texttt{Schreibmaschinenschrift mit fester Zeichenbreite}. 

In den gerahmten C-/C++-Listen werden  für Code und Kommentar zur Verbesserung der Lesbarkeit 
unterschiedliche Schriftarten verwendet.

Der Nachkommaanteil reeller Zahlen wird, entsprechend der Darstellung in den meisten Programmiersprachen, 
durch einen \textit{Dezimalpunkt} abgetrennt, also z.B. PI = 3.1415 .

Dieses Dokument wurde mit \LaTeX\  erzeugt.


%%----------------------------------------------------------------------
%%  Inhaltsverzeichnis / weitere Verzeichnisse
%%----------------------------------------------------------------------
\cleardoublepage
\setcounter{tocdepth}{1}
\addcontentsline{toc}{chapter}{Inhaltsverzeichnis}
\tableofcontents{}

%%\cleardoublepage
%%\addcontentsline{toc}{chapter}{Abbildungsverzeichnis}
%%\listoffigures
%%
%%\cleardoublepage
%%\addcontentsline{toc}{chapter}{Tabellenverzeichnis}
%%\listoftables
%%
%%\cleardoublepage
%%\addcontentsline{toc}{chapter}{Programmlisten}
%%\lstlistoflistings 

%%----------------------------------------------------------------------
%%  Buchhauptteil
%%----------------------------------------------------------------------
\mainmatter


%%----------------------------------------------------------------------
%%  ÜBUNG : Summation unendlicher Reihen
%%----------------------------------------------------------------------
\chapter{Summation unendlicher Reihen}
\index{Summation}
\index{Reihe! unendliche}

%%----------------------------------------------------------------------
%%  Bildung endlicher Reihensummen
%%----------------------------------------------------------------------
\section{Bildung endlicher Reihensummen}
\index{Reihe! harmonische}
\index{Reihe! harmonische!alternierend}
\index{Reihe! leibnizsche}
\index{Reihe! geometrische}

\begin{align}
H & =\; \; \sum _{i=1}^{\infty }\frac{1}{i} 
&&=\; \; \frac{1}{1}+\frac{1}{2}+\frac{1}{3}+\frac{1}{4}+\ldots \label{eq:HReihe} &&&\\
A & =\; \; \sum _{i=1}^{\infty }\frac{\left(-1\right)^{i+1}}{i} 
&&=\; \; \frac{1}{1}-\frac{1}{2}+\frac{1}{3}-\frac{1}{4}+\ldots \label{eq:AReihe} &&&\\
L & =\; \; \sum _{i=1}^{\infty }\frac{\left(-1\right)^{i+1}}{2i-1} 
&&=\; \; \frac{1}{1}-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\ldots \label{eq:LReihe} &&&\\
G & =\; \; \sum _{i=0}^{\infty }\frac{1}{2^{i}} 
&& =\; \; \frac{1}{1}+\frac{1}{2}+\frac{1}{4}+\frac{1}{8}+\ldots \label{eq:GReihe} &&&
\end{align}


\begin{table}[h]

\begin{onehalfspace}
\begin{center}
\begin{tabular}{|c|c|c|}
\hline 
\textbf{Gleichung}& \textbf{Name}& \textbf{Summe}\\
\hline
\hline 
\ref{eq:HReihe}&
harmonische Reihe&
$\infty $\\
\hline 
\ref{eq:AReihe}&
alternierende harmonische Reihe&
$ln$ 2\\
\hline 
\ref{eq:LReihe}&
Leibnizsche Reihe&
$\pi $/4\\
\hline 
\ref{eq:GReihe}&
Geometrische Reihe&
2\\
\hline
\end{tabular}
\end{center}
\end{onehalfspace}

\caption{\label{cap:Unendliche-Reihen}Unendliche Reihen}
\end{table}


Die Bildung einer Summe S aus n Summanden wird mit Hilfe einer Schleife
durchgeführt. Bei jedem Schleifendurchlauf wird ein Summand $s_{i}$
zu der sich aufbauende Summe S addiert:
\begin{eqnarray*}
S & = & s_{1}+s_{2}+s_{3}+\ldots +s_{n}\\
 &  & \\
S & = & 0\\
S & = & S+s_{1}\\
S & = & S+s_{2}\\
 & \ldots  & \\
S & = & S+s_{n}
\end{eqnarray*}


Schreiben Sie ein C-Programm, in welchem für jede dieser Reihen die
Summe der ersten 1000 Summanden gebildet und ausgegeben wird.


%%----------------------------------------------------------------------
%%  Wechselnde Vorzeichen
%%----------------------------------------------------------------------
\subsection{Wechselnde Vorzeichen}
\index{Vorzeichen!wechselndes}

Wechselnde Vorzeichen (Reihe \ref{eq:AReihe} und \ref{eq:LReihe})
werden dadurch gebildet, daß man einer Hilfsvariablen v vor der Schleife
den Wert +1 zuweist. Die Summanden werden in der Schleife mit der
Vorzeichenvariablen v multipliziert. Danach wird mit der Zuweisung
v = -v die Umkehr des Vorzeichens für den nächsten Durchlauf erzwungen. 


%%----------------------------------------------------------------------
%%  Nichtlinear wachsende oder fallende Summanden
%%----------------------------------------------------------------------
\subsection{Nichtlinear wachsende oder fallende Summanden}

Die Summanden der Geometrischen Reihe können ohne Potenzierung berechnet
werden. Der jeweils nächste Summand ergibt sich durch Multiplikation
mit dem Faktor $1/2$ aus dem vorhergehenden. Wenn die Variable \texttt{summand} 
den Wert des Summanden aus dem letzten Schleifendurchlauf besitzt,
dann kann durch 

\begin{verbatim}
summand = 0.5*summand;
\end{verbatim}
der Wert für den aktuellen Schleifendurchlauf bestimmt werden.


%%----------------------------------------------------------------------
%%  Bildung ,,unendlicher'' Reihensummen
%%----------------------------------------------------------------------
\section{Bildung ,,unendlicher'' Reihensummen}

Die Bildung unendlicher Summen ist auf einem Digitalrechner natürlich nicht möglich. 
Wegen der begrenzten Genauigkeit der Zahlendarstellung und der Tatsache,
daß die Summanden einer konvergierenden Reihe immer kleinere Beträge
annehmen, verändert die Addition weiterer Summanden eine bereits berechnete
Summe ab einem gewissen i nicht mehr ! 
Wenn die Summe aus dem letzten Rechenschritt als Vergleichswert zur Verfügung steht, 
kann dieser Umstand festgestellt und die Berechnung abgebrochen werden. 
Die bis dahin ermittelte Summe stellt die Näherungslösung dar. 

Erstellen Sie eine neue Version des Programmes aus dem ersten Teil,
in welchem Sie dann alle Reihen solange aufsummieren, bis sich die
jeweilige Summe nicht mehr ändert. 
Geben Sie die errechneten Summen aus und vergleichen Sie diese mit den 
theoretischen Grenzwerten aus Tabelle \ref{cap:Unendliche-Reihen}.


%%----------------------------------------------------------------------
%%  ÜBUNG : Verwendung von Schleifen
%%----------------------------------------------------------------------
\chapter{Verwendung von Schleifen}
\index{Schleifen}

%%----------------------------------------------------------------------
%%  ASCII-Tabelle
%%----------------------------------------------------------------------
\section{ASCII-Tabelle}
\index{ASCII-Tabelle}

Schreiben Sie ein C-Programm, welches in 32 Zeilen eine 8-spaltige
ASCII-Tabelle ausgibt, die jeweils den Zahlenwert eines Zeichens (3-stellig
mit führenden Nullen) und das zugehörige abdruckbare Zeichen enthält.
Für die nicht darstellbaren Steuerzeichen (0-31) sollen 3 Punkte ausgegeben
werden.

\lstset{language=C}
\lstinputlisting[caption={Programmausgabe: ASCII-Tabelle},label=ascii-tabelle]{ ./programme/ascii.txt }



%%----------------------------------------------------------------------
%%  Teilsumme der harmonischen Reihe bei aufsteigender und absteigender Summation
%%----------------------------------------------------------------------
\section{Teilsumme der harmonischen Reihe bei aufsteigender \\und absteigender Summation}
\index{Reihe! harmonische}
\index{Summation}


Schreiben Sie ein Programm, in welchem die Glieder der harmonischen
Reihe (Gleichung \ref{eq:HReihe}) beginnend mit 1/1 so lange aufsummiert
werden, bis sich die Reihensumme nicht mehr ändert und geben Sie die
Summe aus. 

Anschließend ist eine Schleife zu programmieren, die beginnend vom
letzten Wert des Index der vorhergehenden Schleife die Reihensumme
bildet und beim Summanden 1/1 endet. Diese Summe ist ebenfalls auszugeben.
Geben Sie nun die Differenz der beiden Summen aus (Exponentenformat).
Verwenden Sie den Datentyp \texttt{float} bei der Bildung der Summen.

\begin{itemize}
\item Wie oft werden die beiden Schleifen durchlaufen ?
\item Was stellen Sie beim Vergleich der beiden Summen fest ? 
\end{itemize}


%%----------------------------------------------------------------------
%%  Rundungsfehler durch fortgesetzte Multiplikation und Division
%%----------------------------------------------------------------------
\section{Rundungsfehler durch fortgesetzte Multiplikation und Division}
\index{Rundungsfehler}

Schreiben Sie ein Programm, in welchem die \texttt{float}-Zahl x = 1000000
in einer ersten Schleife 10-mal mit dem \texttt{float}-Faktor k = 0.1693 multipliziert
wird. Das Ergebnis wird danach in einer zweiten Schleife 10-mal durch
den selben Faktor k dividiert. Theoretisch müßte danach x wieder den
Ausgangswert enthalten. Geben Sie den Ausgangswert und den Endwert
von x mit jeweils 10 Nachkommastellen aus und vergleichen Sie die
Werte.

\begin{itemize}
\item Was stellen Sie beim Vergleich der beiden Werte fest ? 
\end{itemize}


%%----------------------------------------------------------------------
%%  Steuerung einer for-Scheife
%%----------------------------------------------------------------------
\section{Steuerung einer \texttt{for}-Scheife}



%%----- FIGURE : begin ----------
\begin{figure}[htb]
\begin{center}
\includegraphics[scale=.5]{./bilder/parabel.eps}
\caption{ \label{ABB:Parabel} Punktweise Berechnung einer Parabel }
\vspace{ 5mm}
\end{center}
\end{figure}
%%----- FIGURE :  end  ----------

Die Funktion $f(x)=x^{2}$ ist im Bereich von $x = 0\ldots30$ auszuwerten.
Dazu wird das x-Intervall {[}0,30{]} in 250 Teilintervalle der Länge
$\Delta x = 30/250 = 0.12$ eingeteilt und die Funktion an den 251 Teilungspunkten 
ausgewertet (Abb. \ref{ABB:Parabel}).
Die Teilungspunkte $x_{i}$ und die dazugehörigen Funktionswerte $f(x_{i})$
sollen in einer \texttt{for}-Schleife berechnet werden. Dabei sollen 3 verschiedene
Steuerungsmethoden ausprobiert werden: 

\begin{enumerate}
\item Ganzzahliger Schleifenzähler \texttt{i} . Das laufende $x_{i}$ wird durch
Multiplikation des Schleifenzählers mit der Intervalllänge ermittelt:
$x_{i}=i*\Delta x$ .\\
Anmerkung: Der aktuelle Wert von $x_{i}$ hängt nur von einer Multiplikation
ab.
\item Ganzzahliger Schleifenzähler \texttt{i} . Das laufende $x_{i}$ wird durch
fortlaufende Addition der Intervalllänge ermittelt: $x_{i}=x_{i-1}+\Delta x$
.\\
Anmerkung: Der aktuelle Wert von $x_{i}$ hängt von allen vorhergegangenen
Additionen ab.
\item Reeller Schleifenzähler \texttt{x} . Das laufende $x$ wird durch Hochzählen
des Schleifenzählers \texttt{x} um die Intervalllängeermittelt: $x=x+\Delta x$
.\\
Anmerkung: Der aktuelle Wert von $x_{i}$ hängt von allen vorhergegangenen
Additionen und von der Darstellungsgenauigkeit von $\Delta x$ ab.
\end{enumerate}
Schreiben Sie ein Programm, in welchem die 3 Schleifen durchlaufen
werden. Der letzte in der Schleife berechnete x-Wert und der dazugehörige
Funktionswert soll jeweils ausgegeben werden (15 Nachkommastellen;
Datentyp \texttt{double}). 

\begin{itemize}
\item Was stellen Sie beim Vergleich der Ausgabewerte fest ? 
\end{itemize}


%%----------------------------------------------------------------------
%%  ÜBUNG : Verwendung von Feldern
%%----------------------------------------------------------------------
\chapter{Verwendung von Feldern}
\index{Felder}

%%----------------------------------------------------------------------
%%  Feld mit Quadratzahlen belegen und ausgeben
%%----------------------------------------------------------------------
\section{Feld mit Quadratzahlen belegen und ausgeben}

Geben Sie das Beispielprogramm aus der Vorlesung ein, in welchem ein
\texttt{int}-Feld (100 Elemente) mit den Quadratzahlen $0^{2},1^{2},2^{2},...,99^{2}$
belegt und der Feldinhalt anschließend ausgegeben wird. Verwenden
Sie in der Ausgabeschleife (Schleifenzähler: i ) die Anweisung

\begin{verbatim}
if( i%10==0 ) printf("\n");
\end{verbatim}
um nach jeweils 10 Werten einen Zeilenvorschub zu erzwingen.


%%----------------------------------------------------------------------
%%  Feld mit Zufallszahlen zwischen 0 und 50 belegen
%%----------------------------------------------------------------------
\section[Feld mit Zufallszahlen zwischen 0 und 50 belegen]{Feld mit Zufallszahlen 
zwischen 0 und 50 belegen und Mittelwert, 
Minimalwert und Maximalwert aller Feldelemente ermitteln}
\index{Mittelwert}
\index{Minimalwert}
\index{Maximalwert}


Schreiben Sie ein Programm, in welchem ein \texttt{double}-Feld a
(100 Elemente) mit Zufallszahlen zwischen 0 und 50 (jeweils einschließlich)
belegt wird. Die Funktion \texttt{random()} , \texttt{include}-Datei \texttt{stdlib.h},
liefert Zufallszahlen im Bereich von 0 bis $2^{31}-1$. Durch die
Bildung des Divisionsrestes mit 51 (Operator \% , modulo-Operator)
können daraus Werte zwischen 0 und 50 erzeugt werden:

\begin{verbatim}
a[i] = random() % 51;
\end{verbatim}
\begin{itemize}
\item Geben Sie das so belegte Feld mit 10 Werten pro Zeile aus.
\item Bilden Sie das arithmetische Mittel aller Feldelemente und geben Sie
diesen Wert aus.
\item Ermitteln Sie den kleinsten Wert und den größten Wert der Feldelemente
und geben Sie diese beiden Werte aus. 
\end{itemize}

%%----------------------------------------------------------------------
%%  Korrespondierende Felder
%%----------------------------------------------------------------------
\section{Korrespondierende Felder}
\index{Felder!korrespondierende}

Schreiben Sie ein Programm, in welchem die \texttt{double}-Felder
\texttt{x}, \texttt{y1} und \texttt{y2} mit jeweils 1000 Elementen
angelegt werden. Die Funktionen $y_{1}(x)=\sin(x)$ und $y_{2}(x)=\cos(x)$
sind im Bereich von $x = 0 \ldots 6.4$ auszuwerten (\texttt{include}-Datei
\texttt{math.h} ). Dazu wird das Intervall $\lbrack 0,6.4\rbrack$  in 100 Teilintervalle
der Länge $\Delta x=6.4/100$ eingeteilt und die beiden Funktionen
an den 101 Teilungspunkten ausgewertet (s.Aufgabe 2.4). Die $x$-Werte
werden fortlaufen im Feld \texttt{x}, die Funktionswerte entsprechend in den
Feldern \texttt{y1} und \texttt{y2} abgelegt. 

Nachdem die Felder belegt sind, sollen die Werte zeilenweise in der
Form 

\begin{quote}
\begin{verbatim}
+0.000000  +0.000000  +1.000000

+0.064000  +0.127651  +0.981625

+0.128000  +0.253213  +0.927174

. . . 
\end{verbatim}
\end{quote}

ausgegeben werden. Von der Kommandozeile des Betriebssystems aus kann
die Ausgabe des Programmes \texttt{kfeld.e} in die Datei \texttt{kfeld.dat}
umgeleitet werden:

\begin{quote}
\begin{verbatim}
student@rechner5:/home/student> kfeld.e > kfeld.dat 
\end{verbatim}
\end{quote}

%%----------------------------------------------------------------------
%%  Erzeugung einer Graphik mit Hilfe des Programmes gnuplot
%%----------------------------------------------------------------------
\section{Erzeugung einer Graphik mit Hilfe des Programmes \texttt{gnuplot}}
\index{gnuplot}

%%===== FIGURE : begin ==========
\begin{figure}[htbp]
\begin{center}
%\includegraphics[  scale=0.9]{./bilder/schwingung.eps}
\input{./bilder/schwingung.tex}
\caption{ \label{ABB:Schwingungsfigur} Darstellung einer Schwingungsfigur durch das Programm \texttt{gnuplot}}
\vspace{ 5mm}
\end{center}
\end{figure}
%%===== FIGURE :  end  ==========

Erstellen Sie nun eine Datei mit dem Namen \textbf{kfeld.plt} in der
folgende Steueranweisungen für das Programm \texttt{gnuplot} enthalten sind:

\lstset{stepnumber=1}

\lstinputlisting[caption={Steueranweisungen für das Programm \texttt{gnuplot}},label=gnuplot]{./programme/kfeld.plt}



\begin{onehalfspace}
\begin{center}\begin{tabular}{|c|p{12cm}|}
\hline 
\textbf{Zeile} & \textbf{Erklärung}\\
\hline
\hline 
 1 & Diagrammtitel festlegen\\
\hline 
 2 & Gitter erzeugen\\
\hline 
 3 & Legende nicht darstellen\\
\hline 
 4 & Beschriftung der x-Achse\\
\hline 
 5 & Beschriftung der y-Achse\\
\hline 
 6 & Kurvenausgabe: \newline 
      aus Datei \texttt{kfeld.dat} Spalte 3 über Spalte 2 auftragen; \newline 
      Punkte durch Linien verbinden\\
\hline 
 7 & Text \verb'"... weiter"' ausgeben und auf beliebigen Tastenanschlag warten\\
\hline
\end{tabular}\end{center}
\end{onehalfspace}

Nachdem Sie \texttt{\textbf{kfeld.plt}} abgespeichert haben,
rufen Sie das Program \texttt{gnuplot} mit foldender Komandozeile
in einem shell-Fenster auf:


\begin{quote}
\begin{verbatim}
student@rechner5:/home/student>gnuplot kfeld.plt
\end{verbatim}
\end{quote}

Danach erscheint die graphische Ausgabe in einem neuen Fenster. Die
Ausgabe wird beendet, wenn der Mauszeiger über dem shell-Fenster steht
und die Eingabetaste gedrückt wird. 

Berechnen Sie nun 

\begin{align*}
y_{1}(x) & =\sin(x) & y_{1}(x) & =\sin(x)   & y_{1}(x) & = \sin(2x) \\
y_{2}(x) & =\cos(x) & y_{2}(x) & =\cos(3x)  & y_{2}(x) & = \cos(3x)
\end{align*}

Weitere Berechnungen mit graphischer Ausgabe :

\begin{align*}
y_{1}(x) & =\sin(x) & y_{1}(x) & =x\cdot\sin(x)   \\
y_{2}(x) & =\cos(x) & y_{2}(x) & =x\cdot\cos(3x) 
\end{align*}

Um die Funktion $y_1(x)$ über $x$ aufzutragen muß die Zeile 6 in der Datei \texttt{\textbf{kfeld.plt}} 
wie folgt aussehen:

\begin{quote}
\begin{verbatim}
plot "kfeld.dat" using 1:2 with lines
\end{verbatim}
\end{quote}

Für die Darstellung von  $y_2(x)$ über $x$ lautet diese Zeile  

\begin{quote}
\begin{verbatim}
plot "kfeld.dat" using 1:3 with lines
\end{verbatim}
\end{quote}


%%----------------------------------------------------------------------
%%  ÜBUNG : Umgang mit Texten
%%----------------------------------------------------------------------
\chapter{Umgang mit Texten}


%%----------------------------------------------------------------------
%%  Buchstaben und Ziffern in einem Text abzählen
%%----------------------------------------------------------------------
\section{Buchstaben und Ziffern in einem Text abzählen}
\index{Buchstaben!abzählen}
\index{Ziffern!abzählen}


%%----------------------------------------------------------------------
%%  Zustandsdiagramme
%%----------------------------------------------------------------------
\begin{figure}[h]
\subfigure[Wörter zählen]
{
\begin{picture}(80,80)
\gasset{Nadjust=w,Nadjustdist=2}
\node[fillcolor=Yellow,linewidth=.4](L)( 40, 40){ZWISCHENRAUM}
\node[fillcolor=Yellow,linewidth=.4](W)( 40, 20){WORT}
\imark[iangle=180](L)
\drawedge[curvedepth=10](L,W){Buchstabe}
\drawedge[curvedepth=10](W,L){Leerzeichen}
\drawloop[loopangle=  0](L){Leerzeichen}
\drawloop[loopangle=270](W){Buchstabe}
\end{picture}
} 
\subfigure[Wörter und Zahlen zählen]
{
\begin{picture}(80,80)
\gasset{Nadjust=w,Nadjustdist=2}
\node[fillcolor=Yellow,linewidth=.4](Z)(40, 60){ZAHL}
\node[fillcolor=Yellow,linewidth=.4](L)(40, 40){ZWISCHENRAUM}
\node[fillcolor=Yellow,linewidth=.4](W)(40, 20){WORT}
\imark[iangle=180](L)
\drawedge[curvedepth=10](Z,L){Leerzeichen}
\drawedge[curvedepth=10](L,Z){Ziffer}
\drawedge[curvedepth=10](L,W){Buchstabe}
\drawedge[curvedepth=10](W,L){Leerzeichen}
\drawloop[loopangle=  0](L){Leerzeichen}
\drawloop[loopangle=270](W){Buchstabe}
\drawloop[loopangle= 90](Z){Ziffer}
\end{picture}
}
\caption{\label{cap:Zustandsdiagramme}Zustandsdiagramme\index{Zustanddiagramm} zur Wort- und Zahlenerkennung }
\end{figure}



\begin{itemize}
\item Geben Sie das Beispielprogramm \texttt{string1.c} aus der Vorlesung ein, in
welchem ein Text eingelesen, ausgegeben und die Anzahl der Klein-
und Großbuchstaben ermittelt wird. Überprüfen Sie dessen Funktionsweise !
\item Erweiteren Sie das Programm so, daß auch Ziffern abgezählt werden
können (Testfunktion: \texttt{isdigit()} ).
\item Ändern Sie das Programm nun so, daß die Unterscheidung zwischen Klein-
und Großbuchstaben entfällt und nur Buchstaben (Testfunktion: \texttt{isalpha()}
) und Ziffern abgezählt werden. 
\end{itemize}

%%----------------------------------------------------------------------
%%  Wörter in einem Text abzählen
%%----------------------------------------------------------------------
\section{Wörter in einem Text abzählen}

Das unter 4.1 entwickelte Programm soll nun so abgeändert werden,
daß die Wörter im Eingabetext abgezählt und deren Anzahl ausgegeben
werden.

Die Analyse kann wie folgt durchgeführt werden: Das augenblicklich
betrachtete Zeichen gehört entweder zu einem Wort oder zu einem Zwischenraum
(Folge von Leerzeichen und/oder Tabulatoren). 
Jeder der beiden Zustände wird in einer Zustandsvariablen \texttt{zustand} \index{Zustandsvariablen} 
codiert, z.B. ZWISCHENRAUM: \texttt{zustand=0}, WORT: \texttt{zustand=1}. 
In jedem Schritt (d.h. beim jeweils nächsten zu betrachtenden Zeichen) wird überprüft, 
ob eine Zustandsänderung stattfindet (siehe Abb. \ref{cap:Zustandsdiagramme}).
Beim Zustandsübergang ZWISCHENRAUM $\rightarrow$ WORT wird der Wortzähler erhöht. 

Zur Klassifizierung der einzelnen Zeichen können die C-Klassifizierungsfunktionen 
verwendet werden, die in der \texttt{h}-Datei \texttt{ctype.h} definiert sind 
(s.a. Abb \ref{cap:Hierarchie-der-Zeichenklassen}).


%%----------------------------------------------------------------------
%%  Wörter und Zahlen in einem Text abzählen
%%----------------------------------------------------------------------
\section{Wörter und Zahlen in einem Text abzählen}

Das unter 4.2 entwickelte Programm soll nun so abgeändert werden,
daß zusätzlich Zahlen im Eingabetext erkannt, abgezählt und auch deren
Anzahl ausgegeben wird. 
Dazu ist gemäß Abbildung \ref{cap:Zustandsdiagramme}b ein weiterer Zustand 
ZAHL einzufügen und die zusätzlichen Übergänge zu implementieren.

Erweitern Sie das Programm indem Sie prüfen, ob in einer Buchstabenfolge
eine Ziffer oder in einer Ziffernfolge ein Buchstabe auftritt. 
In diesem Fall soll das Programm eine Fehlermeldung ausgeben und über den Funktionsaufruf
\texttt{exit(1)} verlassen werden. 
Erstellen Sie nun in einem Editor eine Textdatei \texttt{text.txt}, 
die eine größere Anzahl von Wörtern und Zahlen in einer einzigen Zeile enthält (höchstens 120 Zeichen).

Führen Sie nun Ihr Programm von der Kommandozeile aus:

\begin{quote}
\begin{verbatim}
.../home/student>prakt-4-3.e < text.txt
\end{verbatim}
\end{quote}

Überprüfen Sie das Ergebnis !

Prüfen Sie nun Ihre Textdatei mit dem UNIX-Systemprogramm\index{UNIX!wc}
\texttt{wc}\index{wc} (steht für word count):

\begin{quote}
\begin{verbatim}
.../home/student>wc -w < text.txt
\end{verbatim}
\end{quote}

Die ausgegebene Zahl muß der Summe der Wörter und Zahlen in der Ausgabe
des eigenen Programmes entsprechen.

\begin{figure}[h]
\begin{center}\includegraphics{./bilder/zeichenklassen}\end{center}
\caption{\label{cap:Hierarchie-der-Zeichenklassen}Hierarchie der Zeichenklassen\index{Zeichenklassen}
und der Klassifizierungsfunktionen in C (\texttt{h}-Datei \texttt{ctype.h})}
\end{figure}


%%----------------------------------------------------------------------
%%  ÜBUNG : Codieren und Decodieren von Texten
%%----------------------------------------------------------------------
\chapter{Codieren und Decodieren von Texten}
\index{codieren}
\index{decodieren}
\index{Text!codieren, decodieren}


%%----------------------------------------------------------------------
%%  Inhalt eines Feldes um n Positionen nach links oder rechts rotieren
%%----------------------------------------------------------------------
\section{\label{sec:Codieren-1}Inhalt eines Feldes um n Positionen nach links
oder rechts rotieren}

Legen Sie ein Feld \texttt{ascii} vom Typ \texttt{int} mit n=128 Elementen an, 
füllen Sie das Feld mit der Zahlenfolge 0, 1, 2, 3, ... , 127 ( = jeweiliger Feldindex) 
und geben Sie das Feld in Zeilen zu 16 Elementen aus.

Lesen Sie eine ganze Zahl $r$ ein die angibt, um wieviele Plätze der
Feldinhalt zyklisch nach links (negative Zahl) oder nach rechts (positive
Zahl) verschoben werden soll. Das folgende Beispiel zeigt eine Verschiebung
um $r = 2$ nach links:

%
\begin{figure}[h]
\begin{center}\includegraphics{./bilder/feld-rotieren-1}\end{center}
\caption{\label{cap:Feldinhalt-um-2}Feldinhalt um 2 Positionen nach links
verschieben}
\end{figure}


%%----------------------------------------------------------------------
%%  Einen Teilbereich eines Feldes um n Positionen nach links oder rechts rotieren
%%----------------------------------------------------------------------
\section{\label{sec:Codieren-2}Einen Teilbereich eines Feldes um n Positionen
nach links oder rechts rotieren}

Ändern Sie das Programm aus der Aufgabe \ref{sec:Codieren-1} so ab,
daß zusätzlich die Anfangsposition $p_1$ und Endposition $p_2$ eines Bereiches
des Feldes eingelesen wird. Nur die Feldelemente innerhalb dieses
Bereiches sollen rotiert werden.

Überprüfen Sie, ob vor der Verschiebung die folgenden Bedingungen
erfüllt sind:

\begin{align*}
0 \leq p_1 && p_1 < p_2 && p_2 < 128 
\end{align*}

Geben Sie das rotierte Feld mit derselben Formatierung wie das Originalfeld
aus und überprüfen Sie das Ergebnis mit verschiedenen Links- und Rechtsverschiebungen.


%%----------------------------------------------------------------------
%%  Text chiffrieren
%%----------------------------------------------------------------------
\section{\label{sec:Codieren-3}Text chiffrieren}
\index{chiffrieren}

Verwenden Sie das Programm aus Aufgabe \ref{sec:Codieren-2} und rotieren
Sie das \texttt{int}-Feld zwischen $p_1 = 32$ und $p_2 = 126$ (=alle Nichtsteuerzeichen
des ASCII-Codes) um $r = -5$ Positionen (nach links).

Lesen Sie zeichenweise eine Datei \texttt{klar.txt} in einen Textpuffer\texttt{text} 
ein (s. Beispiel \texttt{string.c} aus der Vorlesung). Die Datei \texttt{klar.txt} soll
einen einzeiligen Klartext enthalten.

Die Feldelemente des Textpuffers enthalten die eingelesenen Zeichen
in ASCII-Codierung. Diese liegt jeweils zwischen den Werten 0 und
127. Diese Werte können nun mit Hilfe des eingangs erzeugten Feldes
in einfacher Weise chiffriert werden.

Die Werte der Zeichen im Textpuffer \texttt{text} werden als Index des teilweise
rotierten Feldes \texttt{ascii} zur Adressierung des Zielzeichens verwendet:

\begin{quote}
\begin{verbatim}
putchar( ascii[ text[i] ] );
\end{verbatim}
\end{quote}

Wegen der Rotation der Nichtsteuerzeichen um 5 Positionen wird der
Buchstabe A auf F, die Ziffer 1 auf 6 usw. abgebildet. Die Steuerzeichen
(falls vorhanden) werden durch sich selbst codiert, d.h. nicht verändert.

Das Feld vor der Rotation: Der Feldindex entspricht dem ASCII-Wert
des Inhalts, der hier in lesbarer Form dargestellt ist (Abb. \ref{cap:Zeichenfeld-als-Hilfsmittel},
oben). 

%
\begin{figure}[h]
\begin{center}\includegraphics{./bilder/feld-rotieren-2}\end{center}


\caption{\label{cap:Zeichenfeld-als-Hilfsmittel}Zeichenfeld als Hilfsmittel
zur Textchiffrierung}
\end{figure}


Das Feld nach der Rotation: Wird das Feld mit dem Wert des Buchstabens
B (=66) adressiert, wird nun der Inhalt 71 ausgelesen (entspricht
dem ASCII-Wert von G), d.h. B wird durch G codiert (Abb. \ref{cap:Zeichenfeld-als-Hilfsmittel},
unten).


%%----------------------------------------------------------------------
%%  Text dechiffrieren
%%----------------------------------------------------------------------
\section{Text dechiffrieren}
\index{dechiffrieren}

Kopieren Sie das Programm aus Aufgabe \ref{sec:Codieren-3} und rotieren
Sie das \texttt{int}-Feld zwischen $p_1 = 32$ und $p_2 = 126$ (=alle Nichtsteuerzeichen
des ASCII-Codes) um $r = +5$ Positionen (nach rechts).

Führen Sie nun Ihr Programm von der Kommandozeile aus:

\begin{quote}
\begin{verbatim}
.../home/student>prakt-5-4.e < geheim.tx > klar1.txt
\end{verbatim}
\end{quote}

Bei richtiger Arbeitsweise beider Programme muß der Inhalt der Dateien
\texttt{klar.txt} und \texttt{klar1.txt} übereinstimmen. 


%%----------------------------------------------------------------------
%%  ÜBUNG : Einfache statistische Kennwerte
%%----------------------------------------------------------------------
\chapter{Einfache statistische Kennwerte}
\index{Kennwerte!statistische}

%%----------------------------------------------------------------------
%%  Statistische Kennwerte
%%----------------------------------------------------------------------
\section{Statistische Kennwerte}

Folgende Kennwerte einer Zahlenfolge $x_{1},...,x_{n}$ sind zu berechnen:

%%+++++ TABLE : begin ++++++++++

\begin{onehalfspace}

\begin{tabular}{|c|p{12cm}|}
\hline 
\textbf{Kennwert} & \textbf{Berechnungsvorschrift}\\
\hline
\hline 
Minimum\index{Minimum}&
kleinster Wert der Zahlenfolge\\
\hline 
Maximum\index{Maximum}&
größter Wert der Zahlenfolge\\
\hline 
Spanne\index{Spanne}&
(Maximum - Minimum)\\
\hline 
Arithmetischer Mittelwert\index{Mittelwert!arithmetischer}&
$$am=\sum _{i=1}^{n}x_{i}$$
\\
\hline 
Geometrischer Mittelwert\index{Mittelwert!geometrischer}&
$$gm=\sqrt[n]{x_{1}x_{2}\cdots x_{n}}$$ 
Zur Berechnung siehe Abschnitt \ref{SEC:GeoMittel}.
\\
\hline 
Quadratischer Mittelwert\index{Mittelwert!quadratischer}&
$$qm=\sqrt{\frac{1}{n}\sum _{i=1}^{n}x_{i}^{2}}$$
\\
\hline 
Mittlere Abweichung\index{Abweichung}&
$$ma=\frac{1}{n}\sum _{i=1}^{n}\Vert x_{i}-am\Vert $$
\\
\hline 
Median\index{Median}&
Der Median einer Menge von Zahlen, die \textit{der Größe nach sortiert} sind,
ist bei ungerader Anzahl der Wert in der Mitte, bei gerader Anzahl das arithmetische Mittel 
der beiden Werte in der Mitte. 
Zur Sortierung s. Abschnitt \ref{SEC:Sortieren}. \\
\hline
\end{tabular}

\end{onehalfspace}
%%+++++ TABLE :  end  ++++++++++

Bei der Programmerstellung ist folgendermaßen vorzugehen:

\begin{itemize}
\item Verwenden Sie zur Berechnung der Kennwerte jeweils  eine eigene Funktion.
\item Es sollen 200 \texttt{double}-Werte berücksichtigt werden, die mit Hilfe des
Zufallsgenerators \texttt{\textbf{rand()}} (Prototyp in \texttt{stdlib.h})
erzeugt werden können (Wertebereich 0 bis 100; eine Nachkommastelle,
die ungleich Null sein kann).
\item Schreiben Sie eine C-Funktion, die die Zahlenreihe in Zeilen zu 10
Werten auf den Bildschirm ausgibt.
\item Zur Berechnung des geometrischen Mittels soll der natürliche Logarithmus
verwendet werden ( s. Abschnitt \ref{SEC:GeoMittel}; Funktionen: \texttt{\textbf{log(), exp()}},
Prototypen in \texttt{math.h} ).
Die Übergabe eines eindimensionalen Feldes an eine Funktion geschieht wie folgt:
\end{itemize}


\begin{quote}
\begin{verbatim}
double am ( double x[ ], int n )
{
}
\end{verbatim}
\end{quote}

%%----------------------------------------------------------------------
%%  Sortieren durch Vertauschen
%%----------------------------------------------------------------------
\section{\label{SEC:Sortieren}Sortieren durch Vertauschen}
\index{Sortieren durch Vertauschen}

\begin{floatingfigure}[r]{85mm}

\includegraphics[ ]{./bilder/sortieren-vertauschen.eps}

\caption{ Sortieren durch Vertauschen }

\end{floatingfigure}

\textbf{Vorgehensweise} Das erste und das zweite Element der vorgelegten
Liste werden verglichen. Ist das erste größer als das zweite, so werden
die beiden vertauscht. Der gleiche Vorgang wird auf das (nunmehr)
zweite und dritte Element der Liste angewandt, dann auf das (nunmehr)
dritte und vierte. Dies wird bis zum Vergleich des (n-1)-ten mit dem
n-ten Element fortgesetzt. Nach (n-1) Vergleichen befindet sich das
größte Element am Ende der Liste.

Nach dem gleichen Verfahren wird nun in der um eine Position verkürzten
Liste das zweitgrößte Element auf die vorletzte Position gebracht.
Dies wird fortgesetzt an einer immer kürzer werdenden Restliste bis
diese schließlich nur noch aus einem Element besteht. 

\textbf{Aufwand} Der Sortieraufwand\index{Sortieraufwand} A ergibt
sich durch das Aufsummieren der in den einzelnen Durchläufen anfallenden
Vergleichsschritte:

\[
A=\sum _{i=1}^{n-1}\left(n-i\right)=\frac{n(n-1)}{2}\approx \frac{n^{2}}{2}\]


\textbf{Vorteil} Das Verfahren hat den Vorteil, daß es keinerlei zusätzlichen
Speicher benötigt. Der Sortiervorgang läuft innerhalb der vorgelegten
Originalliste ab.

\textbf{Nachteil} Ein schwerwiegender Nachteil ist die Zunahme des
Aufwandes mit dem Quadrat der Listenlänge $n$. Das Verfahren ist daher
nur für kurze, selten zu sortierende Listen geeignet. 

%%----------------------------------------------------------------------
%%  Berechnung des geometrischen Mittelwertes
%%----------------------------------------------------------------------
\section{\label{SEC:GeoMittel}Berechnung des geometrischen Mittelwertes}
\index{Mittelwert!geometrischer}

Durch Logarithmieren der Gleichung 
$$gm=\sqrt[n]{x_{1}x_{2}\cdots x_{n}}$$ 
mit dem natürlichen Logarithmus $\ln$ (Basis $e$) erhält man
\index{Logarithmus!natürlicher}

\begin{eqnarray*}
GM= \ln{gm} &=& \ln{\sqrt[n]{x_{1}x_{2}\cdots x_{n}}} \\
&=& \frac{1}{n}(\ln{x_1}+\ln{x_2}+\ldots+\ln{x_n}) \\
&=& \frac{1}{n}\sum_{i=1}^{n}\ln{x_i}
\end{eqnarray*}

d.h. man berechnet zunächst den Logarithmus von $gm$ als arithmetisches Mittel der
Summe der Logarithmen der Größen $x_i$.
Man erhält nun das gesuchte Ergebnis $gm$ durch Potenzierung:
$$gm=e^{GM}=e^{\ln{gm}}$$


%%----------------------------------------------------------------------
%%  ÜBUNG : Vollständige Lösung einer quadratischen Gleichung
%%----------------------------------------------------------------------
\chapter{Vollständige Lösung einer quadratischen Gleichung}
\index{Gleichung!quadratische}
\index{quadratische Gleichung}

%%----------------------------------------------------------------------
%%  Lösung einer quadratischen Gleichung
%%----------------------------------------------------------------------
\section{Lösung einer quadratischen Gleichung}

Für die allgemeine quadratische Gleichung $ax^{2}+bx+c=0$ wird üblicherweise
die Lösungsformel

\begin{equation}
x_{1,2}=\frac{1}{2}\left[-b\pm \sqrt{b^{2}-4ac}\right]\label{eq:Lsg-Quadr-Gleichung}
\end{equation}


angegeben. Eine durch ein Programm automatisch zu bestimmende Lösung
muß in der Regel \textit{logisch vollständig} entwickelt und programmiert werden.
Jeder der Koeffizienten $a$, $b$ und $c$ kann gleich Null oder ungleich
Null sein. Hierdurch ergeben sich bereits $2^{3}=8$ Fälle. Durch
Betrachtung der Vorzeichen der Ausdrücke, die bei einzelnen Fällen
unter einer Wurzel stehen, ergeben sich dann insgesamt 10 Fälle. Diese
10 Fälle sind in der folgenden Tabelle wiedergegeben. Es gilt mit
den Hilfsgrößen:

\begin{align*} u=-c/a && v=b^{2}-4ac && i=\sqrt{-1} \end{align*}

\begin{doublespace}
\begin{center}\begin{tabular}{|c|r|r|r|r|r|l|}
\hline 
Fall&
a&
b&
c&
u&
v&
Berechnungsvorschrift\\
\hline
\hline 
0&
$=0$&
$=0$&
$=0$&
&
&
triviale Gleichung\\
\hline 
1&
$=0$&
$=0$&
$\neq 0$&
&
&
Widerspruch\\
\hline 
2&
$=0$&
$\neq 0$&
$=0$&
&
&
$x_{1}=0$\\
\hline 
3&
$=0$&
$\neq 0$&
$\neq 0$&
&
&
$x_{2}=-c/b$\\
\hline 
4&
$\neq 0$&
$=0$&
$=0$&
&
&
$x_{1}=x_{2}=0$\\
\hline 
5.1&
$\neq 0$&
$=0$&
$\neq 0$&
$\geq 0$&
&
$x_{1,2}=\pm \sqrt{u}$\\
\hline 
5.2&
$\neq 0$&
$=0$&
$\neq 0$&
$<0$&
&
$x_{1,2}=\pm i\sqrt{-u}$\\
\hline 
6&
$\neq 0$&
$\neq 0$&
$=0$&
&
&
$x_{1}=0,x_{2}=-b/a$\\
\hline 
7.1&
$\neq 0$&
$\neq 0$&
$\neq 0$&
&
$\geq 0$&
$x_{1,2}=\frac{1}{2a}\left[-b\pm \sqrt{v}\right]$\\
\hline 
7.2&
$\neq 0$&
$\neq 0$&
$\neq 0$&
&
$<0$&
$x_{1,2}=\frac{1}{2a}\left[-b\pm i\sqrt{-v}\right]$\\
\hline
\end{tabular}\end{center}
\end{doublespace}

Entwickeln Sie ein Programm, in welchem zunächst die Koeffizienten
$a$, $b$ und $c$ eingelesen werden. Anschließend wird mit Hilfe einer vollständigen
Fallunterscheidung der zutreffende Fall ermittelt und gelöst. Die
gewonnene Lösung soll ausgegeben und durch eine anschließende Kontrollrechnung
(Einsetzen von $x_{1}$ und $x_{2}$ in die Ausgangsgleichung) automatisch
überprüft werden.


%%----------------------------------------------------------------------
%%  Kontrollrechnung für Fall 5.2
%%----------------------------------------------------------------------
\section{Kontrollrechnung für Fall 5.2}

Für die konjugiert komplexen Lösungen $x_{1}$ und $x_{2}$ erhält
man zunächst:

\begin{eqnarray*}
x_{1.2} & = & \pm s\cdot i\\
x_{1,2}^{2} & = & -s^{2}
\end{eqnarray*}


Durch Einsetzen in die Ausgangsgleichung (b = 0) erhält man nun

\begin{eqnarray*}
a\cdot (-s^{2})+c & = & 0
\end{eqnarray*}


Der Absolutwert der linken Seite muß kleiner sein als eine positive
Schranke $\varepsilon $ (s.u.). 


%%----------------------------------------------------------------------
%%  Bestimmung der komplexen Lösungen für den Fall 7.2
%%----------------------------------------------------------------------
\section{Bestimmung der komplexen Lösungen für den Fall 7.2}

\[
x_{1,2}=\frac{1}{2a}\left[-b\pm i\sqrt{-v}\right]=\left(\frac{-b}{2a}\right)\pm \left(\frac{\sqrt{-v}}{2a}\right)\cdot i=r\pm s\cdot i\]


Die Ausdrücke in den runden Klammern sind reell und müssen getrennt
berechnet werden (z.B. in den Variablen \texttt{r} und \texttt{s}). Bei der Druckausgabe
wird die imaginäre Einheit $i$ als Text ausgegeben:

\begin{verbatim}
printf("x1 = %.3f %+.3f*i", r, +s );

printf("x2 = %.3f %+.3f*i", r, -s ); 
\end{verbatim}

%%----------------------------------------------------------------------
%%  Kontrollrechnung für Fall 7.2
%%----------------------------------------------------------------------
\section{Kontrollrechnung für Fall 7.2}

Für die konjugiert komplexen Lösungen $x_{1}$ und $x_{2}$ erhält
man zunächst:

\begin{eqnarray*}
x_{1,2} & = & r\pm s\cdot i\\
x_{1,2}^{2} & = & \left(r\pm s\cdot i\right)^{2}=\left(r^{2}-s^{2}\right)\pm \left(2rs\right)\cdot i
\end{eqnarray*}


Durch Einsetzen in die Ausgangsgleichung erhält man nun

\begin{eqnarray*}
a\left[\left(r^{2}-s^{2}\right)\pm \left(2rs\right)\cdot i\right] \quad + \quad b\left[r\pm s\cdot i\right] & = & 0 \\
\left[a\left(r^{2}-s^{2}\right)+br+c\right] \quad \pm\quad \left[a(2rs)+bs\right]\cdot i & = & 0
\end{eqnarray*}


Die Ausdrücke in den eckigen Klammern müssen beide Null sein um die Gleichung zu erfüllen. 
Wegen der bekannten Eigenschaften der Gleitkommarechnung kann nicht direkt mit Null verglichen werden. 
Der Absolutwert des jeweiligen Ausdruckes muß kleiner sein als eine positive Schranke
$\varepsilon $ (z.B. $\varepsilon =10^{-10}$). 


%%----------------------------------------------------------------------
%%  ÜBUNG : Rekursion
%%----------------------------------------------------------------------
\chapter{Rekursion}


%%----------------------------------------------------------------------
%%  Berechnung der Fakultät einer natürlichen Zahl
%%----------------------------------------------------------------------
\section{Berechnung der Fakultät einer natürlichen Zahl}
\index{Fakultät}

%%===== FIGURE (floating) : begin ==========
\begin{floatingfigure}[r]{70mm}
\begin{center}
\includegraphics[ ]{./bilder/rekurs-fakul.eps}
\caption{ \label{Ablaufdiagramm-Fakultät} Ablaufdiagramm zur Berechnung der Fakultät }
\vspace{ 5mm}
\end{center}
\end{floatingfigure}
%%===== FIGURE (floating):  end  ==========


Der Ausdruck $n!$ ist definiert als

$$n!\quad = \quad n\cdot (n-1)\cdot (n-2)\ldots 2\cdot 1\quad = \quad n\cdot (n-1)!$$

Daraus ergibt sich die Möglichkeit, eine Funktion \texttt{fakul()} zur Berechnung
der Fakultät rekursiv zu schreiben. Das vereinfachte Ablaufdiagramm
ist in Abb. \ref{Ablaufdiagramm-Fakultät} wiedergegeben.

Schreiben Sie ein Hauptprogramm, in welchem eine rekursive Funktion

\texttt{    long fakul ( long n )}

aufgerufen wird um eine Tabelle der Fakultäten der Zahlen von 1 bis 20 zu berechnen. 
Stellen Sie fest, bis zu welchem $n$ die berechnete Fakultät richtig ist. 


%%----------------------------------------------------------------------
%%  Berechnung der Fibonacci-Zahlen
%%----------------------------------------------------------------------
\section{Berechnung der Fibonacci-Zahlen}
\index{Fibonacci-Zahlen}

Die Fibonacci-Zahlen $f_{i}$ sind wie folgt rekursiv definiert:

\begin{align}
f_{1}=1 && f_{2}=1 &&  f_{n}=f_{n-1}+f_{n-2};\quad n\geq 3 \label{eq:fibinacci-Zahlen}
\end{align}

Schreiben Sie ein Hauptprogramm, in welchem eine rekursive Funktion

\begin{quote}
\begin{verbatim}
int finonacci ( int n )
\end{verbatim}
\end{quote}

aufgerufen wird um die Fibonacci-Zahlen $f_1$ bis $f_{20}$ zu berechnen und in einer Tabelle auszugeben.
Verwenden Sie eine globale Variable um die jeweils erforderliche Anzahl der Funktionsaufrufe festzustellen.
Geben Sie die Anzahl der Funktionsaufrufe ebenfalls in der Tabelle aus.
Ermitteln Sie die Abhängigkeit zwischen der Fibonacci-Zahl und
der Anzahl der zur Berechnung erforderlichen Funktionsaufrufe. 


%%----------------------------------------------------------------------
%%  Erzeugung von Permutationen
%%----------------------------------------------------------------------
\section{Erzeugung von Permutationen}
\index{Permutation}

%%+++++ TABLE (floating) : begin ++++++++++
\begin{floatingtable}[r]{
\begin{tabular}{p{10mm} p{11mm} p{11mm} p{11mm}}
 & 1& 2& 3\\
 & 1& 3& 2\\
 & 2& 1& 3\\
 & 2& 3& 1\\
 & 3& 2& 1\\
 & 3& 1& 2\\
\end{tabular}}
\caption{ \label{cap:Permutationen-von-3} Permutationen von 3 Zahlen } 
\vspace{ 15mm}
\end{floatingtable}
%%+++++ TABLE (floating):  end  ++++++++++

Eine Permutation entsteht durch die Umordnung einer Objekt- oder Zahlenreihe.
Eine Aufgabenstellung aus der Kombinatorik ist die systematische Erzeugung
aller $n!$ Anordnungen einer Menge von $n$ Zahlen. Die Menge $(1,2,3)$
besitzt $3! = 6$ Permutationen (s. Tab. \ref{cap:Permutationen-von-3}).

Eine Möglichkeit zur Erzeugung von Permutationen kann rekursiv programmiert werden. 
Ein Feld \texttt{a[ ]} ist anfänglich z.B. fortlaufend mit den Werten 0, 1, 2, ... 7 belegt
und wird wie folgt permutiert:

Die Permutation der Stufe 0 entsteht durch Eintauschen des Wertes
des 1. Feldplatzes mit allen anderen Feldplätzen (8 Möglichkeiten).
Die 1. Stufe berücksichtigt nur noch die Feldplätze 2 bis $n$ (Abb.
\ref{cap:Erzeugung-von-Permutationen}a ), usw. 

Die Ordnung $n$ der Permutaionen wird in einer globalen Variablen \texttt{n} abgelegt. 
Die Funktion \texttt{void perm ( int k )} kann so geschrieben
werden, daß bei einem Startaufruf mit \texttt{perm (0)} gemäß Ablauf
in Abb. \ref{cap:Erzeugung-von-Permutationen}b die Permutationen
für 0, 1, 2, 3, .. der Reihe nach erzeugt werden. 
Erst bei Erreichen der Stufe $n-1$ wird die jeweilige Permutation 
(Inhalt des Feldes \texttt{a[ ]} ) ausgegeben.

\begin{figure}[h]
\begin{center}
\subfigure[Symmetrisches Tauschen]{\includegraphics[  scale=0.8]{./bilder/permutation}}
\subfigure[Vereinfachtes Ablaufdiagramm]{\includegraphics[  scale=0.8]{./bilder/rekurs-perm}}
\end{center}
\caption{Erzeugung von Permutationen\label{cap:Erzeugung-von-Permutationen}}
\end{figure}

Die Korrektheit der Ergebnisse kann nur für kleine $n$ (z.B. $n = 2, 3 \ldots$ )
direkt überprüft werden. 
Für größere $n$ kann die Programmausgabe in eine Datei umgeleitet werden 
(z.B. für: $n = 8$; $8! = 40320$ ) :

\begin{quote}
\begin{verbatim}
permutation.e > perm8.dat
\end{verbatim}
\end{quote}

Wenn eine Zeile pro Permutation erzeugt wurde (hier 40320 Zeilen),
kann mit dem Kommando

\begin{quote}
\begin{verbatim}
wc -l perm8.dat
\end{verbatim}
\end{quote}

die Anzahl der Zeilen der Datei \texttt{perm8.dat} festgestellt werden 
(\texttt{wc} ist ein UNIX-Kommando zur Wortzählung, die Option \texttt{-l} erzwingt jedoch
die Zeilenzählung). Um festzustellen, ob alle Permutaionen voneinander
verschieden sind, kann der Dateiinhalt sortiert werden:

\begin{quote}
\begin{verbatim}
sort -u < perm8.dat > perm8sort.dat
\end{verbatim}
\end{quote}

\texttt{sort} \index{sort} \index{UNIX!sort}ist das UNIX-Sortierkommando,
die Option \texttt{-u} erzwingt, daß mehrfach vorhandene Datensätze nur einmal
gezählt werden. Weicht die Satzanzahl von \texttt{perm8.dat} und \texttt{perm8sort.dat}
voneinander ab, dann ist die Erzeugung noch fehlerhaft. 


%%----------------------------------------------------------------------
%%  ÜBUNG : Zweidimensionale Felder - Bildverarbeitung
%%----------------------------------------------------------------------
\chapter{Zweidimensionale Felder - Bildverarbeitung}
\index{Bildverarbeitung}

%%----------------------------------------------------------------------
%%  Bilddatei lesen und speichern
%%----------------------------------------------------------------------
\section{Bilddatei lesen und speichern}

In der Datei \texttt{grau1.pgm} ist ein Grauwertbild\index{Grauwertbild}
(Abb. \ref{cap:Grauwertbild}) wie folgt abgespeichert (s. Listing
\ref{pgm-Datei} und Tab. \ref{cap:Aufbau-einer-pgm-Datei}):

\lstset{language=C}
\lstset{stepnumber=5}
\lstinputlisting[lastline=24,caption={Beginn der pgm-Datei \texttt{grau1.pgm}},label=pgm-Datei]{./bilder/grau1.pgm}


\begin{table}[h]
\begin{onehalfspace}
\begin{center}\begin{tabular}{|c|c|l|}
\hline 
\textbf{Zeile}& \textbf{Inhalt}& \textbf{Bedeutung}\\
\hline
\hline 
 1 & P2           & Codierung des Dateityps, hier pgm\\
\hline 
 2 & 256 256      & Bildbreite und -höhe in Pixel\\
\hline 
 3 & 255          & maximaler Grauwert (0 = schwarz , 255 = weiß)\\
\hline 
 4 bis Dateiende& & Grauwerte der einzelnen Bildpunkte; zeilenweise fortlaufend abgelegt\\
\hline
\end{tabular}\end{center}

\caption{Aufbau einer pgm-Datei\label{cap:Aufbau-einer-pgm-Datei}}
\end{onehalfspace}
\end{table}

\begin{figure}[h]
\begin{center}
\includegraphics[scale=.5]{./bilder/grau1.eps}
\end{center}
\caption{Grauwertbild in der Datei \texttt{grau1.pgm}\label{cap:Grauwertbild}}
\end{figure}


Schreiben Sie ein Programm in welches die Datei \texttt{grau1.pgm} eingelesen wird.
Die Bildinformationen (Zeile 1-3) sollen zur Kontrolle ausgegeben werden. 
Das Bild wird in einem hinreichend großen globalen Feld vom Typ \texttt{unsigned char} 
zeilenweise eingelesen. 
Anschließend ist das Bild im selben Dateiformat in eine Datei \texttt{grau2.pgm} zu speichern. 
Das abgespeicherte Bild kann mit den Programmen \texttt{xv\index{xv}} oder \texttt{kview\index{kview}} 
(Bildbetrachtung und -bearbeitung) dargestellt werden:

\begin{quote}
\begin{verbatim}
xv grau1.pgm 
\end{verbatim}
\end{quote}

Programm \texttt{xv}: Bei Betätigung der rechten Maustaste erscheint ein Dialogfenster.
Wenn der Mauszeiger über dem Bild steht, reicht die Eingabe des Buchstabens
q um das Programm zu beenden.


%%----------------------------------------------------------------------
%%  Grauwertbild bearbeiten
%%----------------------------------------------------------------------
\section{Grauwertbild bearbeiten}


%%===== FIGURE (floating) : begin ==========
\begin{floatingfigure}[r]{80mm}
\begin{center}
\includegraphics[ ]{./bilder/bildbearbeitung-menu.eps}
\caption{Menu 'Bildbearbeitung'\label{cap:Menu-Bildbearbeitung}}
\vspace{ 5mm}
\end{center}
\end{floatingfigure}
%%===== FIGURE (floating):  end  ==========

Im zweiten Schritt soll durch die Anwendung von Bearbeitungsschritten aus
dem Originalbild ein Ergebnisbild erzeugt werden.

Legen Sie zunächst ein weiteres Feld zur Aufnahme des bearbeiteten Bildes an, 
kopieren Sie das eingelesenen Bild vom ersten in das zweite
Feld und geben Sie dann das zweite Feld in die Datei \texttt{grau2.pgm} aus. 

Geben Sie nun ein kleines Menü (Abb. \ref{cap:Menu-Bildbearbeitung})
aus und lesen Sie einen Buchstaben zur Auswahl ein. 
Mit diesem Buchstaben wird eine \texttt{switch}-Anweisung gesteuert, 
in welcher die Bildoperationen durchgeführt werden. 

\textbf{Invertierung}\index{Invertierung}. Bei der Invertierung wird
der neue Grauwert $b_{ij}$ aus dem ursprünglichen Grauwert $a_{ij}$
wie folgt berechnet:
$$b_{ij}=max.Grauwert-a_{ij}$$
Es entsteht ein Negativbild: Schwarz wird zu Weiß und umgekehrt. Kontrollieren
Sie das Ergebnis mit dem Bildbetrachter \texttt{xv}.

%
\begin{figure}
\begin{center}
\includegraphics{./bilder/bildverarb-mittelwert}
\end{center}
\caption{Glättung durch Mittelwertbildung über 9 Bildpunkte\label{cap:Gl=E4ttung-durch-Mittelwertbildung}}
\end{figure}


\textbf{Schwellwertoperation}\index{Schwellwertoperation}. Alle Bildpunkte,
die im Originalbild einen Grauwert kleiner 150 besitzen, werden im
Ergebnisbild zu Null gesetzt. Alle anderen Grauwerte werden unverändert
übernommen.

\textbf{Glättung}\index{Glättung}. Bei der Glättung entsteht das
Zielpixel durch Mittelwertbildung über das Originalpixel und dessen
8 Umgebungspixel (Abb. \ref{cap:Gl=E4ttung-durch-Mittelwertbildung}).
Durch die Glättung werden harte Kontraste gemildert.

%
\begin{figure}
\begin{center}
\includegraphics[scale=1.0]{./bilder/bildverarb-kanten}
\end{center}
\caption[Kantenerkennung]{Kantenerkennung durch Verknüpfung einer 3x3-Umgebung des Originalbildes mit einer Gewichtungsmatrix\label{cap:Kantenerkennung-durch-Verkn=FCpfung}}
\end{figure}


\textbf{Kantenerkennung}\index{Kantenerkennung}. Objektkanten sind
dort zu vermuten, wo sprungartige Helligkeitsübergänge vorhanden sind.
Um Kanten rechnerisch zu ermitteln wird über das Bild ein sog. Operatorfenster
geschoben. Der aktuelle Bildpunkt und die 8 Nachbarpunkte werden mit
den Gewichtungen in Abb. \ref{cap:Kantenerkennung-durch-Verkn=FCpfung}
multipliziert, addiert und zur Normierung durch 9 geteilt. Der Betrag
dieses Ergebnisses ist der Wert des Zielbildpunktes. Wie bei der Glättung
kann diese Operation nur auf die inneren Punkte des Originals angewendet
werden. 


%%----------------------------------------------------------------------
%%  Bildbereich füllen
%%----------------------------------------------------------------------
\section{Bildbereich füllen}
\index{Bildbereich füllen}

%%===== FIGURE (floating) : begin ==========
\begin{floatingfigure}[r]{95mm}
\includegraphics[scale=1.0]{./bilder/bild-fuellen.eps}
\caption{ \label{ABB:Fuellung-eines-Bildbereiches} Rekursives Füllen eines Bildbereiches }
\end{floatingfigure}
%%===== FIGURE (floating):  end  ==========
Bei Grauwertbildern sollen zusammenhängende Bereiche mit einem neuen
Grauwert versehen werden. Dazu wird ein Impfpixel auf einen neuen
Wert gesetzt und rekursiv alle Nachbarpixel untersucht. Wenn ein Nachbarpixel
denselben Originalgrauwert besitzt, dann erhält es ebenfalls den neuen
Wert und seine Nachbarn müssen auch untersucht werden. Beachten Sie,
daß jeder innere Bildpunkt 4 echte Nachbarn besitzt (Randpunkte entsprechend
weniger !).

In Abb. \ref{ABB:Fuellung-eines-Bildbereiches}, links, wird ein Hintergrundpixel
mit einem neuen Grauwert ,,geimpft''. Im rechten Bild haben alle
Hintergrundpixel rekursiv den neuen Grauwert erhalten.

Verwenden Sie nachfolgenden Rahmen: 

\lstset{language=C}
\lstinputlisting[caption={Rahmen für die rekursive Funktion \texttt{fill}},label=pgm-fill]{./programme/fill.c}


%%----------------------------------------------------------------------
%%  Verwendung von Strukturen
%%----------------------------------------------------------------------
\section{Verwendung von Strukturen}
\index{Struktur}

Erstellen Sie eine neue Version des Programmes, in welcher die Grauwertbilder
in einer Struktur (Listing \ref{pgm-struct}) abgelegt werden. Außerdem
sollen alle Bildverarbeitungsfunktionen in jeweils einer eigenen Funktion
dargestellt werden. Die Bilder sind mittels Zeiger an die Funktionen
übergeben werden.

\lstset{language=C}

\lstinputlisting[caption={Strukturdefinition für ein pgm-Bild},label=pgm-struct]{./programme/bildverarb-struct.c}


%%----------------------------------------------------------------------
%%  ÜBUNG : Implementierung eines Stapels als Klasse
%%----------------------------------------------------------------------
\chapter{Implementierung eines Stapels als Klasse}
\index{Stapel}
\index{Klasse}

%%----------------------------------------------------------------------
%%  Basisimplementierung eines Stapels als C++ - Klasse
%%----------------------------------------------------------------------
\section{Basisimplementierung eines Stapels als C++ - Klasse}

\begin{floatingfigure}[r]{75mm}

\includegraphics[ ]{./bilder/stack.eps}

\caption{ \label{Datenstruktur-Stapel} Datenstruktur Stapel }

\end{floatingfigure}

Abb. \ref{Datenstruktur-Stapel} zeigt die Skizze eines Stapels mit
100 Datenelementen. Der Stapelzeiger \texttt{top} zeigt auf den nächste freien
Platz.

Datenelemente des Stapels:

\begin{itemize}
\item Feld, 100 Elemente, zur Aufnahme der Daten
\item Stapelzeiger (\texttt{top})
\item Feldumfang (zur Überwachung; globale \texttt{const}-Größe)
\end{itemize}
Operationen auf dem Stapel:

\begin{itemize}
\item Initialisieren (\texttt{top} = 0)
\item Element auflegen (\texttt{push})
\item Element abnehmen (\texttt{pop})
\item Feststellen, ob der Stapel leer ist
\item Anzahl der Datenelemente ermitteln
\item Wert des obersten Elementes feststellen 
\end{itemize}
Schreiben Sie ein C++-Programm (Dateiendung \texttt{.cc}), in welchem
ein Stapel mit 100 Elementen als Klasse \texttt{stack} für die Aufnahme von
\texttt{int}-Elementen implementiert ist. Die Datenelemente sind als
\texttt{private}-Elemente, die Operationen (Methoden, Komponentenfunktionen)
als \texttt{public}-Elemente einzurichten.

Die Implementierung der Komponentenfunktionen soll außerhalb der Klassendefinition
stehen und muß deshalb den scope-resolution-Operator ( \texttt{::} ) verwenden:

\begin{quote}
\begin{verbatim}
void stack :: push ( int datum ) { . . . }
\end{verbatim}
\end{quote}

Die Einrichtung eines Stapels geschieht z.B. durch

\begin{quote}
\begin{verbatim}
stack stapel1;
\end{verbatim}
\end{quote}

Der Aufruf einer Komponentenfunktion geschieht z.B. durch

\begin{quote}
\begin{verbatim}
stapel1.push( 37 );
\end{verbatim}
\end{quote}

\begin{itemize}
\item Schreiben Sie ein Hauptprogramm, in welchem der Stapel in einer Schleife
mit einigen Elementen gefüllt wird.
\item Geben Sie die Belegung des Stapels aus und bauen Sie den Stapel wieder
ab (mit Ausgabe) um das richtige Funktionieren zu testen.
\item Verhindern Sie Unterlauf und Überlauf des Stapels durch entsprechende Vorkehrungen 
in den Komponentenfunktionen.
\item Ersetzen Sie die Initialisierungsfunktion durch einen Konstruktor.
\item Verwenden Sie zur Eingabe und Ausgabe \texttt{cin} und \texttt{cout} (
\texttt{\#include <iostream.h>} ).
\end{itemize}

%%----------------------------------------------------------------------
%%  Konstruktor und Destruktor für Stapel beliebiger Größe
%%----------------------------------------------------------------------
\section{Konstruktor und Destruktor für Stapel beliebiger Größe}
\index{Konstruktor}
\index{Destruktor}

Ändern Sie die Klassendefinition so ab, daß mit Hilfe eines 1. Konstruktors
ein Stapel beliebiger Länge zur Laufzeit angelegt werden kann (Operator
\texttt{new}). 
Ein 2. Konstruktor, ohne Parameter, soll Stapel der Länge 1024 anlegen.

Ein Destruktor soll den dynamische belegten Platz eines Stapels freigeben
(Operator \texttt{delete}).

Überprüfen Sie die Wirkung durch folgendes Experiment: Schreiben Sie
eine rekursive Funktion 

\begin{quote}
\begin{verbatim}
void belege (int n)
\end{verbatim}
\end{quote}

die einen Stapel der Größe 1024 als lokale Datenstruktur besitzt.

Im Innern wird n um 1 vermindert (solange es ungleich Null ist). Anschließend
ruft sich die Funktion selbst auf. Wenn n gleich Null ist, wird mit
dem Systemaufruf

\begin{quote}
\begin{verbatim}
system("free");
\end{verbatim}
\end{quote}

\index{UNIX!free}
die augenblickliche Belegung des Hauptspeichers ausgegeben und die
Funktion mit \texttt{return} beendet. Im Hauptprogramm wird vor und
nach dem Aufruf von \texttt{belege(1024)} ebenfalls \verb'system("free")'
aufgerufen (Prototyp in \verb'stdlib.h'). Der Vergleich der Speicherbelegungen
sollte etwa 4 MByte ergeben (warum?).


%%----------------------------------------------------------------------
%%  Stapel-Objekte kopieren
%%----------------------------------------------------------------------
\section{Stapel-Objekte kopieren}

Schreiben Sie eine Komponentenfunktion \texttt{copy},

\begin{quote}
\begin{verbatim}
void copy ( const Stack &s );
\end{verbatim}
\end{quote}

die einen Stapel \texttt{s} (Aufrufargument) auf die Originalstruktur kopiert. 
Der zu kopierende Stapel wird als Referenz übergeben.

Folgende Maßnahmen sind erforderlich:

\begin{itemize}
\item dynamisch belegtes Feld des Zielobjektes freigeben (\texttt{delete}),
\item Feld gemäß Längenangabe von \texttt{s} im Zielobjekt neu belegen (\texttt{new}),
\item Feldinhalt kopieren,
\item die Datenelemente übernehmen.
\end{itemize}
Überprüfen Sie die Wirkung durch einen entsprechenden Test.

Anmerkung: Die Funktion \texttt{copy} kann durch die Überladung des
Zuweisungsoperators\index{Zuweisungsoperator} \texttt{=} ersetzt werden.


%%----------------------------------------------------------------------
%%  ÜBUNG : Klasse von Vektoren mit 3 Elementen
%%----------------------------------------------------------------------
\chapter{Klasse von Vektoren mit 3 Elementen}
\index{Vektor}

Die Implementierung einer Klasse \texttt{Vek3} soll die wichtigsten
Grundoperationen der Vektorarithmetik\index{Vektorarithmetik} für
Vektoren der Länge 3 bereitstellen. 

\textbf{Datenelemente}:

\begin{quote}
\texttt{double}-Variablen \texttt{x, y, z} 
\end{quote}

\textbf{Komponentenfunktionen}:

\begin{tabular}{|c||p{14cm}|}
\hline 
\textbf{Funktion}& \textbf{Beschreibung}\\
\hline
\hline 
\texttt{Vek3}&
0 - 3 Komponente werden gesetzt (Ersatzwerte jeweils 0.0)\\
\hline 
\texttt{null}&
alle Komponenten zu 0 setzen\\
\hline 
\texttt{e\_x}&
Einheitsvektor\index{Einheitsvektor} in x-Richtung erzeugen\\
\hline 
\texttt{e\_y}&
Einheitsvektor in y-Richtung erzeugen\\
\hline 
\texttt{e\_z}&
Einheitsvektor in z-Richtung erzeugen\\
\hline 
\texttt{set\_x}&
x-Komponente zuweisen\\
\hline 
\texttt{set\_y}&
y-Komponente zuweisen\\
\hline 
\texttt{set\_z}&
z-Komponente zuweisen\\
\hline 
\texttt{get\_x}&
x-Komponente zurückgeben\\
\hline 
\texttt{get\_y}&
y-Komponente zurückgeben\\
\hline 
\texttt{get\_z}&
z-Komponente zurückgeben\\
\hline 
\texttt{norm}&
Vektor auf die Länge 1.0 normieren\index{Vektor!normieren}\\
\hline 
\texttt{laenge}&
Rückgabe der Vektorlänge\index{Vektor!Länge}\\
\hline 
&
\textit{Die folgenden 3 Operationen verändern den eigenen Vektor und
geben eine Referenz auf sich selbst zurück.}\\
\hline 
\texttt{plusgleich}&
Vektoraddition\index{Vektor!Addition}\\
\hline 
\texttt{minusgleich}&
Vektorsubtraktion\index{Vektor!Subtraktion}\\
\hline 
\texttt{mulgleich}&
Multiplikation mit einem Skalar\index{Vektor!Multiplikation mit einem Skalar}\\
\hline 
&
\textit{Die folgenden 3 Operationen erzeugen jeweils einen neuen Vektor
und geben diesen zurück; der eigene Vektor bleibt unverändert.}\\
\hline 
\texttt{add}&
Vektoraddition\\
\hline 
\texttt{sub}&
Vektorsubtraktion\\
\hline 
\texttt{mul}&
Multiplikation mit einem Skalar\\
\hline 
\texttt{skalarprodukt}&
Skalarprodukt\index{Vektor!Skalarprodukt} zweier Vektoren\\
\hline 
\texttt{kreuzprodukt}&
Kreuzprodukt\index{Vektor!Kreuzprodukt} zweier Vektoren (s.u.)\\
\hline 
\texttt{out}&
einfache Ausgabefunktion\\
\hline
\end{tabular}

\begin{itemize}
\item Alle Methoden sind in einem Hauptprogramm geeignet zu testen.
\item Verwenden Sie die nachstehende Klassendefinition (Listing \ref{vek3-class}).
\end{itemize}
\lstset{language=C}

\lstset{stepnumber=5}

\lstinputlisting[caption={Definition der Klasse \texttt{Vek3}},label=vek3-class]{./programme/vek3-class.cc}


%%----------------------------------------------------------------------
%%  Berechnung des Kreuzproduktes
%%----------------------------------------------------------------------
\section*{Berechnung des Kreuzproduktes}
\index{Vektor!Kreuzprodukt}

$$
\vec{a} \times \vec{b} =
\left( \begin{array}{c} a_x \\ a_y \\ a_z \end{array} \right)
\times
\left( \begin{array}{c} b_x \\ b_y \\ b_z \end{array} \right)
=
\left(
\begin{array}{c}
a_y b_z - a_z b_y \\
a_z b_x - a_x b_z \\ 
a_x b_y - a_y b_x 
\end{array}
\right)
$$



%%----------------------------------------------------------------------
%%  ÜBUNG : Überladen von Operatoren
%%----------------------------------------------------------------------
\chapter{Überladen von Operatoren}
\index{Operator}

Die Klasse \texttt{Vek3} aus der vorhergehenden Übung soll nun mit
Hilfe der Operatorüberladung\index{Operatorüberladung} so eingerichtet
werden, daß die übliche mathematische Schreibweise für elementare
Vektoroperationen möglich wird, also z.B.:

\begin{quote}
\begin{footnotesize}
\begin{verbatim}
double skprod;
Vek3 u, v, w;
u = Vek3( 1.0, 2.0, 3.0 );      // Anfangswerte u
v = Vek3( -3.3, 2.5, 3.1 );     // Anfangswerte v
w = 3.1*u + 23.4*v;             // Vektorausdruck
skprod = u*v;                   // Skalarprodukt
w.norm();                       // Vektor w normieren
\end{verbatim}
\end{footnotesize}
\end{quote}

Erzeugen Sie eine neue Version der Klasse \texttt{Vek3}, in der die
Operatoren in den Tabellen \ref{cap:Zuweisungsoperatoren} und \ref{cap:friend-Funktionen}
implementiert sind und testen Sie alle Operatoren.


\begin{table}[h]
\begin{onehalfspace}
\begin{center}\begin{tabular}{|c|c|l|}
\hline 
\textbf{Operator}  &  \textbf{1. Operand}  &  \textbf{Bemerkung} \\
\hline
\hline 
\texttt{+}   &                        & positives Vorzeichen\\
\hline 
\texttt{-}   &                        & negatives Vorzeichen\\
\hline 
\texttt{+=}  & \texttt{const Vek3 \&} & Vektoraddition mit Zuweisung\\
\hline 
\texttt{-=}  & \texttt{const Vek3 \&} & Vektorsubtraktion mit Zuweisung\\
\hline 
\texttt{{*}=}& \texttt{double}        & Streckung mit Zuweisung\\
\hline 
\texttt{/=}  & \texttt{double}        & Streckung mit Zuweisung\\
\hline 
\texttt{+}   & \texttt{const Vek3 \&} & Vektoraddition\\
\hline 
\texttt{-}   & \texttt{const Vek3 \&} & Vektorsubtraktion\\
\hline 
\texttt{/}   & \texttt{double}        & Streckung\\
\hline
\end{tabular}\end{center}

\caption{\label{cap:Zuweisungsoperatoren}Zuweisungsoperatoren der Klasse \texttt{Vek3}}
\end{onehalfspace}
\end{table}


%
\begin{table}[h]
\begin{onehalfspace}
\begin{center}\begin{tabular}{|c|c|c|c|}
\hline 
\textbf{Operator}& \textbf{1. Operator}    & \textbf{2. Operand}     & \textbf{Bemerkung}\\
\hline
\hline  
\texttt{{*}}     & \texttt{const Vek3 \&}  & \texttt{double}         & Vektor{*}Skalar\\
\hline 
\texttt{{*}}     & \texttt{double}         & \texttt{const Vek3 \&}  & Skalar{*}Vektor\\
\hline 
\texttt{{*}}     & \texttt{const Vek3 \&}  & \texttt{const Vek3 \&}  & Skalarprodukt\\
\hline 
\texttt{<\,{}<}  & \texttt{const Vek3 \&}  &                         & Ausgabe\\
\hline
\end{tabular}\end{center}
\caption{\label{cap:friend-Funktionen}\texttt{friend}-Funktionen\index{friend-Funktionen} der Klasse \texttt{Vek3} }
\end{onehalfspace}
\end{table}


%%----------------------------------------------------------------------
%%  ÜBUNG : Vererbung
%%----------------------------------------------------------------------
\chapter{Vererbung}


%%----------------------------------------------------------------------
%%  Implementierung der Klassen bahn und kbogen
%%----------------------------------------------------------------------
\section{Implementierung der Klassen \texttt{bahn} und \texttt{kbogen}}

Zur Implementierung der Klassen \texttt{bahn} und \texttt{kbogen}
wird in dieser Übung die Klasse \texttt{Vek3} aus der vorhergehenden Übung benötigt. 
Erzeugen Sie zunächst aus der dort erstellten Lösung folgende Dateien:

\begin{tabular}{lp{13cm}}
\texttt{\textbf{vek3.h}}&
header-Datei für die Klasse \texttt{Vek3}; enthält die Klassendefinition und
\texttt{include}-Anweisungen für \texttt{iostream.h} und \texttt{math.h}\\
\texttt{\textbf{vek3.cc}}&
Implementierung der Klasse \texttt{Vek3}; enthält am Anfang 
\verb'#include "vek3.h"' 
und anschließend die Implementierung der Methoden der Klasse \texttt{Vek3} .\\
\texttt{\textbf{praktikum-13-1.cc}}&
Hauptprogramm zum Test der Klasse \texttt{Vek3}; enthält am Anfang
\verb'#include "vek3.h"'  
und anschließend die Aufrufe und Testausgaben der Methoden der Klasse \texttt{Vek3} .\\
\end{tabular}

Definieren und implementieren Sie danach die Klassen \texttt{bahn} und \texttt{kbogen}
(s. Vorlesung):

\begin{center}\begin{tabular}{|lll|}
\hline 
\texttt{\textbf{bahn}}&
\textbf{Datenkomponenten}&
\texttt{pa}, \texttt{pe} Ortsvektoren; Anfangs- und Endpunkt der Bahn (Typ \texttt{Vek3})\\
&
\textbf{Methoden}&
Konstruktor ohne Parameter\\
&
&
Konstruktor mit 2 Vektoren als Parameter\\
&
&
Startpunkt setzen\\
&
&
Zielpunkt setzen\\
&
&
Länge berechnen\\
\hline 
\texttt{\textbf{kbogen}}&
\textbf{Datenkomponenten}&
pm Ortsvektor; mittlerer Bahnpunkt (Typ \texttt{Vek3})\\
&
\textbf{Methoden}&
Konstruktor ohne Parameter\\
&
&
Konstruktor mit 3 Vektoren als Parameter\\
&
&
mittleren Punkt setzen\\
&
&
Länge berechnen (vereinfacht als Summe der Länge der beiden Sehnen)\\
\hline
\end{tabular}\end{center}

Legen Sie im Hauptprogram \texttt{bahn}- und \texttt{kbogen}-Objekte
mit und ohne Initialisierung an, berechnen Sie die Längen und geben
Sie diese aus.

Ergänzen Sie die Konstruktoren und die Längenberechnungen durch einfache
Hilfsausgaben, die die jeweilige Funktion eindeutig benennen und kontrollieren
Sie die Programmausgabe. 


%%----------------------------------------------------------------------
%%  Initialisierungen mit Hilfe der Basisklassen-Konstruktoren
%%----------------------------------------------------------------------
\section{Initialisierungen mit Hilfe der Basisklassen-Konstruktoren}

Ändern Sie den parametrierten Konstruktor der abgeleiteten Klasse
\texttt{kbogen} so ab, daß der Konstruktor der Basisklasse \texttt{bahn} für
den Anfangs- und Endpunkt der Bahn verwendet wird.

Verfolgen Sie die Aufrufreihenfolge mit Hilfe der oben eingerichteten
Hilfsausgaben.


%%----------------------------------------------------------------------
%%  Implementierung der Klasse bahn als Basisklasse
%%----------------------------------------------------------------------
\section{Implementierung der Klasse \texttt{bahn} als Basisklasse}
\index{Basisklasse}

Implementieren Sie die Klasse \texttt{bahn} als Basisklasse, die eine
virtuelle Funktion\index{Funktion!virtuelle} \texttt{laenge()} enthält.

\begin{itemize}
\item Leiten Sie Klassen \texttt{gerade}, \texttt{kbogen} und \texttt{parabel}
ab.
\item Die Konstruktoren sollen den Konstruktor der Basisklasse \texttt{bahn}
für die Anfangs- und Endpunkte verwenden.
\item Die Funktionen zur Längenberechnung sollen jeweils überladen werden.
\item Richten Sie entsprechende Objekte ein und verfolgen Sie die Aufrufe
mittels Hilfsausgaben.
\end{itemize}

%%----------------------------------------------------------------------
%%  Polymorphie
%%----------------------------------------------------------------------
\section{Polymorphie}
\index{Polymorphie}

\begin{itemize}

\item Richten Sie im Hauptprogramm ein Feld mit 100 Zeigern auf den Typ
\texttt{bahn} ein: \\
\\
\verb'bahn *bz[100];'\\

\item Legen Sie im Hauptprogramm einige Teilbahnobjekte an (\texttt{gerade},
\texttt{kbogen}, \texttt{parabel}) und setzen Sie in das Feld \texttt{bz} fortlaufend
Zeiger auf diese Objekte.

\item Schreiben Sie nun eine Funktion \\
\\
\verb'double bahnlaenge ( bahn *bahnzeiger[], int n ) { ... } ' \\
\\
an die das Feld \texttt{bz} und die Anzahl der verzeigerten Elemente
übergeben werden. Die Funktion soll die Summe der Längen aller Teilbahnen
berechnen und über \texttt{return} zurückgeben.
\end{itemize}

%%----------------------------------------------------------------------
%%  Absicherung einer Header-Datei gegen mehrfach-include
%%----------------------------------------------------------------------
\section{Absicherung einer Header-Datei gegen mehrfach-\texttt{include}}

Der gesamte Inhalt einer \texttt{h}-Datei\index{h-Datei} (außer dem Kommentar
am Dateianfang) ist durch die folgende \texttt{if}-Anweisung (Präprozessor\index{Präprozessor})
gegen mehrfaches Einkopieren abzusichern:


\begin{quote}
\begin{verbatim}
\#ifndef VEK3\_H // Name bekannt?
\#define VEK3\_H // Name einrichten
...
\#endif 
\end{verbatim}
\end{quote}


%%----------------------------------------------------------------------
%%  Anhänge
%%----------------------------------------------------------------------
\begin{appendix}


%%----------------------------------------------------------------------
%%  ANHANG : Editor
%%----------------------------------------------------------------------
\chapter[Erstellen von Programmen]{Erstellen von Programmen \newline (Editieren, Compilieren, Binden)}
\chaptermark{Erstellen von Programmen}
\index{Editieren}
\index{Compilieren}
\index{Binden}

\begin{figure}[h]
\begin{center}
\subfigure[\texttt{C-Run}]{\includegraphics[  scale=1.0]{./bilder/vim-5.eps}}
\hspace{15mm}
\subfigure[\texttt{Comments}]{\includegraphics[  scale=1.0]{./bilder/menu-comm.eps}}
\hspace{15mm}
\subfigure[\texttt{C-Statements}]{\includegraphics[  scale=1.0]{./bilder/menu-2.eps}}
\end{center}
\caption{\label{ABB:gvim-menu}  GVIM : Menüs der C/C++-Unterstützung (Auswahl)}
\end{figure}

Zur Programmierung wird der sehr leistungsfähige Editor \index{Editor} \texttt{GVIM}  \index{GVIM}verendet.
Dieser Editor ist eine Weiterentwicklung des klassischen UNIX-Editors \texttt{vi}. \index{vi}
Die nichtgraphische Version des \texttt{GVIM} heißt \texttt{VIM} \index{VIM}.
Die Handhabung des Editors ist u.a. in den Büchern und Anleitungen beschrieben,
die am Ende dieses Anhangs aufgeführt sind.

\texttt{GVIM} kann als integrierte Entwicklungsumgebung (IDE) eingesetzt werden.
Der Editor kann beliebig viele Dateien zum Editieren öffnen.
Jede offene Datei wird in einem Editierpuffer gehalten (Das Menü \texttt{Buffers} ermöglicht die Navigation).
Die Fenster können längs und quer geteilt werden.

Das Menü \texttt{C-Run} (Abbildung \ref{ABB:gvim-menu}) ermöglicht
die Compilierung des aktiven Puffers (Eintrag \texttt{save and compile}) mit Standardeinstellungen 
für den Compiler. Der Pufferinhalt wird vor der Übersetzung abgespeichert.
Beim Auftreten von Übersetzungsfehlern wird ein Fehlerfenster geöffnet. 
Die fehlerhaften Code-Zeilen im Programmfenster können
durch Auswahl der Fehlereinträge (Maus oder Richtungstasten) im Fehlerfenster 
angesprungen und berichtigt werden.

Für Programme, die nur aus einer einzigen Datei bestehen, besteht
die Möglichkeit, diese Datei nach dem Übersetzen zu binden  (Menüeintrag \texttt{link}) und die
Ausführung zu starten (Menüeintrag \texttt{run}). 
Dadurch kann die Erstellung eines \texttt{make}-Skriptes vermieden werden.
Die Programmausgaben erscheinen in einer subshell im Editorfenster (Abb. \ref{ABB:vim-subshell} unten).

Bei Anwahl des Menüpunktes \texttt{C-Run->link} wird der Pufferinhalt
vor dem Binden übersetzt, wenn die evtl. vorhandene Object-Datei älter
ist, als die vor dem Binden gerade gesicherte Quelldatei. 

Bei Anwahl des Menüpunktes \texttt{C-Run->run} wird der Pufferinhalt
vor dem Starten des Programmes übersetzt und gebunden, wenn die evtl.
vorhandene Object-Datei oder die ausführbare Datei älter ist, als
die vor dem Starten gerade gesicherte Quelldatei. 

Für größere Projekte ist die Verwendung von \texttt{make}-Skripten 
\index{make} \index{UNIX!make} 
oder ähnlicher Werkzeuge erforderlich. 
Das \texttt{make}-Programm kann dann ebenfalls über das \texttt{C-Run}-Menü gestartet werden.

Für Programme mit längeren Ausgaben ist der Aufruf mit Weiterleitung der Ausgaben 
durch einen pager (Programm zum Blättern in Dateien oder Konsolausgaben) vorgesehen.

Die Hauptmenüeinträge \texttt{Comments}, \texttt{C-Statements} usw. erlauben das Einsetzen 
von vorbereiteten Kommentaren und von C- bzw. C++-Anweisungen (Abbildung \ref{ABB:gvim-menu}).

Für einige der bei der Programmerzeugung häufig auszuführenden Tätigkeiten stehen Tastenkürzel 
zur Verfügung (s. Tab. \ref{TAB:gvim-tasten} )
\\
\\

%%+++++ TABLE : begin ++++++++++
\begin{table}[htbp]
\begin{center}

  %%~~~~~ TABULAR : begin ~~~~~~~~~~
  \begin{tabular}[]{|c|l|}
  \hline  Tastenkombination& Wirkung\\ [0.0ex]
  \hline
  \hline  F2 & Inhalt des aktiven Puffers sichern. \\
  \hline  F3 & Dialog zum Öffnen von Dateien aufrufen. \\
  \hline  F6 & Fehlerfenster öffnen. \\
  \hline  F7 & Zur Position des vorherigen Fehlers springen. \\
  \hline  F8 & Zur Position des nächsten Fehlers springen. \\
  \hline  Alt-F9 & Pufferinhalt abspeichern und danach den Pufferinhalt compilieren. \\
  \hline  F9 & Programm binden, ggf. vorher compilieren. \\ 
  \hline  Strg-F9 & Programm ausführen, ggf. vorher compilieren und binden. \\
  \hline  Shift-F9 & make aufrufen.\\
  \hline
  \end{tabular} \\ [0.0ex]
  %%~~~~~ TABULAR :  end  ~~~~~~~~~~

\caption{ \label{TAB:gvim-tasten} GVIM : Die wichtigsten Tastenkombinationen der C/C++-Erweiterung}
\vspace{ 5mm}
\end{center}
\end{table}
%%+++++ TABLE :  end  ++++++++++


%%===== FIGURE : begin ==========
\begin{figure}[htbp]
\begin{center}
\includegraphics[scale=0.9]{./bilder/run1.eps}
\caption{ \label{ABB:vim-subshell} GVIM : Programmausgabe in einer subshell im Editorfenster }
\vspace{ 5mm}
\end{center}
\end{figure}
%%===== FIGURE :  end  ==========

Der Editor VIM/GVIM ist ein leistungsstarker Programmiereditor für den Profi.
Die Bedien- und Anwendungsmöglichkeiten sind entsprechend umfangreich.
Neben der online-Hilfe und der Originaldokumentation stehen folgende Bücher 
und Anleitungen zur Verfügung:

\begin{description}
\item [Qualine, Steve  ] Vi IMproved - Vim 
\footnote{mehrere Exemplare in der Bibliothek der FH SWF vorhanden}\\
New Riders Publishing, 2001, ISBN: 0735710015\\
oder unter http://vim.sourceforge.net/docs.php als PDF-Datei

\item [Robbins, Arnold  ] vi Editor kurz\&gut
\footnotemark[1]\\
O'Reilly, 2000, ISBN 3-89721-213-7\\(Kurzanleitung, 63 Seiten, 2. Auflage)

\item [Lamb, Linda / Robbins, Arnold  ] Textbearbeitung mit dem vi-Editor 
\footnotemark[1]\\
O'Reilly, 1999, ISBN 3-89721-126-2\\(deutsche Übersetzung der 6. amerikanischen Auflage)

\item [http://www.vim.org  ] The VIM (Vi IMproved) Home Page\\
Homepage des Vim-Projektes; viele Verweise auf andere Seiten und auf Dokumentation. 

\item [http://vim.sourceforge.net  ] Vim bei sourceforge\\
Vim-Skripte zur Erweiterung des Editors, Tips, Neuigkeiten, ... 

\end{description}


 

%%----------------------------------------------------------------------
%%  ANHANG : Testen von Programmen (Debugging)
%%----------------------------------------------------------------------
\chapter[Testen von Programmen]{Testen von Programmen (Debugging)}
\chaptermark{Testen von Programmen}
\index{Testen}
\index{Debugging}


%%===== FIGURE : begin ==========
\begin{figure}[htbp]
\begin{center}
\includegraphics[scale=0.9]{./bilder/ddd.eps}
\caption{ \label{ABB:DDD} Der Debugger \texttt{DDD} }
\vspace{ 5mm}
\end{center}
\end{figure}
%%===== FIGURE :  end  ==========

Zum Testen von Programmen kann der Debugger \texttt{DDD} \index{DDD} verwendet werden.
Das zu testende Programm muß dazu als ausführbare Datei vorliegen, d.h. es muß übersetzt
und gebunden sein und enthält damit keine syntaktischen Fehler mehr.

Der DDD kann über das Symbol auf der Arbeitsfläche gestartet werden. 
Im Dialog wird das zu testende und ausführbare Programm geöffnet.
Die zugehörige Quelldatei erscheint nun im Quelltextfenster (Abb. \ref{ABB:DDD} ).
Außerdem erscheint im Quelltextfenster das frei verschiebbare Kommandofenster.

\newpage



%%===== FIGURE (floating) : begin ==========
\begin{floatingfigure}[r]{70mm}
\begin{center}
  \subfigure[Haltepunktmenü]
  {
  \includegraphics[ ]{./bilder/ddd-breakpoint-menu.eps}
  }
  \subfigure[Kommandomenü]
  {
  \includegraphics[ ]{./bilder/ddd-menu.eps}
  }
\caption{ \label{ABB:DDD-menu} DDD : Haltepunktmenü und Kommandomenü}
\end{center}
\end{floatingfigure}
%%===== FIGURE (floating):  end  ==========


\textbf{Haltepunkte (breakpoints).} \index{Haltepunkt} \index{breakpoint}
Setzt man die Schreibmarke an den Anfang einer ausführbaren Quellcodezeile und
betätigen die rechte Maustaste, dann erscheint das Haltepunktmenü (Abb. \ref{ABB:DDD-menu}a).
Die erste Auswahl (\texttt{Set Breakpoint}) setzt einen festen Haltepunkt. 
Der zweite Eintrag (\texttt{Set Temporary Breakpoint}) setzt einen Haltepunkt, 
der nach dem Erreichen wieder gelöscht wird.
Der dritte Eintrag (\texttt{Continue Until Here}) ermöglicht die Programmausführung
oder -weiterführung bis zu der Zeile vor der Schreibmarke.
\\
\textbf{Programm schrittweise testen.} 
Durch die Anwahl des Eintrages \texttt{Run} im Kommandomenü (Abb. \ref{ABB:DDD-menu}b)
wird das Programm gestartet und bis zur letzten ausführbaren 
Programmanweisung \textit{vor} dem Haltepunkt ausgeführt.
Die erreichet Stelle wird durch einen roten Pfeil  gekennzeichnet (Abb. \ref{ABB:DDD}).
Mit Hilfe der anderen Möglichkeiten des Kommandomenüs kann das Programm
Zeile für Zeile ausgeführt werden (Tab. \ref{TAB:DDD-Kommandomenü}).
Nach jedem Schritt können dann z.B. Variablenwerte angesehen oder verändert werden.

\vspace{ 5mm}

%%+++++ TABLE : begin ++++++++++
\begin{table}[htbp]
\begin{center}
  %%~~~~~ TABULAR : begin ~~~~~~~~~~
  \begin{tabular}[]{|p{4cm}|p{12cm}|}
  \hline
   Haltepunkt setzen 
    & - Cursor am Anfang der gewünschten Zeile positionieren \newline
      - rechte Maustaste niederhalten (Haltepunktmenü) \newline 
      - \texttt{Set Breakpoint} oder \texttt{Delete Breakpoint}  wählen \newline 
      - am Zeilenanfang erscheint ein Stop-Schild \\ 
  \hline
   Haltepunkt löschen 
    & - Cursor über dem Stop-Schild positionieren \newline 
      - rechte Maustaste niederhalten (Haltepunktmenü) \newline 
      - \texttt{Delete Breakpoint}  wählen \\ 
  \hline
   Programm bis zum \newline Haltepunkt ausführen 
    & - Menüeintrag  \texttt{Run} wählen\\ 
  \hline
   Wert einer Variable \newline ansehen
    & - Mauszeiger im Quelltextfenster über dem Variablennamen positionieren\\ 
  \hline
   Datenelement im \newline Datenfenster anzeigen 
    & - Mauszeiger im Quelltextfenster über dem Namen positionieren \newline
      - rechte Maustaste niederhalten (Display-Menü erscheint) \newline 
      - \texttt{Display} wählen\newline 
      - im Datenfenster erscheint die entsprechende Anzeige\\ 
  \hline
   Datenelement im \newline Datenfenster erweitern
    & Bei Strukturen, Feldern, komplexen Objekten usw. kann \newline 
    die Darstellung erweitert oder zusammengefaßt werden:\newline
     - Mauszeiger im Datenfenster über dem Datenelement positionieren \newline
     - rechte Maustaste niederhalten (Menü) \newline
     - \texttt{Show All} oder \texttt{Hide All} wählen\\ 
  \hline
  \end{tabular} \\ [0.0ex]
  %%~~~~~ TABULAR :  end  ~~~~~~~~~~
\caption{ \label{TAB:DDD-Bedienung} DDD : Grundlegende Bedienung }
\end{center}
\end{table}
%%+++++ TABLE :  end  ++++++++++


%%+++++ TABLE : begin ++++++++++
\begin{table}[htbp]
\begin{center}
  %%~~~~~ TABULAR : begin ~~~~~~~~~~
  \begin{tabular}[]{|l|l|}
  \hline Run       & Starte das zu testende Programm \\
  \hline Interrupt & Unterbreche das zu testende Programm \\
  \hline Step      & eine Zeile weiter   (bei Unterprogammaufrufen wird in das Unterprogramm  gesprungen) \\
  \hline Next      & eine Zeile weiter   (bei Unterprogammaufrufen wird der Aufruf  übersprungen)         \\
  \hline Until     & Programm bis zur nächsten ausführbaren Zeile fortsetzen (zeilenweise Ausführung)     \\
  \hline Cont      & Programm nach einem Haltepunkt fortsetzen                                            \\
  \hline Kill      & Programm abbrechen                                                                   \\
  \hline
  \end{tabular} \\ [0.0ex]
  %%~~~~~ TABULAR :  end  ~~~~~~~~~~
\caption{ \label{TAB:DDD-Kommandomenü} DDD : Die Befehle des Kommandomenüs }
\end{center}
\end{table}
%%+++++ TABLE :  end  ++++++++++

Der Debugger DDD ist äußerst leistungsfähig und steht für mehrere Rechnerplattformen zur Verfügung.
Eine umfassendere Darstellung würde den Rahmen an dieser Stelle sprengen. 
Alles weitere muß der Originaldokumentation entnommen werden.


\end{appendix}


%%----------------------------------------------------------------------
%%  Buchnachspann
%%----------------------------------------------------------------------
\backmatter

%%======================================================================
%%  Stichwortverzeichnis
%%======================================================================
\cleardoublepage
\addcontentsline{toc}{chapter}{Stichwortverzeichnis} 
\printindex{}

\end{document}
%%%%%%%%%%%%%%%%%%%%%%  LATEX-Dokument -- ENDE  %%%%%%%%%%%%%%