// fil: parameters.cc
// beskrivning: lab 1 i C+C++
// senast ändrad: 980114 Tor-Åke Fransson MD4
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
void position(double reals[], int &pos);
void sequence(double reals[], double treshold, int &pos, int &length);
int read_array(double reals[]);
void ctrlc_exit(int); // så att man hinner se output från programmet.
int main(int argc, char *argv[])
{
double *reals;
int pos, length;
double treshold;
char svar[2];
// -h ger hjälp
if (strncmp(argv[argc-1], "-h", 2) == 0)
{
cout << "Usage : " << argv[0] << " position | sequence"<<endl;
ctrlc_exit(-1);
}
// om vi inte fick kommandoradsargument frågar vi vad vi skall göra
if (argc < 2)
{
cout << "position (p) eller sekvens (s) ? ";
cin >> svar; // kan ge skyddsfel
argv[1] = new char(4);
switch (svar[0])
{
case 'p':
strcpy(argv[1], "pos");
break;
case 's':
strcpy(argv[1], "seq");
break;
default:
cout << "Felaktig inmatning\n";
ctrlc_exit(-1);
}
}
if (strncmp(argv[1], "pos", 3) == 0)
{
// allokera lite minne för reals. Detta måste göras här,
// annars kommer pekaren att peka på fel adress!
// ekvivalent med malloc(sizeof(double))
reals = new double[1];
read_array(reals);
position(reals, pos);
cout << "Position: " << pos << endl;
ctrlc_exit(1);
}
if (strncmp(argv[1], "seq", 3) == 0)
{
reals = new double[1];
read_array(reals);
cout << "ange tröskelvärde: ";
cin >> treshold;
sequence(reals, treshold, pos, length);
cout << "Position: " << pos << " Längd: " << length << endl;
ctrlc_exit(1);
}
cout << "Usage : " << argv[0] << " position | sequence"<<endl;
ctrlc_exit(-1); // reached only in case of error
}
// read_array läser in flyttal i vektorn reals
int read_array(double reals[])
{
int index = 0;
cout << "Ange ett antal värden, avsluta med 0"<<endl;
while (1)
{
cin >> reals[index];
if (reals[index] == 0)
break;
index++;
// allokera minne för nästa double. Innehållet i reals ändras inte.
// Besvärligt och långsamt, men jag vägrar använda en temporär vektor
realloc((void *) reals, (sizeof(double) * (index + 1)));
}
return (index); // så många tal har vi läst in
}
// position finner det största talet i en vektor. Den förutsätter att
// sista elementet i vektorn reals är 0
void position(double reals[], int &pos)
{
int index = 0;
double biggest;
while (reals[index] != 0)
{
if (reals[index] > biggest)
{
biggest = reals[index];
pos = index + 1; // element 0 är element ett
}
index++;
}
return;
}
// finner den längsta sekvensen över ett tröskelvärde. Sista elementet i
// reals måste vara 0.
void sequence(double reals[], double treshold, int &pos,int &length)
{
int templength = 0, startpos = 0, index = 0;
pos = length = 0;
while (reals[index] != 0)
{
if (reals[index] < treshold || reals[index+1] == 0)
{
templength = index - startpos;
if (templength > length)
{
length=templength;
pos = startpos + 1; // element 0 är element ett
}
startpos = ++index;
}
else
{
index++;
}
}
}
void ctrlc_exit(int val)
// vänta 30 sekunder, och dö sedan
{
cout << endl;
cout << "Tryck ctrl-c, koppla ifrån terminalen, eller vänta 30 sekunder så avslutas programmet automatiskt";
fflush(stdout);
sleep(30);
exit(val);
}
// end program