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
  • 2016ws
  • 2017ws
  • 2018ws
  • 2019ws
  • 2020ws
  • 2021ws
  • 2022ws
  • 2023ws
  • 2024ws
9 results

Target

Select target project
No results found
Select Git revision
  • master
1 result
Show changes

Commits on Source 348

248 additional commits have been omitted to prevent performance issues.
1000 files
+ 30918
10841
Compare changes
  • Side-by-side
  • Inline

Files

20181008/calculate-2.c

deleted100644 → 0
+0 −11
Original line number Diff line number Diff line
#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;
}

20181008/calculate-5.c

deleted100644 → 0
+0 −11
Original line number Diff line number Diff line
#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/hello-1.s

deleted100644 → 0
+0 −23
Original line number Diff line number Diff line
	.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

20181008/hello-gtk.c

deleted100644 → 0
+0 −23
Original line number Diff line number Diff line
#include <gtk/gtk.h>

int main (int argc, char **argv)
{
  gtk_init (&argc, &argv);
  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (window), "Hello");
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
  gtk_container_add (GTK_CONTAINER (window), vbox);
  gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
  GtkWidget *label = gtk_label_new ("Hello, world!");
  gtk_container_add (GTK_CONTAINER (vbox), label);
  GtkWidget *button = gtk_button_new_with_label ("Quit");
  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
  gtk_container_add (GTK_CONTAINER (vbox), button);
  gtk_widget_show (button);
  gtk_widget_show (label);
  gtk_widget_show (vbox);
  gtk_widget_show (window);
  gtk_main ();
  return 0;
}

20181008/hello-opengl.c

deleted100644 → 0
+0 −32
Original line number Diff line number Diff line
#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;
}

20181008/hp-20181008-fig1.tex

deleted100644 → 0
+0 −60
Original line number Diff line number Diff line
\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}

20181008/if-4.c

deleted100644 → 0
+0 −6
Original line number Diff line number Diff line
#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;
}
+0 −185
Original line number Diff line number Diff line
% 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}

20181015/main-return-1.txt

deleted100644 → 0
+0 −18
Original line number Diff line number Diff line
#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.

20181015/operators-3.c

deleted100644 → 0
+0 −8
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  int a = 3;
  printf ("Hello, world!\n"), a = 42;
  printf ("%d\n", a), return 0;
}

20181015/operators-4.c

deleted100644 → 0
+0 −8
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  for (int i = 0, j = 20; i < 10; i++, j++)
    printf ("%d  %d\n", i, j);
  return 0;
}

20181015/operators-5.c

deleted100644 → 0
+0 −8
Original line number Diff line number Diff line
#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;
}

20181015/operators-6.c

deleted100644 → 0
+0 −8
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  for (int i = 0, j = 20; i < 10, j < 35; i++, j++)
    printf ("%d  %d\n", i, j);
  return 0;
}

20181022/aufgabe-3.c

deleted100644 → 0
+0 −18
Original line number Diff line number Diff line
  year = ORIGINYEAR;  /* = 1980 */

  while (days > 365)
    {
      if (IsLeapYear (year))
        {
          if (days > 366)
            {
              days -= 366;
              year += 1;
            }
        }
      else
        {
          days -= 365;
          year += 1;
        }
    }

20181022/loesung-1.c

deleted100644 → 0
+0 −18
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  char buffer[100];
  scanf ("%s", buffer);
  for (int i = 0; buffer[i]; i++)
    if (buffer[i] >= 'A' && buffer[i] <= 'M')
      buffer[i] += 13;
    else if (buffer[i] >= 'M' && buffer[i] <= 'Z')
      buffer[i] -= 13;
    else if (buffer[i] >= 'a' && buffer[i] <= 'm')
      buffer[i] += 13;
    else if (buffer[i] >= 'm' && buffer[i] <= 'z')
      buffer[i] -= 13;
  printf ("%s\n", buffer);
  return 0;
}

20181022/pointer-4.c

deleted100644 → 0
+0 −15
Original line number Diff line number Diff line
#include <stdio.h>

void calc_answer (int *a, int *b)
{
  *a = 42;
  *b = 137;
}

int main (void)
{
  int answer1, answer2;
  calc_answer (&answer1, &answer2);
  printf ("The answers are %d and %d.\n", answer1, answer2);
  return 0;
}

20181022/pointer-5.c

deleted100644 → 0
+0 −14
Original line number Diff line number Diff line
#include <stdio.h>

int calc_answer (void)
{
  return 42, 137;
}

int main (void)
{
  int answer1, answer2;
  answer1, answer2 = calc_answer ();
  printf ("The answers are %d and %d.\n", answer1, answer2);
  return 0;
}
+0 −25
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  for (int a = 0; a < 1000000; a++)
    {
      if ((a * 1117) % 65535 == 137)
        {
          for (int t = 2; t < 1000000; t++)
            {
              if (a % t == 0)
                {
                  printf ("Found something:\n");
                  printf ("a = %d\nt = %d\n", a, t);
                  a = 2000000;
                  break;
                }
              else
                continue;
            }
        }
    }
  printf ("Bye.\n");
  return 0;
}
+0 −23
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  for (int a = 0; a < 1000000; a++)
    {
      if ((a * 1117) % 65535 == 137)
        {
          for (int t = 2; t < 1000000; t++)
            {
              if (a % t == 0)
                {
                  printf ("Found something:\n");
                  printf ("a = %d\nt = %d\n", a, t);
                  break;
                }
            }
          break;
        }
    }
  printf ("Bye.\n");
  return 0;
}
+0 −23
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  for (int a = 0; 1; a++)
    {
      if ((a * 1117) % 65535 == 137)
        {
          for (int t = 2; 1; t++)
            {
              if (a % t == 0)
                {
                  printf ("Found something:\n");
                  printf ("a = %d\nt = %d\n", a, t);
                  goto found;
                }
            }
        }
    }
found:
  printf ("Bye.\n");
  return 0;
}
+0 −19
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  for (int a = 0; 1; a++)
    {
      if ((a * 1117) % 65535 == 137)
        {
          int t = 2;
          while (a % t != 0)
            t++;
          printf ("Found something:\n");
          printf ("a = %d\nt = %d\n", a, t);
          break;
        }
    }
  printf ("Bye.\n");
  return 0;
}
+0 −21
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  int a = 0;
  while ((a * 1117) % 65535 != 137)
    {
      a++;
      if ((a * 1117) % 65535 == 137)
        {
          int t = 2;
          while (a % t != 0)
            t++;
          printf ("Found something:\n");
          printf ("a = %d\nt = %d\n", a, t);
          break;
        }
    }
  printf ("Bye.\n");
  return 0;
}
+0 −15
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  int a = 0;
  while ((a * 1117) % 65535 != 137)
    a++;
  int t = 2;
  while (a % t != 0)
    t++;
  printf ("Found something:\n");
  printf ("a = %d\nt = %d\n", a, t);
  printf ("Bye.\n");
  return 0;
}
+0 −18
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  int N = 65535;
  int p = 1117;
  int q = 137;
  int a = 0;
  while ((a * p) % N != q)
    a++;
  int t = 2;
  while (a % t != 0)
    t++;
  printf ("Found something:\n");
  printf ("a = %d\nt = %d\n", a, t);
  printf ("Bye.\n");
  return 0;
}

20181029/array-vs-pointer-1.c

deleted100644 → 0
+0 −9
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  char h[] = "Hello!\n";
  h[1] = 'a';
  printf ("%s", h);
  return 0;
}

20181029/array-vs-pointer-10.c

deleted100644 → 0
+0 −9
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  char *h = "Hello!\n";
  while (*h)
    printf ("%c", (*h)++);
  return 0;
}

20181029/array-vs-pointer-2.c

deleted100644 → 0
+0 −9
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  char *h = "Hello!\n";
  h[1] = 'a';
  printf ("%s", h);
  return 0;
}

20181029/array-vs-pointer-6.c

deleted100644 → 0
+0 −8
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  char h[] = "Hello!\n";
  printf ("%c\n", *h);
  return 0;
}

20181029/array-vs-pointer-7.c

deleted100644 → 0
+0 −9
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  char h[] = "Hello!\n";
  while (*h)
    printf ("%c", *h++);
  return 0;
}

20181029/array-vs-pointer-8.c

deleted100644 → 0
+0 −9
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  char h[] = "Hello!\n";
  while (*h)
    printf ("%c", (*h)++);
  return 0;
}

20181029/array-vs-pointer-9.c

deleted100644 → 0
+0 −9
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  char h[] = "Hello!\n";
  while (*h)
    printf ("%c", *h + 1);
  return 0;
}

20181029/ascii-1.c

deleted100644 → 0
+0 −7
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  printf ("Der Buchstabe lautet: %c\n", 1117);
  return 0;
}

20181029/ascii-2.c

deleted100644 → 0
+0 −8
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  printf ("Der Buchstabe lautet: %c\n", 1117);
  printf ("Die Zahl lautet: %d\n", ']');
  return 0;
}

20181029/ascii-3.c

deleted100644 → 0
+0 −10
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  printf ("Der Buchstabe lautet: %c\n", 1117);
  printf ("Die Zahl lautet: %d\n", ']');
  printf ("Der Buchstabe als Hexadezimalzahl lautet: %x\n", 1117);
  printf ("Die Zahl in hexadezimal lautet: %x\n", ']');
  return 0;
}
+0 −371
Original line number Diff line number Diff line
% hp-musterloesung-20181029.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: Strings, Primzahlen, Datum-Bibliothek

\documentclass[a4paper]{article}

\usepackage{pgscript}

\begin{document}

  \section*{Hardwarenahe Programmierung\\
            Musterlösung zu den Übungsaufgaben -- 29.\ Oktober 2018}

  \exercise{Strings}

  Strings werden in der Programmiersprache C
  durch Zeiger auf \lstinline{char}-Variable realisiert.

  Wir betrachten die folgende Funktion (Datei: \gitfile{hp}{20181029}{aufgabe-1.c}):
  \begin{center}
    \begin{minipage}{8cm}
      \begin{lstlisting}[gobble=8]
        int fun_1 (char *s1, char *s2)
        {
          int result = 1;
          for (int i = 0; s1[i] && s2[i]; i++)
            if (s1[i] != s2[i])
              result = 0;
          return result;
        }
      \end{lstlisting}
    \end{minipage}%
  \end{center}
  \begin{itemize}
    \item[(a)]
      Was bewirkt die Funktion? % \points{3}
    \item[(b)]
      Welchen Sinn hat die Bedingung "`\lstinline{s1[i] && s2[i]}"'
      in der \lstinline{for}-Schleife? % \points{2}
    \item[(c)]
      Was würde sich ändern, wenn die Bedingung "`\lstinline{s1[i] && s2[i]}"'
      in der \lstinline{for}-Schleife\\
      zu "`\lstinline{s1[i]}"' verkürzt würde? % \points{3}
%    \item[(d)]
%      Von welcher Ordnung (Landau-Symbol) ist die Funktion \lstinline{fun_1()}
%      hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen in den Strings
%      -- und warum? % \points{2}
    \item[(d)]
      Schreiben Sie eine eigene Funktion,
      die dieselbe Aufgabe erledigt wie \lstinline{fun_1()}, nur effizienter.
%      und geben Sie die Ordnung (Landau-Symbol) der von Ihnen geschriebenen Funktion an. % \points{5}
  \end{itemize}

  \solution

  \begin{itemize}
    \item[(a)]
      \textbf{Was bewirkt die Funktion?}

      Sie vergleicht zwei Strings miteinander bis zur Länge des kürzeren Strings
      und gibt bei Gleichheit 1 zurück, ansonsten 0.

      Mit anderen Worten:
      Die Funktion prüft, ob zwei Strings bis zur Länge des kürzeren übereinstimmen,
      und gibt bei Gleichheit 1 zurück, ansonsten 0.

      Die Funktion prüft insbesondere \textbf{nicht} zwei Strings auf Gleichheit,
      und sie ist \textbf{nicht} funktionsgleich zur
      Standard-Bibliotheksfunktion \lstinline{strcmp()}.

    \item[(b)]
      \textbf{Welchen Sinn hat die Bedingung "`\lstinline{s1[i] && s2[i]}"'
      in der \lstinline{for}-Schleife?}

      Die Bedingung prüft, ob \emph{bei einem der beiden Strings\/}
      die Ende-Markierung (Null-Symbol) erreicht ist.
      Falls ja, wird die Schleife beendet.

    \item[(c)]
      \textbf{Was würde sich ändern, wenn die Bedingung "`\lstinline{s1[i] && s2[i]}"'
      in der \lstinline{for}-Schleife\\
      zu "`\lstinline{s1[i]}"' verkürzt würde?}

      In diesem Fall würde nur für \lstinline{s1} geprüft,
      ob das Ende erreicht ist.
      Wenn \lstinline{s1} länger ist als \lstinline{s2},
      würde \lstinline{s2} über sein Ende hinaus ausgelesen.
      Dies kann zu Lesezugriffen auf Speicher außerhalb des Programms
      und damit zu einem Absturz führen
      ("`Speicherzugriffsfehler"', "`Schutzverletzung"').

    \item[(d)]
      \textbf{Schreiben Sie eine eigene Funktion,
      die dieselbe Aufgabe erledigt wie \lstinline{fun_1()}, nur effizienter.}

      Die Effizienz läßt sich steigern, indem man die Schleife abbricht,
      sobald das Ergebnis feststeht.
      Es folgen drei Möglichkeiten, dies zu realisieren.
  \end{itemize}

  \begin{center}
    \begin{minipage}[t]{8cm}
      Erweiterung der Schleifenbedingung:

      \begin{lstlisting}[gobble=8]
        int fun_2 (char *s1, char *s2)
        {
          int result = 1;
          for (int i = 0; s1[i] && s2[i] && result; i++)
            if (s1[i] != s2[i])
              result = 0;
          return result;
        }
      \end{lstlisting}
    \end{minipage}%
    \begin{minipage}[t]{6cm}
      Verwendung von \lstinline{return}:

      \begin{lstlisting}[gobble=8]
        int fun_3 (char *s1, char *s2)
        {
          for (int i = 0; s1[i] && s2[i]; i++)
            if (s1[i] != s2[i])
              return 0;
          return 1;
        }
      \end{lstlisting}
    \end{minipage}
  \end{center}
  \vspace*{-1cm}\goodbreak

  \begin{center}
    \begin{minipage}{9cm}
      Die nebenstehende Lösung unter Verwendung von \lstinline{break}
      ist zwar ebenfalls richtig, aber länger und weniger übersichtlich
      als die beiden anderen Lösungen.

      \smallskip

      Die Datei \gitfile{hp}{20181029}{loesung-1.c} enthält ein Testprogramm
      für alle o.\,a.\ Lösungen.
      Das Programm testet nur die offensichtlichsten Fälle;
      für den Einsatz der Funktionen in einer Produktivumgebung
      wären weitaus umfassendere Tests erforderlich.

      \smallskip

      Das Testprogramm enthält String-Zuweisungen wie z.\,B.\
      \lstinline{s2 = "Apfel"}.
      Dies funktioniert, weil wir damit einen Zeiger (\lstinline{char *s2})
      auf einen neuen Speicherbereich (\lstinline{"Apfel"}) zeigen lassen.
      Eine entsprechende Zuweisung zwischen Arrays
      (\lstinline{char s3[] = "Birne"; s3 = "Pfirsich";)}
      funktioniert \emph{nicht}.
      
    \end{minipage}\hspace*{1cm}%
    \begin{minipage}{6cm}
      \begin{lstlisting}[gobble=8]
        int fun_4 (char *s1, char *s2)
        {
          int result = 1;
          for (int i = 0; s1[i] && s2[i]; i++)
            if (s1[i] != s2[i])
              {
                result = 0;
                break;
              }
          return result;
        }
      \end{lstlisting}
    \end{minipage}
  \end{center}

  \exercise{Fehlerhaftes Programm: Primzahlen}

  \begin{minipage}[t]{5.5cm}
    Das nebenstehende Primzahlsuchprogramm (Datei: \gitfile{hp}{20181029}{aufgabe-2.c})
    soll Zahlen ausgeben, die genau zwei Teiler haben, ist aber fehlerhaft.

    \smallskip

    Korrigieren Sie das Programm derart, daß ein Programm entsteht,
    welches alle Primzahlen kleiner 100 ausgibt.% \points 5
  \end{minipage}\hfill
  \begin{minipage}[t]{9cm}
     \vspace*{-0.5cm}
    \begin{lstlisting}[gobble=6]
      #include <stdio.h>

      int main (void)
      {
        int n, i, divisors;
        for (n = 0; n < 100; n++)
          divisors = 0;
          for (i = 0; i < n; i++)
            if (n % i == 0)
              divisors++;
          if (divisors = 2)
            printf ("%d ist eine Primzahl.\n", n);
        return 0;
      }
    \end{lstlisting}
  \end{minipage}

  \solution

  Beim Compilieren des Beispiel-Programms mit
  \lstinline[style=cmd]{gcc -Wall} erhalten wir die folgende Warnung:
  \begin{lstlisting}[style=terminal]
    aufgabe-2.c:11:5: warning: suggest parentheses around assignment
                      used as truth value [-Wparentheses]
  \end{lstlisting}
  Beim Ausführen gibt das Programm die folgende (falsche) Behauptung aus:
  \begin{lstlisting}[style=terminal]
    100 ist eine Primzahl.
  \end{lstlisting}

  Einen ersten Hinweis auf den Fehler im Programm liefert die Warnung.
  Die Bedingung \lstinline{if (divisors = 2)} in Zeile 11
  steht \emph{nicht\/} für einen Vergleich
  der Variablen \lstinline{divisors} mit der Zahl 2,
  sondern für eine Zuweisung der Zahl 2 an die Variable \lstinline{divisors}.
  Neben dem \emph{Seiteneffekt\/} der Zuweisung gibt \lstinline{divisors = 2}
  den Wert \lstinline{2} zurück.
  Als Bedingung interpretiert, hat \lstinline{2} den Wahrheitswert "`wahr"' ("`true"');
  die \lstinline{printf()}-Anweisung wird daher in jedem Fall ausgeführt.

  Korrektur dieses Fehlers: \lstinline{if (divisors == 2)}
  -- siehe die Datei \gitfile{hp}{20181029}{loesung-2-1.c}.

  \bigskip

  Nach der Korrektur dieses Fehlers compiliert das Programm ohne Warnung,
  gibt aber beim Ausführen die folgende Fehlermeldung aus:
  \begin{lstlisting}[style=terminal]
    Gleitkomma-Ausnahme
  \end{lstlisting}
  (Bemerkung: Bei ausgeschalteter Optimierung
  -- \lstinline[style=cmd]{gcc} ohne \lstinline[style=cmd]{-O} --
  kommt diese Fehlermeldung bereits beim ersten Versuch, das Programm auszuführen.
  Der Grund für dieses Verhalten ist, daß bei eingeschalteter Optimierung
  irrelevante Teile des Programms entfernt und gar nicht ausgeführt werden,
  so daß der Fehler nicht zum Tragen kommt.
  In diesem Fall wurde die Berechnung von \lstinline{divisors} komplett wegoptimiert,
  da der Wert dieser Variablen nirgendwo abgefragt,
  sondern durch die Zuweisung \lstinline{if (divisors = 2)}
  sofort wieder überschrieben wurde.)

  Die Fehlermeldung "`\lstinline[style=terminal]{Gleitkomma-Ausnahme}"'
  ist insofern irreführend, als daß hier gar keine Gleitkommazahlen im Spiel sind;
  andererseits deutet sie auf einen Rechenfehler hin, was auch tatsächlich zutrifft.
  Durch Untersuchen aller Rechenoperationen
  -- z.\,B.\ durch das Einfügen zusätzlicher \lstinline{printf()} --
  finden wir den Fehler in Zeile 9:
  Die Modulo-Operation \lstinline{n % i} ist eine Division,
  die dann fehlschlägt, wenn der Divisor \lstinline{i} den Wert 0 hat.
  Die Fehlerursache ist die bei 0 beginnende \lstinline{for}-Schleife in Zeile 8:
  \lstinline{for (i = 0; i < n; i++)}.

  Korrektur dieses Fehlers: Beginn der Schleife mit \lstinline{i = 1}
  statt \lstinline{i = 0} -- siehe die Datei \gitfile{hp}{20181029}{loesung-2-2.c}.

  \bigskip

  Nach der Korrektur dieses Fehlers gibt das Programm überhaupt nichts mehr aus.

  Durch Untersuchen des Verhaltens des Programms
  -- z.\,B.\ durch das Einfügen zusätzlicher \lstinline{printf()} --
  stellen wir fest, daß die Zeilen 8 bis 12 des Programms nur einmal ausgeführt werden
  und nicht, wie die \lstinline{for}-Schleife in Zeile 6 vermuten ließe, 100mal.
  Der Grund dafür ist, daß sich die \lstinline{for}-Schleife
  nur auf die unmittelbar folgende Anweisung \lstinline{divisors = 0} bezieht.
  Nur diese Zuweisung wird 100mal ausgeführt;
  alles andere befindet sich außerhalb der \lstinline{for}-Schleife.
  (Die Einrückung hat in C keine inhaltliche Bedeutung,
  sondern dient nur zur Verdeutlichung der Struktur des Programms.
  In diesem Fall entsprach die tatsächliche Struktur nicht der beabsichtigten.)

  Korrektur dieses Fehlers:
  geschweifte Klammern um den Inhalt der äußeren \lstinline{for}-Schleife
  -- siehe die Datei \gitfile{hp}{20181029}{loesung-2-3.c}.

  \bigskip

  Nach der Korrektur dieses Fehlers gibt das Programm folgendes aus:
  \begin{lstlisting}[style=terminal]
    4 ist eine Primzahl.
    9 ist eine Primzahl.
    25 ist eine Primzahl.
    49 ist eine Primzahl.
  \end{lstlisting}
  Diese Zahlen sind keine Primzahlen (mit zwei Teilern),
  sondern sie haben drei Teiler.
  Demnach findet das Programm einen Teiler zu wenig.
  (Um diesen Fehler zu finden, kann man sich zu jeder Zahl
  die gefundene Anzahl der Teiler \lstinline{divisors} ausgeben lassen.)

  Der nicht gefundene Teiler ist jeweils die Zahl selbst.
  Dies kommt daher, daß die Schleife
  \lstinline{for (i = 1; i < n; i++)} nur bis \lstinline{n - 1} geht,
  also keine Division durch \lstinline{n} stattfindet.

  Korrektur dieses Fehlers: Schleifenbedingung \lstinline{i <= n}
  statt \lstinline{i < n}
  -- siehe die Datei \gitfile{hp}{20181029}{loesung-2-4.c}.

  \bigskip

  Nach der Korrektur dieses Fehlers verhält sich das Programm korrekt.

  Die Datei \gitfile{hp}{20181029}{loesung-2-4.c} enthält somit das korrigierte Programm.

  \exercise{Datum-Bibliothek}

  Schreiben Sie eine Bibliothek (= Sammlung von Deklarationen und Funktionen)
  zur Behandlung von Datumsangaben.

  Diese soll enthalten:
  \begin{itemize}
    \item
      einen \lstinline{struct}-Datentyp \lstinline{date},
      der eine Datumsangabe speichert,
    \item
      eine Funktion \lstinline{void date_print (date *d)}, die ein Datum ausgibt,
    \item
      eine Funktion \lstinline{int date_set (date *d, int day, int month, int year)},
      die ein Datum auf einen gegebenen Tag setzt
      und zurückgibt, ob es sich um ein gültiges Datum handelt (0 = nein, 1 = ja),
    \item
      eine Funktion \lstinline{void date_next (date *d)},
      die ein Datum auf den nächsten Tag vorrückt.
  \end{itemize}

  \solution

  Die Datei \gitfile{hp}{20181029}{loesung-3.c}
  enthält die Bibliothek zusammen mit einem Test-Programm.

  Eine detaillierte Anleitung,
  wie man auf die Funktion \lstinline{date_next()} kommt,
  finden Sie im Skript zur Lehrveranstaltung, Datei \gitfile{hp}{script}{hp-2018ws.pdf},
  ab Seite 29.

  (Die Vorgehensweise,
  die Bibliothek und das Hauptprogramm in dieselbe Datei zu schreiben,
  hat den Nachteil,
  daß man die Bibliothek in jedes weitere Programm, das sie benutzt,
  kopieren und auch dort aktuell halten muß.
  Eine sinnvollere Lösung wird demnächst in der Vorlesung vorgestellt werden.)

\end{document}

20181029/loesung-3.c

deleted100644 → 0
+0 −109
Original line number Diff line number Diff line
#include <stdio.h>

typedef struct
{
  char day, month;
  int year;
}
date;

int is_leap_year (int year)
{
  if (year % 4 == 0)
    if (year % 100 == 0)
      if (year % 400 == 0)
        return 1;
      else
        return 0;
    else
      return 1;
  else
    return 0;
}

int days_in_month (int month, int year)
{
  if (month == 2)
    if (is_leap_year (year))
      return 29;
    else
      return 28;
  else if (month == 4 || month == 6 || month == 9 || month == 11)
    return 30;
  else
    return 31;
}

void date_print (date *d)
{
  printf ("%02d.%02d.%04d", d->day, d->month, d->year);
}

int date_set (date *d, char day, char month, int year)
{
  d->year = year;
  if (month > 0 && month <= 12)
    d->month = month;
  else
    return 0;
  if (day > 0 && day <= days_in_month (month, year))
    d->day = day;
  else
    return 0;
  return 1;
}

void date_next (date *d)
{
  d->day++;
  if (d->day > days_in_month (d->month, d->year))
    {
      d->month++;
      d->day = 1;
      if (d->month > 12)
        {
          d->year++;
          d->month = 1;
        }
    }
}

void check (char day, char month, int year)
{
  date d;
  if (date_set (&d, day, month, year))
    {
      date_print (&d);
      printf (" --> ");
      date_next (&d);
      date_print (&d);
      printf ("\n");
    }
  else
    printf ("%02d.%02d.%04d: invalid date\n", day, month, year);
}

int main (void)
{
  check (6, 11, 2018);
  check (29, 11, 2018);
  check (30, 11, 2018);
  check (31, 11, 2018);
  check (29, 12, 2018);
  check (30, 12, 2018);
  check (31, 12, 2018);
  check (28, 2, 2016);
  check (29, 2, 2016);
  check (30, 2, 2016);
  check (28, 2, 2015);
  check (29, 2, 2015);
  check (30, 2, 2015);
  check (31, 12, 2008);
  check (28, 2, 2000);
  check (29, 2, 2000);
  check (30, 2, 2000);
  check (28, 2, 1900);
  check (29, 2, 1900);
  check (30, 2, 1900);
  return 0;
}

20181105/ascii-1.c

deleted100644 → 0
+0 −15
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  char a = 0;
  printf ("%d\n", a);
  printf ("%c\n", a);
  a = 72;
  printf ("%d\n", a);
  printf ("%c\n", a);
  a = 'a';
  printf ("%d\n", a);
  printf ("%c\n", a);
  return 0;
}

20181105/ascii-2.c

deleted100644 → 0
+0 −15
Original line number Diff line number Diff line
#include <stdio.h>

int main (void)
{
  int a = 0;
  printf ("%d\n", a);
  printf ("%c\n", a);
  a = 72;
  printf ("%d\n", a);
  printf ("%c\n", a);
  a = 'a';
  printf ("%d\n", a);
  printf ("%c\n", a);
  return 0;
}

20181105/hello-4.c

deleted100644 → 0
+0 −7
Original line number Diff line number Diff line
extern int schreib_doch_mal (const char *__restrict __format, ...);

int main (void)
{
  schreib_doch_mal ("Hello, world!\n");
  return 0;
}

20181105/hello-5.c

deleted100644 → 0
+0 −7
Original line number Diff line number Diff line
#include <library-1.h>

int main (void)
{
  schreib_doch_mal ("Hello, world!\n");
  return 0;
}

20181105/hello-6.c

deleted100644 → 0
+0 −7
Original line number Diff line number Diff line
#include "library-1.h"

int main (void)
{
  schreib_doch_mal ("Hello, world!\n");
  return 0;
}

20181105/hello-7.c

deleted100644 → 0
+0 −7
Original line number Diff line number Diff line
#include "library-2.h"

int main (void)
{
  schreib_doch_mal ("Hello, world!\n");
  return 0;
}

20181105/hp-20181105.tex

deleted100644 → 0
+0 −643
Original line number Diff line number Diff line
% hp-20181105.pdf - Lecture Slides on Low-Level Programming
% Copyright (C) 2012, 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: String-Operationen, Bibliotheken

\documentclass[10pt,t]{beamer}

\usepackage{pgslides}
\usepackage{pdftricks}
\usepackage{tikz}

\begin{psinputs}
  \usepackage[utf8]{inputenc}
  \usepackage[german]{babel}
  \usepackage[T1]{fontenc}
  \usepackage{helvet}
  \renewcommand*\familydefault{\sfdefault}
  \usepackage{pstricks,pst-grad}
\end{psinputs}

\title{Hardwarenahe Programmierung}
\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
\date{5.\ November 2018}

\begin{document}

\maketitleframe

\nosectionnonumber{\inserttitle}

\begin{frame}

  \shownosectionnonumber

  \begin{itemize}
    \item[\textbf{1}] \textbf{Einführung}
      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp.git}}}
    \item[\textbf{2}] \textbf{Einführung in C}
      \begin{itemize}
%        \item[2.1] Hello, world!
        \vspace*{-0.1cm}
        \item[\dots]
        \item[2.10] Zeiger
        \item[2.11] Arrays und Strings
        \item[2.12] Strukturen
        \color{medgreen}
        \item[2.13] Dateien und Fehlerbehandlung
        \item[2.14] Parameter des Hauptprogramms
        \color{red}
        \item[2.15] String-Operationen
      \end{itemize}
    \item[\textbf{3}] \textbf{Bibliotheken}
      \begin{itemize}
        \color{red}
        \item[3.1] Der Präprozessor
        \item[3.2] Bibliotheken einbinden
        \item[3.3] Bibliotheken verwenden
        \vspace*{-0.1cm}
        \item[\dots]
%        \item[3.4] Projekt organisieren: make
      \end{itemize}
    \item[\textbf{\dots}]
%    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
%    \item[\textbf{5}] \textbf{Algorithmen}
%    \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke}
  \end{itemize}
  \vspace*{-1cm}

\end{frame}

\setcounter{section}{1}
\section{Einführung in C}

\setcounter{subsection}{12}
\subsection{Dateien und Fehlerbehandlung}

\begin{frame}[fragile]
  \showsubsection
  \vspace*{-0.2925cm}
  \begin{minipage}[t]{6cm}
    \begin{onlyenv}<1>
      \begin{lstlisting}[gobble=8]
        ¡#include <stdio.h>

        int main (void)
        {
          FILE *f = fopen ("fhello.txt", "w");
          fprintf (f, "Hello, world!\n");
          fclose (f);
          return 0;
        }¿
      \end{lstlisting}
    \end{onlyenv}
    \begin{onlyenv}<2>
      \begin{lstlisting}[gobble=8]
        ¡#include <stdio.h>

        int main (void)
        {
          FILE *f = fopen ("fhello.txt", "w");
          if (f)
            {
              fprintf (f, "Hello, world!\n");
              fclose (f);
            }
          return 0;
        }¿
      \end{lstlisting}
    \end{onlyenv}
    \begin{onlyenv}<3>
      \begin{lstlisting}[gobble=8]
        ¡#include <stdio.h>
        #include <errno.h>

        int main (void)
        {
          FILE *f = fopen ("fhello.txt", "w");
          if (f)
            {
              fprintf (f, "Hello, world!\n");
              fclose (f);
            }
          else
            fprintf (stderr, "error #%d\n", errno);
          return 0;
        }¿
      \end{lstlisting}
    \end{onlyenv}
    \begin{onlyenv}<4>
      \begin{lstlisting}[gobble=8]
        ¡#include <stdio.h>
        #include <errno.h>
        #include <string.h>

        int main (void)
        {
          FILE *f = fopen ("fhello.txt", "w");
          if (f)
            {
              fprintf (f, "Hello, world!\n");
              fclose (f);
            }
          else
            {
              char *msg = strerror (errno);
              fprintf (stderr, "%s\n", msg);
            }
          return 0;
        }¿
      \end{lstlisting}
      \vspace*{-1cm}
    \end{onlyenv}
    \begin{onlyenv}<5->
      \begin{lstlisting}[gobble=8]
        ¡#include <stdio.h>
        #include <errno.h>
        #include <er¡ror.h>

        int main (void)
        {
          FILE *f = fopen ("fhello.txt", "w");
          if (!f)
            error (1, errno, "cannot open file");
          fprintf (f, "Hello, world!\n");
          fclose (f);
          return 0;
        }
      \end{lstlisting}
    \end{onlyenv}
  \end{minipage}\pause\hspace*{-1.5cm}%
  \begin{minipage}[t]{8.5cm}
    \bigskip
    \only<3->{\bigskip}
    \begin{itemize}
      \item
        Wenn die Datei nicht geöffnet werden kann,\\
        gibt \lstinline{fopen()} den Wert \lstinline{NULL} zurück.
        \pause
        \medskip
      \item
        \addtolength{\leftskip}{1cm}
        Die globale Variable \lstinline{int errno}\\
        enthält dann die Nummer des Fehlers.\\
        Benötigt: \lstinline{#include <errno.h>}
        \pause
        \medskip
        \only<5->{\bigskip}
      \item
        Die Funktion \lstinline{strerror()} wandelt \lstinline{errno}\\
        in einen Fehlermeldungstext um.\\
        Benötigt: \lstinline{#include <string.h>}
        \pause
        \medskip
      \item
        \addtolength{\leftskip}{-1.5cm}
        Die Funktion \lstinline{error()} gibt eine Fehlermeldung aus\\
        und beendet das Programm.\\
        Benötigt: \lstinline{#include <er¡¿ror.h>}
%        \pause
        \medskip
      \item
        \textbf{Niemals Fehler einfach ignorieren!}
    \end{itemize}
    \addtolength{\leftskip}{0.5cm}
  \end{minipage}
\end{frame}

\subsection{Parameter des Hauptprogramms}

\begin{frame}[fragile]

  \showsubsection

  \vspace*{-1.4\medskipamount}
  \vbox to 0pt{%
    \begin{onlyenv}<1-2>
      \begin{lstlisting}[gobble=8]
        #include <stdio.h>

        int main (int argc, char **argv)
        {
          printf ("argc = %d\n", argc);
          for (int i = 0; i < argc; i++)
            printf ("argv[%d] = \"%s\"\n", i, argv[i]);
          return 0;
        }
      \end{lstlisting}
    \end{onlyenv}
    \begin{onlyenv}<3>
      \begin{lstlisting}[gobble=8]
        #include <stdio.h>

        int main (int argc, char **argv)
        {
          printf ("argc = %d\n", argc);
          for (int i = 0; *argv; i++, argv++)
            printf ("argv[%d] = \"%s\"\n", i, *argv);
          return 0;
        }
      \end{lstlisting}
    \end{onlyenv}
    \begin{onlyenv}<4>
      \begin{lstlisting}[gobble=8]
        #include <stdio.h>

        int main (int argc, char **argv)
        {
          printf ("argc = %d\n", argc);
          int i = 0;
          while (*argv)
            printf ("argv[%d] = \"%s\"\n",
                   i++, *argv++);
          return 0;
        }
      \end{lstlisting}
    \end{onlyenv}
    \begin{onlyenv}<5->
      \begin{lstlisting}[gobble=8]
        #include <stdio.h>

        int main (int argc, char **argv)
        {
          printf ("argc = %d\n", argc);
          int i = 0;
          while (*argv)
            {
              printf ("argv[%d] = \"%s\"\n", i, *argv);
              i++;
              argv++;
            }
          return 0;
        }
      \end{lstlisting}
    \end{onlyenv}
    \vss
  }

  \pause
  \strut\hfill
  \begin{minipage}{5.5cm}
    \begin{itemize}
      \item
        \lstinline{argc}: Anzahl der Parameter
      \item
        \lstinline{argv}: Array von Strings\\
        (= Zeiger auf Zeiger auf \lstinline{char}s)\\
        mit den Parametern
      \item
        Parameter Nr.\ 0:\\
        Name des Programms selbst,\\
        wie es aufgerufen wurde
      \pause
      \item
        letzter Eintrag im Array:\\
        \lstinline{NULL}-Zeiger\\
        (als Ende-Markierung)
    \end{itemize}
  \end{minipage}

\end{frame}

\nosectionnonumber{\inserttitle}

\begin{frame}

  \shownosectionnonumber

  \begin{itemize}
    \item[\textbf{1}] \textbf{Einführung}
      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp.git}}}
    \item[\textbf{2}] \textbf{Einführung in C}
      \begin{itemize}
%        \item[2.1] Hello, world!
        \vspace*{-0.1cm}
        \item[\dots]
        \item[2.10] Zeiger
        \item[2.11] Arrays und Strings
        \item[2.12] Strukturen
        \color{medgreen}
        \item[2.13] Dateien und Fehlerbehandlung
        \item[2.14] Parameter des Hauptprogramms
        \color{red}
        \item[2.15] String-Operationen
      \end{itemize}
    \item[\textbf{3}] \textbf{Bibliotheken}
      \begin{itemize}
        \color{red}
        \item[3.1] Der Präprozessor
        \item[3.2] Bibliotheken einbinden
        \item[3.3] Bibliotheken verwenden
        \vspace*{-0.1cm}
        \item[\dots]
%        \item[3.4] Projekt organisieren: make
      \end{itemize}
    \item[\textbf{\dots}]
%    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
%    \item[\textbf{5}] \textbf{Algorithmen}
%    \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke}
  \end{itemize}
  \vspace*{-1cm}

\end{frame}

\subsection{String-Operationen}

\begin{frame}[fragile]

  \showsubsection

  \begin{lstlisting}
    #include <stdio.h>

    int main (void)
    {
      char name[100];

      printf ("Ihr Name: ");
      fgets (name, 100, stdin);
      printf ("Hallo, %s!\n", name);

      return 0;
    }
  \end{lstlisting}
  \vspace*{-4.5cm}\strut\hfill
  \begin{minipage}{6cm}
    Probleme mit \lstinline{scanf ("%s", name)}:
    \begin{itemize}
      \item
        Leerzeichen beendet Eingabe
      \item
        keine Prüfung der Puffergröße
    \end{itemize}
  \end{minipage}

\end{frame}

\begin{frame}[fragile]

  \showsubsection

  \vspace*{-1.4\medskipamount}
  \vbox to 0pt{%
    \begin{lstlisting}[gobble=6]
      #include <stdio.h>
      #include <string.h>

      int main (void)
      {
        char hello[] = "Hello, world!\n";

        printf ("%s\n", hello);
        printf ("%zd\n", strlen (hello));

        printf ("%s\n", hello + 7);
        printf ("%zd\n", strlen (hello + 7));

        hello[5] = 0;
        printf ("%s\n", hello);
        printf ("%zd\n", strlen (hello));

        return 0;
      }
    \end{lstlisting}
    \vss
  }

  \pause
  \strut\hfill
  \begin{minipage}{5.5cm}
    \begin{itemize}
      \item
        \lstinline{strlen()} gibt die\\
        Länge eines Strings zurück.
      \item
        Es enthält eine Schleife.
      \pause
      \item
        Typ des Rückgabewerts:\\
        \lstinline{size_t} = ganze Zahl\\
        von der Größe eines Zeigers
      \item
        in \lstinline{printf()}: \lstinline{%zd} (\emph{si\textbf{z}e})
      \pause
      \bigskip
      \item
        Zeiger erhöhen:\\
        String vorne abschneiden
      \pause
      \item
        \lstinline{0}-Symbol (= Ende-Markierung)\\
        in den String schreiben:\\
        String hinten abschneiden
      \pause
      \item
        \textbf{Der für den String reservierte Speicherplatz bleibt derselbe!}
    \end{itemize}
  \end{minipage}

\end{frame}

\begin{frame}[fragile]

  \showsubsection

  \vspace*{-1.4\medskipamount}
  \vbox to 0pt{%
    \begin{lstlisting}[gobble=6]
      #include <stdio.h>
      #include <string.h>

      int main (void)
      {
        char *anton = "Anton";
        char *zacharias = "Zacharias";

        printf ("%d\n", strcmp (anton, zacharias));
        printf ("%d\n", strcmp (zacharias, anton));
        printf ("%d\n", strcmp (anton, anton));

        char buffer[100] = "Huber ";
        strcat (buffer, anton);
        printf ("%s\n", buffer);

        return 0;
      }
    \end{lstlisting}
    \vss
  }

  \pause
  \strut\hfill
  \begin{minipage}{5.5cm}
    \begin{itemize}
      \item
        \lstinline{strcmp()}: Strings vergleichen
      \item
        alphabetisch nach ASCII\\
        (Groß- $<$ Kleinbuchstaben,\\
        ohne Umlaute usw.)
      \item
        Rückgabewert:\\
        $-1$, wenn linker String kleiner,\\
        $+1$, wenn rechter String kleiner,\\
        $0$, wenn beide Strings gleich
      \pause
      \bigskip
      \item
        \lstinline{strcat()}: String anhängen\\
        (\emph{con\textbf{cat}enate})
      \pause
      \item
        \textbf{Ob der Speicherplatz reicht, wird nicht geprüft!}
    \end{itemize}
  \end{minipage}

\end{frame}

\begin{frame}[fragile]

  \showsubsection

  \vspace*{-1.4\medskipamount}
  \vbox to 0pt{%
    \begin{lstlisting}[gobble=6]
      #include <stdio.h>
      #include <string.h>

      int main (void)
      {
        char buffer[100] = "";
        sprintf (buffer, "Die Antwort lautet: %d", 42);
        printf ("%s\n", buffer);

        char *answer = strstr (buffer, "Antwort");
        printf ("%s\n", answer);
        printf ("found at: %zd\n", answer - buffer);

        return 0;
      }
    \end{lstlisting}
    \vss
  }

  \pause
  \strut\hfill
  \begin{minipage}{5.5cm}
    \begin{itemize}
      \item
        \lstinline{sprintf()}: in einen\\
        String schreiben
      \pause
      \item
        \textbf{Ob der Speicherplatz reicht, wird nicht geprüft!}
      \pause
      \vspace{4\bigskipamount}
      \item
        \lstinline{strstr()}: String in String suchen
      \item
        Rückgabewert: Zeiger auf den gefundenen String
      \item
        Index berechnen:\\
        Zeiger $-$ Zeiger $=$ Zahl\\
        von der Größe eines Zeigers
    \end{itemize}
  \end{minipage}

\end{frame}

\begin{frame}

  \showsection

  Sprachelemente weitgehend komplett

  \bigskip
  Es fehlen:
  \begin{itemize}
    \item
      Ergänzungen (z.\,B.\ ternärer Operator, \lstinline{union}, \lstinline{unsigned}, \lstinline{volatile})
    \item
      Bibliotheksfunktionen (z.\,B.\ \lstinline{malloc()})
    \arrowitem
      werden eingeführt, wenn wir sie brauchen
    \bigskip
    \item
      Konzepte (z.\,B.\ rekursive Datenstrukturen, Klassen selbst bauen)
    \arrowitem
      werden eingeführt, wenn wir sie brauchen, oder:
    \arrowitem
      Literatur\\[\smallskipamount]
      (z.\,B.\ Wikibooks: C-Programmierung,\\
      Dokumentation zu Compiler und Bibliotheken)
    \bigskip
    \item
      Praxiserfahrung
    \arrowitem
      Übung und Praktikum: nur Einstieg
    \arrowitem
      selbständig arbeiten
  \end{itemize}
\end{frame}

\nosectionnonumber{\inserttitle}

\begin{frame}

  \shownosectionnonumber

  \begin{itemize}
    \item[\textbf{1}] \textbf{Einführung}
      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp.git}}}
    \item[\textbf{2}] \textbf{Einführung in C}
      \begin{itemize}
%        \item[2.1] Hello, world!
        \vspace*{-0.1cm}
        \item[\dots]
        \item[2.10] Zeiger
        \item[2.11] Arrays und Strings
        \item[2.12] Strukturen
        \item[2.13] Dateien und Fehlerbehandlung
        \item[2.14] Parameter des Hauptprogramms
        \color{medgreen}
        \item[2.15] String-Operationen
      \end{itemize}
    \item[\textbf{3}] \textbf{Bibliotheken}
      \begin{itemize}
        \color{red}
        \item[3.1] Der Präprozessor
        \item[3.2] Bibliotheken einbinden
        \item[3.3] Bibliotheken verwenden
        \vspace*{-0.1cm}
        \item[\dots]
%        \item[3.4] Projekt organisieren: make
      \end{itemize}
    \item[\textbf{\dots}]
%    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
%    \item[\textbf{5}] \textbf{Algorithmen}
%    \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke}
  \end{itemize}
  \vspace*{-1cm}

\end{frame}

\end{document}

20181105/library-1.h

deleted100644 → 0
+0 −1
Original line number Diff line number Diff line
extern int schreib_doch_mal (const char *__restrict __format, ...);

20181105/library-2.h

deleted100644 → 0
+0 −1
Original line number Diff line number Diff line
extern int schreib_doch_mal (char *s);

20181105/screnshot-library-1.txt

deleted100644 → 0
+0 −20
Original line number Diff line number Diff line
cassini/home/peter/bo/2018ws/hp/20181105> cat hello-6.c
#include "library-1.h"

int main (void)
{
  schreib_doch_mal ("Hello, world!\n");
  return 0;
}
cassini/home/peter/bo/2018ws/hp/20181105> cat library-1.h
extern int schreib_doch_mal (const char *__restrict __format, ...);
cassini/home/peter/bo/2018ws/hp/20181105> cat library-1.c
#include <stdio.h>

void schreib_doch_mal (char *s)
{
  printf ("%s", s);
}
cassini/home/peter/bo/2018ws/hp/20181105> gcc -Wall -O hello-6.c library-1.c -o hello-6
cassini/home/peter/bo/2018ws/hp/20181105> ./hello-6
Hello, world!

20181105/string-ops-4.c

deleted100644 → 0
+0 −13
Original line number Diff line number Diff line
#include <stdio.h>
#include <string.h>

int main (void)
{
  char *test1 = "Dies ist ein Test.";
  char *test2 = "Dies ist ein Test.";
  if (test1 == test2)
    printf ("Die Strings sind gleich.\n");
  else
    printf ("Die Strings sind verschieden.\n");
  return 0;
}

20181105/string-ops-5.c

deleted100644 → 0
+0 −13
Original line number Diff line number Diff line
#include <stdio.h>
#include <string.h>

int main (void)
{
  char test1[] = "Dies ist ein Test.";
  char test2[] = "Dies ist ein Test.";
  if (test1 == test2)
    printf ("Die Strings sind gleich.\n");
  else
    printf ("Die Strings sind verschieden.\n");
  return 0;
}

20181105/string-ops-6.c

deleted100644 → 0
+0 −13
Original line number Diff line number Diff line
#include <stdio.h>
#include <string.h>

int main (void)
{
  char test1[] = "Dies ist ein Test.";
  char test2[] = "Dies ist ein Test.";
  if (strcmp (test1, test2) == 0)
    printf ("Die Strings sind gleich.\n");
  else
    printf ("Die Strings sind verschieden.\n");
  return 0;
}

20181105/string-ops-7.c

deleted100644 → 0
+0 −13
Original line number Diff line number Diff line
#include <stdio.h>
#include <string.h>

int main (void)
{
  char test1[] = "Dies ist ein Test.";
  char test2[] = "Dies ist ein Test.";
  if (!strcmp (test1, test2))
    printf ("Die Strings sind gleich.\n");
  else
    printf ("Die Strings sind verschieden.\n");
  return 0;
}

20181112/gtk-10.c

deleted100644 → 0
+0 −53
Original line number Diff line number Diff line
#include <gtk/gtk.h>

#define WIDTH 320
#define HEIGHT 240

double t = 0.0;

double x = 10;
double y = 200;
double vx = 20;
double vy = -60;
double g = 9.81;

gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
{
  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };

  gdk_cairo_set_source_rgba (c, &blue);
  cairo_rectangle (c, x + vx * t, y + vy * t + 0.5 * g * t * t, 10, 10);
  cairo_fill (c);

  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
                    FALSE to propagate the event further. */
}

gboolean timer (GtkWidget *widget)
{
  t += 0.05;
  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
  g_timeout_add (50, (GSourceFunc) timer, widget);
  return FALSE;
}

int main (int argc, char **argv)
{
  gtk_init (&argc, &argv);

  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_widget_show (window);
  gtk_window_set_title (GTK_WINDOW (window), "Hello");
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  GtkWidget *drawing_area = gtk_drawing_area_new ();
  gtk_widget_show (drawing_area);
  gtk_container_add (GTK_CONTAINER (window), drawing_area);
  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);

  g_timeout_add (50, (GSourceFunc) timer, drawing_area);

  gtk_main ();
  return 0;
}

20181112/gtk-11.c

deleted100644 → 0
+0 −57
Original line number Diff line number Diff line
#include <gtk/gtk.h>

#define WIDTH 320
#define HEIGHT 240

double t = 0.0;
double dt = 0.05;

double x = 10;
double y = 200;
double vx = 20;
double vy = -60;
double g = 9.81;

gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
{
  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };

  gdk_cairo_set_source_rgba (c, &blue);
  cairo_rectangle (c, x, y, 10, 10);
  cairo_fill (c);

  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
                    FALSE to propagate the event further. */
}

gboolean timer (GtkWidget *widget)
{
  t += dt;
  x += vx * dt;
  y += vy * dt;
  vy += g * dt;
  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
  g_timeout_add (50, (GSourceFunc) timer, widget);
  return FALSE;
}

int main (int argc, char **argv)
{
  gtk_init (&argc, &argv);

  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_widget_show (window);
  gtk_window_set_title (GTK_WINDOW (window), "Hello");
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  GtkWidget *drawing_area = gtk_drawing_area_new ();
  gtk_widget_show (drawing_area);
  gtk_container_add (GTK_CONTAINER (window), drawing_area);
  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);

  g_timeout_add (50, (GSourceFunc) timer, drawing_area);

  gtk_main ();
  return 0;
}

20181112/gtk-12.c

deleted100644 → 0
+0 −63
Original line number Diff line number Diff line
#include <gtk/gtk.h>

#define WIDTH 320
#define HEIGHT 240

double t = 0.0;
double dt = 0.05;

double x = 10;
double y = 200;
double vx = 20;
double vy = -60;
double g = 9.81;

gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
{
  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };

  gdk_cairo_set_source_rgba (c, &blue);
  cairo_rectangle (c, x, y, 10, 10);
  cairo_fill (c);

  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
                    FALSE to propagate the event further. */
}

gboolean timer (GtkWidget *widget)
{
  t += dt;
  x += vx * dt;
  y += vy * dt;
  vy += g * dt;
  if (y >= HEIGHT)
    vy = -vy;
  if (x >= WIDTH)
    vx = -vx;
  if (x <= 0)
    vx = -vx;
  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
  g_timeout_add (50, (GSourceFunc) timer, widget);
  return FALSE;
}

int main (int argc, char **argv)
{
  gtk_init (&argc, &argv);

  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_widget_show (window);
  gtk_window_set_title (GTK_WINDOW (window), "Hello");
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  GtkWidget *drawing_area = gtk_drawing_area_new ();
  gtk_widget_show (drawing_area);
  gtk_container_add (GTK_CONTAINER (window), drawing_area);
  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);

  g_timeout_add (50, (GSourceFunc) timer, drawing_area);

  gtk_main ();
  return 0;
}

20181112/gtk-13.c

deleted100644 → 0
+0 −65
Original line number Diff line number Diff line
#include <gtk/gtk.h>

#define WIDTH 320
#define HEIGHT 240

double t = 0.0;
double dt = 0.2;

int r = 5;

double x = 10;
double y = 200;
double vx = 20;
double vy = -60;
double g = 9.81;

gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
{
  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };

  gdk_cairo_set_source_rgba (c, &blue);
  cairo_arc (c, x, y, r, 0, 2 * G_PI);
  cairo_fill (c);

  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
                    FALSE to propagate the event further. */
}

gboolean timer (GtkWidget *widget)
{
  t += dt;
  x += vx * dt;
  y += vy * dt;
  vy += g * dt;
  if (y + r >= HEIGHT)
    vy = -vy * 0.9;
  if (x + r >= WIDTH)
    vx = -vx * 0.9;
  if (x - r <= 0)
    vx = -vx * 0.9;
  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
  g_timeout_add (50, (GSourceFunc) timer, widget);
  return FALSE;
}

int main (int argc, char **argv)
{
  gtk_init (&argc, &argv);

  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_widget_show (window);
  gtk_window_set_title (GTK_WINDOW (window), "Hello");
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  GtkWidget *drawing_area = gtk_drawing_area_new ();
  gtk_widget_show (drawing_area);
  gtk_container_add (GTK_CONTAINER (window), drawing_area);
  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);

  g_timeout_add (50, (GSourceFunc) timer, drawing_area);

  gtk_main ();
  return 0;
}

20181112/gtk-4a.c

deleted100644 → 0
+0 −18
Original line number Diff line number Diff line
#include <gtk/gtk.h>

int main (int argc, char **argv)
{
  gtk_init (&argc, &argv);

  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_widget_show (window);
  gtk_window_set_title (GTK_WINDOW (window), "Hello");
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  GtkWidget *drawing_area = gtk_drawing_area_new ();
  gtk_widget_show (drawing_area);
  gtk_container_add (GTK_CONTAINER (window), drawing_area);

  gtk_main ();
  return 0;
}

20181112/gtk-6c.c

deleted100644 → 0
+0 −48
Original line number Diff line number Diff line
#include <gtk/gtk.h>

#define WIDTH 320
#define HEIGHT 240

gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
{
  GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 };
  GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 };
  GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 };

  gdk_cairo_set_source_rgba (c, &red);
  cairo_rectangle (c, 10, 10, 60, 40);
  cairo_fill (c);

  gdk_cairo_set_source_rgba (c, &yellow);
  cairo_arc (c, 65, 50, 30, 0, 2 * G_PI);
  cairo_fill (c);

  gdk_cairo_set_source_rgba (c, &blue);
  cairo_move_to (c, 10, 70);
  cairo_line_to (c, 70, 70);
  cairo_line_to (c, 40, 18);
  cairo_close_path (c);
  cairo_fill (c);

  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
                    FALSE to propagate the event further. */
}

int main (int argc, char **argv)
{
  gtk_init (&argc, &argv);

  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_widget_show (window);
  gtk_window_set_title (GTK_WINDOW (window), "Hello");

  GtkWidget *drawing_area = gtk_drawing_area_new ();
  gtk_widget_show (drawing_area);
  gtk_container_add (GTK_CONTAINER (window), drawing_area);
  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
  g_signal_connect (drawing_area, "clicked", G_CALLBACK (gtk_main_quit), NULL);

  gtk_main ();
  return 0;
}

20181112/gtk-6e.c

deleted100644 → 0
+0 −48
Original line number Diff line number Diff line
#include <gtk/gtk.h>

#define WIDTH 320
#define HEIGHT 240

gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
{
  GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 };
  GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 };
  GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 };

  gdk_cairo_set_source_rgba (c, &red);
  cairo_rectangle (c, 10, 10, 60, 40);
  cairo_stroke (c);

  gdk_cairo_set_source_rgba (c, &yellow);
  cairo_arc (c, 65, 50, 30, 0, 2 * G_PI);
  cairo_stroke (c);

  gdk_cairo_set_source_rgba (c, &blue);
  cairo_move_to (c, 10, 70);
  cairo_line_to (c, 70, 70);
  cairo_line_to (c, 40, 18);
  cairo_close_path (c);
  cairo_stroke (c);

  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
                    FALSE to propagate the event further. */
}

int main (int argc, char **argv)
{
  gtk_init (&argc, &argv);

  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_widget_show (window);
  gtk_window_set_title (GTK_WINDOW (window), "Hello");
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  GtkWidget *drawing_area = gtk_drawing_area_new ();
  gtk_widget_show (drawing_area);
  gtk_container_add (GTK_CONTAINER (window), drawing_area);
  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);

  gtk_main ();
  return 0;
}

20181112/gtk-7.c

deleted100644 → 0
+0 −68
Original line number Diff line number Diff line
#include <gtk/gtk.h>

#define WIDTH 320
#define HEIGHT 240

double t = 0.0;

gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
{
  GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 };
  GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 };
  GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 };

  gdk_cairo_set_source_rgba (c, &red);
  cairo_rectangle (c, 10 + 40 * t, 10 + 30 * t, 60, 40);
  cairo_fill (c);

  gdk_cairo_set_source_rgba (c, &yellow);
  cairo_arc (c, 65, 50, 30, 0, 2 * G_PI);
  cairo_fill (c);

  gdk_cairo_set_source_rgba (c, &blue);
  cairo_move_to (c, 10, 70);
  cairo_line_to (c, 70, 70);
  cairo_line_to (c, 40, 18);
  cairo_close_path (c);
  cairo_fill (c);

  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
                    FALSE to propagate the event further. */
}

gboolean timer (GtkWidget *widget)
{
  t += 0.05;
  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
  g_timeout_add (50, (GSourceFunc) timer, widget);
  return FALSE;
}

int main (int argc, char **argv)
{
  gtk_init (&argc, &argv);
  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (window), "Hello");
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
  gtk_container_add (GTK_CONTAINER (window), vbox);

  GtkWidget *button = gtk_button_new_with_label ("Quit");
  g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
  gtk_container_add (GTK_CONTAINER (vbox), button);

  GtkWidget *drawing_area = gtk_drawing_area_new ();
  gtk_container_add (GTK_CONTAINER (vbox), drawing_area);
  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);

  g_timeout_add (50, (GSourceFunc) timer, drawing_area);

  gtk_widget_show (drawing_area);
  gtk_widget_show (button);
  gtk_widget_show (vbox);
  gtk_widget_show (window);
  gtk_main ();
  return 0;
}

20181112/gtk-7a.c

deleted100644 → 0
+0 −60
Original line number Diff line number Diff line
#include <gtk/gtk.h>

#define WIDTH 320
#define HEIGHT 240

double t = 0.0;

gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
{
  GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 };
  GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 };
  GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 };

  gdk_cairo_set_source_rgba (c, &red);
  cairo_rectangle (c, 10 + 40 * t, 10 + 30 * t, 60, 40);
  cairo_fill (c);

  gdk_cairo_set_source_rgba (c, &yellow);
  cairo_arc (c, 65, 50, 30, 0, 2 * G_PI);
  cairo_fill (c);

  gdk_cairo_set_source_rgba (c, &blue);
  cairo_move_to (c, 10, 70);
  cairo_line_to (c, 70, 70);
  cairo_line_to (c, 40, 18);
  cairo_close_path (c);
  cairo_fill (c);

  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
                    FALSE to propagate the event further. */
}

gboolean timer (GtkWidget *widget)
{
  t += 0.05;
  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
  g_timeout_add (50, (GSourceFunc) timer, widget);
  return FALSE;
}

int main (int argc, char **argv)
{
  gtk_init (&argc, &argv);

  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_widget_show (window);
  gtk_window_set_title (GTK_WINDOW (window), "Hello");
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  GtkWidget *drawing_area = gtk_drawing_area_new ();
  gtk_widget_show (drawing_area);
  gtk_container_add (GTK_CONTAINER (window), drawing_area);
  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);

  g_timeout_add (50, (GSourceFunc) timer, drawing_area);

  gtk_main ();
  return 0;
}

20181112/gtk-7b.c

deleted100644 → 0
+0 −61
Original line number Diff line number Diff line
#include <gtk/gtk.h>

#define WIDTH 320
#define HEIGHT 240

double t = 0.0;

gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
{
  t += 0.05;

  GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 };
  GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 };
  GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 };

  gdk_cairo_set_source_rgba (c, &red);
  cairo_rectangle (c, 10 + 40 * t, 10 + 30 * t, 60, 40);
  cairo_fill (c);

  gdk_cairo_set_source_rgba (c, &yellow);
  cairo_arc (c, 65, 50, 30, 0, 2 * G_PI);
  cairo_fill (c);

  gdk_cairo_set_source_rgba (c, &blue);
  cairo_move_to (c, 10, 70);
  cairo_line_to (c, 70, 70);
  cairo_line_to (c, 40, 18);
  cairo_close_path (c);
  cairo_fill (c);

  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
                    FALSE to propagate the event further. */
}

gboolean timer (GtkWidget *widget)
{
  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
  g_timeout_add (50, (GSourceFunc) timer, widget);
  return FALSE;
}

int main (int argc, char **argv)
{
  gtk_init (&argc, &argv);

  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_widget_show (window);
  gtk_window_set_title (GTK_WINDOW (window), "Hello");
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  GtkWidget *drawing_area = gtk_drawing_area_new ();
  gtk_widget_show (drawing_area);
  gtk_container_add (GTK_CONTAINER (window), drawing_area);
  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);

  g_timeout_add (50, (GSourceFunc) timer, drawing_area);

  gtk_main ();
  return 0;
}

20181112/gtk-8.c

deleted100644 → 0
+0 −50
Original line number Diff line number Diff line
#include <gtk/gtk.h>

#define WIDTH 320
#define HEIGHT 240

double t = 0.0;

double vx = 40;
double vy = 30;

gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
{
  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };

  gdk_cairo_set_source_rgba (c, &blue);
  cairo_rectangle (c, 10 + vx * t, 10 + vy * t, 10, 10);
  cairo_fill (c);

  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
                    FALSE to propagate the event further. */
}

gboolean timer (GtkWidget *widget)
{
  t += 0.05;
  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
  g_timeout_add (50, (GSourceFunc) timer, widget);
  return FALSE;
}

int main (int argc, char **argv)
{
  gtk_init (&argc, &argv);

  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_widget_show (window);
  gtk_window_set_title (GTK_WINDOW (window), "Hello");
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  GtkWidget *drawing_area = gtk_drawing_area_new ();
  gtk_widget_show (drawing_area);
  gtk_container_add (GTK_CONTAINER (window), drawing_area);
  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);

  g_timeout_add (50, (GSourceFunc) timer, drawing_area);

  gtk_main ();
  return 0;
}

20181112/gtk-9.c

deleted100644 → 0
+0 −53
Original line number Diff line number Diff line
#include <gtk/gtk.h>

#define WIDTH 320
#define HEIGHT 240

double t = 0.0;

double x = 10;
double y = 10;
double vx = 40;
double vy = 30;
double g = 9.81;

gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
{
  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };

  gdk_cairo_set_source_rgba (c, &blue);
  cairo_rectangle (c, x + vx * t, y + vy * t - 0.5 * g * t * t, 10, 10);
  cairo_fill (c);

  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
                    FALSE to propagate the event further. */
}

gboolean timer (GtkWidget *widget)
{
  t += 0.05;
  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
  g_timeout_add (50, (GSourceFunc) timer, widget);
  return FALSE;
}

int main (int argc, char **argv)
{
  gtk_init (&argc, &argv);

  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_widget_show (window);
  gtk_window_set_title (GTK_WINDOW (window), "Hello");
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  GtkWidget *drawing_area = gtk_drawing_area_new ();
  gtk_widget_show (drawing_area);
  gtk_container_add (GTK_CONTAINER (window), drawing_area);
  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);

  g_timeout_add (50, (GSourceFunc) timer, drawing_area);

  gtk_main ();
  return 0;
}

20181112/hp-20181112.tex

deleted100644 → 0
+0 −330
Original line number Diff line number Diff line
% hp-20181112.pdf - Lecture Slides on Low-Level Programming
% Copyright (C) 2012, 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: Einführung: Bibliotheken, Differentialgleichungen

\documentclass[10pt,t]{beamer}

\usepackage{pgslides}
\usepackage{pdftricks}
\usepackage{tikz}

\begin{psinputs}
  \usepackage[utf8]{inputenc}
  \usepackage[german]{babel}
  \usepackage[T1]{fontenc}
  \usepackage{helvet}
  \renewcommand*\familydefault{\sfdefault}
  \usepackage{pstricks,pst-grad}
\end{psinputs}

\title{Hardwarenahe Programmierung}
\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
\date{12.\ November 2018}

\begin{document}

\maketitleframe

\nosectionnonumber{\inserttitle}

\begin{frame}

  \shownosectionnonumber

  \begin{itemize}
    \item[\textbf{1}] \textbf{Einführung}
      \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp.git}}}
    \item[\textbf{2}] \textbf{Einführung in C}
      \begin{itemize}
%        \item[2.1] Hello, world!
        \vspace*{-0.1cm}
        \item[\dots]
        \item[2.13] Dateien und Fehlerbehandlung
        \item[2.14] Parameter des Hauptprogramms
        \color{medgreen}
        \item[2.15] String-Operationen
      \end{itemize}
    \item[\textbf{3}] \textbf{Bibliotheken}
      \begin{itemize}
        \color{medgreen}
        \item[3.1] Der Präprozessor
        \item[3.2] Bibliotheken einbinden
        \color{orange}
        \item[3.3] Bibliotheken verwenden
        \vspace*{-0.1cm}
        \item[\dots]
%        \item[3.4] Projekt organisieren: make
      \end{itemize}
    \item[\textbf{\dots}]
%    \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
%    \item[\textbf{5}] \textbf{Algorithmen}
%    \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke}
  \end{itemize}
  \vspace*{-1cm}

\end{frame}

\setcounter{section}{1}
\section{Einführung in C}

\setcounter{subsection}{14}
\subsection{String-Operationen}

\begin{frame}[fragile]

  \showsubsection

  \begin{lstlisting}
    #include <stdio.h>

    int main (void)
    {
      char name[100];

      printf ("Ihr Name: ");
      fgets (name, 100, stdin);
      printf ("Hallo, %s!\n", name);

      return 0;
    }
  \end{lstlisting}
  \vspace*{-4.5cm}\strut\hfill
  \begin{minipage}{6cm}
    Probleme mit \lstinline{scanf ("%s", name)}:
    \begin{itemize}
      \item
        Leerzeichen beendet Eingabe
      \item
        keine Prüfung der Puffergröße
    \end{itemize}
  \end{minipage}

\end{frame}

\begin{frame}[fragile]

  \showsubsection

  \vspace*{-1.4\medskipamount}
  \vbox to 0pt{%
    \begin{lstlisting}[gobble=6]
      #include <stdio.h>
      #include <string.h>

      int main (void)
      {
        char hello[] = "Hello, world!\n";

        printf ("%s\n", hello);
        printf ("%zd\n", strlen (hello));

        printf ("%s\n", hello + 7);
        printf ("%zd\n", strlen (hello + 7));

        hello[5] = 0;
        printf ("%s\n", hello);
        printf ("%zd\n", strlen (hello));

        return 0;
      }
    \end{lstlisting}
    \vss
  }

%  \pause
  \strut\hfill
  \begin{minipage}{5.5cm}
    \begin{itemize}
      \item
        \lstinline{strlen()} gibt die\\
        Länge eines Strings zurück.
      \item
        Es enthält eine Schleife.
%      \pause
      \item
        Typ des Rückgabewerts:\\
        \lstinline{size_t} = ganze Zahl\\
        von der Größe eines Zeigers
      \item
        in \lstinline{printf()}: \lstinline{%zd} (\emph{si\textbf{z}e})
%      \pause
      \bigskip
      \item
        Zeiger erhöhen:\\
        String vorne abschneiden
%      \pause
      \item
        \lstinline{0}-Symbol (= Ende-Markierung)\\
        in den String schreiben:\\
        String hinten abschneiden
%      \pause
      \item
        \textbf{Der für den String reservierte Speicherplatz bleibt derselbe!}
    \end{itemize}
  \end{minipage}

\end{frame}

\begin{frame}[fragile]

  \showsubsection

  \vspace*{-1.4\medskipamount}
  \vbox to 0pt{%
    \begin{lstlisting}[gobble=6]
      #include <stdio.h>
      #include <string.h>

      int main (void)
      {
        char *anton = "Anton";
        char *zacharias = "Zacharias";

        printf ("%d\n", strcmp (anton, zacharias));
        printf ("%d\n", strcmp (zacharias, anton));
        printf ("%d\n", strcmp (anton, anton));

        char buffer[100] = "Huber ";
        strcat (buffer, anton);
        printf ("%s\n", buffer);

        return 0;
      }
    \end{lstlisting}
    \vss
  }

%  \pause
  \strut\hfill
  \begin{minipage}{5.5cm}
    \begin{itemize}
      \item
        \lstinline{strcmp()}: Strings vergleichen
      \item
        alphabetisch nach ASCII\\
        (Groß- $<$ Kleinbuchstaben,\\
        ohne Umlaute usw.)
      \item
        Rückgabewert:\\
        $-1$, wenn linker String kleiner,\\
        $+1$, wenn rechter String kleiner,\\
        $0$, wenn beide Strings gleich
%      \pause
      \bigskip
      \item
        \lstinline{strcat()}: String anhängen\\
        (\emph{con\textbf{cat}enate})
%      \pause
      \item
        \textbf{Ob der Speicherplatz reicht, wird nicht geprüft!}
    \end{itemize}
  \end{minipage}

\end{frame}

\begin{frame}[fragile]

  \showsubsection

  \vspace*{-1.4\medskipamount}
  \vbox to 0pt{%
    \begin{lstlisting}[gobble=6]
      #include <stdio.h>
      #include <string.h>

      int main (void)
      {
        char buffer[100] = "";
        sprintf (buffer, "Die Antwort lautet: %d", 42);
        printf ("%s\n", buffer);

        char *answer = strstr (buffer, "Antwort");
        printf ("%s\n", answer);
        printf ("found at: %zd\n", answer - buffer);

        return 0;
      }
    \end{lstlisting}
    \vss
  }

%  \pause
  \strut\hfill
  \begin{minipage}{5.5cm}
    \begin{itemize}
      \item
        \lstinline{sprintf()}: in einen\\
        String schreiben
%      \pause
      \item
        \textbf{Ob der Speicherplatz reicht, wird nicht geprüft!}
%      \pause
      \vspace{4\bigskipamount}
      \item
        \lstinline{strstr()}: String in String suchen
      \item
        Rückgabewert: Zeiger auf den gefundenen String
      \item
        Index berechnen:\\
        Zeiger $-$ Zeiger $=$ Zahl\\
        von der Größe eines Zeigers
    \end{itemize}
  \end{minipage}

\end{frame}

\begin{frame}

  \showsection

  Sprachelemente weitgehend komplett

  \bigskip
  Es fehlen:
  \begin{itemize}
    \item
      Ergänzungen (z.\,B.\ ternärer Operator, \lstinline{union}, \lstinline{unsigned}, \lstinline{volatile})
    \item
      Bibliotheksfunktionen (z.\,B.\ \lstinline{malloc()})
    \arrowitem
      werden eingeführt, wenn wir sie brauchen
    \bigskip
    \item
      Konzepte (z.\,B.\ rekursive Datenstrukturen, Klassen selbst bauen)
    \arrowitem
      werden eingeführt, wenn wir sie brauchen, oder:
    \arrowitem
      Literatur\\[\smallskipamount]
      (z.\,B.\ Wikibooks: C-Programmierung,\\
      Dokumentation zu Compiler und Bibliotheken)
    \bigskip
    \item
      Praxiserfahrung
    \arrowitem
      Übung und Praktikum: nur Einstieg
    \arrowitem
      selbständig arbeiten
  \end{itemize}
\end{frame}

\end{document}
+0 −219
Original line number Diff line number Diff line
% hp-musterloesung-20181112.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: Text-Grafik-Bibliothek, Datum-Bibliothek, Kondensator

\documentclass[a4paper]{article}

\usepackage{pgscript}
\usepackage{gnuplot-lua-tikz}

\begin{document}

  \section*{Hardwarenahe Programmierung\\
            Musterlösung zu den Übungsaufgaben -- 12.\ November 2018}

  \exercise{Text-Grafik-Bibliothek}

  Schreiben Sie eine Bibliothek für "`Text-Grafik"' mit folgenden Funktionen:\vspace*{-\medskipamount}
  \begin{itemize}
    \item
      \lstinline|void clear (char c)|\\
      Bildschirm auf Zeichen \lstinline|c| löschen,\\
      also komplett mit diesem Zeichen (z.\,B.: Leerzeichen) füllen
    \item
      \lstinline|void put_point (int x, int y, char c)|\\
      Punkt setzen (z.\,B.\ einen Stern (\lstinline{*}) an die Stelle $(x,y)$ "`malen"')
    \item
      \lstinline|char get_point (int x, int y)|\\
      Punkt lesen
%    \item
%      \lstinline|void fill (int x, int y, char c, char o)|\\
%      Fläche in der "`Farbe"' \lstinline|o|,
%      die den Punkt \lstinline|(x, y)| enthält,
%      mit der "`Farbe"' \lstinline|c| ausmalen
    \item
      \lstinline|void display (void)|\\
      das Gezeichnete auf dem Bildschirm ausgeben
  \end{itemize}

  Hinweise:\vspace*{-\medskipamount}
  \begin{itemize}
    \item
      Eine C-Bibliothek besteht aus (mindestens)
      einer \file{.h}-Datei und einer \file{.c}-Datei.
    \item
      Verwenden Sie ein Array als "`Bildschirm"'.

      Vor dem Aufruf der Funktion \lstinline|display()| ist nichts zu sehen;\\
      alle Grafikoperationen erfolgen auf dem Array.
    \item
      Verwenden Sie Präprozessor-Konstante,
      z.\,B.\ \lstinline{WIDTH} und \lstinline{HEIGHT},\\
      um Höhe und Breite des "`Bildschirms"' festzulegen:
      \begin{lstlisting}[gobble=8]
        #define WIDTH 72
        #define HEIGHT 24
      \end{lstlisting}
    \item
     Schreiben Sie zusätzlich ein Test-Programm,
     das alle Funktionen der Bibliothek benutzt,\\
     um ein hübsches Bild (z.\,B.\ ein stilisiertes Gesicht -- "`Smiley"')
     auszugeben.
  \end{itemize}

  \solution

  Siehe die Dateien \gitfile{hp}{20181112}{textgraph.c} und \gitfile{hp}{20181112}{textgraph.h} (Bibliothek)
  sowie \gitfile{20181112}{test-textgraph.c} (Test-Programm).

  Diese Lösung erfüllt zusätzlich die Aufgabe,
  bei fehlerhafter Benutzung (Koordinaten außerhalb des Zeichenbereichs)
  eine sinnvolle Fehlermeldung auszugeben,
  anstatt unkontrolliert Speicher zu überschreiben und abzustürzen.

  Das Schlüsselwort \lstinline{static}
  bei der Deklaration der Funktion \lstinline{check_coordinates()}
  bedeutet, daß diese Funktion nur lokal (d.\,h.\ innerhalb der Bibliothek)
  verwendet und insbesondere nicht nach außen
  (d.\,h.\ für die Benutzung durch das Hauptprogramm) exportiert wird.
  Dies dient dazu, nicht unnötig Bezeichner zu reservieren
  (Vermeidung von "`Namensraumverschmutzung"').

  Man beachte die Verwendung einfacher Anführungszeichen (Apostrophe)
  bei der Angabe von \lstinline{char}-Kon"-stanten (\lstinline{'*'})
  im Gegensatz zur Verwendung doppelter Anführungszeichen
  bei der Angabe von String-Konstanten
  (String = Array von \lstinline{char}s, abgeschlossen mit Null-Symbol).
  Um das einfache Anführungszeichen selbst als \lstinline{char}-Konstante anzugeben,
  ist ein vorangestellter Backslash erforderlich: \lstinline{'\''} ("`Escape-Sequenz"').
  Entsprechendes gilt für die Verwendung doppelter Anführungszeichen
  innerhalb von String-Konstanten:
  \lstinline{printf ("Your name is: \"%s\"", name);}

  \clearpage

  \exercise{Datum-Bibliothek}

  Zerlegen Sie die Datum-Bibliothek aus der Übungsaufgabe 3 vom 29.\,10.\,2018
  in eine \file{.c}- und eine \file{.h}-Datei.

  Hinweis: Schreiben Sie auch hierfür zusätzlich ein Test-Programm.

  \solution

  Die Dateien \gitfile{hp}{20181112}{dates.c} und \gitfile{hp}{20181112}{dates.h} enthalten die Bibliothek,
  die Datei \gitfile{hp}{20181112}{test-dates.c} ein Programm zum Testen der Bibliothek.

  \exercise{Kondensator}

  Ein Kondensator der Kapazität $C = 100\,\mu{\rm F}$
  ist auf die Spannung $U = 5\,{\rm V}$ aufgeladen
  und wird über einen Widerstand $R = 33\,{\rm k}\Omega$ entladen.
  \begin{enumerate}[(a)]
    \item
      Stellen Sie den zeitlichen Spannungsverlauf in einer Tabelle dar.
    \item
      Wie lange dauert es, bis die Spannung unter $0.1\,{\rm V}$ gefallen ist?
    \item
      Vergleichen Sie die berechneten Werte mit der exakten theoretischen Entladekurve:
      \begin{math}
        U(t) = U_0 \cdot e^{-\frac{t}{RC}}
      \end{math}
  \end{enumerate}

  Hinweise:
  \begin{itemize}
    \item
      Für die Simulation zerlegen wir den Entladevorgang in kurze Zeitintervalle $dt$.
      Innerhalb jedes Zeitintervalls betrachten wir den Strom $I$ als konstant
      und berechnen, wieviel Ladung $Q$ innerhalb des Zeitintervalls
      aus dem Kondensator herausfließt.
      Aus der neuen Ladung berechnen wir die Spannung am Ende des Zeitintervalls.
    \item
      Für den Vergleich mit der exakten theoretischen Entladekurve
      benötigen Sie die Exponentialfunktion \lstinline{exp()}.
      Diese finden Sie in der Mathematik-Bibliothek:
      \lstinline{#include <math.h>} im Quelltext,
      beim \lstinline[style=cmd]{gcc}-Aufruf \lstinline[style=cmd]{-lm} mit angeben.
    \item
      $Q = C \cdot U$,\quad $U = R \cdot I$,\quad $I = \frac{dQ}{dt}$
  \end{itemize}

  \solution

  In dem Programm \gitfile{hp}{20181112}{loesung-3.c}
  arbeiten wir, dem ersten Hinweis folgend,
  mit einem Zeitintervall von \lstinline{dt = 0.01}.
  Mit dieser Schrittweite lassen wir uns eine Tabelle ausgeben,
  die jeweils die Zeit, die durch die Simulation berechnete Spannung
  und die Spannung $U_0 \cdot e^{-\frac{t}{RC}}$
  gemäß der theoretischen Entladekurve ausgibt.

  Wir simulieren, wie die Ladung $Q = C \cdot U$ des Kondensators
  im Laufe der Zeit abfließt.
  Dazu berechnen wir in jedem Zeitschritt zunächst den Strom $I = U / R$,
  der aus dem Kondensator fließt.
  Dieser Strom bewirkt, daß innerhalb des Zeitintervalls $dt$
  die Ladung $dQ = I \cdot dt$ aus dem Kondensator abfließt.
  Am Ende des Zeitintervalls berechnen wir die zur neuen Ladung $Q$
  gehörende neue Spannung $U = Q / C$.

  Für eine einfache Ausgabe der Tabelle
  verwenden wir dreimal die Formatspezifikation \lstinline{%10.3lf}.
  Damit schreiben wir jeweils eine \emph{lange Fließkommazahl\/} (\lstinline{%lf})
  rechtsbündig in ein Feld der Breite 10 und lassen uns 3 Nachkommastellen ausgeben. 

  Wir compilieren das Programm mit:
  \lstinline[style=cmd]{gcc -Wall -O loesung-3.c -lm -o loesung-3}\\
  (Man beachte das \lstinline[style=cmd]{-lm}\hspace{1pt}
  für das Einbinden der Mathematik-Bibliothek.)

  Der Tabelle entnehmen wir dann, daß die Spannung bei etwa $t = 12.91\,{\rm s}$
  den Wert $0.1\,{\rm V}$ unterschreitet.

  Ebenfalls der Tabelle können wir entnehmen,
  daß die durch die Simulation berechnete Spannung
  mit der Spannung $U_0 \cdot e^{-\frac{t}{RC}}$
  gemäß der theoretischen Entladekurve
  bis auf wenige Prozent übereinstimmt.
  Dies ist für viele praktische Anwendungen ausreichend,
  wenn auch nicht für Präzisionsmessungen.

  \goodbreak

  Wenn Sie die Ausgabe des Programms, z.\,B.\ mit
  \lstinline{./loesung-3 > loesung-3.dat},
  in einer Datei \gitfile{hp}{20181112}{loesung-3.dat} speichern,
  können Sie sich die beiden Kurven graphisch darstellen lassen,
  z.\,B.\ mit \file{gnuplot} und dem folgenden Befehl:\,
  \lstinline[style=cmd]{plot "loesung-3.dat" using 1:2 with lines title "Simulation",}
  \lstinline[style=cmd]{"loesung-3.dat" using 1:3 with lines title "Theorie"}

  \begin{center}
    \input{loesung-3.tikz}
  \end{center}

  Der Unterschied zwischen der simulierten und der theoretischen Entladungskurve
  ist mit bloßem Auge nicht sichtbar.

\end{document}

20181112/hp-uebung-20181112.tex

deleted100644 → 0
+0 −132
Original line number Diff line number Diff line
% hp-uebung-20181112.pdf - 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: Text-Grafik-Bibliothek, Datum-Bibliothek, Kondensator

\documentclass[a4paper]{article}

\usepackage{pgscript}

\begin{document}

  \thispagestyle{empty}

  \section*{Hardwarenahe Programmierung\\
            Übungsaufgaben -- 12.\ November 2018}

%  Diese Übung enthält Punkteangaben wie in einer Klausur.
%  Um zu "`bestehen"', müssen Sie innerhalb von 80 Minuten
%  unter Verwendung ausschließlich zugelassener Hilfsmittel
%  14 Punkte (von insgesamt \totalpoints) erreichen.

  \exercise{Text-Grafik-Bibliothek}

  Schreiben Sie eine Bibliothek für "`Text-Grafik"' mit folgenden Funktionen:\vspace*{-\medskipamount}
  \begin{itemize}
    \item
      \lstinline|void clear (char c)|\\
      Bildschirm auf Zeichen \lstinline|c| löschen,\\
      also komplett mit diesem Zeichen (z.\,B.: Leerzeichen) füllen
    \item
      \lstinline|void put_point (int x, int y, char c)|\\
      Punkt setzen (z.\,B.\ einen Stern (\lstinline{*}) an die Stelle $(x,y)$ "`malen"')
    \item
      \lstinline|char get_point (int x, int y)|\\
      Punkt lesen
%    \item
%      \lstinline|void fill (int x, int y, char c, char o)|\\
%      Fläche in der "`Farbe"' \lstinline|o|,
%      die den Punkt \lstinline|(x, y)| enthält,
%      mit der "`Farbe"' \lstinline|c| ausmalen
    \item
      \lstinline|void display (void)|\\
      das Gezeichnete auf dem Bildschirm ausgeben
  \end{itemize}

  Hinweise:\vspace*{-\medskipamount}
  \begin{itemize}
    \item
      Eine C-Bibliothek besteht aus (mindestens)
      einer \file{.h}-Datei und einer \file{.c}-Datei.
    \item
      Verwenden Sie ein Array als "`Bildschirm"'.

      Vor dem Aufruf der Funktion \lstinline|display()| ist nichts zu sehen;\\
      alle Grafikoperationen erfolgen auf dem Array.
    \item
      Verwenden Sie Präprozessor-Konstante,
      z.\,B.\ \lstinline{WIDTH} und \lstinline{HEIGHT},\\
      um Höhe und Breite des "`Bildschirms"' festzulegen:
      \begin{lstlisting}[gobble=8]
        #define WIDTH 72
        #define HEIGHT 24
      \end{lstlisting}
    \item
     Schreiben Sie zusätzlich ein Test-Programm,
     das alle Funktionen der Bibliothek benutzt,\\
     um ein hübsches Bild (z.\,B.\ ein stilisiertes Gesicht -- "`Smiley"')
     auszugeben.
  \end{itemize}

  \exercise{Datum-Bibliothek}

  Zerlegen Sie die Datum-Bibliothek aus der Übungsaufgabe 3 vom 29.\,10.\,2018
  in eine \file{.c}- und eine \file{.h}-Datei.

  Hinweis: Schreiben Sie auch hierfür zusätzlich ein Test-Programm.

  \exercise{Kondensator}

  Ein Kondensator der Kapazität $C = 100\,\mu{\rm F}$
  ist auf die Spannung $U = 5\,{\rm V}$ aufgeladen
  und wird über einen Widerstand $R = 33\,{\rm k}\Omega$ entladen.
  \begin{enumerate}[(a)]
    \item
      Stellen Sie den zeitlichen Spannungsverlauf in einer Tabelle dar.
    \item
      Wie lange dauert es, bis die Spannung unter $0.1\,{\rm V}$ gefallen ist?
    \item
      Vergleichen Sie die berechneten Werte mit der exakten theoretischen Entladekurve:
      \begin{math}
        U(t) = U_0 \cdot e^{-\frac{t}{RC}}
      \end{math}
  \end{enumerate}

  Hinweise:
  \begin{itemize}
    \item
      Für die Simulation zerlegen wir den Entladevorgang in kurze Zeitintervalle $dt$.
      Innerhalb jedes Zeitintervalls betrachten wir den Strom $I$ als konstant
      und berechnen, wieviel Ladung $Q$ innerhalb des Zeitintervalls
      aus dem Kondensator herausfließt.
      Aus der neuen Ladung berechnen wir die Spannung am Ende des Zeitintervalls.
    \item
      Für den Vergleich mit der exakten theoretischen Entladekurve
      benötigen Sie die Exponentialfunktion \lstinline{exp()}.
      Diese finden Sie in der Mathematik-Bibliothek:
      \lstinline{#include <math.h>} im Quelltext,
      beim \lstinline[style=cmd]{gcc}-Aufruf \lstinline[style=cmd]{-lm} mit angeben.
    \item
      $Q = C \cdot U$,\quad $U = R \cdot I$,\quad $I = \frac{dQ}{dt}$
  \end{itemize}

\end{document}

20181112/loesung-3.dat

deleted100644 → 0
+0 −1324

File deleted.

Preview size limit exceeded, changes collapsed.

+0 −1
Original line number Diff line number Diff line
README: Differentialgleichung für gleichförmige und gleichmäßig beschleunigte Bewegung

20181119/higher-math-5.c

deleted100644 → 0
+0 −9
Original line number Diff line number Diff line
#include <stdio.h>

#define VIER (2 + 2)

int main (void)
{
  printf ("3 * 4 = %d\n", 3 * VIER);
  return 0;
}

20181119/hp-20181119.tex

deleted100644 → 0
+0 −592

File deleted.

Preview size limit exceeded, changes collapsed.

20181119/hp-uebung-20181119.tex

deleted100644 → 0
+0 −229
Original line number Diff line number Diff line
% hp-uebung-20181119.pdf - 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: Arrays mit Zahlen, hüpfender Ball

\documentclass[a4paper]{article}

\usepackage{pgscript}

\begin{document}

%  \thispagestyle{empty}

  \section*{Hardwarenahe Programmierung\\
            Übungsaufgaben -- 19.\ November 2018}

  Diese Übung enthält Punkteangaben wie in einer Klausur.
  Um zu "`bestehen"', müssen Sie innerhalb von 60 Minuten
  unter Verwendung ausschließlich zugelassener Hilfsmittel
  10 Punkte (von insgesamt \totalpoints) erreichen.

  \exercise{Arrays mit Zahlen}

  \begin{minipage}[t]{0.5\textwidth}
    Wir betrachten das folgende Programm\\
    (Datei: \gitfile{hp}{20181119}{aufgabe-1.c}):
    \begin{lstlisting}[gobble=6]
      #include <stdio.h>

      void f (int *s0, int *s1)
      {
        while (*s0 >= 0)
        {
          int *s = s1;
          while (*s >= 0)
            if (*s0 == *s++)
              printf ("%d ", *s0);
          s0++;
        }
        printf ("\n");
      }

      int main (void)
      {
        int a[] = { 10, 4, 3, 7, 12, 0, 1, -1 };
        int b[] = { 7, 14, 0, 8, 9, 22, 10, -1 };
        f (a, b);
        return 0;
      }
    \end{lstlisting}
  \end{minipage}\hfill
  \begin{minipage}[t]{0.5\textwidth}
    \vspace*{-\bigskipamount}
    \begin{enumerate}[\quad(a)]
      \item
        Was bewirkt die Funktion \lstinline{f},\\
        und wie funktioniert sie?
        \points{4}
%      \item
%        Von welcher Ordnung (Landau-Symbol) ist die Funktion und warum?
%
%        Wir beziehen uns hierbei auf die Anzahl der Vergleiche
%        in Abhängigkeit von der Länge der Eingabedaten \lstinline{s0} und \lstinline{s1}.
%        Für die Rechnung dürfen Sie beide Längen mit $n$ gleichsetzen,
%        obwohl sie normalerweise nicht gleich sind.
%        \points{2}
      \item
        Was passiert, wenn Sie beim Aufruf der Funktion für einen der
        Parameter den Wert \lstinline{NULL} übergeben und warum?
        \points{2}
      \item
        Was kann passieren, wenn Sie das Hauptprogramm wie folgt abändern
        (\gitfile{hp}{20181119}{aufgabe-1d.c}) und warum?
        \begin{lstlisting}[gobble=8]
          int main (void)
          {
            int a[] = { 10, 4, 3, 7, 12, 0, 1 };
            int b[] = { 7, 14, 0, 8, 9, 22, 10 };
            f (a, b);
            return 0;
          }
        \end{lstlisting}
        \points{2}
%      \item
%        Beschreiben Sie -- in Worten und/oder als C-Quelltext --, wie
%        sich die Funktion \lstinline{f} effizienter gestalten läßt,
%        wenn man die ihr übergebenen Arrays \lstinline{s0} und
%        \lstinline{s1} als sortiert voraussetzt.
%        \points{5}
%
%        Hinweis: Wie würden Sie als Mensch die Aufgabe erledigen?
%      \item
%        Von welcher
%        Ordnung (Landau-Symbol) ist Ihre effizientere Version der Funktion und warum?
%        \points{2}
    \end{enumerate}
  \end{minipage}

  \exercise{Fehlerhaftes Programm: Hüpfender Ball}

  Das auf der nächsten Seite abgedruckte GTK+-Programm
  (Datei: \gitfile{hp}{20181119}{aufgabe-2.c}) soll einen
  hüpfenden Ball darstellen, ist jedoch fehlerhaft.

  \begin{enumerate}[\quad(a)]
    \item
      Warum sieht man lediglich ein leeres Fenster?
      Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben?
      \points{3}
    \item
      Nach der Fehlerbehebung in Aufgabenteil (a)
      zeigt das Programm einen unbeweglichen Ball.
      Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben, und warum?
      \points{2}
    \item
      Erklären Sie das merkwürdige Hüpfverhalten des Balls.
      Wie kommt es zustande?
      Was an diesem Verhalten ist korrekt, und was ist fehlerhaft? \points{5}
    \item
      Welche Befehle muß man in welcher Weise ändern,
      um ein realistischeres Hüpf-Verhalten zu bekommen? \points{2}
  \end{enumerate}

  Hinweis: Das Hinzuziehen von Beispiel-Programmen aus der Vorlesung
  ist ausdrücklich erlaubt -- auch in der Klausur.

  Allgemeiner Hinweis:
  Wenn Sie die Übungsaufgaben zu dieser Lehrveranstaltung
  als PDF-Datei betrachten und darin auf die Dateinamen klicken,
  können Sie die Beispiel-Programme direkt herunterladen.
  Dadurch vermeiden Sie Übertragungsfehler.

  \bigskip

  \begin{flushright}
    \textit{Viel Erfolg!}
  \end{flushright}

  \clearpage

  \vbox to \textheight{\vspace*{-0.5cm}\begin{lstlisting}
    #include <gtk/gtk.h>

    #define WIDTH 320
    #define HEIGHT 240

    double t = 0.0;
    double dt = 0.2;

    int r = 5;

    double x = 10;
    double y = 200;
    double vx = 20;
    double vy = -60;
    double g = 9.81;

    gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
    {
      GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };

      gdk_cairo_set_source_rgba (c, &blue);
      cairo_arc (c, x, y, r, 0, 2 * G_PI);
      cairo_fill (c);

      return FALSE;
    }

    gboolean timer (GtkWidget *widget)
    {
      t += dt;
      x += vx * dt;
      y += vy * dt;
      vx = vx;
      vy = 0.5 * g * (t * t);
      if (y + r >= HEIGHT)
        vy = -vy * 0.9;
      if (x + r >= WIDTH)
        vx = -vx * 0.9;
      if (x - r <= 0)
        vx = -vx * 0.9;
      gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
      g_timeout_add (50, (GSourceFunc) timer, widget);
      return FALSE;
    }

    int main (int argc, char **argv)
    {
      gtk_init (&argc, &argv);

      GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_widget_show (window);
      gtk_window_set_title (GTK_WINDOW (window), "Hello");
      g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

      GtkWidget *drawing_area = gtk_drawing_area_new ();
      gtk_widget_show (drawing_area);
      gtk_container_add (GTK_CONTAINER (window), drawing_area);
      gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);

      gtk_main ();
      return 0;
    }
  \end{lstlisting}\vss}

  \makeatletter
    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
  \makeatother

\end{document}

20181119/pendulum-0a.c

deleted100644 → 0
+0 −76
Original line number Diff line number Diff line
#include <gtk/gtk.h>
#include <math.h>

int width = 320;
int height = 240;
int gap;
int r;
double visual_length;

double phi0 = -0.5;
double omega0 = 0.0;
double t0 = 0.0;
double g = 9.81;
double l = 1.0;
double dt = 0.02;

double t;
double phi;
double omega;

gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
{
  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };

  int x = width / 2 + visual_length * sin (phi);
  int y = gap + visual_length * cos (phi);

  gdk_cairo_set_source_rgba (c, &blue);
  cairo_move_to (c, width / 2, 10);
  cairo_line_to (c, x, y);
  cairo_stroke (c);
  cairo_arc (c, x, y, r, 0, 2 * G_PI);
  cairo_fill (c);

  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
                    FALSE to propagate the event further. */
}

gboolean timer (GtkWidget *widget)
{
  t += dt;
  phi += omega * dt;
  omega += - dt * g / l * sin (phi);

  gtk_widget_queue_draw_area (widget, 0, 0, width, height);
  g_timeout_add (50, (GSourceFunc) timer, widget);
  return FALSE;
}

int main (int argc, char **argv)
{
  gap = height / 20;
  r = gap;
  visual_length = height - 2 * gap - r;
  t = t0;
  phi = phi0;
  omega = omega0;

  gtk_init (&argc, &argv);

  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_widget_show (window);
  gtk_window_set_title (GTK_WINDOW (window), "Hello");
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  GtkWidget *drawing_area = gtk_drawing_area_new ();
  gtk_widget_show (drawing_area);
  gtk_container_add (GTK_CONTAINER (window), drawing_area);
  gtk_widget_set_size_request (drawing_area, width, height);
  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);

  g_timeout_add (50, (GSourceFunc) timer, drawing_area);

  gtk_main ();
  return 0;
}

20181119/pendulum-1.c

deleted100644 → 0
+0 −69

File deleted.

Preview size limit exceeded, changes collapsed.

20181119/pendulum-2.c

deleted100644 → 0
+0 −69

File deleted.

Preview size limit exceeded, changes collapsed.

20181126/compiling-philosophy.txt

deleted100644 → 0
+0 −38
Original line number Diff line number Diff line
cassini/home/peter/bo/2018ws/hp/20181126> cat philosophy.c
#include <stdio.h>
#include "answer.h"

int main (void)
{
  printf ("The answer is %d.\n", answer ());
  return 0;
}
cassini/home/peter/bo/2018ws/hp/20181126> cat answer.h
extern int answer (void);
cassini/home/peter/bo/2018ws/hp/20181126> cat answer.c
#include "answer.h"

int answer (void)
{
  return 23;
}
cassini/home/peter/bo/2018ws/hp/20181126> gcc -Wall -O philosophy.c -o philosophy
/tmp/ccnyOpK1.o: In function `main':
philosophy.c:(.text+0x5): undefined reference to `answer'
collect2: error: ld returned 1 exit status
cassini/home/peter/bo/2018ws/hp/20181126> gcc -Wall -O philosophy.c answer.c -o philosophy
cassini/home/peter/bo/2018ws/hp/20181126> ./philosophy
The answer is 23.
cassini/home/peter/bo/2018ws/hp/20181126> gcc -Wall -O philosophy.c -c
cassini/home/peter/bo/2018ws/hp/20181126> gcc -Wall -O answer.c -c
cassini/home/peter/bo/2018ws/hp/20181126> ls -l philosophy* answer.*
-rw-r--r-- 1 peter peter   56 Okt 25  2017 answer.c
-rw-r--r-- 1 peter peter   26 Okt 25  2017 answer.h
-rw-r--r-- 1 peter peter 1224 Nov 26 16:21 answer.o
-rwxr-xr-x 1 peter peter 8712 Nov 26 16:21 philosophy
-rw-r--r-- 1 peter peter  117 Okt 25  2017 philosophy.c
-rw-r--r-- 1 peter peter 1648 Nov 26 16:21 philosophy.o
cassini/home/peter/bo/2018ws/hp/20181126> gcc philosophy.o answer.o -o philosophy
cassini/home/peter/bo/2018ws/hp/20181126> ./philosophy
The answer is 23.
cassini/home/peter/bo/2018ws/hp/20181126>

20181126/const-functions-0.c

deleted100644 → 0
+0 −10
Original line number Diff line number Diff line
#include <stdio.h>

double G = 6.67e-11;

int main (void)
{
  printf ("G = %20.15lf\n", G);
  return 0;
}

20181126/const-functions-1.c

deleted100644 → 0
+0 −11
Original line number Diff line number Diff line
#include <stdio.h>
#include <math.h>

double G = 6.67 * pow (10, -11);

int main (void)
{
  printf ("G = %20.15lf\n", G);
  return 0;
}

20181126/pendulum-0.c

deleted100644 → 0
+0 −69

File deleted.

Preview size limit exceeded, changes collapsed.

20181126/pendulum-0a.c

deleted100644 → 0
+0 −76

File deleted.

Preview size limit exceeded, changes collapsed.

20181203/blink-11.c

deleted100644 → 0
+0 −32

File deleted.

Preview size limit exceeded, changes collapsed.

20181203/blink-3a.c

deleted100644 → 0
+0 −18

File deleted.

Preview size limit exceeded, changes collapsed.

20181203/blink-4b.c

deleted100644 → 0
+0 −13

File deleted.

Preview size limit exceeded, changes collapsed.

20181203/blink-5a.c

deleted100644 → 0
+0 −15

File deleted.

Preview size limit exceeded, changes collapsed.

20181203/blink-5b.c

deleted100644 → 0
+0 −15

File deleted.

Preview size limit exceeded, changes collapsed.

20181203/blink-6a.c

deleted100644 → 0
+0 −23

File deleted.

Preview size limit exceeded, changes collapsed.

20181210/blink-0a.c

deleted100644 → 0
+0 −9

File deleted.

Preview size limit exceeded, changes collapsed.

20181210/blink-10.E

deleted100644 → 0
+0 −492

File deleted.

Preview size limit exceeded, changes collapsed.

20181210/blink-10.c

deleted100644 → 0
+0 −31

File deleted.

Preview size limit exceeded, changes collapsed.

20181210/blink-10.s

deleted100644 → 0
+0 −75

File deleted.

Preview size limit exceeded, changes collapsed.

20181210/blink-11.c

deleted100644 → 0
+0 −32

File deleted.

Preview size limit exceeded, changes collapsed.

20181210/blink-3a.c

deleted100644 → 0
+0 −18

File deleted.

Preview size limit exceeded, changes collapsed.

20181210/blink-4a.c

deleted100644 → 0
+0 −18

File deleted.

Preview size limit exceeded, changes collapsed.

20181210/blink-4b.c

deleted100644 → 0
+0 −13

File deleted.

Preview size limit exceeded, changes collapsed.

20181210/blink-4c.c

deleted100644 → 0
+0 −0

File deleted.

Preview size limit exceeded, changes collapsed.

20181210/blink-5a.c

deleted100644 → 0
+0 −15

File deleted.

Preview size limit exceeded, changes collapsed.

20181210/blink-5b.c

deleted100644 → 0
+0 −15

File deleted.

Preview size limit exceeded, changes collapsed.

20181210/blink-6a.c

deleted100644 → 0
+0 −23

File deleted.

Preview size limit exceeded, changes collapsed.

20181210/blink-8.c

deleted100644 → 0
+0 −20

File deleted.

Preview size limit exceeded, changes collapsed.

20181210/blink-9.s

deleted100644 → 0
+0 −78

File deleted.

Preview size limit exceeded, changes collapsed.

20181217/aufgabe-2.c

deleted100644 → 0
+0 −20

File deleted.

Preview size limit exceeded, changes collapsed.

20181217/aufgabe-3.c

deleted100644 → 0
+0 −18

File deleted.

Preview size limit exceeded, changes collapsed.

20181217/leds.jpg

deleted120000 → 0
+0 −1

File deleted.

Preview size limit exceeded, changes collapsed.

20181217/names.h

deleted100644 → 0
+0 −50

File deleted.

Preview size limit exceeded, changes collapsed.

20190107/aufgabe-1-32.s

deleted100644 → 0
+0 −57

File deleted.

Preview size limit exceeded, changes collapsed.

20190107/aufgabe-1-64.s

deleted100644 → 0
+0 −24

File deleted.

Preview size limit exceeded, changes collapsed.

20190107/dynmem-4.c

deleted100644 → 0
+0 −23

File deleted.

Preview size limit exceeded, changes collapsed.

20190107/gtk-1.c

deleted100644 → 0
+0 −11

File deleted.

Preview size limit exceeded, changes collapsed.

20190107/gtk-3.c

deleted100644 → 0
+0 −16

File deleted.

Preview size limit exceeded, changes collapsed.

20190107/hanoi-0.c

deleted100644 → 0
+0 −26

File deleted.

Preview size limit exceeded, changes collapsed.

20190107/hanoi-1.c

deleted100644 → 0
+0 −30

File deleted.

Preview size limit exceeded, changes collapsed.

20190107/hanoi-2.c

deleted100644 → 0
+0 −28

File deleted.

Preview size limit exceeded, changes collapsed.

20190107/hanoi-3.c

deleted100644 → 0
+0 −44

File deleted.

Preview size limit exceeded, changes collapsed.

20190107/hanoi-4.c

deleted100644 → 0
+0 −44

File deleted.

Preview size limit exceeded, changes collapsed.

20190107/hanoi-5.c

deleted100644 → 0
+0 −45

File deleted.

Preview size limit exceeded, changes collapsed.

20190107/hanoi-6.c

deleted100644 → 0
+0 −52

File deleted.

Preview size limit exceeded, changes collapsed.

20190107/hanoi-7.c

deleted100644 → 0
+0 −52

File deleted.

Preview size limit exceeded, changes collapsed.

20190107/hanoi-8.c

deleted100644 → 0
+0 −52

File deleted.

Preview size limit exceeded, changes collapsed.

20190107/hanoi-9.c

deleted100644 → 0
+0 −58

File deleted.

Preview size limit exceeded, changes collapsed.

20190107/hanoi-9a.c

deleted100644 → 0
+0 −58

File deleted.

Preview size limit exceeded, changes collapsed.

20190107/names.h

deleted100644 → 0
+0 −50

File deleted.

Preview size limit exceeded, changes collapsed.

20241010/gitlab.png

0 → 120000
+1 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/hello-01.txt

0 → 100644
+15 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/hello-gtk.c

0 → 100644
+31 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/if-02.c

0 → 100644
+14 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/if-05.c

0 → 100644
+15 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/if-06.c

0 → 100644
+16 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/if-07a.pas

0 → 100644
+18 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/if-07b.pas

0 → 100644
+18 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/if-07c.c

0 → 100644
+17 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/if-07c.pas

0 → 100644
+18 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/if-08.c

0 → 100644
+15 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/if-09.c

0 → 100644
+4 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/if-10.c

0 → 100644
+17 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/input-03.c

0 → 100644
+10 −0

File added.

Preview size limit exceeded, changes collapsed.

+10 −0

File added.

Preview size limit exceeded, changes collapsed.

+9 −0

File added.

Preview size limit exceeded, changes collapsed.

+10 −0

File added.

Preview size limit exceeded, changes collapsed.

+10 −0

File added.

Preview size limit exceeded, changes collapsed.

+10 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/while-01.c

0 → 100644
+12 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/while-02.c

0 → 100644
+12 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/while-03.c

0 → 100644
+12 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/while-04.c

0 → 100644
+8 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/while-05.c

0 → 100644
+8 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/while-06.c

0 → 100644
+8 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/while-07.c

0 → 100644
+8 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/while-08.c

0 → 100644
+12 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/while-09.c

0 → 100644
+12 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/while-10.c

0 → 100644
+12 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/while-11.c

0 → 100644
+13 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/while-12.s

0 → 100644
+45 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/while-13.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241010/while-14.c

0 → 100644
+7 −0

File added.

Preview size limit exceeded, changes collapsed.

20241017/aufgabe-4.c

0 → 100644
+8 −0

File added.

Preview size limit exceeded, changes collapsed.

20241017/gitlab.png

0 → 120000
+1 −0

File added.

Preview size limit exceeded, changes collapsed.

20241017/hello-04.c

0 → 100644
+8 −0

File added.

Preview size limit exceeded, changes collapsed.

20241017/hello-05.c

0 → 100644
+10 −0

File added.

Preview size limit exceeded, changes collapsed.

20241017/hello-08.c

0 → 100644
+10 −0

File added.

Preview size limit exceeded, changes collapsed.

20241017/hello-09.c

0 → 100644
+11 −0

File added.

Preview size limit exceeded, changes collapsed.

20241017/hello-10.c

0 → 100644
+11 −0

File added.

Preview size limit exceeded, changes collapsed.

20241017/hello-10.txt

0 → 100644
+29 −0

File added.

Preview size limit exceeded, changes collapsed.

+13 −0

File added.

Preview size limit exceeded, changes collapsed.

+13 −0

File added.

Preview size limit exceeded, changes collapsed.

+16 −0

File added.

Preview size limit exceeded, changes collapsed.

+17 −0

File added.

Preview size limit exceeded, changes collapsed.

+15 −0

File added.

Preview size limit exceeded, changes collapsed.

+15 −0

File added.

Preview size limit exceeded, changes collapsed.

+15 −0

File added.

Preview size limit exceeded, changes collapsed.

20241017/loesung-3-3.c

0 → 100644
+15 −0

File added.

Preview size limit exceeded, changes collapsed.

20241017/loesung-3-4.c

0 → 100644
+15 −0

File added.

Preview size limit exceeded, changes collapsed.

20241017/loesung-3-5.c

0 → 100644
+15 −0

File added.

Preview size limit exceeded, changes collapsed.

20241017/loesung-3-6.c

0 → 100644
+16 −0

File added.

Preview size limit exceeded, changes collapsed.

+16 −0

File added.

Preview size limit exceeded, changes collapsed.

+15 −0

File added.

Preview size limit exceeded, changes collapsed.

+15 −0

File added.

Preview size limit exceeded, changes collapsed.

+15 −0

File added.

Preview size limit exceeded, changes collapsed.

20241031/arrays-06.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241031/arrays-07.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241031/arrays-08.c

0 → 100644
+10 −0

File added.

Preview size limit exceeded, changes collapsed.

20241031/arrays-09.c

0 → 100644
+10 −0

File added.

Preview size limit exceeded, changes collapsed.

20241031/arrays-12.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241031/arrays-13.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

+17 −0

File added.

Preview size limit exceeded, changes collapsed.

+17 −0

File added.

Preview size limit exceeded, changes collapsed.

+17 −0

File added.

Preview size limit exceeded, changes collapsed.

+16 −0

File added.

Preview size limit exceeded, changes collapsed.

+17 −0

File added.

Preview size limit exceeded, changes collapsed.

+13 −0

File added.

Preview size limit exceeded, changes collapsed.

+27 −0

File added.

Preview size limit exceeded, changes collapsed.

+27 −0

File added.

Preview size limit exceeded, changes collapsed.

+29 −0

File added.

Preview size limit exceeded, changes collapsed.

+29 −0

File added.

Preview size limit exceeded, changes collapsed.

+910 −0

File added.

Preview size limit exceeded, changes collapsed.

20241031/pointers-00.c

0 → 100644
+14 −0

File added.

Preview size limit exceeded, changes collapsed.

20241031/pointers-02.c

0 → 100644
+13 −0

File added.

Preview size limit exceeded, changes collapsed.

20241031/pointers-03.c

0 → 100644
+13 −0

File added.

Preview size limit exceeded, changes collapsed.

20241031/pointers-04.c

0 → 100644
+13 −0

File added.

Preview size limit exceeded, changes collapsed.

20241031/pointers-05.c

0 → 100644
+13 −0

File added.

Preview size limit exceeded, changes collapsed.

20241031/strings-02.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241031/strings-03.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241031/strings-04.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/arrays-03.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/arrays-04.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/arrays-05.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/arrays-06.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/arrays-07.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/arrays-08.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/arrays-09.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/arrays-10.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/arrays-11.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/arrays-12.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/arrays-13.c

0 → 100644
+14 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/arrays-14.c

0 → 100644
+14 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/arrays-15.c

0 → 100644
+14 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/arrays-16.c

0 → 100644
+14 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/files-01.txt

0 → 100644
+21 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/files-03.c

0 → 100644
+14 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/files-04.c

0 → 100644
+17 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/files-05.c

0 → 100644
+18 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/files-06.c

0 → 100644
+18 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/files-07.c

0 → 100644
+18 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/loesung-2.c

0 → 100644
+18 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/pointers-01.c

0 → 100644
+14 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/pointers-02.c

0 → 100644
+14 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/pointers-03.c

0 → 100644
+15 −0

File added.

Preview size limit exceeded, changes collapsed.

+21 −0

File added.

Preview size limit exceeded, changes collapsed.

+22 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/strings-01.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/strings-03.c

0 → 100644
+13 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/strings-04.c

0 → 100644
+13 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/strings-05.c

0 → 100644
+13 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/strings-06.c

0 → 100644
+13 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/strings-07.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/strings-11.c

0 → 100644
+8 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/strings-12.c

0 → 100644
+8 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/strings-13.c

0 → 100644
+8 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/strings-14.c

0 → 100644
+8 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/strings-15.c

0 → 100644
+8 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/strings-16.c

0 → 100644
+8 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/structs-01.c

0 → 100644
+15 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/structs-02.c

0 → 100644
+23 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/structs-03.c

0 → 100644
+23 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/structs-04.c

0 → 100644
+28 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/structs-05.c

0 → 100644
+27 −0

File added.

Preview size limit exceeded, changes collapsed.

20241107/structs-06.c

0 → 100644
+27 −0

File added.

Preview size limit exceeded, changes collapsed.

20241114/arrays-01.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.

20241114/arrays-02.c

0 → 100644
+9 −0

File added.

Preview size limit exceeded, changes collapsed.