Lösungen
für Hinweise auf Fehler stets dankbar und offen ?
Übung 02
1) a)
mkdir Subdir subdir
b)
cat > da
.....
.....
# Strg+c
c)
# -----
d)
mv subdir/da subdir/Da
e)
# -----
f)
rm subdir/Da rmdir subdir
g)
# für das aktuelle Verzeichnis
2) a)
# erster erstellt im ~ eine leere Datei mit den Namen experiment, zweiter gibt eine Fehlermeldung aus, da die Datei da in Subdir schon vorhanden ist
b)
# eine Ausgabe
c)
# eine Fehlermeldung?
d)
# date => gibt das aktuelle Datum aus # who => zeigt an wer eingeloggt ist # who -H => -""- mit Kopfzeile # who -uH => -""- -""- mit Loggintime # finger => gibt Informationen über den Benutzer aus # uname => gibt das BS aus # -a steht bei den meisten Programmen für all
e)
# file gibt Auskunft über die Datei, das bedeutet aber nicht unbedingt das man direkt erfährt zu welchen Progamm die Datei gehört. Des weiteren kann man mit file dateien manipulieren.
f)
# -k => Sucht im Namen und in den Kurzbescheibungen # -l => verwendet nur lokale man # -a => alle gefunden man werden nacheinander angezeigt
3)
# es gibt mehrere Möglichkeiten, aber in diesem Fall wird nach id gesucht.
Übung 03
1-3)
# ---
4)
# 022 -> 755
5)
# chmod u=rx,g=rx,o=x f chmod 551 D # chmod u=r,g=r,o=- f chmod 440 D # chmod u=rw,g=r,o=- f chmod 640 D # chmod u=rwx,g=-,o=- f chmod 700 D # chmod u=wx,g=r,o=- f chmod 340 D
6)
# umask 27
7)
# in der Bourne geht es so % export PATH=.:$PATH # wie es in der tcsh ist muss ich noch einmal nachschauen.
8)
# den pfad findet man mit which uname # der zweite Schritte würde auf meinen System so aussehen cp /bin/uname ~/ls # Es wird uname ausgeführt, da uname nun in meinen ~ auf ls hört und mein ~ zuerst aufgerufen wird.
9)
# pfad wo liegt
10)
set myvar = 2008 # In der ersten. # In allen # Nein da die conf nicht neu eingelesen wurde.
Übung 04
1)
ls -l > manpages.info cat manpages.info more -"- less -"-
2)
# less is more # man less ?
3)
# /dev/.... # Ich bin der Eigentümer # Es geht nicht weil Gerätedateien schreibgeschützt sind und weil sie gerade in verwendung ist
4)
echo $#path
Übung 05
1)
cd /usr/bin
a)
echo ??
b)
echo [aeiou]*d
c)
echo *\?*
2) a)
ls- l | grep '^..$'
b)
ls- l | grep '^[aeiou]*d$*'
c)
ls- l | grep '*?*'
3)
set zlist `date` set zlist [1]=heute
4)
set pco `ps -e | wc -l`
Übung 06
Aufgabe 1
ls -l |grep '[May]a[iy]'
Aufgabe 2
set substitutionfolge `~/.*`
Aufgabe 3
# ls ausgabe gefilter auf dot-files
Aufgabe 4
(find /usr -name '00*' >jarout) > & /dev/null
Aufgabe 5
# nein dieses ist in der tcsh nur indirekt möglich
Aufgabe 6
ls -l /usr | grep d...r.xr.x
Übung 07
Aufgabe 1
chmod 755 ~
Aufgabe 2
#! bin/tcsh -f set zz = gesetzt echo $zz
Übung 08
Aufgabe 2
#! bin/tcsh ps -f | sed 1,1d
Aufgabe 3
#!/bin/tcsh
echo "Any Key-Taste drücken"
read AnyKey
echo "Mahlzeit du Lusche, wie ist dein Vorname?"
set PRENAME=$<
echo "Ich will jetzt deinen Nachnamen hören, du Drecksack!"
set NAME=$<
echo "Ah die Dame heisst $PRENAME $NAME"
echo "Ah die Dame heisst $NAME , $PRENAME"
echo "Wie ist deine Matrikelnummer?"
set MATRNR=$<
if ( $MATRNR % 2 == 0 ) then
echo "$MATRNR ist gerade"
else
echo "$MATRNR ist ungerade"
endif
echo "ENDE"
Aufgabe 4
#! bin/tcsh
set anz=$#argv
while ( $anz != 0 )
if (-d $argv[$anz] ) then
rm -r $argv[$anz]
echo " argument" $anz " ist ein verzeichnis und wurde gelöscht"
else
echo " argument " $anz "ist kein verzeichnis"
endif
@ anz --
end
Aufgabe 5
#! /bin/sh
for verz in $*
do
# $verz da??
if [ -d $verz ]
then
# ja also dann löschen
rmdir $verz
else
# NEIN?
echo he, du Sack $verz ist nicht da.
fi
done
Aufgabe 6
#!/bin/tcsh
if ( $argv != 2 ) then
#exit
else
if (! ((-f $1 && -f $2) || (-d $1 && -d $2)) then
#exit
else
if ({ (diff $1 $2 > /dev/null) }) then
#exit
else
echo "Sind gleich"
endif
endif
endif
echo "ENDE"
Aufgabe 8
set a=wirklich set b=$a echo $b ---> wirklich Bei eval vor einer Kommandozeile, werden in einem ersten Durchlauf alle Variablen durch ihre Inhalte ersetzt, die geänderte Zeile wird dann abgearbeitet.
Aufgabe 9
#! bin/tcsh
set anz=$#argv
while ( $anz != 0 )
if (-f $argv[$anz] ) then
echo $anz -tes Argument: `cat $argv[$anz]`
else
echo $anz -tes Argument: ungültig
endif
@ anz --
end
Übung 11
Aufgabe 1 ganz einfaches Bsp. frei in einer Minute zusammen gehakt.
<html>
<head>
<titel>Homepage von Karl Arsch</title>
<style type="text/css">
<!--
body { background:#000; }
h1,h2,h3,h4 { background-color:#fff }
#head h1 {}
#content h1 {}
#content p.absatz {}
-->
</style>
</head>
<body>
<div id="head">
<h1>simple Site</h1>
</div>
<div id="content">
<h2>zweiter Titel</h2>
<p class="absatz">
erster Absatz
</p>
<p class="absatz">
zweiter Absatz
</p>
</div>
</body>
</html>
Aufgabe 2 a)
// es gibt nichts zu beobachten bei gcc fout.c -o fout
b)
7 16.5 Es wurden 7 Zeichen ausgegeben. 1076920320 0.0 Es wurden 15 Zeichen ausgegeben.
c)
// ist eine printf drin, d.h. Ausgabe
d)
// meldet ein paar Fehler fout.c: In function `main': fout.c:22: warning: int format, double arg (arg 2) fout.c:22: warning: double format, different type arg (arg 3)
Aufgabe 3
/*
* hier ohne Fehler
*/
#include<stdio.h>
int main() {
int i = 63;
double x = .000007;
double y = 123.45;
printf("\ni:\n%d \n%o \n%x \n%X", i, i, i, i);
printf("\nx:\n%f \n%e \n%E \n%g \n%G", x, x, x, x, x);
printf("\ny:\n%g \n%G \n", y, y);
return 0;
}
/*
* zum vgl der code mit Fehler
*/
int main() {
int i = 63;
double x = .000007;
double y = 123.45;
printf("\ni:\n%d \n%o \n%x \n%X", i, i, k, i);
printf("\nx:\n%f \n%e \n%E \n%g \n%G", x, i, x, x);
printf("\ny:\n%g \n%G", i);
}
Aufgabe 4
//
// es soll der text "Ich kenne die Formatelemente zu 100%." Ausgegeben werden
//
//base header
#include<stdio.h>
//start main -> void = keine parameter
int main(void) {
//Ausgabe, man achte auf %%
printf("Ich kenne die Formatelemente zu 100%%.\");
return 0;
}
Übung 12
Aufgabe 1
/* fehler.c
*
* Ein Programm, dass Compilerfehler,
* Laufzeitfehler und logische Fehler demonstriert.
*
*/
#include <stdio.h>
int main() {
int num1, num2, x,y;
num1 = 0;
num2 = 1;
printf("Der Quotient der Variablen ist: ");
printf("%d\n", num1/num2);
printf("\n"); // Leerzeile
printf("Jetzt werden die Variablenwerte vertauscht.\n");
x=num1;
y=num2;
num1=y;
num2=x;
printf("Der Quotient der Variablen ist nun: ");
printf("%d\n", num1/num2);
return 0;
}
c)
/* * Fehlermeldung: Fließkommafehler (core dumped) * Grund: Division durch 0 ist nicht möglich. */
Aufgabe 2
/* Programm, dass zuerst die geraden Zahlen von 12 bis 0, dann
* die ungeraden Zahlen von -1 bis -13 und zum Schluss die ersten 10 Quadratzahlen
* mit Hilfe einer for-Schleifen ausgibt:
*
*/
#include <stdio.h>
int main() {
int i;
for (i=13;i>-1;i--) {
if ( i%2 == 0 ) {
printf( "%d,",i) ;
}
}
printf("\n");
for (i=-1;i<=13;i++) {
if ( i%2 == 1 ) {
printf("-");
printf( "%d,",i) ;
}
}
printf("\n");
for(i=0;i<10;i++) {
printf( "%d,",i*i) ;
}
printf("\n");
return 0;
}
Aufgabe 3
/*
* Temperatur wird in celsius und fahreheit angegeben in einer
* Tabelle
*/
#include <stdio.h>
int main() {
int f=0;
int c=0;
printf("Fahrenheit Celsius \n");
while (f <=300 ) {
c=f-32;
c=c*5;
c=c/9;
printf("%d\t\t%d\n",f,c);
f=f+20;
}
return 0;
}
Aufgabe 4
/*
* quadrat einer eingabe mal 3
*/
#include <stdio.h>
int quadratdrei (int n) {
n=n*n;
return n*3 ;
}
int c;
int qud;
int main() {
scanf("%d",&c);
qud=quadratdrei(c);
printf("%d\n",qud);
return 0;
}
Aufgabe 5
/*
* Das Script erwartet eine Eingabe und es nimmt solange die Eingabe
* entgegen bis ein newline kommt. Die Eingabe wird dann in ASCII-Werte
* "übersetzt". In der folgenden Ausgabe werden die ermittelten Werte
* auf der Ausgabeeinheit ausgegeben. Jeder Wert in einer newline.
*/
/*
* Zeichen zählen
* File count.c
*/
#include <stdio.h>
#include <stdlib.h>
int main (void) {
int c,count=0;
printf("Schreib und das ist ein Befehl: \t");
while((c=getchar()) != '\n') {
count++;
}
printf("Anzahl der Zeichen beträgt %d Zeichen\n", count);
return EXIT_SUCCESS;
}
Übung 13
Aufgabe 1
/*Ein Programm zu berechnen des Zinses mit Zinsanlage
*/
#include <stdio.h>
#define Jahre 10 /*Laufzeit*/
#define gka 1000 /*kapital*/
#define z 5 //Zinsen
int main(){
int i;
float gk, zins ;
gk=gka;
printf("Jahr \t Geld \n");
for (i=0; i<=Jahre ; i++ ){
printf("%d \t %.2f \n ", i , gk );
zins=((z*gk)/100);
gk= gk+zins ;
}
return 0;
}
Aufgabe 2
/*
* Ein Programm zum Zeiger ausprobieren
*/
#include <stdio.h>
int main () {
int i, * pointeri;
pointeri=&i;
i=1;
printf("%p \n", pointeri);
printf("%d \n", *pointeri);
printf("%d \n", i);
*pointeri=2;
printf("%d \n", i);
return 0;
}
Aufgabe 3
/*Ein Programm zum Zeiger ausprobieren
*/
#include <stdio.h>
void swap (int *pointa,int *pointb){
int z;
z=*pointa;
*pointa=*pointb;
*pointb=z;
}
int main() {
int a=2;
int b=4;
printf("%d %d \n ", a , b);
swap(&a,&b);
printf("%d %d \n ", a , b );
return 0;
}
Aufgabe 4
/* mithilfe von zeigern zerteilte ausgabe einer hexazahl
*/
#include <stdio.h>
int main() {
long long S, *ptr;
S =0x1a1b2a2b3a3b4a4bULL;
ptr=&S;
unsigned short *a, *aa, *aaa,*aaaa;
void *whole ;
whole = ptr ;
a=whole;
aa=a+1;
aaa=a+2;
aaaa=a+3;
printf("wert der long long S: %llx \n ", S);
printf("Wert des 4 doppelbyte %x\n ", *a);
printf("Wert des 3 doppelbyte %x\n ", *aa);
printf("Wert des 2 doppelbyte %x\n ", *aaa);
printf("Wert des 1 doppelbyte %x\n ", *aaaa);
return 0;
}
Übung 14
Aufgabe 1
#include<stdio.h>
#define arrayg 10
int main() {
int i;
int ar [arrayg];
for (i=0; i<arrayg ;i++){
ar [i]= (i+1)*(i+1);
printf("%d ", ar[i]);
}
printf("\n");
return 0;
}
Aufgabe 2
#include<stdio.h>
#define arrayg 10
void rev_print(int* arp) {
int i;
for (i=arrayg-1; i>=0 ;i--){
printf("%d ",(*arp+i)*(*arp+i));
}
printf("\n");
}
int main() {
int i;
int ar [arrayg];
for (i=0; i<arrayg ;i++){
ar [i]= (i+1)*(i+1);
printf("%d ", ar[i]);
}
printf("\n");
rev_print(ar);
return 0;
}
Aufgabe 3
#include<stdio.h>
#define arrayg 1000
int main() {
int i,j;
int eingabe=0;
int ar [arrayg];
for (j=0;j<arrayg; j++){
ar[j]=(j)*(j);
}
for (i=0; i<arrayg ;i++){
printf("Bitte geben sie eine Zahl zwischen 1 und %d ein \n ",arrayg);
scanf ("%d", &eingabe );
if( eingabe==0){
break;
}
if (eingabe<1 || eingabe>1000){
printf("ihre Zahl passt nich in den Array");
continue;
}
else{
printf("Zahl im Array and der stelle %d ,%d \n ", eingabe, ar[eingabe]);
}
}
printf("\n");
return 0;
}
Aufgabe 4
/* char_array.c
*
* Entscheidung, ob eine Zeichenkette ein 'a' enthaelt
*/
#include <stdio.h>
#define MAX 40
int main() {
int index;
char eingabe [MAX];
printf("Bitte String eingeben (max. %d Zeichen): ", MAX);
gets(eingabe);
for (index = 0; eingabe[index] != '\0'; index++)
if (eingabe[index] == 'a')
break;
if (eingabe[index] == '\0')
printf("\nDer String enthaelt kein 'a'\n");
else
printf("\nDas erste 'a' ist an %d. Stelle\n", index + 1);
return 0;
}
Aufgabe 5
/* zeichenketten.c
*
* Eingabe, Ausgabe und Manipulation von Zeichenketten
*/
#include <stdio.h>
#include <string.h>
int main() {
char s1 [20];
char s2 [20];
char * name;
char * tmp;
printf("Geben Sie Ihren Vornamen ein: ");
scanf("%s", s1);
printf("Geben Sie Ihren Nachnamen ein: ");
scanf("%s", s2);
tmp = s2;
while (*tmp != '\0') {
if (*tmp > 96 && *tmp < 123)
*tmp = *tmp - 32;
tmp++;
}
name = strcat(s1, " ");
name = strcat(name, s2);
printf("%s\n", name);
return 0;
}
Aufgabe 6
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[]){
double kubik;
if (argc != 2){
printf("Falsch!\n");
return 0;
}
if (atof(argv[1])!=0 || *argv[1]=='0' ){
kubik=atof(argv[1]);
kubik=kubik*kubik*kubik;
printf("%f \n",kubik);
}
else {
printf("Keine Zahl!\n");
}
return 0;
}
Literatur
- Martin Dietze: Praxiskurs Unix-Shell; O'Reilly Verlag GmbH & Co. KG, 2011
- Helmut Erlenkötter: C: Programmieren von Anfang an; Rowohlt Taschenbuch Verlag, 1999
- Ulla Kirch-Prinz, Peter Prinz: C - kurz & gut; O'Reilly Verlag GmbH & Co. KG, 2002
Weblinks
Sonstiges
Falls ihr die PATH Variable versaut habt
path (/opt/sfw/teTeX/bin/sparc-sun-solaris2.9 /usr/local/qt/bin /usr/local/kde/bin /opt/sfw/bin /usr/sfw/bin /opt/sfw/gcc-3/bin /opt/local/bin /usr/local/bin /usr/dt/bin /usr/openwin/bin /usr/ccs/bin /usr/bin /bin)
PATH /opt/sfw/teTeX/bin/sparc-sun-solaris2.9:/usr/local/qt/bin:/usr/local/kde/bin:/opt/sfw/bin:/usr/sfw/bin:/opt/sfw/gcc-3/bin:/opt/local/bin:/usr/local/bin:/usr/dt/bin:/usr/openwin/bin:/usr/ccs/bin:/usr/bin:/bin: