Poniżej znajdują się przykłady nieoptymalnych programów rozwiązującychproblem z samouczka z prawidłową obsługą sygnałów. Więcej informacji na temat obsługi sygnałów można znaleźć na help.
Obecnie istnieje przykład dlaC, C++ (with CMake, z CPLEX), Python 2, Python 3, Java, Haskell, VB.NET. Jeśli potrzebujesz przykładu w jakimś innym języku, pozwól nam teraz.
Pamiętaj o słowie kluczowym volatile, aby upewnić się, że optymalizator nie usunie zmiennej z pętli for.
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <math.h>
volatile sig_atomic_t tle = 0;
int n, i;
float worker;
void term(int signum)
{
tle = 1;
}
int main(int argc, char *argv[])
{
struct sigaction action;
memset(&action, 0, sizeof(struct sigaction));
action.sa_handler = term;
sigaction(SIGTERM, &action, NULL);
scanf("%d", &n);
for (i = 0; i < n - 1 && !tle; i++)
worker += sqrt((float)i);
printf("%d\n", (int)(worker/n));
return 0;
}
Pamiętaj o słowie kluczowym volatile, aby upewnić się, że optymalizator nie usunie zmiennej z pętli for.
#include <signal.h>
#include <unistd.h>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
volatile sig_atomic_t tle = 0;
int n;
float worker;
void term(int signum)
{
tle = 1;
}
int main(int argc, char *argv[])
{
struct sigaction action;
memset(&action, 0, sizeof(struct sigaction));
action.sa_handler = term;
sigaction(SIGTERM, &action, NULL);
ios_base::sync_with_stdio(false);
cin >> n;
for (int i = 0; i < n - 1 && !tle; i++)
worker += sqrt((float)i);
cout << (int)(worker / n) << endl;
return 0;
}
Jeśli chcesz użyć pakietu CMake, musisz dodać następującą zawartość do pliku CMakeLists.txt , zapisz powyższy kod w pliku tut.cpp i zapakuj oba. do archiwum Tut.tgz (uwaga na obudowę).
cmake_minimum_required (VERSION 2.6) project (Tut) add_executable (Tut tut.cpp)
import signal
import time
from math import sqrt
class Killer:
exit_now = False
def __init__(self):
signal.signal(signal.SIGINT, self.exit)
signal.signal(signal.SIGTERM, self.exit)
def exit(self,signum, frame):
self.exit_now = True
killer = Killer()
n = int(input())
worker = 0.0
for i in xrange(0,n):
worker += sqrt(i)
if killer.exit_now:
break
print i
print int(worker / n)
import signal
import time
from math import sqrt
class Killer:
exit_now = False
def __init__(self):
signal.signal(signal.SIGINT, self.exit)
signal.signal(signal.SIGTERM, self.exit)
def exit(self,signum, frame):
self.exit_now = True
killer = Killer()
n = int(input())
worker = 0.0
for i in range(0,n):
worker += sqrt(i)
if killer.exit_now:
break
print(int(worker / n))
Kompilator Java informuje, że sygnał API jest przestarzały. Jednak nie planuje się go usuwać w Javie 9 i jest to jedyny sposób na obsługę sygnałów na serwerze.
import java.util.Scanner;
import sun.misc.Signal;
import sun.misc.SignalHandler;
import java.util.concurrent.CountDownLatch;
public class Tut
{
public static void main(final String[] args) throws InterruptedException
{
Scanner in = new Scanner(System.in);
final CountDownLatch exit_now = new CountDownLatch(1);
double worker = 0.0;
int n;
SignalHandler termHandler = new SignalHandler()
{
@Override
public void handle(Signal sig)
{
System.out.println("Terminating");
exit_now.countDown();
}
};
Signal.handle(new Signal("TERM"), termHandler);
n = in.nextInt();
for (int i = 0; i < n && exit_now.getCount() == 1; i++)
{
worker += Math.sqrt((double)i);
}
System.out.print((int)(worker / n));
}
}
Ten kod nie implementuje obsługi sygnałów. Jeśli wiesz, jak go zaimplementować w Haskell, prześlij nam przykład.
main = do n <- getLine let v = read n :: Int print (v-1)
Ten kod nie implementuje jeszcze obsługi sygnałów.
#include <ilcplex/ilocplex.h>
ILOSTLBEGIN
int
main (int argc, char **argv)
{
int n;
IloEnv env;
IloModel model(env);
IloNumVarArray var(env);
IloRangeArray con(env);
IloCplex cplex(model);
cplex.setOut(env.getNullStream());
cin >> n;
var.add(IloNumVar(env, 0, 1000000000, ILOINT));
model.add(IloMaximize(env, var[0]));
con.add(var[0] <= (n - 1));
model.add(con);
cplex.solve();
cout << cplex.getObjValue() << endl;
env.end();
return 0;
}
Ten kod nie implementuje jeszcze obsługi sygnałów. Jeśli wiesz, jak go zaimplementować w VB.NET at Mono, prześlij nam przykład.
Module Tutorial
Sub Main()
Dim line = Console.ReadLine()
Dim n = Integer.Parse(line)
Console.WriteLine(n - 1)
End Sub
End Module