Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • pgerwinski/hp
  • bwildenhain/hp
  • Daniel.Eisi/hp
  • aahrens/hp
4 results
Select Git revision
Show changes
Commits on Source (351)
Showing
with 0 additions and 370 deletions
#include <stdio.h>
int main (void)
{
double a;
printf ("Bitte eine Zahl eingeben: ");
scanf ("%d", &a);
a = 2 * a;
printf ("Das Doppelte ist: %lf\n", a);
return 0;
}
#include <stdio.h>
int main (void)
{
long long int a;
printf ("Bitte eine Zahl eingeben: ");
scanf ("%lf", &a);
a = 2 * a;
printf ("Das Doppelte ist: %lf\n", a);
return 0;
}
20181008/gitlab.png

757 B

.file "hello-1.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "Hello, world!"
.text
.globl main
.type main, @function
main:
.LFB11:
.cfi_startproc #include <stdio.h>
subq $8, %rsp
.cfi_def_cfa_offset 16 int main (void)
leaq .LC0(%rip), %rdi {
call puts@PLT printf ("Hello, world!\n");
movl $0, %eax return 0;
addq $8, %rsp }
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE11:
.size main, .-main
.ident "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
.section .note.GNU-stack,"",@progbits
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
void draw (void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f (1.0, 1.0, 0.0);
glRasterPos2f (-0.65, -0.1);
char *hello = "Hello, world!";
while (*hello)
glutBitmapCharacter (GLUT_BITMAP_HELVETICA_18, *hello++);
glFlush ();
glutSwapBuffers ();
}
void timer_handler (int data)
{
exit (0);
}
int main (int argc, char **argv)
{
glutInit (&argc, argv);
glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize (320, 200);
glutCreateWindow ("Hello");
glutDisplayFunc (draw);
glutTimerFunc (5000, timer_handler, 0);
glutMainLoop ();
return 0;
}
File deleted
\documentclass{article}
\input tmp.inputs
\pagestyle{empty}
\begin{document}
\psscalebox{0.8}{%
\begin{pspicture}(-5,0)(12,12)
\small
\psset{unit=0.5cm}
\psline[arrows=<->](-1,0)(-1,22)
\rput(-1.3,0){\makebox(0,0)[br]{\textbf{gegenständlich}}}
\rput(-1.3,22){\makebox(0,0)[tr]{\textbf{abstrakt}}}
\rput(-1.3,2){\makebox(0,0)[r]{Elektromagnetismus, Halbleiter}}
\rput(-1.3,4){\makebox(0,0)[r]{Elektronische Bauelemente}}
\rput(-1.3,6){\makebox(0,0)[r]{Logik-Schaltkreise}}
\rput(-1.3,8){\makebox(0,0)[r]{Prozessoren}}
\rput(-1.3,9){\makebox(0,0)[r]{Maschinensprache}}
\rput(-1.3,10){\makebox(0,0)[r]{Assembler}}
\rput(-1.3,11){\makebox(0,0)[r]{Ein-/Ausgabe}}
\rput(-1.3,12.35){\makebox(0,0)[r]{\textbf{hardwarenahe Programmierung} (z.\,B.\ in C)}}
\rput(-1.3,14){\makebox(0,0)[r]{\shortstack[r]{abstrahierende Programmierung\\(z.\,B.\ in C++, Java)}}}
% \rput(-1.3,15){\makebox(0,0)[r]{Programmierung}}
\rput(-1.3,16){\makebox(0,0)[r]{Algorithmen, Datenstrukturen, Software-Entwurf}}
\rput(-1.3,17){\makebox(0,0)[r]{Requirements Engineering}}
\rput(-1.3,18){\makebox(0,0)[r]{formale Sprachen, Berechenbarkeit}}
\rput(-1.3,19){\makebox(0,0)[r]{mathematische Strukturen}}
\rput(-1.3,20){\makebox(0,0)[r]{mathematische Beweise}}
\rput(2.1,0.5){\makebox(0,0)[l]{Physik}}
\rput(4.1,4){\makebox(0,0)[l]{Elektrotechnik}}
\rput(6.1,8){\makebox(0,0)[l]{Rechnertechnik}}
\rput(8.1,12.35){\makebox(0,0)[l]{angewandte Informatik}}
\rput(10.1,16){\makebox(0,0)[l]{\shortstack[l]{Softwaretechnik und\\theoretische Informatik}}}
\rput(12.1,21){\makebox(0,0)[l]{Mathematik}}
\psset{linewidth=0.001,linestyle=none,fillstyle=gradient,gradmidpoint=1.0,gradlines=1000}
\definecolor{RGBwhite}{rgb}{1.0,1.0,1.0}
\definecolor{RGBblue}{rgb}{0.0,0.0,1.0}
\definecolor{RGBred}{rgb}{1.0,0.0,0.0}
\definecolor{RGBgreen}{rgb}{0.0,1.0,0.0}
\definecolor{RGByellow}{rgb}{1.0,1.0,0.0}
\definecolor{RGBorange}{rgb}{1.0,0.7,0.0}
\definecolor{RGBgrey}{rgb}{0.7,0.7,0.7}
\rput(0,2){\psframe[gradbegin=RGBwhite,gradend=RGBblue](2,2)}
\rput(0,0){\psframe[fillstyle=solid,fillcolor=RGBblue](2,2.01)}
\rput(2,6){\psframe[gradbegin=RGBwhite,gradend=RGBred](2,2)}
\rput(2,2){\psframe[gradbegin=RGBred,gradend=RGBwhite](2,2)}
\rput(2,3.99){\psframe[fillstyle=solid,fillcolor=RGBred](2,2.02)}
\rput(4,10){\psframe[gradbegin=RGBwhite,gradend=RGBgreen](2,2)}
\rput(4,6){\psframe[gradbegin=RGBgreen,gradend=RGBwhite](2,2)}
\rput(4,7.99){\psframe[fillstyle=solid,fillcolor=RGBgreen](2,2.02)}
\rput(6,14){\psframe[gradbegin=RGBwhite,gradend=RGByellow](2,2)}
\rput(6,10){\psframe[gradbegin=RGByellow,gradend=RGBwhite](2,2)}
\rput(6,11.99){\psframe[fillstyle=solid,fillcolor=RGByellow](2,2.02)}
\rput(8,18){\psframe[gradbegin=RGBwhite,gradend=RGBorange](2,2)}
\rput(8,14){\psframe[gradbegin=RGBorange,gradend=RGBwhite](2,2)}
\rput(8,15.99){\psframe[fillstyle=solid,fillcolor=RGBorange](2,2.02)}
\rput(10,18){\psframe[gradbegin=RGBgrey,gradend=RGBwhite](2,2)}
\rput(10,19.99){\psframe[fillstyle=solid,fillcolor=RGBgrey](2,2.01)}
\end{pspicture}
}
\end{document}
File deleted
File deleted
File deleted
#include <stdio.h>
int main (void)
{
int a = 100; int b = 0; if (b != 0) printf ("%d / %d = %d\n", a, b, a / b); else printf ("Bitte nicht durch 0 dividieren!\n"); return 0;
}
20181015/gitlab.png

757 B

File deleted
File deleted
% hp-musterloesung-20181015.pdf - Solutions to the Exercises on Low-Level Programming / Applied Computer Sciences
% Copyright (C) 2013, 2015, 2016, 2017, 2018 Peter Gerwinski
%
% This document is free software: you can redistribute it and/or
% modify it either under the terms of the Creative Commons
% Attribution-ShareAlike 3.0 License, or under the terms of the
% GNU General Public License as published by the Free Software
% Foundation, either version 3 of the License, or (at your option)
% any later version.
%
% This document is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this document. If not, see <http://www.gnu.org/licenses/>.
%
% You should have received a copy of the Creative Commons
% Attribution-ShareAlike 3.0 Unported License along with this
% document. If not, see <http://creativecommons.org/licenses/>.
% README: Fibonacci-Zahlen, fehlerhaftes Programm, "Hello, world!"
\documentclass[a4paper]{article}
\usepackage{pgscript}
\begin{document}
\thispagestyle{empty}
\section*{Hardwarenahe Programmierung\\
Musterlösung zu den Übungsaufgaben -- 15.\ Oktober 2018}
\exercise{Fibonacci-Zahlen}
Die Folge der Fibonacci-Zahlen ist definiert durch:
\begin{quote}
1.\ Zahl: 0\\
2.\ Zahl: 1\\
nächste Zahl = Summe der beiden vorherigen
\end{quote}
Schreiben Sie ein Programm, das die ersten 50 Fibonacci-Zahlen ausgibt.
\solution
Zwei verschiedene richtige Lösungen finden Sie in den Dateien
\gitfile{hp}{20181015}{loesung-1-1.c} und \gitfile{hp}{20181015}{loesung-1-2.c}.
Die Lösung in \gitfile{hp}{20181015}{loesung-1-2.c}
speichert alle berechneten Zahlen in einem Array,
die in \gitfile{hp}{20181015}{loesung-1-1.c} hingegen
speichert immer nur maximal drei Zahlen gleichzeitig.
Sofern nicht alle berechneten Zahlen später noch benötigt werden,
ist daher \gitfile{hp}{20181015}{loesung-1-1.c} zu bevorzugen.
Wichtig in \gitfile{hp}{20181015}{loesung-1-1.c} ist, daß \lstinline{f0 + f1} berechnet wird,
\emph{bevor\/} \lstinline{f0} oder \lstinline{f1} ein neuer Wert zugewiesen wird.
Dies ist nur möglich, weil das Programm
eine zusätzliche Variable (hier: \lstinline{f2}) verwendet.
\exercise{Fehlerhaftes Programm}
Wir betrachten das folgende C-Programm
(Datei: \gitfile{hp}{20181015}{aufgabe-2.c}):
\begin{lstlisting}
#include <stdio.h>
int main (void)
{
for (int i = 10; i = 0; i - 1)
printf ("%d\n", i);
return 0;
}
\end{lstlisting}
\begin{itemize}
\item[(a)]
Was bewirkt dieses Programm und warum?
\item[(b)]
Ändern Sie das Programm so, daß es einen "`Countdown"' von 10 bis 0 ausgibt.
\end{itemize}
\solution
\begin{itemize}
\item[(a)]
\textbf{Was bewirkt dieses Programm und warum?}
Dieses Programm bewirkt nichts.
Die \lstinline{for}-Schleife wird nicht ausgeführt.
Begründung: Die \lstinline{for}-Bedingung ist eine Zuweisung
des Werts \lstinline{0} an die Variable \lstinline{i}.
Neben dem Seiteneffekt der Zuweisung liefert der Ausdruck
einen Wert zurück, nämlich den zugewiesenen Wert
\lstinline{0}. Dieser wird von \lstinline{for} als eine
Bedingung mit dem konstanten Wert "`falsch"' interpretiert.
(Hinweis: Ohne diese Begründung ist die Aufgabe nur zu einem
kleinen Teil gelöst.)
Darüberhinaus ist die Zähl-Anwendung unwirksam: Sie berechnet
den Wert \lstinline{i - 1} und vergißt ihn wieder, ohne ihn
einer Variablen (z.\,B.\ \lstinline{i}) zuzuweisen.
\clearpage
\item[(b)]
\textbf{Ändern Sie das Programm so, daß es einen "`Countdown"' von 10 bis 0 ausgibt.}
Datei \gitfile{hp}{20181015}{loesung-2.c}:
\begin{lstlisting}[gobble=8]
#include <stdio.h>
int main (void)
{
for (int i = 10; i >= 0; i--)
printf ("%d\n", i);
return 0;
}
\end{lstlisting}
\end{itemize}
\exercise{Hello, world!}
Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20181015}
finden Sie (unter anderem)\\
die Programme \gitfile{hp}{20181015}{test-1.c},
\gitfile{hp}{20181015}{test-2.c} und \gitfile{hp}{20181015}{test-3.c}.
Was bewirken diese Programme, und warum verhalten sie sich so?
\solution
\begin{itemize}
\item
\gitfile{hp}{20181015}{test-1.c}
Hinter \lstinline{return} steht ein Ausdruck mit dem
Komma-Operator. Dieser bewirkt, daß der Wert vor dem Komma
berechnet und ignoriert und danach der Wert nach dem Komma
zurückgegeben wird.
In diesem Fall wird vor dem Komma der Wert des
\lstinline{printf()}-Aufrufs berechnet und ignoriert.
Als Seiteneffekt gibt das Programm die Zeile
\lstinline[style=terminal]{Hello, world!} aus.
Anschließend wird der Wert \lstinline{0} an \lstinline{return}
übergeben und daher \lstinline{return 0} ausgeführt.
\item
\gitfile{hp}{20181015}{test-2.c}
Das Programm gibt die Zeile
\lstinline[style=terminal]{Die Antwort lautet: 42} aus.
Die \lstinline{if}-Bedingung ist eine Zuweisung \lstinline{b = 42},
die den zugewiesenen Wert \lstinline{42} zurückgibt.
Weil dieser Wert ungleich Null ist, interpretiert
\lstinline{if} ihn als Wahrheitswert "`wahr"', führt also den
\lstinline{if}-Zweig aus und überspringt den
\lstinline{else}-Zweig.
\item
\gitfile{hp}{20181015}{test-3.c}
Das Programm stürzt mit einer Fehlermeldung
"`Speicherzugriffsfehler"' oder "`Schutzverletzung"' ab.
Der Funktionsaufruf \lstinline{printf (42)} übergibt den
Zahlenwert \lstinline{42} als String, also als einen Zeiger
auf \lstinline{char}-Variable, an die Funktion
\lstinline{printf()}. Diese versucht, auf den Speicher ab
Adresse 42 zuzugreifen, wofür aber das Programm keine
Zugriffsrechte hat. Das Betriebssystem beendet daraufhin das
Programm mit der o.\,a.\ Fehlermeldung.
Der String \lstinline{"Die Antwort lautet: "} wird nicht
ausgegeben, weil Schreiboperationen aus Effizienzgründen
erst nach einer abgeschlossenen Zeile (\lstinline{"\n"})
durchgeführt werden.
\end{itemize}
\end{document}
File deleted
#include <stdio.h>
int main (void)
{
printf ("Hello, world!\n");
return 137;
}
cassini/home/peter/bo/2018ws/hp/20181015> gcc -Wall -O functions-6.c -o functions-6
cassini/home/peter/bo/2018ws/hp/20181015> ./functions-6
Hello, world!
cassini/home/peter/bo/2018ws/hp/20181015> echo $?
137
cassini/home/peter/bo/2018ws/hp/20181015> if ./functions-4; then echo "Jawohl!"; else echo "Schade."; fi
3 + 7 = 10
Jawohl!
cassini/home/peter/bo/2018ws/hp/20181015> if ./functions-6; then echo "Jawohl!"; else echo "Schade."; fi
Hello, world!
Schade.
#include <stdio.h>
int main (void)
{
int a = 3;
printf ("Hello, world!\n"), a = 42;
printf ("%d\n", a), return 0;
}
#include <stdio.h>
int main (void)
{
for (int i = 0, j = 20; i < 10; i++, j++)
printf ("%d %d\n", i, j);
return 0;
}
#include <stdio.h>
int main (void)
{
for (int i = 0, j = 20; i < 10, j < 30; i++, j++)
printf ("%d %d\n", i, j);
return 0;
}