<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://so.v2.cs.unibo.it/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Eddy</id>
	<title>Sistemi Operativi - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://so.v2.cs.unibo.it/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Eddy"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php/Special:Contributions/Eddy"/>
	<updated>2026-05-03T13:40:00Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Grep_piramidale_(non_tanto_grep)_esame_2.7.2003&amp;diff=1054</id>
		<title>Grep piramidale (non tanto grep) esame 2.7.2003</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Grep_piramidale_(non_tanto_grep)_esame_2.7.2003&amp;diff=1054"/>
		<updated>2015-04-22T06:21:00Z</updated>

		<summary type="html">&lt;p&gt;Eddy: /* Soluzione di Eddy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Traccia=&lt;br /&gt;
Scrivere uno script che prende in input (da linea di comando) una stringa e una lista di file; lo script deve&lt;br /&gt;
riportare il numero di occorrenze della stringa e di tutte i suoi prefissi nei file specificati. Ad esempio, se la&lt;br /&gt;
stringa cercata è linux, lo script deve riportare un output del tipo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
l 512&lt;br /&gt;
li 324&lt;br /&gt;
lin 300&lt;br /&gt;
linu 30&lt;br /&gt;
linux 30&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Eddy ==&lt;br /&gt;
In bash sarebbe stato molto piu` corto, ma volevo provare a fare qualcosa in python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import argparse&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # parsing degli argomenti&lt;br /&gt;
    parser = argparse.ArgumentParser()&lt;br /&gt;
    parser.add_argument(&amp;quot;string&amp;quot;, help=&amp;quot;string to be matched&amp;quot;)&lt;br /&gt;
    parser.add_argument(&amp;quot;files&amp;quot;, nargs='+', help=&amp;quot;source files&amp;quot;)&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    # leggo tutti i file e metto le parole in data&lt;br /&gt;
    data = list()&lt;br /&gt;
    try:&lt;br /&gt;
        for fname in args.files:&lt;br /&gt;
            with open(fname) as f:&lt;br /&gt;
                data += f.read().split()&lt;br /&gt;
    except FileNotFoundError:&lt;br /&gt;
        print ('file \'%s\' not found' % fname)&lt;br /&gt;
        sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
    # faccio lo string matching per ogni prefisso&lt;br /&gt;
    for i in range(len(args.string)+1)[1:]:     # ogni prefisso&lt;br /&gt;
        currStrn = args.string[:i]&lt;br /&gt;
        count = 0&lt;br /&gt;
        newData = list()&lt;br /&gt;
&lt;br /&gt;
        for strn in data:       # string matching&lt;br /&gt;
            n = strn.count(currStrn)&lt;br /&gt;
            if n&amp;gt;0:&lt;br /&gt;
                count += n&lt;br /&gt;
                newData.append(strn)&lt;br /&gt;
        print (currStrn,count)&lt;br /&gt;
        data = newData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Soluzione in bash&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env bash&lt;br /&gt;
&lt;br /&gt;
cat ${@:2} &amp;gt;&amp;gt; /tmp/tmp$$&lt;br /&gt;
string=$1&lt;br /&gt;
for (( i=1; i&amp;lt;=${#string}; i++ ))&lt;br /&gt;
do&lt;br /&gt;
   curr=$(echo ${string} | cut -c1-$i)&lt;br /&gt;
   occ=$(grep -o &amp;quot;$curr&amp;quot; /tmp/tmp$$ | wc -w)&lt;br /&gt;
   echo &amp;quot;$curr $occ&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Grep_piramidale_(non_tanto_grep)_esame_2.7.2003&amp;diff=1053</id>
		<title>Grep piramidale (non tanto grep) esame 2.7.2003</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Grep_piramidale_(non_tanto_grep)_esame_2.7.2003&amp;diff=1053"/>
		<updated>2015-04-21T22:59:16Z</updated>

		<summary type="html">&lt;p&gt;Eddy: Created page with &amp;quot;=Traccia= Scrivere uno script che prende in input (da linea di comando) una stringa e una lista di file; lo script deve riportare il numero di occorrenze della stringa e di tu...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Traccia=&lt;br /&gt;
Scrivere uno script che prende in input (da linea di comando) una stringa e una lista di file; lo script deve&lt;br /&gt;
riportare il numero di occorrenze della stringa e di tutte i suoi prefissi nei file specificati. Ad esempio, se la&lt;br /&gt;
stringa cercata è linux, lo script deve riportare un output del tipo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
l 512&lt;br /&gt;
li 324&lt;br /&gt;
lin 300&lt;br /&gt;
linu 30&lt;br /&gt;
linux 30&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Eddy ==&lt;br /&gt;
In bash sarebbe stato molto piu` corto, ma volevo provare a fare qualcosa in python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import argparse&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # parsing degli argomenti&lt;br /&gt;
    parser = argparse.ArgumentParser()&lt;br /&gt;
    parser.add_argument(&amp;quot;string&amp;quot;, help=&amp;quot;string to be matched&amp;quot;)&lt;br /&gt;
    parser.add_argument(&amp;quot;files&amp;quot;, nargs='+', help=&amp;quot;source files&amp;quot;)&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    # leggo tutti i file e metto le parole in data&lt;br /&gt;
    data = list()&lt;br /&gt;
    try:&lt;br /&gt;
        for fname in args.files:&lt;br /&gt;
            with open(fname) as f:&lt;br /&gt;
                data += f.read().split()&lt;br /&gt;
    except FileNotFoundError:&lt;br /&gt;
        print ('file \'%s\' not found' % fname)&lt;br /&gt;
        sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
    # faccio lo string matching per ogni prefisso&lt;br /&gt;
    for i in range(len(args.string)+1)[1:]:     # ogni prefisso&lt;br /&gt;
        currStrn = args.string[:i]&lt;br /&gt;
        count = 0&lt;br /&gt;
        newData = list()&lt;br /&gt;
&lt;br /&gt;
        for strn in data:       # string matching&lt;br /&gt;
            n = strn.count(currStrn)&lt;br /&gt;
            if n&amp;gt;0:&lt;br /&gt;
                count += n&lt;br /&gt;
                newData.append(strn)&lt;br /&gt;
        print (currStrn,count)&lt;br /&gt;
        data = newData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=1052</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=1052"/>
		<updated>2015-04-21T22:48:13Z</updated>

		<summary type="html">&lt;p&gt;Eddy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questo &amp;amp;egrave; il Wiki del Corso di Sistemi Operativi&lt;br /&gt;
&lt;br /&gt;
[[Grep piramidale (non tanto grep) esame 2.7.2003]]&lt;br /&gt;
&lt;br /&gt;
[[Ricerca e stampa MD5checksum (Prova pratica 21-01-2015)]]&lt;br /&gt;
&lt;br /&gt;
[[Linker fisico (Prova pratica 20-02-2014)]]&lt;br /&gt;
&lt;br /&gt;
[[Differenza tra due sottoalberi del file system (Prova pratica 22-07-2011)]]&lt;br /&gt;
&lt;br /&gt;
[[Aggiorna cartelle (Prova pratica 23-01-2014)]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3 prova pratica 29 maggio 2014]]&lt;br /&gt;
&lt;br /&gt;
[[Ampiezza di tutti i file di una directory divisi per suffisso (Prova pratica 29-05-2013)]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1 Prova Pratica 12-09-11]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1 Prova Pratica 25-01-2013]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3 Prova Pratica 22-06-2011]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3, prova pratica, 18-07-2013]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3, prova pratica, 17-07-2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica, 23-01-2014]]&lt;br /&gt;
&lt;br /&gt;
[[Prova pratica Esercizio 3 esami 17_07_12 - 17_06_14 - 19_07_10]]&lt;br /&gt;
&lt;br /&gt;
[[Prova pratica 23_01_14]]&lt;br /&gt;
&lt;br /&gt;
[[Albero binario 2002-07-23]]&lt;br /&gt;
&lt;br /&gt;
[[50 Sfumature di Fibonacci]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1 Prova Pratica 20/06/12]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3 Prova Pratica 17/06/14]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3, prova pratica 13/09/2013]]&lt;br /&gt;
&lt;br /&gt;
[[Prova pratica 17 07 14]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 20.01.2015]]&lt;br /&gt;
&lt;br /&gt;
[[bash scripting 2002 gennaio]]&lt;br /&gt;
&lt;br /&gt;
[[Process Race (Prova pratica 18-07-2013)]]&lt;br /&gt;
&lt;br /&gt;
[[Arduino web controller]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 29.05.2013]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 29.05.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 20.06.2013]]&lt;br /&gt;
&lt;br /&gt;
[[Prova_pratica_21_01_15]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 17.06.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1 - 25.09.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 20/02/2014]]&lt;br /&gt;
&lt;br /&gt;
[[Demone ruba input]]&lt;br /&gt;
&lt;br /&gt;
[[wifi daemon]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 13/09/2013]]&lt;br /&gt;
&lt;br /&gt;
[[Problema Dei Filosofi]]&lt;br /&gt;
&lt;br /&gt;
[http://www.cs.unibo.it/~renzo/so/portability.tgz portability.tgz]&lt;br /&gt;
&lt;br /&gt;
[[listx.h commentato + esempio su container_of]]&lt;br /&gt;
&lt;br /&gt;
[[Congettura di Goldbach]]&lt;br /&gt;
&lt;br /&gt;
[[list segments]]&lt;br /&gt;
&lt;br /&gt;
[[Execv/fork su file aperto]]&lt;br /&gt;
&lt;br /&gt;
[[Angry_Children]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 12/02/2009]]&lt;br /&gt;
&lt;br /&gt;
[[(Programma C) Un quadrato nella matrice]]&lt;br /&gt;
&lt;br /&gt;
[[&amp;quot;classi&amp;quot;_in_C]]&lt;br /&gt;
&lt;br /&gt;
[[Esempi del 02 dicembre 2014]]&lt;br /&gt;
&lt;br /&gt;
[[Materiale dell'AA 2013-14]]&lt;br /&gt;
----&lt;br /&gt;
Ricordate che per creare un account o quando viene richiesto di risolvere un semplice calcolo occorre ricordare quanto scritto [[qui]]&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Ampiezza_di_tutti_i_file_di_una_directory_divisi_per_suffisso_(Prova_pratica_29-05-2013)&amp;diff=982</id>
		<title>Ampiezza di tutti i file di una directory divisi per suffisso (Prova pratica 29-05-2013)</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Ampiezza_di_tutti_i_file_di_una_directory_divisi_per_suffisso_(Prova_pratica_29-05-2013)&amp;diff=982"/>
		<updated>2015-04-10T09:09:02Z</updated>

		<summary type="html">&lt;p&gt;Eddy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Esercizio 3: Script bash o Python: (10 punti):&lt;br /&gt;
Scrivere un programma python o uno script bash che conti l'ampiezza totale in byte di tutti i file di una directory divisi per suffisso&lt;br /&gt;
(i.e. Si considera suffisso tutto cio' che segue il primo carattere 'punto' nel filename). I file privi di suffisso vengono ignorati.&lt;br /&gt;
&lt;br /&gt;
Es:&lt;br /&gt;
$ suffixlen dir &lt;br /&gt;
.c: 44320&lt;br /&gt;
.o: 123000&lt;br /&gt;
.tar.gz: 555333&lt;br /&gt;
.jpg: 44332&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Federico Giuggioloni usando bash ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
DIR=$1&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `find $DIR -name &amp;quot;*.*&amp;quot; -exec basename {} \; | sort -u -k2 -t.` ; do&lt;br /&gt;
&lt;br /&gt;
   if [[ $NAME != *&amp;quot;.&amp;quot;* ]] ; then&lt;br /&gt;
      continue&lt;br /&gt;
   fi&lt;br /&gt;
&lt;br /&gt;
   SUFFIX=${NAME#*.}&lt;br /&gt;
&lt;br /&gt;
   echo -ne &amp;quot;.${SUFFIX}: &amp;quot;&lt;br /&gt;
   TEST=`find $DIR -name &amp;quot;*.${SUFFIX}&amp;quot; -exec wc -c {} + | tail -1`&lt;br /&gt;
   echo $TEST | cut -d &amp;quot; &amp;quot; -f 1&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Federico Giuggioloni usando Python (2.7.6) ==&lt;br /&gt;
&lt;br /&gt;
Non so come eliminare lo spazio aggiunto dalla print tra gli elementi separati dalla virgola.&lt;br /&gt;
Per il resto l'output è lo stesso di quello in bash.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
rootdir = sys.argv[1]&lt;br /&gt;
extsize = {}&lt;br /&gt;
&lt;br /&gt;
print&lt;br /&gt;
&lt;br /&gt;
for root, subFolders, files in os.walk(rootdir):&lt;br /&gt;
&lt;br /&gt;
   for file in files:&lt;br /&gt;
      fp = os.path.join(root, file)&lt;br /&gt;
      size = os.path.getsize(fp)&lt;br /&gt;
      extension = file.split(&amp;quot;.&amp;quot;)[-1]&lt;br /&gt;
      if extension in extsize:&lt;br /&gt;
         extsize[extension] += size&lt;br /&gt;
      else:&lt;br /&gt;
         extsize[extension] = size&lt;br /&gt;
&lt;br /&gt;
for key in extsize:&lt;br /&gt;
   print &amp;quot;.&amp;quot;, key, &amp;quot;:&amp;quot;, extsize[key]&lt;br /&gt;
&lt;br /&gt;
print&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Eddy ==&lt;br /&gt;
*Inizialmente ho esportato l'array associativo, per permettere alla subshell che eseguiva il while di usare extmap del padre, ma non riesco a capire come mai non funzioni, cosi` ho usato un file temporaneo&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export extmap&lt;br /&gt;
find $1 -name &amp;quot;?*.*&amp;quot; -type f | while read path&lt;br /&gt;
... &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*soluzione&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
declare -A extmap&lt;br /&gt;
&lt;br /&gt;
find $1 -name &amp;quot;?*.*&amp;quot; -type f &amp;gt; /tmp/tmp$$&lt;br /&gt;
while read path&lt;br /&gt;
do&lt;br /&gt;
   fullname=`basename &amp;quot;$path&amp;quot;`&lt;br /&gt;
   ext=${fullname#?*.} #non considero il punto dei file nascosti&lt;br /&gt;
   filesize=`wc -c &amp;quot;$path&amp;quot; | awk '{print $1}'`&lt;br /&gt;
   let &amp;quot;sum=${extmap[&amp;quot;$ext&amp;quot;]}+$filesize&amp;quot;&lt;br /&gt;
   extmap[&amp;quot;$ext&amp;quot;]=&amp;quot;$sum&amp;quot;&lt;br /&gt;
done &amp;lt; /tmp/tmp$$&lt;br /&gt;
&lt;br /&gt;
for ext in &amp;quot;${!extmap[@]}&amp;quot;&lt;br /&gt;
do&lt;br /&gt;
   echo &amp;quot;$ext - ${extmap[&amp;quot;$ext&amp;quot;]}&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
rm /tmp/tmp$$&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Albero_binario_2002-07-23&amp;diff=974</id>
		<title>Albero binario 2002-07-23</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Albero_binario_2002-07-23&amp;diff=974"/>
		<updated>2015-04-08T06:59:54Z</updated>

		<summary type="html">&lt;p&gt;Eddy: /* Soluzione di Eddy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scrivere un programma C così organizzato. Si generi innanzitutto un albero binario di processi di altezza&lt;br /&gt;
ALTEZZA. Se ALTEZZA=1, l’albero è costituito dal solo processo principale. Se ALTEZZA &amp;gt; 1, il processo&lt;br /&gt;
padre genera due processi, che corrispondono ai figli destro e sinistro. Ognuno dei figli genera due alberi binari&lt;br /&gt;
di processi di altezza ALTEZZA-1. I processi foglia (quelli dell’ultimo livello) generano un numero casuale,&lt;br /&gt;
utilizzando le funzioni rand(), e lo comunicano al processo genitore. Il processo genitore riceve i valori dai&lt;br /&gt;
due processi figli, li somma e comunica il risultato al proprio genitore. Il procedimento termina quando il&lt;br /&gt;
processo radice riceve i valori dai propri figli e li somma. I processi foglia devono stampare l’identificatore del&lt;br /&gt;
processo e il valore generato. Tutti gli altri processi devono stampare il proprio identificatore, i valori ricevuti&lt;br /&gt;
dai figli e la somma così ottenuta. Risolvere il problema utilizzando pipe.&lt;br /&gt;
PS Per le prove, utilizzare valori bassi di altezza (3-4), per evitare di incorrere in limitazioni sul numero di&lt;br /&gt;
processi.&lt;br /&gt;
&lt;br /&gt;
==Soluzione di Eddy==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define MAXVAL 20&lt;br /&gt;
&lt;br /&gt;
void inputH (int argc, char **argv);&lt;br /&gt;
int treeGen (int h);&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
   int rv=0;&lt;br /&gt;
   inputH (argc, argv);&lt;br /&gt;
   treeGen (atoi(argv[1]));&lt;br /&gt;
   return rv;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void inputH (int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
   if (argc != 2)&lt;br /&gt;
   {&lt;br /&gt;
      printf (&amp;quot;Usage: %s [ALTEZZA]\n&amp;quot;, argv[0]);&lt;br /&gt;
      exit (EXIT_FAILURE);&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      int h = atoi(argv[1]);&lt;br /&gt;
      // maximum number of simultaneous processes per user ID.&lt;br /&gt;
      long cldMax = sysconf (_SC_CHILD_MAX);&lt;br /&gt;
      // NB. 2^h -1 processes in a binary tree&lt;br /&gt;
      if ( h &amp;lt; 1 || (int)pow(2, h)-1 &amp;gt; cldMax)&lt;br /&gt;
      {&lt;br /&gt;
         printf (&amp;quot;Invalid argument: ALTEZZA is too high/low\n&amp;quot;);&lt;br /&gt;
         exit (EXIT_FAILURE);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int treeGen (int h)&lt;br /&gt;
{&lt;br /&gt;
   if (h&amp;lt;=1)&lt;br /&gt;
   {&lt;br /&gt;
      // if h==1 root is handled as a leaf&lt;br /&gt;
      // leaf: generates a random value&lt;br /&gt;
      int randV = 0;&lt;br /&gt;
      srandom ( (int) getpid());&lt;br /&gt;
      randV = random()% MAXVAL;&lt;br /&gt;
      printf (&amp;quot;**Leaf %d: number %d generated\n&amp;quot;, getpid(), randV);&lt;br /&gt;
      return randV;&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
&lt;br /&gt;
      int lpipefd[2];&lt;br /&gt;
      int rpipefd[2];&lt;br /&gt;
&lt;br /&gt;
      int cValue[2]={0,0}; //child values&lt;br /&gt;
      pid_t cld [2] = {-1,-1};&lt;br /&gt;
&lt;br /&gt;
      pipe(lpipefd);&lt;br /&gt;
      pipe(rpipefd);&lt;br /&gt;
&lt;br /&gt;
      // left cld fork&lt;br /&gt;
      cld[0] = fork ();&lt;br /&gt;
&lt;br /&gt;
      if ( cld[0] == 0)&lt;br /&gt;
      {&lt;br /&gt;
&lt;br /&gt;
         close(lpipefd[0]);          /* Close unused read end */&lt;br /&gt;
         cValue[0] = treeGen (h-1);&lt;br /&gt;
         write(lpipefd[1], &amp;amp;(cValue[0]), sizeof(int));&lt;br /&gt;
         close(lpipefd[1]);&lt;br /&gt;
         exit(EXIT_SUCCESS);&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // right cld fork&lt;br /&gt;
      cld[1] = fork ();&lt;br /&gt;
&lt;br /&gt;
      if (cld[1] ==0)&lt;br /&gt;
      {&lt;br /&gt;
         close(rpipefd[0]);          /* Close unused read end */&lt;br /&gt;
         cValue[1] = treeGen (h-1);&lt;br /&gt;
         write(rpipefd[1], &amp;amp;(cValue[1]), sizeof(int));&lt;br /&gt;
         close(rpipefd[1]);&lt;br /&gt;
         exit(EXIT_SUCCESS);&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // parent&lt;br /&gt;
      if (cld[0] &amp;gt;0 &amp;amp;&amp;amp; cld[1]&amp;gt;0) {&lt;br /&gt;
         int sum =0;&lt;br /&gt;
         close(lpipefd[1]);          /* Close unused write end */&lt;br /&gt;
         close(rpipefd[1]);          /* Close unused write end */&lt;br /&gt;
&lt;br /&gt;
         wait();&lt;br /&gt;
         wait();&lt;br /&gt;
         printf (&amp;quot;##Node %d\n&amp;quot;, getpid());&lt;br /&gt;
&lt;br /&gt;
         while (read(lpipefd[0], &amp;amp;(cValue[0]), sizeof(int)) &amp;gt; 0);&lt;br /&gt;
         printf (&amp;quot;\t%d received from %d\n&amp;quot;, cValue[0], cld[0]);&lt;br /&gt;
         while (read(rpipefd[0], &amp;amp;(cValue[1]), sizeof(int)) &amp;gt; 0);&lt;br /&gt;
         printf (&amp;quot;\t%d received from %d\n&amp;quot;, cValue[1], cld[1]);&lt;br /&gt;
&lt;br /&gt;
         sum = cValue[0] + cValue[1];&lt;br /&gt;
         printf (&amp;quot;\tsum: %d\n&amp;quot;, sum);&lt;br /&gt;
         return sum;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // at least a fork returned -1&lt;br /&gt;
      if (cld[0] &amp;gt; 0) kill(cld[0] ,SIGTERM);&lt;br /&gt;
      if (cld[1] &amp;gt; 0) kill(cld[1] ,SIGTERM);&lt;br /&gt;
&lt;br /&gt;
      exit (EXIT_FAILURE);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Albero_binario_2002-07-23&amp;diff=973</id>
		<title>Albero binario 2002-07-23</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Albero_binario_2002-07-23&amp;diff=973"/>
		<updated>2015-04-08T06:42:38Z</updated>

		<summary type="html">&lt;p&gt;Eddy: /* Soluzione di Eddy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scrivere un programma C così organizzato. Si generi innanzitutto un albero binario di processi di altezza&lt;br /&gt;
ALTEZZA. Se ALTEZZA=1, l’albero è costituito dal solo processo principale. Se ALTEZZA &amp;gt; 1, il processo&lt;br /&gt;
padre genera due processi, che corrispondono ai figli destro e sinistro. Ognuno dei figli genera due alberi binari&lt;br /&gt;
di processi di altezza ALTEZZA-1. I processi foglia (quelli dell’ultimo livello) generano un numero casuale,&lt;br /&gt;
utilizzando le funzioni rand(), e lo comunicano al processo genitore. Il processo genitore riceve i valori dai&lt;br /&gt;
due processi figli, li somma e comunica il risultato al proprio genitore. Il procedimento termina quando il&lt;br /&gt;
processo radice riceve i valori dai propri figli e li somma. I processi foglia devono stampare l’identificatore del&lt;br /&gt;
processo e il valore generato. Tutti gli altri processi devono stampare il proprio identificatore, i valori ricevuti&lt;br /&gt;
dai figli e la somma così ottenuta. Risolvere il problema utilizzando pipe.&lt;br /&gt;
PS Per le prove, utilizzare valori bassi di altezza (3-4), per evitare di incorrere in limitazioni sul numero di&lt;br /&gt;
processi.&lt;br /&gt;
&lt;br /&gt;
==Soluzione di Eddy==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define MAXVAL 20&lt;br /&gt;
&lt;br /&gt;
void inputH (int argc, char **argv);&lt;br /&gt;
int treeGen (int h);&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
   int rv=0;&lt;br /&gt;
   inputH (argc, argv);&lt;br /&gt;
   treeGen (atoi(argv[1]));&lt;br /&gt;
   return rv;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void inputH (int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
   if (argc != 2)&lt;br /&gt;
   {&lt;br /&gt;
      printf (&amp;quot;Usage: %s [ALTEZZA]\n&amp;quot;, argv[0]);&lt;br /&gt;
      exit (EXIT_FAILURE);&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      int h = atoi(argv[1]);&lt;br /&gt;
      // maximum number of simultaneous processes per user ID.&lt;br /&gt;
      long cldMax = sysconf (_SC_CHILD_MAX);&lt;br /&gt;
      // NB. 2^h -1 processes in a binary tree&lt;br /&gt;
      if ( h &amp;lt; 1 || (int)pow(2, h)-1 &amp;gt; cldMax)&lt;br /&gt;
      {&lt;br /&gt;
         printf (&amp;quot;Invalid argument: ALTEZZA is too high/low\n&amp;quot;);&lt;br /&gt;
         exit (EXIT_FAILURE);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int treeGen (int h)&lt;br /&gt;
{&lt;br /&gt;
   if (h&amp;lt;=1)&lt;br /&gt;
   {&lt;br /&gt;
      // if h==1 root is handled as a leaf&lt;br /&gt;
      // leaf: generates a random value&lt;br /&gt;
      int randV = 0;&lt;br /&gt;
      srandom ( (int) getpid());&lt;br /&gt;
      randV = random()% MAXVAL;&lt;br /&gt;
      printf (&amp;quot;**Leaf %d: number %d generated\n&amp;quot;, getpid(), randV);&lt;br /&gt;
      return randV;&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
&lt;br /&gt;
      int lpipefd[2];&lt;br /&gt;
      int rpipefd[2];&lt;br /&gt;
&lt;br /&gt;
      int cValue[2]={0,0}; //child values&lt;br /&gt;
      pid_t cld [2] = {-1,-1};&lt;br /&gt;
&lt;br /&gt;
      pipe(lpipefd);&lt;br /&gt;
      pipe(rpipefd);&lt;br /&gt;
&lt;br /&gt;
      // left cld fork&lt;br /&gt;
      cld[0] = fork ();&lt;br /&gt;
&lt;br /&gt;
      if ( cld[0] == 0)&lt;br /&gt;
      {&lt;br /&gt;
&lt;br /&gt;
         close(lpipefd[0]);          /* Close unused read end */&lt;br /&gt;
         cValue[0] = treeGen (h-1);&lt;br /&gt;
         write(lpipefd[1], &amp;amp;(cValue[0]), sizeof(int));&lt;br /&gt;
         close(lpipefd[1]);&lt;br /&gt;
         exit(EXIT_SUCCESS);&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // right cld fork&lt;br /&gt;
      cld[1] = fork ();&lt;br /&gt;
&lt;br /&gt;
      if (cld[1] ==0)&lt;br /&gt;
      {&lt;br /&gt;
         close(rpipefd[0]);          /* Close unused read end */&lt;br /&gt;
         cValue[1] = treeGen (h-1);&lt;br /&gt;
         write(rpipefd[1], &amp;amp;(cValue[1]), sizeof(int));&lt;br /&gt;
         close(rpipefd[1]);&lt;br /&gt;
         exit(EXIT_SUCCESS);&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // parent&lt;br /&gt;
      if (cld[0] &amp;gt;0 &amp;amp;&amp;amp; cld[1]&amp;gt;0) {&lt;br /&gt;
         int sum =0;&lt;br /&gt;
         close(lpipefd[1]);          /* Close unused write end */&lt;br /&gt;
         close(rpipefd[1]);          /* Close unused write end */&lt;br /&gt;
&lt;br /&gt;
         wait();&lt;br /&gt;
         wait();&lt;br /&gt;
         printf (&amp;quot;##Node %d\n&amp;quot;, getpid());&lt;br /&gt;
&lt;br /&gt;
         while (read(lpipefd[0], &amp;amp;(cValue[0]), sizeof(int)) &amp;gt; 0);&lt;br /&gt;
         printf (&amp;quot;\t%d received from %d\n&amp;quot;, cValue[0], cld[0]);&lt;br /&gt;
         while (read(rpipefd[0], &amp;amp;(cValue[1]), sizeof(int)) &amp;gt; 0);&lt;br /&gt;
         printf (&amp;quot;\t%d received from %d\n&amp;quot;, cValue[1], cld[1]);&lt;br /&gt;
&lt;br /&gt;
         sum = cValue[0] + cValue[1];&lt;br /&gt;
         printf (&amp;quot;\tsum: %d\n&amp;quot;, sum);&lt;br /&gt;
         return sum;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // at least a fork returned -1&lt;br /&gt;
      if (cld[0] &amp;gt; 0) kill(cld[0] ,SIGCHLD);&lt;br /&gt;
      if (cld[1] &amp;gt; 0) kill(cld[1] ,SIGCHLD);&lt;br /&gt;
&lt;br /&gt;
      exit (EXIT_FAILURE);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Albero_binario_2002-07-23&amp;diff=972</id>
		<title>Albero binario 2002-07-23</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Albero_binario_2002-07-23&amp;diff=972"/>
		<updated>2015-04-07T23:40:19Z</updated>

		<summary type="html">&lt;p&gt;Eddy: Created page with &amp;quot;Scrivere un programma C così organizzato. Si generi innanzitutto un albero binario di processi di altezza ALTEZZA. Se ALTEZZA=1, l’albero è costituito dal solo processo pr...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scrivere un programma C così organizzato. Si generi innanzitutto un albero binario di processi di altezza&lt;br /&gt;
ALTEZZA. Se ALTEZZA=1, l’albero è costituito dal solo processo principale. Se ALTEZZA &amp;gt; 1, il processo&lt;br /&gt;
padre genera due processi, che corrispondono ai figli destro e sinistro. Ognuno dei figli genera due alberi binari&lt;br /&gt;
di processi di altezza ALTEZZA-1. I processi foglia (quelli dell’ultimo livello) generano un numero casuale,&lt;br /&gt;
utilizzando le funzioni rand(), e lo comunicano al processo genitore. Il processo genitore riceve i valori dai&lt;br /&gt;
due processi figli, li somma e comunica il risultato al proprio genitore. Il procedimento termina quando il&lt;br /&gt;
processo radice riceve i valori dai propri figli e li somma. I processi foglia devono stampare l’identificatore del&lt;br /&gt;
processo e il valore generato. Tutti gli altri processi devono stampare il proprio identificatore, i valori ricevuti&lt;br /&gt;
dai figli e la somma così ottenuta. Risolvere il problema utilizzando pipe.&lt;br /&gt;
PS Per le prove, utilizzare valori bassi di altezza (3-4), per evitare di incorrere in limitazioni sul numero di&lt;br /&gt;
processi.&lt;br /&gt;
&lt;br /&gt;
==Soluzione di Eddy==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define MAXVAL 20&lt;br /&gt;
&lt;br /&gt;
void inputH (int argc, char **argv);&lt;br /&gt;
int treeGen (int h);&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
   int rv=0;&lt;br /&gt;
   inputH (argc, argv);&lt;br /&gt;
   treeGen (atoi(argv[1]));&lt;br /&gt;
   return rv;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void inputH (int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
   if (argc != 2)&lt;br /&gt;
   {&lt;br /&gt;
      printf (&amp;quot;Usage: %s [ALTEZZA]\n&amp;quot;, argv[0]);&lt;br /&gt;
      exit (EXIT_FAILURE);&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      int h = atoi(argv[1]);&lt;br /&gt;
      // maximum number of simultaneous processes per user ID.&lt;br /&gt;
      long cldMax = sysconf (_SC_CHILD_MAX);&lt;br /&gt;
      // NB. 2^h -1 processes in a binary tree&lt;br /&gt;
      if ( h &amp;lt; 1 || (int)pow(2, h)-1 &amp;gt; cldMax)&lt;br /&gt;
      {&lt;br /&gt;
         printf (&amp;quot;Invalid argument: ALTEZZA is too high/low\n&amp;quot;);&lt;br /&gt;
         exit (EXIT_FAILURE);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int treeGen (int h)&lt;br /&gt;
{&lt;br /&gt;
   if (h&amp;lt;=1)&lt;br /&gt;
   {&lt;br /&gt;
      // if h==1 root is handled as a leaf&lt;br /&gt;
      // leaf: generates a random value&lt;br /&gt;
      int randV = 0;&lt;br /&gt;
      srandom ( (int) getpid());&lt;br /&gt;
      randV = random()% MAXVAL;&lt;br /&gt;
      printf (&amp;quot;**Leaf %d: number %d generated\n&amp;quot;, getpid(), randV);&lt;br /&gt;
      return randV;&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
&lt;br /&gt;
      int lpipefd[2];&lt;br /&gt;
      int rpipefd[2];&lt;br /&gt;
&lt;br /&gt;
      int cValue[2]={0,0}; //child values&lt;br /&gt;
      pid_t cld [2] = {-1,-1};&lt;br /&gt;
&lt;br /&gt;
      pipe(lpipefd);&lt;br /&gt;
      pipe(rpipefd);&lt;br /&gt;
&lt;br /&gt;
      // left cld fork&lt;br /&gt;
      cld[0] = fork ();&lt;br /&gt;
&lt;br /&gt;
      if ( cld[0] == 0)&lt;br /&gt;
      {&lt;br /&gt;
&lt;br /&gt;
         close(lpipefd[0]);          /* Close unused read end */&lt;br /&gt;
         cValue[0] = treeGen (h-1);&lt;br /&gt;
         write(lpipefd[1], &amp;amp;(cValue[0]), sizeof(int));&lt;br /&gt;
         close(lpipefd[1]);&lt;br /&gt;
         exit(EXIT_SUCCESS);&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // right cld fork&lt;br /&gt;
      cld[1] = fork ();&lt;br /&gt;
&lt;br /&gt;
      if (cld[1] ==0)&lt;br /&gt;
      {&lt;br /&gt;
         close(rpipefd[0]);          /* Close unused read end */&lt;br /&gt;
         cValue[1] = treeGen (h-1);&lt;br /&gt;
         write(rpipefd[1], &amp;amp;(cValue[1]), sizeof(int));&lt;br /&gt;
         close(rpipefd[1]);&lt;br /&gt;
         exit(EXIT_SUCCESS);&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // parent&lt;br /&gt;
      if (cld[0] &amp;gt;0 &amp;amp;&amp;amp; cld[1]&amp;gt;0) {&lt;br /&gt;
         int sum =0;&lt;br /&gt;
         close(lpipefd[1]);          /* Close unused write end */&lt;br /&gt;
         close(rpipefd[1]);          /* Close unused write end */&lt;br /&gt;
&lt;br /&gt;
         wait();&lt;br /&gt;
         wait();&lt;br /&gt;
         printf (&amp;quot;##Node %d\n&amp;quot;, getpid());&lt;br /&gt;
&lt;br /&gt;
         while (read(lpipefd[0], &amp;amp;(cValue[0]), sizeof(int)) &amp;gt; 0);&lt;br /&gt;
         printf (&amp;quot;\t%d received from %d\n&amp;quot;, cValue[0], cld[0]);&lt;br /&gt;
         while (read(rpipefd[0], &amp;amp;(cValue[1]), sizeof(int)) &amp;gt; 0);&lt;br /&gt;
         printf (&amp;quot;\t%d received from %d\n&amp;quot;, cValue[1], cld[1]);&lt;br /&gt;
&lt;br /&gt;
         sum = cValue[0] + cValue[1];&lt;br /&gt;
         printf (&amp;quot;\tsum: %d\n&amp;quot;, sum);&lt;br /&gt;
         return sum;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // at least a fork returned -1&lt;br /&gt;
      if (cld[0] == -1) kill(cld[0] ,SIGTERM);&lt;br /&gt;
      if (cld[1] == -1) kill(cld[1] ,SIGTERM);&lt;br /&gt;
&lt;br /&gt;
      exit (EXIT_FAILURE);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=971</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=971"/>
		<updated>2015-04-07T23:36:41Z</updated>

		<summary type="html">&lt;p&gt;Eddy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questo &amp;amp;egrave; il Wiki del Corso di Sistemi Operativi&lt;br /&gt;
&lt;br /&gt;
[[Albero binario 2002-07-23]]&lt;br /&gt;
&lt;br /&gt;
[[50 Sfumature di Fibonacci]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1 Prova Pratica 20/06/12]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3 Prova Pratica 17/06/14]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3, prova pratica 13/09/2013]]&lt;br /&gt;
&lt;br /&gt;
[[Prova pratica 17 07 14]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 20.01.2015]]&lt;br /&gt;
&lt;br /&gt;
[[bash scripting 2002 gennaio]]&lt;br /&gt;
&lt;br /&gt;
[[Process Race (Prova pratica 18-07-2013)]]&lt;br /&gt;
&lt;br /&gt;
[[Arduino web controller]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 29.05.2013]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 29.05.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 20.06.2013]]&lt;br /&gt;
&lt;br /&gt;
[[Prova_pratica_21_01_15]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 17.06.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1 - 25.09.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 20/02/2014]]&lt;br /&gt;
&lt;br /&gt;
[[Demone ruba input]]&lt;br /&gt;
&lt;br /&gt;
[[wifi daemon]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 13/09/2013]]&lt;br /&gt;
&lt;br /&gt;
[[Problema Dei Filosofi]]&lt;br /&gt;
&lt;br /&gt;
[http://www.cs.unibo.it/~renzo/so/portability.tgz portability.tgz]&lt;br /&gt;
&lt;br /&gt;
[[listx.h commentato + esempio su container_of]]&lt;br /&gt;
&lt;br /&gt;
[[Congettura di Goldbach]]&lt;br /&gt;
&lt;br /&gt;
[[list segments]]&lt;br /&gt;
&lt;br /&gt;
[[Execv/fork su file aperto]]&lt;br /&gt;
&lt;br /&gt;
[[Angry_Children]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 12/02/2009]]&lt;br /&gt;
&lt;br /&gt;
[[(Programma C) Un quadrato nella matrice]]&lt;br /&gt;
&lt;br /&gt;
[[&amp;quot;classi&amp;quot;_in_C]]&lt;br /&gt;
&lt;br /&gt;
[[Esempi del 02 dicembre 2014]]&lt;br /&gt;
&lt;br /&gt;
[[Materiale dell'AA 2013-14]]&lt;br /&gt;
----&lt;br /&gt;
Ricordate che per creare un account o quando viene richiesto di risolvere un semplice calcolo occorre ricordare quanto scritto [[qui]]&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_pratica_2002.01.24&amp;diff=946</id>
		<title>Prova pratica 2002.01.24</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_pratica_2002.01.24&amp;diff=946"/>
		<updated>2015-03-31T11:19:48Z</updated>

		<summary type="html">&lt;p&gt;Eddy: Created page with &amp;quot;Scrivere uno script che estragga messaggi con subject SUBSCRIBE:&amp;lt;email&amp;gt; da un folder di posta elettronica e che inserisca &amp;lt;email&amp;gt; in un file chiamato mailing.list, evitando di...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scrivere uno script che estragga messaggi con subject SUBSCRIBE:&amp;lt;email&amp;gt; da un folder di posta elettronica e che inserisca &amp;lt;email&amp;gt; in un file chiamato mailing.list, evitando di inserire dupplicati.&lt;br /&gt;
&lt;br /&gt;
file:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
From: montreso@cs.unibo.it&lt;br /&gt;
Subject: SUBSCRIBE: montreso@cs.unibo.it&lt;br /&gt;
Date: xx.xx.xx&lt;br /&gt;
From: montreso@cs.unibo.it&lt;br /&gt;
Subject: SUBSCRIBE: montreso@phd.cs.unibo.it&lt;br /&gt;
Date: xx.xx.xx&lt;br /&gt;
From: rossi@cs.unibo.it&lt;br /&gt;
Subject: SUBSCRIBE: rossi@cs.unibo.it&lt;br /&gt;
Date: xx.xx.xx&lt;br /&gt;
From: bononi@cs.unibo.it&lt;br /&gt;
Subject: SUBSCRIBE: rossi@cs.unibo.it&lt;br /&gt;
Date: xx.xx.xx&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
il file risultante deve contenere:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
montreso@cs.unibo.it&lt;br /&gt;
montreso@phd.cs.unibo.it&lt;br /&gt;
rossi@cs.unibo.it&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Eddy ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
&lt;br /&gt;
controllaOccorrenza ()&lt;br /&gt;
{&lt;br /&gt;
   unaVolta=0&lt;br /&gt;
   if [ ! -f $2 ]&lt;br /&gt;
   then&lt;br /&gt;
      touch $2&lt;br /&gt;
   fi&lt;br /&gt;
   buf=`cat $2`&lt;br /&gt;
   for word in $buf; do&lt;br /&gt;
      if [ &amp;quot;$word&amp;quot; == &amp;quot;$1&amp;quot; ]; then&lt;br /&gt;
         unaVolta=1&lt;br /&gt;
         break&lt;br /&gt;
      fi&lt;br /&gt;
   done&lt;br /&gt;
   if [ &amp;quot;$unaVolta&amp;quot; -eq &amp;quot;0&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;$1&amp;quot; &amp;gt;&amp;gt; $2&lt;br /&gt;
   fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
okRead=0&lt;br /&gt;
buf=`cat $1`&lt;br /&gt;
for word in $buf; do&lt;br /&gt;
   # echo &amp;quot;$word&amp;quot;&lt;br /&gt;
   if [ &amp;quot;$okRead&amp;quot; -eq &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
      controllaOccorrenza $word mailing.list&lt;br /&gt;
      okRead=0&lt;br /&gt;
   fi&lt;br /&gt;
   if [ &amp;quot;$word&amp;quot; == &amp;quot;SUBSCRIBE:&amp;quot; ]; then&lt;br /&gt;
      okRead=1&lt;br /&gt;
   fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=945</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=945"/>
		<updated>2015-03-31T11:03:19Z</updated>

		<summary type="html">&lt;p&gt;Eddy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questo &amp;amp;egrave; il Wiki del Corso di Sistemi Operativi&lt;br /&gt;
&lt;br /&gt;
[[bash scripting 2002 gennaio]]&lt;br /&gt;
&lt;br /&gt;
[[Process Race (Prova pratica 18-07-2013)]]&lt;br /&gt;
&lt;br /&gt;
[[Arduino web controller]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 29.05.2013]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 29.05.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 20.06.2013]]&lt;br /&gt;
&lt;br /&gt;
[[Prova_pratica_21_01_15]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 17.06.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1 - 25.09.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 20/02/2014]]&lt;br /&gt;
&lt;br /&gt;
[[Demone ruba input]]&lt;br /&gt;
&lt;br /&gt;
[[wifi daemon]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 13/09/2013]]&lt;br /&gt;
&lt;br /&gt;
[[Problema Dei Filosofi]]&lt;br /&gt;
&lt;br /&gt;
[http://www.cs.unibo.it/~renzo/so/portability.tgz portability.tgz]&lt;br /&gt;
&lt;br /&gt;
[[listx.h commentato + esempio su container_of]]&lt;br /&gt;
&lt;br /&gt;
[[Congettura di Goldbach]]&lt;br /&gt;
&lt;br /&gt;
[[list segments]]&lt;br /&gt;
&lt;br /&gt;
[[Execv/fork su file aperto]]&lt;br /&gt;
&lt;br /&gt;
[[Angry_Children]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 12/02/2009]]&lt;br /&gt;
&lt;br /&gt;
[[(Programma C) Un quadrato nella matrice]]&lt;br /&gt;
&lt;br /&gt;
[[&amp;quot;classi&amp;quot;_in_C]]&lt;br /&gt;
&lt;br /&gt;
[[Esempi del 02 dicembre 2014]]&lt;br /&gt;
&lt;br /&gt;
[[Materiale dell'AA 2013-14]]&lt;br /&gt;
----&lt;br /&gt;
Ricordate che per creare un account o quando viene richiesto di risolvere un semplice calcolo occorre ricordare quanto scritto [[qui]]&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=931</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=931"/>
		<updated>2015-03-24T15:26:10Z</updated>

		<summary type="html">&lt;p&gt;Eddy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questo &amp;amp;egrave; il Wiki del Corso di Sistemi Operativi&lt;br /&gt;
&lt;br /&gt;
[[Arduino web controller]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 29.05.2013]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 29.05.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 20.06.2013]]&lt;br /&gt;
&lt;br /&gt;
[[Prova_pratica_21_01_15]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 17.06.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1 - 25.09.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 20/02/2014]]&lt;br /&gt;
&lt;br /&gt;
[[Demone ruba input]]&lt;br /&gt;
&lt;br /&gt;
[[wifi daemon]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 13/09/2013]]&lt;br /&gt;
&lt;br /&gt;
[[Problema Dei Filosofi]]&lt;br /&gt;
&lt;br /&gt;
[http://www.cs.unibo.it/~renzo/so/portability.tgz portability.tgz]&lt;br /&gt;
&lt;br /&gt;
[[listx.h commentato + esempio su container_of]]&lt;br /&gt;
&lt;br /&gt;
[[Congettura di Goldbach]]&lt;br /&gt;
&lt;br /&gt;
[[list segments]]&lt;br /&gt;
&lt;br /&gt;
[[Execv/fork su file aperto]]&lt;br /&gt;
&lt;br /&gt;
[[Angry_Children]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 12/02/2009]]&lt;br /&gt;
&lt;br /&gt;
[[(Programma C) Un quadrato nella matrice]]&lt;br /&gt;
&lt;br /&gt;
[[&amp;quot;classi&amp;quot;_in_C]]&lt;br /&gt;
&lt;br /&gt;
[[Esempi del 02 dicembre 2014]]&lt;br /&gt;
&lt;br /&gt;
[[Materiale dell'AA 2013-14]]&lt;br /&gt;
----&lt;br /&gt;
Ricordate che per creare un account o quando viene richiesto di risolvere un semplice calcolo occorre ricordare quanto scritto [[qui]]&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1,_prova_pratica_29.05.2013&amp;diff=926</id>
		<title>Esercizio 1, prova pratica 29.05.2013</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1,_prova_pratica_29.05.2013&amp;diff=926"/>
		<updated>2015-03-24T12:54:25Z</updated>

		<summary type="html">&lt;p&gt;Eddy: /* Soluzione di Eddy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Scrivere un programma testeventfd che faccia uso della system call eventfd.&lt;br /&gt;
In particolare il programma deve eseguire una fork, quando l'utente digita un numero letto dal processo padre, il processo&lt;br /&gt;
figlio deve stampare un numero uguale di x.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Soluzione di Pierg==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[]) {&lt;br /&gt;
	&lt;br /&gt;
	int efd, i; &lt;br /&gt;
	long long unsigned int val;&lt;br /&gt;
    	ssize_t s;&lt;br /&gt;
	&lt;br /&gt;
	/* Check for eventfd error */&lt;br /&gt;
	efd = eventfd(0, 0);&lt;br /&gt;
	if (efd == -1) {&lt;br /&gt;
		perror(&amp;quot;Eventfd Error&amp;quot;); &lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Use fork to move eventfd form parent to child */&lt;br /&gt;
	switch (fork()) {&lt;br /&gt;
		&lt;br /&gt;
		case 0:&lt;br /&gt;
			/* Read parent event */&lt;br /&gt;
			s = read(efd, &amp;amp;val, sizeof(long long unsigned int));&lt;br /&gt;
&lt;br /&gt;
            		if (s != sizeof(long long unsigned int)) {&lt;br /&gt;
                		perror(&amp;quot;Read Error&amp;quot;);&lt;br /&gt;
				exit(EXIT_FAILURE);&lt;br /&gt;
        		}&lt;br /&gt;
&lt;br /&gt;
			/* For is used to print the 'x' of the argument passed by terminal */&lt;br /&gt;
			for (i = (int)val; i &amp;gt; 0; i--) {&lt;br /&gt;
				printf (&amp;quot;x\n&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			exit(EXIT_SUCCESS);&lt;br /&gt;
		&lt;br /&gt;
		/* Check for error */&lt;br /&gt;
		case -1:&lt;br /&gt;
			perror(&amp;quot;Fork Error&amp;quot;); &lt;br /&gt;
			exit(EXIT_FAILURE);&lt;br /&gt;
&lt;br /&gt;
		default:&lt;br /&gt;
			/* Wait for number */&lt;br /&gt;
			printf (&amp;quot;Inserisci un intero diverso da 0: \n&amp;quot;);&lt;br /&gt;
			scanf (&amp;quot;%llu&amp;quot;, &amp;amp;val);&lt;br /&gt;
&lt;br /&gt;
			/* Write parent event */&lt;br /&gt;
           		s = write(efd, &amp;amp;val, sizeof(long long unsigned int));&lt;br /&gt;
&lt;br /&gt;
            		if (s != sizeof(long long unsigned int)) {&lt;br /&gt;
                		perror(&amp;quot;Write Error&amp;quot;);&lt;br /&gt;
				exit(EXIT_FAILURE);&lt;br /&gt;
        		}&lt;br /&gt;
	&lt;br /&gt;
			exit(EXIT_SUCCESS);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soluzione di Maldus==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
#include &amp;lt;semaphore.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
	sem_t empty , full ;&lt;br /&gt;
	pid_t son ;&lt;br /&gt;
	int ed , status, i;&lt;br /&gt;
	uint64_t x = 1;&lt;br /&gt;
	ed = eventfd(0,0) ;&lt;br /&gt;
	sem_init( &amp;amp;full , 1 , 0) ;&lt;br /&gt;
	sem_init( &amp;amp;empty , 1 , 1 ) ;&lt;br /&gt;
	switch( son = fork() ){&lt;br /&gt;
		case 0:&lt;br /&gt;
			while( x){&lt;br /&gt;
				scanf(&amp;quot;%&amp;quot; PRIu64 , &amp;amp;x) ;&lt;br /&gt;
				sem_wait(&amp;amp;empty) ;&lt;br /&gt;
				write(ed , &amp;amp;x , 8 ) ;&lt;br /&gt;
				sem_post(&amp;amp;full) ;&lt;br /&gt;
			}&lt;br /&gt;
			kill(son ,SIGTERM);&lt;br /&gt;
			return 0 ;&lt;br /&gt;
		default:&lt;br /&gt;
			while( 1 ){&lt;br /&gt;
				sem_wait(&amp;amp;full);&lt;br /&gt;
				read( ed , &amp;amp;x , 8) ;&lt;br /&gt;
				for( i = x ; i &amp;gt; 0 ; i--) printf( &amp;quot;x\n&amp;quot; ) ;&lt;br /&gt;
				sem_post(&amp;amp;empty) ;&lt;br /&gt;
			}&lt;br /&gt;
			return 1;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Siccome la write su di un event descriptor somma il valore dal buffer, se questa viene effettuata prima della lettura (che lo riporta a 0) il risultato ottenuto non è quello richiesto. Benchè sia altamente improbabile che una situazione del genere si verifichi in questo programma, ho cercato di evitarla usando i semafori (si tratta di un problema produttore/consumatore), senza successo: non riesco a capire perchè, ma sembra che le sem_post non incrementino il valore del semaforo.&lt;br /&gt;
Togliendo sem_wait e sem_post il programma funziona correttamente.&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1,_prova_pratica_29.05.2013&amp;diff=925</id>
		<title>Esercizio 1, prova pratica 29.05.2013</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1,_prova_pratica_29.05.2013&amp;diff=925"/>
		<updated>2015-03-24T11:58:04Z</updated>

		<summary type="html">&lt;p&gt;Eddy: /* Soluzione di Eddy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Scrivere un programma testeventfd che faccia uso della system call eventfd.&lt;br /&gt;
In particolare il programma deve eseguire una fork, quando l'utente digita un numero letto dal processo padre, il processo&lt;br /&gt;
figlio deve stampare un numero uguale di x.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Soluzione di Pierg==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[]) {&lt;br /&gt;
	&lt;br /&gt;
	int efd, i; &lt;br /&gt;
	long long unsigned int val;&lt;br /&gt;
    	ssize_t s;&lt;br /&gt;
	&lt;br /&gt;
	/* Check for eventfd error */&lt;br /&gt;
	efd = eventfd(0, 0);&lt;br /&gt;
	if (efd == -1) {&lt;br /&gt;
		perror(&amp;quot;Eventfd Error&amp;quot;); &lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Use fork to move eventfd form parent to child */&lt;br /&gt;
	switch (fork()) {&lt;br /&gt;
		&lt;br /&gt;
		case 0:&lt;br /&gt;
			/* Read parent event */&lt;br /&gt;
			s = read(efd, &amp;amp;val, sizeof(long long unsigned int));&lt;br /&gt;
&lt;br /&gt;
            		if (s != sizeof(long long unsigned int)) {&lt;br /&gt;
                		perror(&amp;quot;Read Error&amp;quot;);&lt;br /&gt;
				exit(EXIT_FAILURE);&lt;br /&gt;
        		}&lt;br /&gt;
&lt;br /&gt;
			/* For is used to print the 'x' of the argument passed by terminal */&lt;br /&gt;
			for (i = (int)val; i &amp;gt; 0; i--) {&lt;br /&gt;
				printf (&amp;quot;x\n&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			exit(EXIT_SUCCESS);&lt;br /&gt;
		&lt;br /&gt;
		/* Check for error */&lt;br /&gt;
		case -1:&lt;br /&gt;
			perror(&amp;quot;Fork Error&amp;quot;); &lt;br /&gt;
			exit(EXIT_FAILURE);&lt;br /&gt;
&lt;br /&gt;
		default:&lt;br /&gt;
			/* Wait for number */&lt;br /&gt;
			printf (&amp;quot;Inserisci un intero diverso da 0: \n&amp;quot;);&lt;br /&gt;
			scanf (&amp;quot;%llu&amp;quot;, &amp;amp;val);&lt;br /&gt;
&lt;br /&gt;
			/* Write parent event */&lt;br /&gt;
           		s = write(efd, &amp;amp;val, sizeof(long long unsigned int));&lt;br /&gt;
&lt;br /&gt;
            		if (s != sizeof(long long unsigned int)) {&lt;br /&gt;
                		perror(&amp;quot;Write Error&amp;quot;);&lt;br /&gt;
				exit(EXIT_FAILURE);&lt;br /&gt;
        		}&lt;br /&gt;
	&lt;br /&gt;
			exit(EXIT_SUCCESS);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soluzione di Maldus==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
#include &amp;lt;semaphore.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
	sem_t empty , full ;&lt;br /&gt;
	pid_t son ;&lt;br /&gt;
	int ed , status, i;&lt;br /&gt;
	uint64_t x = 1;&lt;br /&gt;
	ed = eventfd(0,0) ;&lt;br /&gt;
	sem_init( &amp;amp;full , 1 , 0) ;&lt;br /&gt;
	sem_init( &amp;amp;empty , 1 , 1 ) ;&lt;br /&gt;
	switch( son = fork() ){&lt;br /&gt;
		case 0:&lt;br /&gt;
			while( x){&lt;br /&gt;
				scanf(&amp;quot;%&amp;quot; PRIu64 , &amp;amp;x) ;&lt;br /&gt;
				sem_wait(&amp;amp;empty) ;&lt;br /&gt;
				write(ed , &amp;amp;x , 8 ) ;&lt;br /&gt;
				sem_post(&amp;amp;full) ;&lt;br /&gt;
			}&lt;br /&gt;
			kill(son ,SIGTERM);&lt;br /&gt;
			return 0 ;&lt;br /&gt;
		default:&lt;br /&gt;
			while( 1 ){&lt;br /&gt;
				sem_wait(&amp;amp;full);&lt;br /&gt;
				read( ed , &amp;amp;x , 8) ;&lt;br /&gt;
				for( i = x ; i &amp;gt; 0 ; i--) printf( &amp;quot;x\n&amp;quot; ) ;&lt;br /&gt;
				sem_post(&amp;amp;empty) ;&lt;br /&gt;
			}&lt;br /&gt;
			return 1;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Siccome la write su di un event descriptor somma il valore dal buffer, se questa viene effettuata prima della lettura (che lo riporta a 0) il risultato ottenuto non è quello richiesto. Benchè sia altamente improbabile che una situazione del genere si verifichi in questo programma, ho cercato di evitarla usando i semafori (si tratta di un problema produttore/consumatore), senza successo: non riesco a capire perchè, ma sembra che le sem_post non incrementino il valore del semaforo.&lt;br /&gt;
Togliendo sem_wait e sem_post il programma funziona correttamente.&lt;br /&gt;
&lt;br /&gt;
==Soluzione di Eddy==&lt;br /&gt;
Ho preso libera ispirazione da Maldus, ma ho usato la poll al posto dei semafori.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
#include &amp;lt;poll.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define INF (-1)&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  pid_t child;&lt;br /&gt;
  int efd, status;&lt;br /&gt;
  uint64_t x = 1;&lt;br /&gt;
  efd = eventfd(0,0);&lt;br /&gt;
&lt;br /&gt;
  nfds_t nfds = 1;&lt;br /&gt;
  struct pollfd *fds = (struct pollfd *) malloc (sizeof (struct pollfd));&lt;br /&gt;
    fds-&amp;gt;fd = efd;&lt;br /&gt;
    fds-&amp;gt;events = POLLIN;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  switch (child = fork())&lt;br /&gt;
  {&lt;br /&gt;
    case 0:&lt;br /&gt;
      //child&lt;br /&gt;
      while (1)&lt;br /&gt;
      {&lt;br /&gt;
        int i;&lt;br /&gt;
        poll( fds, nfds, INF); // wait for data to read.&lt;br /&gt;
        read( efd , &amp;amp;x , 8);&lt;br /&gt;
        for ( i = x; i &amp;gt; 0; i--)&lt;br /&gt;
          printf( &amp;quot;x&amp;quot; ) ;&lt;br /&gt;
        printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      return 1;&lt;br /&gt;
    default:&lt;br /&gt;
      //parent&lt;br /&gt;
      while (x){&lt;br /&gt;
        scanf(&amp;quot;%&amp;quot; PRIu64 , &amp;amp;x) ;&lt;br /&gt;
        write(efd , &amp;amp;x , 8 ) ;&lt;br /&gt;
      }&lt;br /&gt;
      kill(child ,SIGTERM);&lt;br /&gt;
      return 0 ;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1,_prova_pratica_29.05.2013&amp;diff=924</id>
		<title>Esercizio 1, prova pratica 29.05.2013</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1,_prova_pratica_29.05.2013&amp;diff=924"/>
		<updated>2015-03-24T10:05:47Z</updated>

		<summary type="html">&lt;p&gt;Eddy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Scrivere un programma testeventfd che faccia uso della system call eventfd.&lt;br /&gt;
In particolare il programma deve eseguire una fork, quando l'utente digita un numero letto dal processo padre, il processo&lt;br /&gt;
figlio deve stampare un numero uguale di x.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Soluzione di Pierg==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[]) {&lt;br /&gt;
	&lt;br /&gt;
	int efd, i; &lt;br /&gt;
	long long unsigned int val;&lt;br /&gt;
    	ssize_t s;&lt;br /&gt;
	&lt;br /&gt;
	/* Check for eventfd error */&lt;br /&gt;
	efd = eventfd(0, 0);&lt;br /&gt;
	if (efd == -1) {&lt;br /&gt;
		perror(&amp;quot;Eventfd Error&amp;quot;); &lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Use fork to move eventfd form parent to child */&lt;br /&gt;
	switch (fork()) {&lt;br /&gt;
		&lt;br /&gt;
		case 0:&lt;br /&gt;
			/* Read parent event */&lt;br /&gt;
			s = read(efd, &amp;amp;val, sizeof(long long unsigned int));&lt;br /&gt;
&lt;br /&gt;
            		if (s != sizeof(long long unsigned int)) {&lt;br /&gt;
                		perror(&amp;quot;Read Error&amp;quot;);&lt;br /&gt;
				exit(EXIT_FAILURE);&lt;br /&gt;
        		}&lt;br /&gt;
&lt;br /&gt;
			/* For is used to print the 'x' of the argument passed by terminal */&lt;br /&gt;
			for (i = (int)val; i &amp;gt; 0; i--) {&lt;br /&gt;
				printf (&amp;quot;x\n&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			exit(EXIT_SUCCESS);&lt;br /&gt;
		&lt;br /&gt;
		/* Check for error */&lt;br /&gt;
		case -1:&lt;br /&gt;
			perror(&amp;quot;Fork Error&amp;quot;); &lt;br /&gt;
			exit(EXIT_FAILURE);&lt;br /&gt;
&lt;br /&gt;
		default:&lt;br /&gt;
			/* Wait for number */&lt;br /&gt;
			printf (&amp;quot;Inserisci un intero diverso da 0: \n&amp;quot;);&lt;br /&gt;
			scanf (&amp;quot;%llu&amp;quot;, &amp;amp;val);&lt;br /&gt;
&lt;br /&gt;
			/* Write parent event */&lt;br /&gt;
           		s = write(efd, &amp;amp;val, sizeof(long long unsigned int));&lt;br /&gt;
&lt;br /&gt;
            		if (s != sizeof(long long unsigned int)) {&lt;br /&gt;
                		perror(&amp;quot;Write Error&amp;quot;);&lt;br /&gt;
				exit(EXIT_FAILURE);&lt;br /&gt;
        		}&lt;br /&gt;
	&lt;br /&gt;
			exit(EXIT_SUCCESS);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soluzione di Maldus==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
#include &amp;lt;semaphore.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
	sem_t empty , full ;&lt;br /&gt;
	pid_t son ;&lt;br /&gt;
	int ed , status, i;&lt;br /&gt;
	uint64_t x = 1;&lt;br /&gt;
	ed = eventfd(0,0) ;&lt;br /&gt;
	sem_init( &amp;amp;full , 1 , 0) ;&lt;br /&gt;
	sem_init( &amp;amp;empty , 1 , 1 ) ;&lt;br /&gt;
	switch( son = fork() ){&lt;br /&gt;
		case 0:&lt;br /&gt;
			while( x){&lt;br /&gt;
				scanf(&amp;quot;%&amp;quot; PRIu64 , &amp;amp;x) ;&lt;br /&gt;
				sem_wait(&amp;amp;empty) ;&lt;br /&gt;
				write(ed , &amp;amp;x , 8 ) ;&lt;br /&gt;
				sem_post(&amp;amp;full) ;&lt;br /&gt;
			}&lt;br /&gt;
			kill(son ,SIGTERM);&lt;br /&gt;
			return 0 ;&lt;br /&gt;
		default:&lt;br /&gt;
			while( 1 ){&lt;br /&gt;
				sem_wait(&amp;amp;full);&lt;br /&gt;
				read( ed , &amp;amp;x , 8) ;&lt;br /&gt;
				for( i = x ; i &amp;gt; 0 ; i--) printf( &amp;quot;x\n&amp;quot; ) ;&lt;br /&gt;
				sem_post(&amp;amp;empty) ;&lt;br /&gt;
			}&lt;br /&gt;
			return 1;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Siccome la write su di un event descriptor somma il valore dal buffer, se questa viene effettuata prima della lettura (che lo riporta a 0) il risultato ottenuto non è quello richiesto. Benchè sia altamente improbabile che una situazione del genere si verifichi in questo programma, ho cercato di evitarla usando i semafori (si tratta di un problema produttore/consumatore), senza successo: non riesco a capire perchè, ma sembra che le sem_post non incrementino il valore del semaforo.&lt;br /&gt;
Togliendo sem_wait e sem_post il programma funziona correttamente.&lt;br /&gt;
&lt;br /&gt;
==Soluzione di Eddy==&lt;br /&gt;
Ho preso libera ispirazione da Maldus, ma ho usato la poll al posto dei semafori.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;poll.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define INF (-1)&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  pid_t child;&lt;br /&gt;
  int efd, status;&lt;br /&gt;
  uint64_t x = 1;&lt;br /&gt;
  efd = eventfd(0,0);&lt;br /&gt;
&lt;br /&gt;
  nfds_t nfds = 1;&lt;br /&gt;
  struct pollfd *fds = (struct pollfd *) malloc (sizeof (struct pollfd));&lt;br /&gt;
    fds-&amp;gt;fd = efd;&lt;br /&gt;
    fds-&amp;gt;events = POLLIN;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  switch (child = fork())&lt;br /&gt;
  {&lt;br /&gt;
    case 0:&lt;br /&gt;
      //child&lt;br /&gt;
      while (1)&lt;br /&gt;
      {&lt;br /&gt;
        int i;&lt;br /&gt;
        poll( fds, nfds, INF); // wait for data to read.&lt;br /&gt;
        read( efd , &amp;amp;x , 8);&lt;br /&gt;
        for ( i = x; i &amp;gt; 0; i--)&lt;br /&gt;
          printf( &amp;quot;x&amp;quot; ) ;&lt;br /&gt;
        printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      return 1;&lt;br /&gt;
    default:&lt;br /&gt;
      //parent&lt;br /&gt;
      while (x){&lt;br /&gt;
        scanf(&amp;quot;%&amp;quot; PRIu64 , &amp;amp;x) ;&lt;br /&gt;
        write(efd , &amp;amp;x , 8 ) ;&lt;br /&gt;
      }&lt;br /&gt;
      return 0 ;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Wifi_daemon&amp;diff=877</id>
		<title>Wifi daemon</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Wifi_daemon&amp;diff=877"/>
		<updated>2015-03-02T08:45:49Z</updated>

		<summary type="html">&lt;p&gt;Eddy: Created page with &amp;quot;==Intro== Dato che ogni mattina mentre sono in laboratorio la connessione con ALMAWIFI viene persa ogni 10 minuti, ho deciso di scrivere un demone che me la riattivi ogni volt...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Intro==&lt;br /&gt;
Dato che ogni mattina mentre sono in laboratorio la connessione con ALMAWIFI viene persa ogni 10 minuti, ho deciso di scrivere un demone che me la riattivi ogni volta.&lt;br /&gt;
PROBLEMA: durante la  wpa_supplicant ho ioctl[SIOCSIWAP]: Operation not permitted&lt;br /&gt;
&lt;br /&gt;
===daemon.c===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/wait.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void daemonFunction (char * argv[]);&lt;br /&gt;
void usage (int argc, char *argv[]);&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	pid_t child;&lt;br /&gt;
	pid_t gChild;&lt;br /&gt;
	int status;&lt;br /&gt;
&lt;br /&gt;
	usage (argc, argv);&lt;br /&gt;
	child = fork ();&lt;br /&gt;
	switch (child)&lt;br /&gt;
	{&lt;br /&gt;
		case -1:&lt;br /&gt;
			perror (&amp;quot;child&amp;quot;);&lt;br /&gt;
			exit (1);&lt;br /&gt;
		case 0:&lt;br /&gt;
			gChild = fork ();&lt;br /&gt;
			switch (gChild)&lt;br /&gt;
			{&lt;br /&gt;
				  case -1:&lt;br /&gt;
					 perror (&amp;quot;gChild&amp;quot;);&lt;br /&gt;
					 exit (1);&lt;br /&gt;
&lt;br /&gt;
				  case 0:&lt;br /&gt;
					 daemonFunction(argv);&lt;br /&gt;
&lt;br /&gt;
				  default:&lt;br /&gt;
					 //parent gChild&lt;br /&gt;
					 return 0;&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
		default:&lt;br /&gt;
&lt;br /&gt;
			//parent&lt;br /&gt;
			waitpid (child, &amp;amp;status, 0);&lt;br /&gt;
			return 0;&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		 return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void daemonFunction (char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	argv[0] = &amp;quot;./connect.sh&amp;quot;;&lt;br /&gt;
	while (1)&lt;br /&gt;
	{&lt;br /&gt;
		 pid_t child;&lt;br /&gt;
		 child = fork ();&lt;br /&gt;
		 int status;&lt;br /&gt;
&lt;br /&gt;
		 switch (child)&lt;br /&gt;
		 {&lt;br /&gt;
			case -1:&lt;br /&gt;
				  perror (&amp;quot;child&amp;quot;);&lt;br /&gt;
				  exit (1);&lt;br /&gt;
			case 0:&lt;br /&gt;
				  execv(&amp;quot;./connect.sh&amp;quot;, argv);&lt;br /&gt;
&lt;br /&gt;
				  perror (&amp;quot;execv&amp;quot;);&lt;br /&gt;
				  exit (1);&lt;br /&gt;
&lt;br /&gt;
			default:&lt;br /&gt;
				  //parent &lt;br /&gt;
				  waitpid (child, &amp;amp;status, 0);&lt;br /&gt;
				  break;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		 }&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void usage (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	if (argc != 2)&lt;br /&gt;
	{&lt;br /&gt;
		 char *iface= &amp;quot;iface&amp;quot;;&lt;br /&gt;
		 printf (&amp;quot;Usage: %s [%s]\n&amp;quot;,&lt;br /&gt;
			  argv[0],&lt;br /&gt;
			  iface);&lt;br /&gt;
		 exit (1);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===connect.sh===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
main ()&lt;br /&gt;
{&lt;br /&gt;
	  ping -q -c5 google.com &amp;gt;&amp;gt; ./.log&lt;br /&gt;
&lt;br /&gt;
	  if [ $? -eq 0 ]&lt;br /&gt;
	  then&lt;br /&gt;
		 echo &amp;quot;internet ok&amp;quot; &amp;gt;&amp;gt; ./.log&lt;br /&gt;
		 sleep 10&lt;br /&gt;
	  else&lt;br /&gt;
		 connect &amp;quot;$@&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	  fi&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
connect ()&lt;br /&gt;
{&lt;br /&gt;
	  iface=$1&lt;br /&gt;
&lt;br /&gt;
	  sudo killall wpa_supplicant&lt;br /&gt;
	  sudo ifconfig $iface down &lt;br /&gt;
	  sudo iwconfig $iface mode Managed &lt;br /&gt;
	  sudo ifconfig $iface up &lt;br /&gt;
	  sudo wpa_supplicant -B -Dwext -i $iface -c ./wireless-wpa-enterprise.conf -dd &lt;br /&gt;
	  sudo dhclient $iface &lt;br /&gt;
	  sleep 10&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main &amp;quot;$@&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===wireless-wpa-enterprise.conf===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ctrl_interface=/var/run/wpa_supplicant&lt;br /&gt;
&lt;br /&gt;
network={&lt;br /&gt;
    ssid=&amp;quot;ALMAWIFI&amp;quot;&lt;br /&gt;
    scan_ssid=0&lt;br /&gt;
    key_mgmt=WPA-EAP&lt;br /&gt;
    eap=PEAP&lt;br /&gt;
    phase2=&amp;quot;auth=MSCHAPV2&amp;quot;&lt;br /&gt;
    identity=&amp;quot;blabla@studio.unibo.it&amp;quot;&lt;br /&gt;
    password=&amp;quot;psw&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Eddy|Eddy]] ([[User talk:Eddy|talk]]) 10.20 Mon, 02 Mar 2015 (CET)&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=876</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=876"/>
		<updated>2015-03-02T08:20:34Z</updated>

		<summary type="html">&lt;p&gt;Eddy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questo &amp;amp;egrave; il Wiki del Corso di Sistemi Operativi&lt;br /&gt;
&lt;br /&gt;
[[wifi daemon]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 13/09/2013]]&lt;br /&gt;
&lt;br /&gt;
[[Problema Dei Filosofi]]&lt;br /&gt;
&lt;br /&gt;
[http://www.cs.unibo.it/~renzo/so/portability.tgz portability.tgz]&lt;br /&gt;
&lt;br /&gt;
[[listx.h commentato + esempio su container_of]]&lt;br /&gt;
&lt;br /&gt;
[[Congettura di Goldbach]]&lt;br /&gt;
&lt;br /&gt;
[[list segments]]&lt;br /&gt;
&lt;br /&gt;
[[Execv/fork su file aperto]]&lt;br /&gt;
&lt;br /&gt;
[[Angry_Children]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 12/02/2009]]&lt;br /&gt;
&lt;br /&gt;
[[(Programma C) Un quadrato nella matrice]]&lt;br /&gt;
&lt;br /&gt;
[[&amp;quot;classi&amp;quot;_in_C]]&lt;br /&gt;
&lt;br /&gt;
[[Esempi del 02 dicembre 2014]]&lt;br /&gt;
&lt;br /&gt;
[[Materiale dell'AA 2013-14]]&lt;br /&gt;
----&lt;br /&gt;
Ricordate che per creare un account o quando viene richiesto di risolvere un semplice calcolo occorre ricordare quanto scritto [[qui]]&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Listx.h_commentato_%2B_esempio_su_container_of&amp;diff=868</id>
		<title>Listx.h commentato + esempio su container of</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Listx.h_commentato_%2B_esempio_su_container_of&amp;diff=868"/>
		<updated>2015-01-30T10:43:04Z</updated>

		<summary type="html">&lt;p&gt;Eddy: /* Intro */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Intro==&lt;br /&gt;
Siccome mi e` stato chiesto, per chiunque ne avesse bisogno, qui c'e` il file listx.h con i commenti presi dal file originale list.h, ho aggiunto in piu un esempio su come usare la macro container_of&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
* subset of the Linux Kernel source file: &amp;quot;include/linux/list.h&amp;quot;&lt;br /&gt;
CPLv2 */&lt;br /&gt;
#ifndef _LISTX_H&lt;br /&gt;
#define _LISTX_H&lt;br /&gt;
&lt;br /&gt;
typedef unsigned int    size_t;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* example:&lt;br /&gt;
*&lt;br /&gt;
* struct container&lt;br /&gt;
* {&lt;br /&gt;
* 	int some_data;&lt;br /&gt;
* 	struct list_head list;&lt;br /&gt;
* };&lt;br /&gt;
*&lt;br /&gt;
* *list_ptr is a pointer to the list member&lt;br /&gt;
*&lt;br /&gt;
* struct container *container_ptr;&lt;br /&gt;
* container_ptr = container_of(list_ptr, struct container, list);&lt;br /&gt;
*/&lt;br /&gt;
#define container_of(ptr, type, member) ({			\&lt;br /&gt;
		const typeof( ((type *)0)-&amp;gt;member ) *__mptr = (ptr);	\&lt;br /&gt;
		(type *)( (char *)__mptr - offsetof(type,member) );})&lt;br /&gt;
&lt;br /&gt;
#define offsetof(TYPE, MEMBER) ((size_t) &amp;amp;((TYPE *)0)-&amp;gt;MEMBER)&lt;br /&gt;
&lt;br /&gt;
struct list_head {&lt;br /&gt;
	struct list_head *next, *prev;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define LIST_HEAD_INIT(name) { &amp;amp;(name), &amp;amp;(name) }&lt;br /&gt;
&lt;br /&gt;
#define LIST_HEAD(name) \&lt;br /&gt;
	struct list_head name = LIST_HEAD_INIT(name)&lt;br /&gt;
&lt;br /&gt;
static inline void INIT_LIST_HEAD(struct list_head *list)&lt;br /&gt;
{&lt;br /&gt;
	list-&amp;gt;next = list;&lt;br /&gt;
	list-&amp;gt;prev = list;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Insert a new entry between two known consecutive entries.&lt;br /&gt;
 *&lt;br /&gt;
 * This is only for internal list manipulation where we know&lt;br /&gt;
 * the prev/next entries already!&lt;br /&gt;
 */&lt;br /&gt;
static inline void __list_add(struct list_head *new,&lt;br /&gt;
		struct list_head *prev,&lt;br /&gt;
		struct list_head *next)&lt;br /&gt;
{&lt;br /&gt;
	next-&amp;gt;prev = new;&lt;br /&gt;
	new-&amp;gt;next = next;&lt;br /&gt;
	new-&amp;gt;prev = prev;&lt;br /&gt;
	prev-&amp;gt;next = new;&lt;br /&gt;
}&lt;br /&gt;
/**&lt;br /&gt;
 * list_add - add a new entry&lt;br /&gt;
 * @new: new entry to be added&lt;br /&gt;
 * @head: list head to add it after&lt;br /&gt;
 *&lt;br /&gt;
 * Insert a new entry after the specified head.&lt;br /&gt;
 * This is good for implementing stacks.&lt;br /&gt;
 */&lt;br /&gt;
static inline void list_add(struct list_head *new, struct list_head *head)&lt;br /&gt;
{&lt;br /&gt;
	__list_add(new, head, head-&amp;gt;next);&lt;br /&gt;
}&lt;br /&gt;
/**&lt;br /&gt;
 * list_add_tail - add a new entry&lt;br /&gt;
 * @new: new entry to be added&lt;br /&gt;
 * @head: list head to add it before&lt;br /&gt;
 *&lt;br /&gt;
 * Insert a new entry before the specified head.&lt;br /&gt;
 * This is useful for implementing queues.&lt;br /&gt;
 */&lt;br /&gt;
static inline void list_add_tail(struct list_head *new, struct list_head *head)&lt;br /&gt;
{&lt;br /&gt;
	__list_add(new, head-&amp;gt;prev, head);&lt;br /&gt;
}&lt;br /&gt;
/**&lt;br /&gt;
 * Delete a list entry by making the prev/next entries&lt;br /&gt;
 * point to each other.&lt;br /&gt;
 *&lt;br /&gt;
 * This is only for internal list manipulation where we know&lt;br /&gt;
 * the prev/next entries already!&lt;br /&gt;
 */&lt;br /&gt;
static inline void __list_del(struct list_head * prev, struct list_head * next)&lt;br /&gt;
{&lt;br /&gt;
	next-&amp;gt;prev = prev;&lt;br /&gt;
	prev-&amp;gt;next = next;&lt;br /&gt;
}&lt;br /&gt;
/**&lt;br /&gt;
 * list_del - deletes entry from list.&lt;br /&gt;
 * @entry: the element to delete from the list.&lt;br /&gt;
 * Note: list_empty on entry does not return true after this, the entry is in an undefined state.&lt;br /&gt;
 */&lt;br /&gt;
static inline void list_del(struct list_head *entry)&lt;br /&gt;
{&lt;br /&gt;
	__list_del(entry-&amp;gt;prev, entry-&amp;gt;next);&lt;br /&gt;
}&lt;br /&gt;
static inline int list_is_last(const struct list_head *list,&lt;br /&gt;
		const struct list_head *head)&lt;br /&gt;
{&lt;br /&gt;
	return list-&amp;gt;next == head;&lt;br /&gt;
}&lt;br /&gt;
/**&lt;br /&gt;
 * list_empty - tests whether a list is empty&lt;br /&gt;
 * @head: the list to test.&lt;br /&gt;
 */&lt;br /&gt;
static inline int list_empty(const struct list_head *head)&lt;br /&gt;
{&lt;br /&gt;
	return head-&amp;gt;next == head;&lt;br /&gt;
}&lt;br /&gt;
static inline struct list_head *list_next(const struct list_head *current)&lt;br /&gt;
{&lt;br /&gt;
	if (list_empty(current))&lt;br /&gt;
		return NULL;&lt;br /&gt;
	else&lt;br /&gt;
		return current-&amp;gt;next;&lt;br /&gt;
}&lt;br /&gt;
static inline struct list_head *list_prev(const struct list_head *current)&lt;br /&gt;
{&lt;br /&gt;
	if (list_empty(current))&lt;br /&gt;
		return NULL;&lt;br /&gt;
	else&lt;br /&gt;
		return current-&amp;gt;prev;&lt;br /&gt;
}&lt;br /&gt;
/**&lt;br /&gt;
 * list_for_each	-	iterate over a list&lt;br /&gt;
 * @pos:	the &amp;amp;struct list_head to use as a loop counter.&lt;br /&gt;
 * @head:	the head for your list.&lt;br /&gt;
 */&lt;br /&gt;
#define list_for_each(pos, head) \&lt;br /&gt;
	for (pos = (head)-&amp;gt;next; pos != (head); pos = pos-&amp;gt;next)&lt;br /&gt;
/**&lt;br /&gt;
 * list_for_each_prev	-	iterate over a list backwards&lt;br /&gt;
 * @pos:	the &amp;amp;struct list_head to use as a loop counter.&lt;br /&gt;
 * @head:	the head for your list.&lt;br /&gt;
 */&lt;br /&gt;
#define list_for_each_prev(pos, head) \&lt;br /&gt;
	for (pos = (head)-&amp;gt;prev; pos != (head); pos = pos-&amp;gt;prev)&lt;br /&gt;
/**&lt;br /&gt;
 * list_for_each_entry	-	iterate over list of given type&lt;br /&gt;
 * @pos:	the type * to use as a loop counter.&lt;br /&gt;
 * @head:	the head for your list.&lt;br /&gt;
 * @member:	the name of the list_struct within the struct.&lt;br /&gt;
 */&lt;br /&gt;
#define list_for_each_entry(pos, head, member)                          \&lt;br /&gt;
	for (pos = container_of((head)-&amp;gt;next, typeof(*pos), member);      \&lt;br /&gt;
	&amp;amp;pos-&amp;gt;member != (head);        \&lt;br /&gt;
	pos = container_of(pos-&amp;gt;member.next, typeof(*pos), member))&lt;br /&gt;
&lt;br /&gt;
#define list_for_each_entry_reverse(pos, head, member)                  \&lt;br /&gt;
	for (pos = container_of((head)-&amp;gt;prev, typeof(*pos), member);      \&lt;br /&gt;
	&amp;amp;pos-&amp;gt;member != (head);        \&lt;br /&gt;
	pos = container_of(pos-&amp;gt;member.prev, typeof(*pos), member))&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Eddy|Eddy]] ([[User talk:Eddy|talk]]) 12.20 FRI, 30 Gen 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Listx.h_commentato_%2B_esempio_su_container_of&amp;diff=867</id>
		<title>Listx.h commentato + esempio su container of</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Listx.h_commentato_%2B_esempio_su_container_of&amp;diff=867"/>
		<updated>2015-01-30T10:42:04Z</updated>

		<summary type="html">&lt;p&gt;Eddy: Created page with &amp;quot;==Intro== Siccome mi e` stato chiesto, per chiunque ne avesse bisogno, qui c'e` il file listx.h con i commenti presi dal file originale list.h, ho aggiunto in piu un esempio s...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Intro==&lt;br /&gt;
Siccome mi e` stato chiesto, per chiunque ne avesse bisogno, qui c'e` il file listx.h con i commenti presi dal file originale list.h, ho aggiunto in piu un esempio su come usare la macro container_of&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
* subset of the Linux Kernel source file: &amp;quot;include/linux/list.h&amp;quot;&lt;br /&gt;
CPLv2 */&lt;br /&gt;
#ifndef _LISTX_H&lt;br /&gt;
#define _LISTX_H&lt;br /&gt;
&lt;br /&gt;
typedef unsigned int    size_t;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* example:&lt;br /&gt;
*&lt;br /&gt;
* struct container&lt;br /&gt;
* {&lt;br /&gt;
* 	int some_data;&lt;br /&gt;
* 	struct list_head list;&lt;br /&gt;
* };&lt;br /&gt;
*&lt;br /&gt;
* *list_ptr is a pointer to the list member&lt;br /&gt;
*&lt;br /&gt;
* struct container *container_ptr;&lt;br /&gt;
* container_ptr = container_of(list_ptr, struct container, list);&lt;br /&gt;
*/&lt;br /&gt;
#define container_of(ptr, type, member) ({			\&lt;br /&gt;
		const typeof( ((type *)0)-&amp;gt;member ) *__mptr = (ptr);	\&lt;br /&gt;
		(type *)( (char *)__mptr - offsetof(type,member) );})&lt;br /&gt;
&lt;br /&gt;
#define offsetof(TYPE, MEMBER) ((size_t) &amp;amp;((TYPE *)0)-&amp;gt;MEMBER)&lt;br /&gt;
&lt;br /&gt;
struct list_head {&lt;br /&gt;
	struct list_head *next, *prev;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define LIST_HEAD_INIT(name) { &amp;amp;(name), &amp;amp;(name) }&lt;br /&gt;
&lt;br /&gt;
#define LIST_HEAD(name) \&lt;br /&gt;
	struct list_head name = LIST_HEAD_INIT(name)&lt;br /&gt;
&lt;br /&gt;
static inline void INIT_LIST_HEAD(struct list_head *list)&lt;br /&gt;
{&lt;br /&gt;
	list-&amp;gt;next = list;&lt;br /&gt;
	list-&amp;gt;prev = list;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Insert a new entry between two known consecutive entries.&lt;br /&gt;
 *&lt;br /&gt;
 * This is only for internal list manipulation where we know&lt;br /&gt;
 * the prev/next entries already!&lt;br /&gt;
 */&lt;br /&gt;
static inline void __list_add(struct list_head *new,&lt;br /&gt;
		struct list_head *prev,&lt;br /&gt;
		struct list_head *next)&lt;br /&gt;
{&lt;br /&gt;
	next-&amp;gt;prev = new;&lt;br /&gt;
	new-&amp;gt;next = next;&lt;br /&gt;
	new-&amp;gt;prev = prev;&lt;br /&gt;
	prev-&amp;gt;next = new;&lt;br /&gt;
}&lt;br /&gt;
/**&lt;br /&gt;
 * list_add - add a new entry&lt;br /&gt;
 * @new: new entry to be added&lt;br /&gt;
 * @head: list head to add it after&lt;br /&gt;
 *&lt;br /&gt;
 * Insert a new entry after the specified head.&lt;br /&gt;
 * This is good for implementing stacks.&lt;br /&gt;
 */&lt;br /&gt;
static inline void list_add(struct list_head *new, struct list_head *head)&lt;br /&gt;
{&lt;br /&gt;
	__list_add(new, head, head-&amp;gt;next);&lt;br /&gt;
}&lt;br /&gt;
/**&lt;br /&gt;
 * list_add_tail - add a new entry&lt;br /&gt;
 * @new: new entry to be added&lt;br /&gt;
 * @head: list head to add it before&lt;br /&gt;
 *&lt;br /&gt;
 * Insert a new entry before the specified head.&lt;br /&gt;
 * This is useful for implementing queues.&lt;br /&gt;
 */&lt;br /&gt;
static inline void list_add_tail(struct list_head *new, struct list_head *head)&lt;br /&gt;
{&lt;br /&gt;
	__list_add(new, head-&amp;gt;prev, head);&lt;br /&gt;
}&lt;br /&gt;
/**&lt;br /&gt;
 * Delete a list entry by making the prev/next entries&lt;br /&gt;
 * point to each other.&lt;br /&gt;
 *&lt;br /&gt;
 * This is only for internal list manipulation where we know&lt;br /&gt;
 * the prev/next entries already!&lt;br /&gt;
 */&lt;br /&gt;
static inline void __list_del(struct list_head * prev, struct list_head * next)&lt;br /&gt;
{&lt;br /&gt;
	next-&amp;gt;prev = prev;&lt;br /&gt;
	prev-&amp;gt;next = next;&lt;br /&gt;
}&lt;br /&gt;
/**&lt;br /&gt;
 * list_del - deletes entry from list.&lt;br /&gt;
 * @entry: the element to delete from the list.&lt;br /&gt;
 * Note: list_empty on entry does not return true after this, the entry is in an undefined state.&lt;br /&gt;
 */&lt;br /&gt;
static inline void list_del(struct list_head *entry)&lt;br /&gt;
{&lt;br /&gt;
	__list_del(entry-&amp;gt;prev, entry-&amp;gt;next);&lt;br /&gt;
}&lt;br /&gt;
static inline int list_is_last(const struct list_head *list,&lt;br /&gt;
		const struct list_head *head)&lt;br /&gt;
{&lt;br /&gt;
	return list-&amp;gt;next == head;&lt;br /&gt;
}&lt;br /&gt;
/**&lt;br /&gt;
 * list_empty - tests whether a list is empty&lt;br /&gt;
 * @head: the list to test.&lt;br /&gt;
 */&lt;br /&gt;
static inline int list_empty(const struct list_head *head)&lt;br /&gt;
{&lt;br /&gt;
	return head-&amp;gt;next == head;&lt;br /&gt;
}&lt;br /&gt;
static inline struct list_head *list_next(const struct list_head *current)&lt;br /&gt;
{&lt;br /&gt;
	if (list_empty(current))&lt;br /&gt;
		return NULL;&lt;br /&gt;
	else&lt;br /&gt;
		return current-&amp;gt;next;&lt;br /&gt;
}&lt;br /&gt;
static inline struct list_head *list_prev(const struct list_head *current)&lt;br /&gt;
{&lt;br /&gt;
	if (list_empty(current))&lt;br /&gt;
		return NULL;&lt;br /&gt;
	else&lt;br /&gt;
		return current-&amp;gt;prev;&lt;br /&gt;
}&lt;br /&gt;
/**&lt;br /&gt;
 * list_for_each	-	iterate over a list&lt;br /&gt;
 * @pos:	the &amp;amp;struct list_head to use as a loop counter.&lt;br /&gt;
 * @head:	the head for your list.&lt;br /&gt;
 */&lt;br /&gt;
#define list_for_each(pos, head) \&lt;br /&gt;
	for (pos = (head)-&amp;gt;next; pos != (head); pos = pos-&amp;gt;next)&lt;br /&gt;
/**&lt;br /&gt;
 * list_for_each_prev	-	iterate over a list backwards&lt;br /&gt;
 * @pos:	the &amp;amp;struct list_head to use as a loop counter.&lt;br /&gt;
 * @head:	the head for your list.&lt;br /&gt;
 */&lt;br /&gt;
#define list_for_each_prev(pos, head) \&lt;br /&gt;
	for (pos = (head)-&amp;gt;prev; pos != (head); pos = pos-&amp;gt;prev)&lt;br /&gt;
/**&lt;br /&gt;
 * list_for_each_entry	-	iterate over list of given type&lt;br /&gt;
 * @pos:	the type * to use as a loop counter.&lt;br /&gt;
 * @head:	the head for your list.&lt;br /&gt;
 * @member:	the name of the list_struct within the struct.&lt;br /&gt;
 */&lt;br /&gt;
#define list_for_each_entry(pos, head, member)                          \&lt;br /&gt;
	for (pos = container_of((head)-&amp;gt;next, typeof(*pos), member);      \&lt;br /&gt;
	&amp;amp;pos-&amp;gt;member != (head);        \&lt;br /&gt;
	pos = container_of(pos-&amp;gt;member.next, typeof(*pos), member))&lt;br /&gt;
&lt;br /&gt;
#define list_for_each_entry_reverse(pos, head, member)                  \&lt;br /&gt;
	for (pos = container_of((head)-&amp;gt;prev, typeof(*pos), member);      \&lt;br /&gt;
	&amp;amp;pos-&amp;gt;member != (head);        \&lt;br /&gt;
	pos = container_of(pos-&amp;gt;member.prev, typeof(*pos), member))&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Eddy|Eddy]] ([[User talk:Eddy|talk]]) 00:59 Mon, 02 Dic 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=866</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=866"/>
		<updated>2015-01-30T10:35:59Z</updated>

		<summary type="html">&lt;p&gt;Eddy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questo &amp;amp;egrave; il Wiki del Corso di Sistemi Operativi&lt;br /&gt;
&lt;br /&gt;
[http://www.cs.unibo.it/~renzo/so/portability.tgz portability.tgz]&lt;br /&gt;
&lt;br /&gt;
[[listx.h commentato + esempio su container_of]]&lt;br /&gt;
&lt;br /&gt;
[[Congettura di Goldbach]]&lt;br /&gt;
&lt;br /&gt;
[[list segments]]&lt;br /&gt;
&lt;br /&gt;
[[Execv/fork su file aperto]]&lt;br /&gt;
&lt;br /&gt;
[[Angry_Children]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 12/02/2009]]&lt;br /&gt;
&lt;br /&gt;
[[(Programma C) Un quadrato nella matrice]]&lt;br /&gt;
&lt;br /&gt;
[[&amp;quot;classi&amp;quot;_in_C]]&lt;br /&gt;
&lt;br /&gt;
[[Esempi del 02 dicembre 2014]]&lt;br /&gt;
&lt;br /&gt;
[[Materiale dell'AA 2013-14]]&lt;br /&gt;
----&lt;br /&gt;
Ricordate che per creare un account o quando viene richiesto di risolvere un semplice calcolo occorre ricordare quanto scritto [[qui]]&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Execv/fork_su_file_aperto&amp;diff=842</id>
		<title>Execv/fork su file aperto</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Execv/fork_su_file_aperto&amp;diff=842"/>
		<updated>2014-12-02T09:55:29Z</updated>

		<summary type="html">&lt;p&gt;Eddy: /* cmd */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ho provato a far &amp;quot;girare&amp;quot; questo piccolo eseguibile, notato l'out ho provato a dare le mie conclusioni (non sono certo della correttezza)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
/* nessun controllo */&lt;br /&gt;
	if ( fork() ){&lt;br /&gt;
		int t;&lt;br /&gt;
		wait (&amp;amp;t);&lt;br /&gt;
		printf (&amp;quot;sono il padre\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	else{&lt;br /&gt;
		printf (&amp;quot;sono il figlio\n&amp;quot;);&lt;br /&gt;
		execv (&amp;quot;/bin/echo&amp;quot;, ++argv);&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cmd===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$&amp;gt; ./es echo prova &amp;gt;&amp;gt; tmp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===out===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
prova&lt;br /&gt;
sono il padre&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===conclusioni===&lt;br /&gt;
*fork =&amp;gt; padre e figlio condividono lo stesso offset (il figlio stampa prova e il padre stampa &amp;quot;sotto&amp;quot;)&lt;br /&gt;
*exec =&amp;gt; non condivide stesso offset (sono il figlio viene sovrascritto)&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=841</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=841"/>
		<updated>2014-12-02T09:53:57Z</updated>

		<summary type="html">&lt;p&gt;Eddy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questo &amp;amp;egrave; il Wiki del Corso di Sistemi Operativi&lt;br /&gt;
&lt;br /&gt;
[http://www.cs.unibo.it/~renzo/so/portability.tgz portability.tgz]&lt;br /&gt;
&lt;br /&gt;
[[Execv/fork su file aperto]]&lt;br /&gt;
&lt;br /&gt;
[[Angry_Children]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 12/02/2009]]&lt;br /&gt;
&lt;br /&gt;
[[(Programma C) Un quadrato nella matrice]]&lt;br /&gt;
&lt;br /&gt;
[[&amp;quot;classi&amp;quot;_in_C]]&lt;br /&gt;
&lt;br /&gt;
[[Materiale dell'AA 2013-14]]&lt;br /&gt;
----&lt;br /&gt;
Ricordate che per creare un account o quando viene richiesto di risolvere un semplice calcolo occorre ricordare quanto scritto [[qui]]&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Execv/fork_su_file_aperto&amp;diff=840</id>
		<title>Execv/fork su file aperto</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Execv/fork_su_file_aperto&amp;diff=840"/>
		<updated>2014-12-02T09:53:21Z</updated>

		<summary type="html">&lt;p&gt;Eddy: Created page with &amp;quot;Ho provato a far &amp;quot;girare&amp;quot; questo piccolo eseguibile, notato l'out ho provato a dare le mie conclusioni (non sono certo della correttezza) &amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt; int main (int argc,...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ho provato a far &amp;quot;girare&amp;quot; questo piccolo eseguibile, notato l'out ho provato a dare le mie conclusioni (non sono certo della correttezza)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
/* nessun controllo */&lt;br /&gt;
	if ( fork() ){&lt;br /&gt;
		int t;&lt;br /&gt;
		wait (&amp;amp;t);&lt;br /&gt;
		printf (&amp;quot;sono il padre\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	else{&lt;br /&gt;
		printf (&amp;quot;sono il figlio\n&amp;quot;);&lt;br /&gt;
		execv (&amp;quot;/bin/echo&amp;quot;, ++argv);&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cmd===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$&amp;gt; ./es echo prova &amp;gt; tmp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===out===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
prova&lt;br /&gt;
sono il padre&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===conclusioni===&lt;br /&gt;
*fork =&amp;gt; padre e figlio condividono lo stesso offset (il figlio stampa prova e il padre stampa &amp;quot;sotto&amp;quot;)&lt;br /&gt;
*exec =&amp;gt; non condivide stesso offset (sono il figlio viene sovrascritto)&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=839</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=839"/>
		<updated>2014-12-01T23:26:23Z</updated>

		<summary type="html">&lt;p&gt;Eddy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questo &amp;amp;egrave; il Wiki del Corso di Sistemi Operativi&lt;br /&gt;
&lt;br /&gt;
[http://www.cs.unibo.it/~renzo/so/portability.tgz portability.tgz]&lt;br /&gt;
&lt;br /&gt;
[[Angry_Children]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 12/02/2009]]&lt;br /&gt;
&lt;br /&gt;
[[(Programma C) Un quadrato nella matrice]]&lt;br /&gt;
&lt;br /&gt;
[[&amp;quot;classi&amp;quot;_in_C]]&lt;br /&gt;
&lt;br /&gt;
[[Materiale dell'AA 2013-14]]&lt;br /&gt;
----&lt;br /&gt;
Ricordate che per creare un account o quando viene richiesto di risolvere un semplice calcolo occorre ricordare quanto scritto [[qui]]&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Angry_Children&amp;diff=838</id>
		<title>Angry Children</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Angry_Children&amp;diff=838"/>
		<updated>2014-12-01T23:25:49Z</updated>

		<summary type="html">&lt;p&gt;Eddy: Created page with &amp;quot;=Problem Statement= Bill Gates is on one of his philanthropic journeys to a village in Utopia. He has N packets of candies and would like to distribute one packet to each of t...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Problem Statement=&lt;br /&gt;
Bill Gates is on one of his philanthropic journeys to a village in Utopia. He has N packets of candies and would like to distribute one packet to each of the K children in the village (each packet may contain different number of candies). To avoid any fighting among the children, he would like to pick K out of N packets, such that unfairness is minimized.&lt;br /&gt;
&lt;br /&gt;
Suppose the K packets have (x1, x2, x3,....xk) candies in them, where xi denotes the number of candies in the ith packet, then we define unfairness as&lt;br /&gt;
&lt;br /&gt;
max(x1,x2,...xk) - min(x1,x2,...xk)&lt;br /&gt;
&lt;br /&gt;
where max denotes the highest value amongst the elements, and min denotes the least value amongst the elements. Can you figure out the minimum unfairness and print it?&lt;br /&gt;
&lt;br /&gt;
===Input Format===&lt;br /&gt;
The first line contains an integer N.&lt;br /&gt;
The second line contains an integer K. N lines follow. Each line contains an integer that denotes the candy in the ith packet.&lt;br /&gt;
&lt;br /&gt;
===Output Format===&lt;br /&gt;
An integer that denotes the minimum possible value of unfairness.&lt;br /&gt;
&lt;br /&gt;
===Constraints===&lt;br /&gt;
1&amp;lt;=N&amp;lt;=105&lt;br /&gt;
1&amp;lt;=K&amp;lt;=N&lt;br /&gt;
0&amp;lt;= number of candies in any packet &amp;lt;=109&lt;br /&gt;
&lt;br /&gt;
===Sample Input #00===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
7&lt;br /&gt;
3&lt;br /&gt;
10&lt;br /&gt;
100&lt;br /&gt;
300&lt;br /&gt;
200&lt;br /&gt;
1000&lt;br /&gt;
20&lt;br /&gt;
30&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Sample Output #00===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
20&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Explanation #00===&lt;br /&gt;
Here K = 3. We can choose packets that contain 10,20,30 candies. The unfairness is&lt;br /&gt;
&lt;br /&gt;
*max(10,20,30) - min(10,20,30) = 30 - 10 = 20&lt;br /&gt;
&lt;br /&gt;
===Sample Input #01===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
10&lt;br /&gt;
4&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
10&lt;br /&gt;
20&lt;br /&gt;
30&lt;br /&gt;
40&lt;br /&gt;
100&lt;br /&gt;
200&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Sample Output #01===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Explanation #01===&lt;br /&gt;
Here K = 4. We can choose the packets that contain 1,2,3,4 candies. The unfairness is&lt;br /&gt;
&lt;br /&gt;
*max(1,2,3,4) - min(1,2,3,4) = 4 - 1 = 3&lt;br /&gt;
&lt;br /&gt;
==Soluzione di Eddy==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define MAX 100000&lt;br /&gt;
#define MAX_VAL 1000000001&lt;br /&gt;
&lt;br /&gt;
int candies[MAX];&lt;br /&gt;
&lt;br /&gt;
void MergeSort (int *candies, int primo, int ultimo);&lt;br /&gt;
void Merge (int *candies, int primo, int ultimo, int mezzo);&lt;br /&gt;
int Unfairness (int *candies, int len, int k);&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
		int N,K;&lt;br /&gt;
		int i;&lt;br /&gt;
		FILE *fin;&lt;br /&gt;
&lt;br /&gt;
		if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
			exit(2);&lt;br /&gt;
		fscanf(fin,&amp;quot;%d %d&amp;quot;,&amp;amp;N,&amp;amp;K);&lt;br /&gt;
		for(i = 0;i &amp;lt; N;i++)&lt;br /&gt;
				fscanf(fin,&amp;quot;%d&amp;quot;,candies + i);&lt;br /&gt;
		MergeSort (candies, 0, N-1);&lt;br /&gt;
		int unfairness = Unfairness (candies, N, K-1);&lt;br /&gt;
&lt;br /&gt;
		printf(&amp;quot;%d\n&amp;quot;,unfairness);&lt;br /&gt;
		return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* IDEA:&lt;br /&gt;
 * siccome l'array e` ordinato max = i-esima pos + (k-1), min = i-esima pos,&lt;br /&gt;
 * mi basta scorrere l'array pagando O(n), ma avevo ordinato: O(nlog(n))&lt;br /&gt;
 */&lt;br /&gt;
int Unfairness (int *candies, int len, int k)&lt;br /&gt;
{&lt;br /&gt;
		int i, min, tmp;&lt;br /&gt;
		i=0; min=candies[len-1];&lt;br /&gt;
		while (i+k &amp;lt; len){&lt;br /&gt;
				tmp = candies[i+k] - candies[i];&lt;br /&gt;
				if (tmp &amp;lt; min)  min = tmp;&lt;br /&gt;
				i++;&lt;br /&gt;
		}&lt;br /&gt;
		return min;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort (int *candies, int primo, int ultimo)&lt;br /&gt;
{&lt;br /&gt;
		if (primo &amp;lt; ultimo){&lt;br /&gt;
				int mezzo = (primo+ultimo)/2;&lt;br /&gt;
				MergeSort(candies, primo, mezzo);&lt;br /&gt;
				MergeSort(candies, mezzo+1, ultimo);&lt;br /&gt;
				Merge(candies, primo, ultimo, mezzo);&lt;br /&gt;
		}    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge (int *candies, int primo, int ultimo, int mezzo)&lt;br /&gt;
{&lt;br /&gt;
		int i, j, k, h;&lt;br /&gt;
		int tmp[MAX];&lt;br /&gt;
		i = primo; j = mezzo+1; k = primo;&lt;br /&gt;
		/* &amp;quot;compongo tmp&amp;quot; fino a quando non esaurisco una meta` */&lt;br /&gt;
		while (i &amp;lt;= mezzo &amp;amp;&amp;amp; j &amp;lt;= ultimo){&lt;br /&gt;
				if (candies[i]&amp;lt;=candies[j])&lt;br /&gt;
						tmp[k++] = candies[i++];&lt;br /&gt;
				else&lt;br /&gt;
						tmp[k++]=candies[j++];&lt;br /&gt;
		}&lt;br /&gt;
		j=ultimo;&lt;br /&gt;
		/*  se sono rimasti degli elementi nella prima meta` saranno i maggiori */&lt;br /&gt;
		for (h=mezzo; h&amp;gt;=i; h--)&lt;br /&gt;
				candies[j--]=candies[h];&lt;br /&gt;
		for (j=primo; j&amp;lt;=k-1; j++)&lt;br /&gt;
				candies[j]=tmp[j];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Eddy|Eddy]] ([[User talk:Eddy|talk]]) 00:59 Mon, 02 Dic 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1,_prova_pratica_12/02/2009&amp;diff=829</id>
		<title>Esercizio 1, prova pratica 12/02/2009</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1,_prova_pratica_12/02/2009&amp;diff=829"/>
		<updated>2014-11-22T19:50:59Z</updated>

		<summary type="html">&lt;p&gt;Eddy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ho provato a svolgere l'esercizio 1 dell'esame di laboratorio del 2 febbraio 2009 ([http://www.cs.unibo.it/~renzo/so/pratiche/2009.02.12.pdf]).&lt;br /&gt;
&lt;br /&gt;
Consegna:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Esercizio1 (obbligatorio): (10 punti)&lt;br /&gt;
Scrivere un programma C denominato “invarg” che esegua il programma passato come parametro invertendo gli argomenti.&lt;br /&gt;
Esempio:&lt;br /&gt;
invarg cat a b c&lt;br /&gt;
deve avere l'effetto di&lt;br /&gt;
cat c b a&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soluzione di Maldus==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc , char* argv[]){&lt;br /&gt;
	char *nargv[argc-1] ;	/*nargv è il vettore degli argomenti da passare al programma da eseguire*/&lt;br /&gt;
	int i , j ;		/*puntatori che scorrono, rispettivamente, argv ed nargv per riempire correttamente nargv*/&lt;br /&gt;
	nargv[0] = argv[1] ;	/*il primo valore di nargv deve essere il programma chiamato, l'ultimo deve essere NULL*/&lt;br /&gt;
	nargv[argc-1] = NULL ;&lt;br /&gt;
	for( i = argc - 1 , j = 1 ; i &amp;gt; 1 , j &amp;lt; (argc - 1) ; i-- , j++ ) nargv[j] = argv[i] ;	/*metto in nargv (dal secondo elemento in poi) gli argomenti presenti &lt;br /&gt;
in argv in ordine invertito*/&lt;br /&gt;
	execvp( nargv[0] , nargv  ) ;	/*eseguo il programma (il cui nome è contenuto in nargv[0]) passandogli nargv come vettore di parametri*/&lt;br /&gt;
	fprintf( stderr , &amp;quot;programma errato\n&amp;quot; ) ;	/*se ci troviamo in questo punto significa che la chiamata a execvp è fallita, probabilmente&lt;br /&gt;
 perchè il programma indicato non è stato trovato*/&lt;br /&gt;
	exit(1) ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soluzione di Eddy==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void scambia_ordine(int argc, char **argv, int j);&lt;br /&gt;
&lt;br /&gt;
int main(int argc , char* argv[])&lt;br /&gt;
{&lt;br /&gt;
	if (argc &amp;lt; 2) return 2;&lt;br /&gt;
	argv++;	argc--;&lt;br /&gt;
	scambia_ordine(argc, argv, 1);&lt;br /&gt;
	execvp(argv[0], argv);&lt;br /&gt;
	perror(&amp;quot;execvp&amp;quot;);&lt;br /&gt;
	return 3;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* piccola funzione ricorsiva che:&lt;br /&gt;
 * -memorizza in tmp gli argomenti dalla fine&lt;br /&gt;
 * -assegna ad argv in ordine inverso&lt;br /&gt;
 *&lt;br /&gt;
 *  non scambia il primo argomento&lt;br /&gt;
 */&lt;br /&gt;
void scambia_ordine(int argc, char **argv, int j)&lt;br /&gt;
{&lt;br /&gt;
	char *tmp;&lt;br /&gt;
	if (argc &amp;gt; 1){&lt;br /&gt;
		tmp = argv[argc-1];&lt;br /&gt;
		scambia_ordine (argc-1, argv, j+1);&lt;br /&gt;
		argv[j]=tmp;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Eddy|Eddy]] ([[User talk:Eddy|talk]]) 21:00 Saturday, 22 November 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=826</id>
		<title>(Programma C) Un quadrato nella matrice</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=826"/>
		<updated>2014-11-10T22:17:25Z</updated>

		<summary type="html">&lt;p&gt;Eddy: /* Altre considerazioni e un'altra soluzione (rd) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Soluzione di LorenzoV ==&lt;br /&gt;
&lt;br /&gt;
Questo è un problema uscito per le fasi di qualificazione della Facebook Hacker Cup 2014.&lt;br /&gt;
Il codice sorgente del programma di seguito riportato è in grado di riconoscere se in una matrice quadrata è presente un quadrato &amp;quot;pieno&amp;quot;: il programma accetta in '''input''' un file come da esempio:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
#...&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
####&lt;br /&gt;
#..#&lt;br /&gt;
#..#&lt;br /&gt;
####&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
.....&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dove il primo intero T indica il numero di casi (o test) e gli altri interi n indicano la grandezza di ogni matrice nxn.&amp;lt;br&amp;gt;&lt;br /&gt;
Valgono i seguenti vincoli: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ T ≤ 20&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ N ≤ 20&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Seguendo questo esempio, in '''output''' il programma stamperà le seguenti righe:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Case #1: YES&lt;br /&gt;
Case #2: NO&lt;br /&gt;
Case #3: NO&lt;br /&gt;
Case #4: NO&lt;br /&gt;
Case #5: YES&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La matrice n. 2 contiene un # fuori dal quadrato, la matrice n. 3 contiene un quadrato non riempito e la matrice n. 4 contiene un rettangolo.&amp;lt;br&amp;gt;&lt;br /&gt;
Ecco il codice della mia soluzione:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct coordinate{&lt;br /&gt;
    int x;&lt;br /&gt;
    int y;&lt;br /&gt;
}coord;&lt;br /&gt;
&lt;br /&gt;
int max(int x, int y){&lt;br /&gt;
    if (x&amp;gt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int min(int x, int y){&lt;br /&gt;
    if (x&amp;lt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	FILE *fin;&lt;br /&gt;
	const int N=20;&lt;br /&gt;
	int i, j, k, h, n, T, M[N][N];&lt;br /&gt;
	int acase, find;&lt;br /&gt;
	coord asx, adx, bsx, bdx;&lt;br /&gt;
	char str[N];&lt;br /&gt;
	fin = fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
	if (fin == NULL){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Error opening file\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;T);&lt;br /&gt;
	if (T&amp;gt;20 || T&amp;lt;1){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Number of test cases not valid\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	for (k=0; k&amp;lt;T; k++){&lt;br /&gt;
        fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
        if (n&amp;gt;N){&lt;br /&gt;
            fprintf(stderr, &amp;quot;Number of cells too high\n&amp;quot;);&lt;br /&gt;
            exit(1);&lt;br /&gt;
        }&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(fin, &amp;quot;%s&amp;quot;, &amp;amp;str);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++){&lt;br /&gt;
                M[i][j]=str[j];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        asx.x=asx.y=-1;&lt;br /&gt;
        adx.x=adx.y=-1;&lt;br /&gt;
        bsx.x=bsx.y=-1;&lt;br /&gt;
        bdx.x=bdx.y=-1;&lt;br /&gt;
        /*Angolo in alto a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    asx.x=i;&lt;br /&gt;
                    asx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in alto a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    adx.x=i;&lt;br /&gt;
                    adx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bsx.x=i;&lt;br /&gt;
                    bsx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bdx.x=i;&lt;br /&gt;
                    bdx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Verifico che non sia un rettangolo*/&lt;br /&gt;
        acase=1;&lt;br /&gt;
        if (max(bsx.x, bdx.x)-min(asx.x, adx.x)!=max(bsx.y, bdx.y)-min(asx.y, adx.y)){&lt;br /&gt;
            acase=0;&lt;br /&gt;
        } else {&lt;br /&gt;
            /*Verifico se il quadrato è pieno*/&lt;br /&gt;
            for (i=min(asx.x, adx.x); i&amp;lt;=max(bsx.x, bdx.x); i++){&lt;br /&gt;
                for (j=min(asx.y, adx.y); j&amp;lt;=max(bsx.y, bdx.y); j++){&lt;br /&gt;
                    if (M[i][j]!='#'){&lt;br /&gt;
                        acase=0;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (acase) printf(&amp;quot;Case #%i: YES\n&amp;quot;, k+1);&lt;br /&gt;
        else printf(&amp;quot;Case #%i: NO\n&amp;quot;, k+1);&lt;br /&gt;
	}&lt;br /&gt;
	fclose(fin);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:LorenzoV|LorenzoV]] ([[User talk:LorenzoV|talk]]) 17:25, 1 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Nat ==&lt;br /&gt;
&lt;br /&gt;
Il codice che posto qui di seguito verifica che nella matrice presa in input da file ci sia un quadrato pieno, ma attraverso controlli diversi rispetto al codice precedente e con una matrice allocata dinamicamente (si possono passare in input matrici più grandi di 20*20).&lt;br /&gt;
Il programma prende lo stesso input della consegna postata da LorenzoV.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se compilate con gcc va aggiunto  il flag -lm perchè con la libreria math.h (per la radice quadrata) ci sono problemi. &amp;lt;br&amp;gt;&lt;br /&gt;
Es. gcc main.c -o programma -lm&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	FILE *text; &lt;br /&gt;
    	int n,i,j,k,counter,tmp,isx,jsx,boole,cases; int* vect;&lt;br /&gt;
	double squaroot; ;cases=0;&lt;br /&gt;
	text=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
    	if(text==NULL)&lt;br /&gt;
    	{&lt;br /&gt;
        	fprintf(stderr, &amp;quot;Invalid input.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
    	}&lt;br /&gt;
	&lt;br /&gt;
	/*Leggo il numero di casi*/&lt;br /&gt;
    	fscanf(text,&amp;quot;%d&amp;quot;,&amp;amp;cases);&lt;br /&gt;
	if(cases&amp;lt;=0)&lt;br /&gt;
    	{&lt;br /&gt;
        	fprintf(stderr, &amp;quot;Invalid input.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
    	}&lt;br /&gt;
	vect=malloc(cases*sizeof(int));&lt;br /&gt;
	printf(&amp;quot;\nCases =%d\n&amp;quot;,cases);&lt;br /&gt;
&lt;br /&gt;
  for(k=0;k&amp;lt;cases;k++)&lt;br /&gt;
  {     &lt;br /&gt;
	&lt;br /&gt;
	 counter=0;&lt;br /&gt;
&lt;br /&gt;
	/*Leggo la dimensione n della matrice in input*/&lt;br /&gt;
    	fscanf(text,&amp;quot;%d&amp;quot;,&amp;amp;n);&lt;br /&gt;
    	printf(&amp;quot;n=%d \n&amp;quot;,n);&lt;br /&gt;
&lt;br /&gt;
	/*Alloco una matrice M e un vettore r, che mi serve&lt;br /&gt;
	 per copiare l'input su M. &lt;br /&gt;
	In seguito setto tutto con un '.'*/&lt;br /&gt;
    	char **M;&lt;br /&gt;
    	M=(char**)malloc(n * sizeof(char*));&lt;br /&gt;
    	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
    	{M[i]=(char*)malloc(n * sizeof(char));}&lt;br /&gt;
&lt;br /&gt;
    	char *r;&lt;br /&gt;
    	r=(char*)malloc(n*sizeof(char));&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
		r[i]='.';&lt;br /&gt;
		for(j=0;j&amp;lt;n;j++)&lt;br /&gt;
			M[i][j]='.';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(text, &amp;quot;%s&amp;quot;, r);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
	               M[i][j]=r[j];          &lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	/*Stampa matrice*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
			printf(&amp;quot;%c&amp;quot;,M[i][j]);&lt;br /&gt;
&lt;br /&gt;
		printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*Conto i cancelletti*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
		{&lt;br /&gt;
			if(M[i][j]=='#')&lt;br /&gt;
			counter++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/*Logicamente si ha che se il numero &lt;br /&gt;
	di cancelletti non è un numero quadrato&lt;br /&gt;
	allora la matrice non potrà mai contenere un quadrato pieno.*/&lt;br /&gt;
&lt;br /&gt;
			/*Ho risolto il problema del &amp;quot;quadrato di lato 0&amp;quot;&lt;br /&gt;
			con un controllo sul counter dei cancelletti totali*/&lt;br /&gt;
	squaroot=sqrt(counter);&lt;br /&gt;
&lt;br /&gt;
	if(squaroot!=(int)squaroot||counter&amp;lt;1)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;\nThere isn't any square.\n\n&amp;quot;);&lt;br /&gt;
		vect[k]=0;&lt;br /&gt;
		goto final;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*Cerco il primo cancelletto,&lt;br /&gt;
	che sarà sicuramente il mio angolo &lt;br /&gt;
	in alto a sinistra del &lt;br /&gt;
	mio potenziale quadrato*/&lt;br /&gt;
	&lt;br /&gt;
			/*Ho risolto il goto con una variabile &lt;br /&gt;
			booleana che cambia valore nel momento&lt;br /&gt;
			in cui trovo il primo cancelletto.&lt;br /&gt;
			Uso il goto però per trattare l'errore  &lt;br /&gt;
			nel caso in cui	la radice del numero di &lt;br /&gt;
			cancelletti non sia intera.*/&lt;br /&gt;
&lt;br /&gt;
	boole=1;&lt;br /&gt;
	for(i=0;i&amp;lt;n&amp;amp;&amp;amp;boole;i++)&lt;br /&gt;
	{&lt;br /&gt;
       		 for(j=0;j&amp;lt;n&amp;amp;&amp;amp;boole;j++)&lt;br /&gt;
        	{&lt;br /&gt;
            		if(M[i][j]=='#')&lt;br /&gt;
            			boole=0;&lt;br /&gt;
        	}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/*Valuto solo la parte di matrice &lt;br /&gt;
	che inizia con il mio angolo sx&lt;br /&gt;
	e &amp;quot;spazzolo&amp;quot; solo per la lunghezza &lt;br /&gt;
	del mio lato(radice quadrata del numero di cancelletti)&lt;br /&gt;
	e scalo il numero dei cancelletti: se alla fine sono 0 vuol dire&lt;br /&gt;
	che nello spazio k*k (k&amp;lt;=n) ho trovato esattamente k*k cancelletti e non ce ne sono altri.&lt;br /&gt;
	Quindi è un quadrato pieno. */&lt;br /&gt;
	&lt;br /&gt;
			/*Ho risolto il segmentation fault controllando&lt;br /&gt;
			che la mia visita della matrice non esca dal range n &lt;br /&gt;
			oltre che dal range del lato del quadrato. &lt;br /&gt;
			Sottraggo 1 a i e j poichè nel momento in cui &lt;br /&gt;
                        boole cambia valore i cicli incrementano di 1 gli indici.*/&lt;br /&gt;
	isx=i-1; jsx=j-1; tmp=counter;&lt;br /&gt;
&lt;br /&gt;
	for(i=isx;i&amp;lt;(isx+(int)squaroot)&amp;amp;&amp;amp;i&amp;lt;n;i++)&lt;br /&gt;
	{&lt;br /&gt;
	        for(j=jsx;j&amp;lt;(jsx+(int)squaroot)&amp;amp;&amp;amp;j&amp;lt;n;j++)&lt;br /&gt;
	        {&lt;br /&gt;
	            if(M[i][j]=='#')&lt;br /&gt;
	            tmp--;&lt;br /&gt;
	        }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(tmp==0)&lt;br /&gt;
	{printf(&amp;quot;\nThere is a square! :D\n\n&amp;quot;);&lt;br /&gt;
	vect[k]=1;}&lt;br /&gt;
	else&lt;br /&gt;
	{printf(&amp;quot;\nThere isn't any square!\n\n&amp;quot;);&lt;br /&gt;
	vect[k]=0;}&lt;br /&gt;
	&lt;br /&gt;
	final:&lt;br /&gt;
&lt;br /&gt;
	free(M);&lt;br /&gt;
	free(r);&lt;br /&gt;
	&lt;br /&gt;
  }&lt;br /&gt;
	printf(&amp;quot;\nSTOP\n&amp;quot;);&lt;br /&gt;
	for(k=0;k&amp;lt;cases;k++)&lt;br /&gt;
	{&lt;br /&gt;
			&lt;br /&gt;
		printf(&amp;quot;CASE #%d :&amp;quot; ,k+1);		&lt;br /&gt;
		if(vect[k]==1)&lt;br /&gt;
		printf(&amp;quot;YES\n&amp;quot;);&lt;br /&gt;
		else printf(&amp;quot;NO\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	fclose(text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Nat|Nat]] ([[User talk:Nat|talk]]) 18:05, 2 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
== Soluzione di rd ==&lt;br /&gt;
&lt;br /&gt;
Ho provato a risolvere il problema giocando con i bit.&lt;br /&gt;
Il risultato e' riportato qui sotto.&lt;br /&gt;
&lt;br /&gt;
E' compatto ma un po' contorto...&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* count the # of bits set to 1 in an unsigned int */&lt;br /&gt;
int countones(unsigned int x) {&lt;br /&gt;
  int count;&lt;br /&gt;
  for (count=0; x!= 0; x&amp;gt;&amp;gt;=1)&lt;br /&gt;
    count += x &amp;amp; 1;&lt;br /&gt;
  return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* if there is one sequence of 1, return the length of that seq*/&lt;br /&gt;
int seqlen(unsigned int x) {&lt;br /&gt;
  while (x != 0 &amp;amp;&amp;amp; (x &amp;amp; 1)==0)&lt;br /&gt;
    x &amp;gt;&amp;gt;= 1;&lt;br /&gt;
  return countones(x+1)==1?countones(x):0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j;&lt;br /&gt;
  char line[20];&lt;br /&gt;
  unsigned int values,vsum,hsum;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  if (dim&amp;gt;20 || dim&amp;lt;1)&lt;br /&gt;
    error_n_die(&amp;quot;invalid matrix size&amp;quot;);&lt;br /&gt;
  for (i=values=hsum=vsum=0; i&amp;lt;dim; i++) {&lt;br /&gt;
    unsigned int bline;&lt;br /&gt;
    fscanf(fin,&amp;quot;%s&amp;quot;,line);&lt;br /&gt;
    for (j=bline=0; j&amp;lt;dim; j++)&lt;br /&gt;
      bline = (bline &amp;lt;&amp;lt; 1) | (line[j] == '#');&lt;br /&gt;
    values |= 1&amp;lt;&amp;lt;countones(bline);&lt;br /&gt;
    hsum = (hsum &amp;lt;&amp;lt; 1) | (bline != 0);&lt;br /&gt;
    vsum |= bline;&lt;br /&gt;
  }&lt;br /&gt;
  values |= 1&amp;lt;&amp;lt;countones(vsum) | 1&amp;lt;&amp;lt;countones(hsum);&lt;br /&gt;
  values &amp;amp;= ~1;&lt;br /&gt;
  values |= 1&amp;lt;&amp;lt;seqlen(vsum) | 1&amp;lt;&amp;lt;seqlen(hsum);&lt;br /&gt;
  return countones(values) == 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
  &lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 07:54, 4 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Altre considerazioni e un'altra soluzione (rd) ==&lt;br /&gt;
&lt;br /&gt;
(NB: le indicazioni in '''Bold text''' sono esercizi da svolgere qui sul blog.)&lt;br /&gt;
&lt;br /&gt;
Ho riguardato i programmi proposti.&lt;br /&gt;
&lt;br /&gt;
La soluzione di LorenzoV ha un problema. Lui cerca i quattro vertici e poi controlla che tutti gli elementi all'interno siano '#'.&lt;br /&gt;
Se provate con questa configurazione:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
.....&lt;br /&gt;
.###.&lt;br /&gt;
####.&lt;br /&gt;
.###.&lt;br /&gt;
.....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
vi dice che e' un quadrato. Si potrebbe correggere il programma cambiando il modo per cercare i vertici... '''come'''?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 /*Angolo in alto a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){ // controllo per righe&lt;br /&gt;
                    asx.x=i;&lt;br /&gt;
                    asx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in alto a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n-1; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[j][i]=='#'){ // scambio indici, controllo per colonne&lt;br /&gt;
                    adx.x=j;&lt;br /&gt;
                    adx.y=i;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=n-1; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[j][i]=='#'){ // scambio indici, controllo per colonne&lt;br /&gt;
                    bsx.x=j;&lt;br /&gt;
                    bsx.y=i;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n-1; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=n-1; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){ // controllo per righe&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bdx.x=i;&lt;br /&gt;
                    bdx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Eddy|Eddy]] ([[User talk:Eddy|talk]]) 21:40 Monday, 10 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
La soluzione di Nat invece funziona dal punto di vista algoritmico. Lui controlla che il numero di # sia un quadrato perfetto N^2 e quindi controlla che a partire dal primo # che si incontra scandendo la matrice in senso lessicografico tutti gli elementi nel quadrato a destra e in basso di lato N siano '#'.&lt;br /&gt;
&lt;br /&gt;
Pero'...&lt;br /&gt;
con questa configurazione:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
.....#####&lt;br /&gt;
##########&lt;br /&gt;
##########&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
il risultato e': Segmentation fault. '''Perch&amp;amp;eacute;?'''&lt;br /&gt;
&lt;br /&gt;
Inoltre se si fornisce una matrice vuota come:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
4&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dice che c'e' un quadrato (che sarebbe coerente, e' un quadrato di dimensione 0, ma secondo me le specifiche indicando &amp;quot;pieno&amp;quot; vogliono escludere questo caso).&lt;br /&gt;
&lt;br /&gt;
Ho poi un paio di commenti stilistici per Nat: la soluzione non rispetta le specifiche per il formato del file in input e usa un 'goto' non per casi di errore.&lt;br /&gt;
Il suo problema era &amp;quot;rompere&amp;quot; il doppio ciclo: '''come si puo' fare'''?&lt;br /&gt;
&lt;br /&gt;
Infine vi lascio questa altra soluzione.&lt;br /&gt;
Non usa alcuna memorizzazione per la matrice, neanche per una singola riga. Calcola se ci sia o meno un quadrato durante la lettura carattere per carattere.&lt;br /&gt;
Quindi anche se fosse data in input una matrice di un milione per un milione di elementi il programma userebbe sempre solo 8 interi.&lt;br /&gt;
&lt;br /&gt;
'''Chi ne descrive il funzionamento'''?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void flushtonl(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int c;&lt;br /&gt;
  while ((c=fgetc(fin)) != '\n' &amp;amp;&amp;amp; c!=EOF)&lt;br /&gt;
    ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j,c;&lt;br /&gt;
  int mini,maxi,minj,maxj;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  flushtonl(fin);&lt;br /&gt;
  mini=maxi=minj=maxj=-1;&lt;br /&gt;
  for (i=0; i&amp;lt;dim+1; i++) {&lt;br /&gt;
    int n=0;&lt;br /&gt;
    for (j=0; j&amp;lt;dim+1; j++) {&lt;br /&gt;
      c=(i&amp;lt;dim &amp;amp;&amp;amp; j&amp;lt;dim)?fgetc(fin):'.';&lt;br /&gt;
      if (mini&amp;lt;0) {&lt;br /&gt;
        if (c=='#') {&lt;br /&gt;
          if (minj&amp;lt;0) minj=j;&lt;br /&gt;
        } else {&lt;br /&gt;
          if (minj&amp;gt;=0) maxj=j-1,mini=i;&lt;br /&gt;
        }&lt;br /&gt;
      } else if (maxi&amp;lt;0) {&lt;br /&gt;
        if (c!='#' ^ (j &amp;lt; minj || j &amp;gt; maxj))&lt;br /&gt;
          if (c == '#' || j != minj)&lt;br /&gt;
            mini=maxi=minj=maxj=dim;&lt;br /&gt;
          else&lt;br /&gt;
            maxi=i-1;&lt;br /&gt;
      } else {&lt;br /&gt;
        if (c=='#')&lt;br /&gt;
          mini=maxi=minj=maxj=dim;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (i&amp;lt;dim) flushtonl(fin);&lt;br /&gt;
  }&lt;br /&gt;
  return maxj-minj == maxi-mini &amp;amp;&amp;amp; mini&amp;gt;=0 &amp;amp;&amp;amp; maxi&amp;lt;dim;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 12:45, 6 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
''c'era un bug. Ho corretto il confronto di riga 36 da &amp;quot;if (c == '#')&amp;quot; a &amp;quot;if (c == '#' || j != minj)&amp;quot;''.&lt;br /&gt;
'''Chi riesce a trovare il caso che non veniva correttamente riconosciuto? (spiegando il perch&amp;amp;eacute;!)'''&lt;br /&gt;
&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 20:30, 6 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Funzionamento''&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* funzione che &amp;quot;si mangia&amp;quot; quel che resta della riga &lt;br /&gt;
   per portare l'indicatore di posizione del file alla riga successiva */&lt;br /&gt;
void flushtonl(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int c;&lt;br /&gt;
  while ((c=fgetc(fin)) != '\n' &amp;amp;&amp;amp; c!=EOF)&lt;br /&gt;
    ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j,c;&lt;br /&gt;
/* rappresentano rispettivamente la prima riga, l'ultima riga, &lt;br /&gt;
   prima colonna, ultima colonna del quadrato */&lt;br /&gt;
&lt;br /&gt;
  int mini,maxi,minj,maxj;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  flushtonl(fin);&lt;br /&gt;
  mini=maxi=minj=maxj=-1;&lt;br /&gt;
  for (i=0; i&amp;lt;dim+1; i++) {&lt;br /&gt;
    int n=0; // credo sia superfluo&lt;br /&gt;
    for (j=0; j&amp;lt;dim+1; j++) {&lt;br /&gt;
      c=(i&amp;lt;dim &amp;amp;&amp;amp; j&amp;lt;dim)?fgetc(fin):'.';&lt;br /&gt;
&lt;br /&gt;
/* partendo da &amp;quot;in alto a sinistra&amp;quot; se non ho ancora trovato la prima riga */&lt;br /&gt;
      if (mini&amp;lt;0) {&lt;br /&gt;
        if (c=='#') {&lt;br /&gt;
          /* so che e` la prima colonna */&lt;br /&gt;
          if (minj&amp;lt;0) minj=j;&lt;br /&gt;
        } else {&lt;br /&gt;
          /* se sono qui, vuol dire che ho gia` trovato la prima colonna e c=='.'&lt;br /&gt;
             ho trovato l'ultima colonna (era la precedente) e setto prima riga */&lt;br /&gt;
          if (minj&amp;gt;=0) maxj=j-1,mini=i;&lt;br /&gt;
        }&lt;br /&gt;
     /* ho gia` trovato la prima riga, la prima colonna e l'ultima colonna&lt;br /&gt;
        mi manca solo l'ultima riga */&lt;br /&gt;
      } else if (maxi&amp;lt;0) {&lt;br /&gt;
        /* entrero` qui soltanto se:&lt;br /&gt;
           1. c=='.' e sono nel range delle colonne&lt;br /&gt;
           2. c=='#' e sono fuori dal range delle colonne */&lt;br /&gt;
        if (c!='#' ^ (j &amp;lt; minj || j &amp;gt; maxj))&lt;br /&gt;
          /* casi di errore:&lt;br /&gt;
             1. se c=='#' c'e` un '#' fuori dal quadrato&lt;br /&gt;
             2. e` stato aggiunto j != minj, poiche` non verrebbe riconosciuto &lt;br /&gt;
                ##&lt;br /&gt;
                #.   */ &lt;br /&gt;
          if (c == '#' || j != minj)&lt;br /&gt;
            mini=maxi=minj=maxj=dim;&lt;br /&gt;
          else&lt;br /&gt;
            maxi=i-1; // trovato ultima riga&lt;br /&gt;
      } else {&lt;br /&gt;
        /* trovato un &amp;quot;#&amp;quot; al di fuori del quadrato  */&lt;br /&gt;
        if (c=='#')&lt;br /&gt;
          mini=maxi=minj=maxj=dim;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (i&amp;lt;dim) flushtonl(fin);&lt;br /&gt;
  }&lt;br /&gt;
  /* controllo che le dimensioni siano stato rispettate */ &lt;br /&gt;
  return maxj-minj == maxi-mini &amp;amp;&amp;amp; mini&amp;gt;=0 &amp;amp;&amp;amp; maxi&amp;lt;dim;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Eddy|Eddy]] ([[User talk:Eddy|talk]]) 23:15 Monday, 10 November 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=825</id>
		<title>(Programma C) Un quadrato nella matrice</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=825"/>
		<updated>2014-11-10T22:15:45Z</updated>

		<summary type="html">&lt;p&gt;Eddy: /* Altre considerazioni e un'altra soluzione (rd) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Soluzione di LorenzoV ==&lt;br /&gt;
&lt;br /&gt;
Questo è un problema uscito per le fasi di qualificazione della Facebook Hacker Cup 2014.&lt;br /&gt;
Il codice sorgente del programma di seguito riportato è in grado di riconoscere se in una matrice quadrata è presente un quadrato &amp;quot;pieno&amp;quot;: il programma accetta in '''input''' un file come da esempio:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
#...&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
####&lt;br /&gt;
#..#&lt;br /&gt;
#..#&lt;br /&gt;
####&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
.....&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dove il primo intero T indica il numero di casi (o test) e gli altri interi n indicano la grandezza di ogni matrice nxn.&amp;lt;br&amp;gt;&lt;br /&gt;
Valgono i seguenti vincoli: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ T ≤ 20&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ N ≤ 20&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Seguendo questo esempio, in '''output''' il programma stamperà le seguenti righe:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Case #1: YES&lt;br /&gt;
Case #2: NO&lt;br /&gt;
Case #3: NO&lt;br /&gt;
Case #4: NO&lt;br /&gt;
Case #5: YES&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La matrice n. 2 contiene un # fuori dal quadrato, la matrice n. 3 contiene un quadrato non riempito e la matrice n. 4 contiene un rettangolo.&amp;lt;br&amp;gt;&lt;br /&gt;
Ecco il codice della mia soluzione:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct coordinate{&lt;br /&gt;
    int x;&lt;br /&gt;
    int y;&lt;br /&gt;
}coord;&lt;br /&gt;
&lt;br /&gt;
int max(int x, int y){&lt;br /&gt;
    if (x&amp;gt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int min(int x, int y){&lt;br /&gt;
    if (x&amp;lt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	FILE *fin;&lt;br /&gt;
	const int N=20;&lt;br /&gt;
	int i, j, k, h, n, T, M[N][N];&lt;br /&gt;
	int acase, find;&lt;br /&gt;
	coord asx, adx, bsx, bdx;&lt;br /&gt;
	char str[N];&lt;br /&gt;
	fin = fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
	if (fin == NULL){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Error opening file\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;T);&lt;br /&gt;
	if (T&amp;gt;20 || T&amp;lt;1){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Number of test cases not valid\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	for (k=0; k&amp;lt;T; k++){&lt;br /&gt;
        fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
        if (n&amp;gt;N){&lt;br /&gt;
            fprintf(stderr, &amp;quot;Number of cells too high\n&amp;quot;);&lt;br /&gt;
            exit(1);&lt;br /&gt;
        }&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(fin, &amp;quot;%s&amp;quot;, &amp;amp;str);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++){&lt;br /&gt;
                M[i][j]=str[j];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        asx.x=asx.y=-1;&lt;br /&gt;
        adx.x=adx.y=-1;&lt;br /&gt;
        bsx.x=bsx.y=-1;&lt;br /&gt;
        bdx.x=bdx.y=-1;&lt;br /&gt;
        /*Angolo in alto a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    asx.x=i;&lt;br /&gt;
                    asx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in alto a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    adx.x=i;&lt;br /&gt;
                    adx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bsx.x=i;&lt;br /&gt;
                    bsx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bdx.x=i;&lt;br /&gt;
                    bdx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Verifico che non sia un rettangolo*/&lt;br /&gt;
        acase=1;&lt;br /&gt;
        if (max(bsx.x, bdx.x)-min(asx.x, adx.x)!=max(bsx.y, bdx.y)-min(asx.y, adx.y)){&lt;br /&gt;
            acase=0;&lt;br /&gt;
        } else {&lt;br /&gt;
            /*Verifico se il quadrato è pieno*/&lt;br /&gt;
            for (i=min(asx.x, adx.x); i&amp;lt;=max(bsx.x, bdx.x); i++){&lt;br /&gt;
                for (j=min(asx.y, adx.y); j&amp;lt;=max(bsx.y, bdx.y); j++){&lt;br /&gt;
                    if (M[i][j]!='#'){&lt;br /&gt;
                        acase=0;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (acase) printf(&amp;quot;Case #%i: YES\n&amp;quot;, k+1);&lt;br /&gt;
        else printf(&amp;quot;Case #%i: NO\n&amp;quot;, k+1);&lt;br /&gt;
	}&lt;br /&gt;
	fclose(fin);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:LorenzoV|LorenzoV]] ([[User talk:LorenzoV|talk]]) 17:25, 1 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Nat ==&lt;br /&gt;
&lt;br /&gt;
Il codice che posto qui di seguito verifica che nella matrice presa in input da file ci sia un quadrato pieno, ma attraverso controlli diversi rispetto al codice precedente e con una matrice allocata dinamicamente (si possono passare in input matrici più grandi di 20*20).&lt;br /&gt;
Il programma prende lo stesso input della consegna postata da LorenzoV.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se compilate con gcc va aggiunto  il flag -lm perchè con la libreria math.h (per la radice quadrata) ci sono problemi. &amp;lt;br&amp;gt;&lt;br /&gt;
Es. gcc main.c -o programma -lm&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	FILE *text; &lt;br /&gt;
    	int n,i,j,k,counter,tmp,isx,jsx,boole,cases; int* vect;&lt;br /&gt;
	double squaroot; ;cases=0;&lt;br /&gt;
	text=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
    	if(text==NULL)&lt;br /&gt;
    	{&lt;br /&gt;
        	fprintf(stderr, &amp;quot;Invalid input.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
    	}&lt;br /&gt;
	&lt;br /&gt;
	/*Leggo il numero di casi*/&lt;br /&gt;
    	fscanf(text,&amp;quot;%d&amp;quot;,&amp;amp;cases);&lt;br /&gt;
	if(cases&amp;lt;=0)&lt;br /&gt;
    	{&lt;br /&gt;
        	fprintf(stderr, &amp;quot;Invalid input.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
    	}&lt;br /&gt;
	vect=malloc(cases*sizeof(int));&lt;br /&gt;
	printf(&amp;quot;\nCases =%d\n&amp;quot;,cases);&lt;br /&gt;
&lt;br /&gt;
  for(k=0;k&amp;lt;cases;k++)&lt;br /&gt;
  {     &lt;br /&gt;
	&lt;br /&gt;
	 counter=0;&lt;br /&gt;
&lt;br /&gt;
	/*Leggo la dimensione n della matrice in input*/&lt;br /&gt;
    	fscanf(text,&amp;quot;%d&amp;quot;,&amp;amp;n);&lt;br /&gt;
    	printf(&amp;quot;n=%d \n&amp;quot;,n);&lt;br /&gt;
&lt;br /&gt;
	/*Alloco una matrice M e un vettore r, che mi serve&lt;br /&gt;
	 per copiare l'input su M. &lt;br /&gt;
	In seguito setto tutto con un '.'*/&lt;br /&gt;
    	char **M;&lt;br /&gt;
    	M=(char**)malloc(n * sizeof(char*));&lt;br /&gt;
    	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
    	{M[i]=(char*)malloc(n * sizeof(char));}&lt;br /&gt;
&lt;br /&gt;
    	char *r;&lt;br /&gt;
    	r=(char*)malloc(n*sizeof(char));&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
		r[i]='.';&lt;br /&gt;
		for(j=0;j&amp;lt;n;j++)&lt;br /&gt;
			M[i][j]='.';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(text, &amp;quot;%s&amp;quot;, r);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
	               M[i][j]=r[j];          &lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	/*Stampa matrice*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
			printf(&amp;quot;%c&amp;quot;,M[i][j]);&lt;br /&gt;
&lt;br /&gt;
		printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*Conto i cancelletti*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
		{&lt;br /&gt;
			if(M[i][j]=='#')&lt;br /&gt;
			counter++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/*Logicamente si ha che se il numero &lt;br /&gt;
	di cancelletti non è un numero quadrato&lt;br /&gt;
	allora la matrice non potrà mai contenere un quadrato pieno.*/&lt;br /&gt;
&lt;br /&gt;
			/*Ho risolto il problema del &amp;quot;quadrato di lato 0&amp;quot;&lt;br /&gt;
			con un controllo sul counter dei cancelletti totali*/&lt;br /&gt;
	squaroot=sqrt(counter);&lt;br /&gt;
&lt;br /&gt;
	if(squaroot!=(int)squaroot||counter&amp;lt;1)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;\nThere isn't any square.\n\n&amp;quot;);&lt;br /&gt;
		vect[k]=0;&lt;br /&gt;
		goto final;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*Cerco il primo cancelletto,&lt;br /&gt;
	che sarà sicuramente il mio angolo &lt;br /&gt;
	in alto a sinistra del &lt;br /&gt;
	mio potenziale quadrato*/&lt;br /&gt;
	&lt;br /&gt;
			/*Ho risolto il goto con una variabile &lt;br /&gt;
			booleana che cambia valore nel momento&lt;br /&gt;
			in cui trovo il primo cancelletto.&lt;br /&gt;
			Uso il goto però per trattare l'errore  &lt;br /&gt;
			nel caso in cui	la radice del numero di &lt;br /&gt;
			cancelletti non sia intera.*/&lt;br /&gt;
&lt;br /&gt;
	boole=1;&lt;br /&gt;
	for(i=0;i&amp;lt;n&amp;amp;&amp;amp;boole;i++)&lt;br /&gt;
	{&lt;br /&gt;
       		 for(j=0;j&amp;lt;n&amp;amp;&amp;amp;boole;j++)&lt;br /&gt;
        	{&lt;br /&gt;
            		if(M[i][j]=='#')&lt;br /&gt;
            			boole=0;&lt;br /&gt;
        	}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/*Valuto solo la parte di matrice &lt;br /&gt;
	che inizia con il mio angolo sx&lt;br /&gt;
	e &amp;quot;spazzolo&amp;quot; solo per la lunghezza &lt;br /&gt;
	del mio lato(radice quadrata del numero di cancelletti)&lt;br /&gt;
	e scalo il numero dei cancelletti: se alla fine sono 0 vuol dire&lt;br /&gt;
	che nello spazio k*k (k&amp;lt;=n) ho trovato esattamente k*k cancelletti e non ce ne sono altri.&lt;br /&gt;
	Quindi è un quadrato pieno. */&lt;br /&gt;
	&lt;br /&gt;
			/*Ho risolto il segmentation fault controllando&lt;br /&gt;
			che la mia visita della matrice non esca dal range n &lt;br /&gt;
			oltre che dal range del lato del quadrato. &lt;br /&gt;
			Sottraggo 1 a i e j poichè nel momento in cui &lt;br /&gt;
                        boole cambia valore i cicli incrementano di 1 gli indici.*/&lt;br /&gt;
	isx=i-1; jsx=j-1; tmp=counter;&lt;br /&gt;
&lt;br /&gt;
	for(i=isx;i&amp;lt;(isx+(int)squaroot)&amp;amp;&amp;amp;i&amp;lt;n;i++)&lt;br /&gt;
	{&lt;br /&gt;
	        for(j=jsx;j&amp;lt;(jsx+(int)squaroot)&amp;amp;&amp;amp;j&amp;lt;n;j++)&lt;br /&gt;
	        {&lt;br /&gt;
	            if(M[i][j]=='#')&lt;br /&gt;
	            tmp--;&lt;br /&gt;
	        }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(tmp==0)&lt;br /&gt;
	{printf(&amp;quot;\nThere is a square! :D\n\n&amp;quot;);&lt;br /&gt;
	vect[k]=1;}&lt;br /&gt;
	else&lt;br /&gt;
	{printf(&amp;quot;\nThere isn't any square!\n\n&amp;quot;);&lt;br /&gt;
	vect[k]=0;}&lt;br /&gt;
	&lt;br /&gt;
	final:&lt;br /&gt;
&lt;br /&gt;
	free(M);&lt;br /&gt;
	free(r);&lt;br /&gt;
	&lt;br /&gt;
  }&lt;br /&gt;
	printf(&amp;quot;\nSTOP\n&amp;quot;);&lt;br /&gt;
	for(k=0;k&amp;lt;cases;k++)&lt;br /&gt;
	{&lt;br /&gt;
			&lt;br /&gt;
		printf(&amp;quot;CASE #%d :&amp;quot; ,k+1);		&lt;br /&gt;
		if(vect[k]==1)&lt;br /&gt;
		printf(&amp;quot;YES\n&amp;quot;);&lt;br /&gt;
		else printf(&amp;quot;NO\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	fclose(text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Nat|Nat]] ([[User talk:Nat|talk]]) 18:05, 2 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
== Soluzione di rd ==&lt;br /&gt;
&lt;br /&gt;
Ho provato a risolvere il problema giocando con i bit.&lt;br /&gt;
Il risultato e' riportato qui sotto.&lt;br /&gt;
&lt;br /&gt;
E' compatto ma un po' contorto...&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* count the # of bits set to 1 in an unsigned int */&lt;br /&gt;
int countones(unsigned int x) {&lt;br /&gt;
  int count;&lt;br /&gt;
  for (count=0; x!= 0; x&amp;gt;&amp;gt;=1)&lt;br /&gt;
    count += x &amp;amp; 1;&lt;br /&gt;
  return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* if there is one sequence of 1, return the length of that seq*/&lt;br /&gt;
int seqlen(unsigned int x) {&lt;br /&gt;
  while (x != 0 &amp;amp;&amp;amp; (x &amp;amp; 1)==0)&lt;br /&gt;
    x &amp;gt;&amp;gt;= 1;&lt;br /&gt;
  return countones(x+1)==1?countones(x):0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j;&lt;br /&gt;
  char line[20];&lt;br /&gt;
  unsigned int values,vsum,hsum;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  if (dim&amp;gt;20 || dim&amp;lt;1)&lt;br /&gt;
    error_n_die(&amp;quot;invalid matrix size&amp;quot;);&lt;br /&gt;
  for (i=values=hsum=vsum=0; i&amp;lt;dim; i++) {&lt;br /&gt;
    unsigned int bline;&lt;br /&gt;
    fscanf(fin,&amp;quot;%s&amp;quot;,line);&lt;br /&gt;
    for (j=bline=0; j&amp;lt;dim; j++)&lt;br /&gt;
      bline = (bline &amp;lt;&amp;lt; 1) | (line[j] == '#');&lt;br /&gt;
    values |= 1&amp;lt;&amp;lt;countones(bline);&lt;br /&gt;
    hsum = (hsum &amp;lt;&amp;lt; 1) | (bline != 0);&lt;br /&gt;
    vsum |= bline;&lt;br /&gt;
  }&lt;br /&gt;
  values |= 1&amp;lt;&amp;lt;countones(vsum) | 1&amp;lt;&amp;lt;countones(hsum);&lt;br /&gt;
  values &amp;amp;= ~1;&lt;br /&gt;
  values |= 1&amp;lt;&amp;lt;seqlen(vsum) | 1&amp;lt;&amp;lt;seqlen(hsum);&lt;br /&gt;
  return countones(values) == 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
  &lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 07:54, 4 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Altre considerazioni e un'altra soluzione (rd) ==&lt;br /&gt;
&lt;br /&gt;
(NB: le indicazioni in '''Bold text''' sono esercizi da svolgere qui sul blog.)&lt;br /&gt;
&lt;br /&gt;
Ho riguardato i programmi proposti.&lt;br /&gt;
&lt;br /&gt;
La soluzione di LorenzoV ha un problema. Lui cerca i quattro vertici e poi controlla che tutti gli elementi all'interno siano '#'.&lt;br /&gt;
Se provate con questa configurazione:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
.....&lt;br /&gt;
.###.&lt;br /&gt;
####.&lt;br /&gt;
.###.&lt;br /&gt;
.....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
vi dice che e' un quadrato. Si potrebbe correggere il programma cambiando il modo per cercare i vertici... '''come'''?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 /*Angolo in alto a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){ // controllo per righe&lt;br /&gt;
                    asx.x=i;&lt;br /&gt;
                    asx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in alto a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n-1; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[j][i]=='#'){ // scambio indici, controllo per colonne&lt;br /&gt;
                    adx.x=j;&lt;br /&gt;
                    adx.y=i;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=n-1; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[j][i]=='#'){ // scambio indici, controllo per colonne&lt;br /&gt;
                    bsx.x=j;&lt;br /&gt;
                    bsx.y=i;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){ // controllo per righe&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bdx.x=i;&lt;br /&gt;
                    bdx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Eddy|Eddy]] ([[User talk:Eddy|talk]]) 21:40 Monday, 10 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
La soluzione di Nat invece funziona dal punto di vista algoritmico. Lui controlla che il numero di # sia un quadrato perfetto N^2 e quindi controlla che a partire dal primo # che si incontra scandendo la matrice in senso lessicografico tutti gli elementi nel quadrato a destra e in basso di lato N siano '#'.&lt;br /&gt;
&lt;br /&gt;
Pero'...&lt;br /&gt;
con questa configurazione:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
.....#####&lt;br /&gt;
##########&lt;br /&gt;
##########&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
il risultato e': Segmentation fault. '''Perch&amp;amp;eacute;?'''&lt;br /&gt;
&lt;br /&gt;
Inoltre se si fornisce una matrice vuota come:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
4&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dice che c'e' un quadrato (che sarebbe coerente, e' un quadrato di dimensione 0, ma secondo me le specifiche indicando &amp;quot;pieno&amp;quot; vogliono escludere questo caso).&lt;br /&gt;
&lt;br /&gt;
Ho poi un paio di commenti stilistici per Nat: la soluzione non rispetta le specifiche per il formato del file in input e usa un 'goto' non per casi di errore.&lt;br /&gt;
Il suo problema era &amp;quot;rompere&amp;quot; il doppio ciclo: '''come si puo' fare'''?&lt;br /&gt;
&lt;br /&gt;
Infine vi lascio questa altra soluzione.&lt;br /&gt;
Non usa alcuna memorizzazione per la matrice, neanche per una singola riga. Calcola se ci sia o meno un quadrato durante la lettura carattere per carattere.&lt;br /&gt;
Quindi anche se fosse data in input una matrice di un milione per un milione di elementi il programma userebbe sempre solo 8 interi.&lt;br /&gt;
&lt;br /&gt;
'''Chi ne descrive il funzionamento'''?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void flushtonl(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int c;&lt;br /&gt;
  while ((c=fgetc(fin)) != '\n' &amp;amp;&amp;amp; c!=EOF)&lt;br /&gt;
    ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j,c;&lt;br /&gt;
  int mini,maxi,minj,maxj;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  flushtonl(fin);&lt;br /&gt;
  mini=maxi=minj=maxj=-1;&lt;br /&gt;
  for (i=0; i&amp;lt;dim+1; i++) {&lt;br /&gt;
    int n=0;&lt;br /&gt;
    for (j=0; j&amp;lt;dim+1; j++) {&lt;br /&gt;
      c=(i&amp;lt;dim &amp;amp;&amp;amp; j&amp;lt;dim)?fgetc(fin):'.';&lt;br /&gt;
      if (mini&amp;lt;0) {&lt;br /&gt;
        if (c=='#') {&lt;br /&gt;
          if (minj&amp;lt;0) minj=j;&lt;br /&gt;
        } else {&lt;br /&gt;
          if (minj&amp;gt;=0) maxj=j-1,mini=i;&lt;br /&gt;
        }&lt;br /&gt;
      } else if (maxi&amp;lt;0) {&lt;br /&gt;
        if (c!='#' ^ (j &amp;lt; minj || j &amp;gt; maxj))&lt;br /&gt;
          if (c == '#' || j != minj)&lt;br /&gt;
            mini=maxi=minj=maxj=dim;&lt;br /&gt;
          else&lt;br /&gt;
            maxi=i-1;&lt;br /&gt;
      } else {&lt;br /&gt;
        if (c=='#')&lt;br /&gt;
          mini=maxi=minj=maxj=dim;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (i&amp;lt;dim) flushtonl(fin);&lt;br /&gt;
  }&lt;br /&gt;
  return maxj-minj == maxi-mini &amp;amp;&amp;amp; mini&amp;gt;=0 &amp;amp;&amp;amp; maxi&amp;lt;dim;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 12:45, 6 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
''c'era un bug. Ho corretto il confronto di riga 36 da &amp;quot;if (c == '#')&amp;quot; a &amp;quot;if (c == '#' || j != minj)&amp;quot;''.&lt;br /&gt;
'''Chi riesce a trovare il caso che non veniva correttamente riconosciuto? (spiegando il perch&amp;amp;eacute;!)'''&lt;br /&gt;
&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 20:30, 6 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Funzionamento''&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* funzione che &amp;quot;si mangia&amp;quot; quel che resta della riga &lt;br /&gt;
   per portare l'indicatore di posizione del file alla riga successiva */&lt;br /&gt;
void flushtonl(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int c;&lt;br /&gt;
  while ((c=fgetc(fin)) != '\n' &amp;amp;&amp;amp; c!=EOF)&lt;br /&gt;
    ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j,c;&lt;br /&gt;
/* rappresentano rispettivamente la prima riga, l'ultima riga, &lt;br /&gt;
   prima colonna, ultima colonna del quadrato */&lt;br /&gt;
&lt;br /&gt;
  int mini,maxi,minj,maxj;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  flushtonl(fin);&lt;br /&gt;
  mini=maxi=minj=maxj=-1;&lt;br /&gt;
  for (i=0; i&amp;lt;dim+1; i++) {&lt;br /&gt;
    int n=0; // credo sia superfluo&lt;br /&gt;
    for (j=0; j&amp;lt;dim+1; j++) {&lt;br /&gt;
      c=(i&amp;lt;dim &amp;amp;&amp;amp; j&amp;lt;dim)?fgetc(fin):'.';&lt;br /&gt;
&lt;br /&gt;
/* partendo da &amp;quot;in alto a sinistra&amp;quot; se non ho ancora trovato la prima riga */&lt;br /&gt;
      if (mini&amp;lt;0) {&lt;br /&gt;
        if (c=='#') {&lt;br /&gt;
          /* so che e` la prima colonna */&lt;br /&gt;
          if (minj&amp;lt;0) minj=j;&lt;br /&gt;
        } else {&lt;br /&gt;
          /* se sono qui, vuol dire che ho gia` trovato la prima colonna e c=='.'&lt;br /&gt;
             ho trovato l'ultima colonna (era la precedente) e setto prima riga */&lt;br /&gt;
          if (minj&amp;gt;=0) maxj=j-1,mini=i;&lt;br /&gt;
        }&lt;br /&gt;
     /* ho gia` trovato la prima riga, la prima colonna e l'ultima colonna&lt;br /&gt;
        mi manca solo l'ultima riga */&lt;br /&gt;
      } else if (maxi&amp;lt;0) {&lt;br /&gt;
        /* entrero` qui soltanto se:&lt;br /&gt;
           1. c=='.' e sono nel range delle colonne&lt;br /&gt;
           2. c=='#' e sono fuori dal range delle colonne */&lt;br /&gt;
        if (c!='#' ^ (j &amp;lt; minj || j &amp;gt; maxj))&lt;br /&gt;
          /* casi di errore:&lt;br /&gt;
             1. se c=='#' c'e` un '#' fuori dal quadrato&lt;br /&gt;
             2. e` stato aggiunto j != minj, poiche` non verrebbe riconosciuto &lt;br /&gt;
                ##&lt;br /&gt;
                #.   */ &lt;br /&gt;
          if (c == '#' || j != minj)&lt;br /&gt;
            mini=maxi=minj=maxj=dim;&lt;br /&gt;
          else&lt;br /&gt;
            maxi=i-1; // trovato ultima riga&lt;br /&gt;
      } else {&lt;br /&gt;
        /* trovato un &amp;quot;#&amp;quot; al di fuori del quadrato  */&lt;br /&gt;
        if (c=='#')&lt;br /&gt;
          mini=maxi=minj=maxj=dim;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (i&amp;lt;dim) flushtonl(fin);&lt;br /&gt;
  }&lt;br /&gt;
  /* controllo che le dimensioni siano stato rispettate */ &lt;br /&gt;
  return maxj-minj == maxi-mini &amp;amp;&amp;amp; mini&amp;gt;=0 &amp;amp;&amp;amp; maxi&amp;lt;dim;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Eddy|Eddy]] ([[User talk:Eddy|talk]]) 23:15 Monday, 10 November 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=824</id>
		<title>(Programma C) Un quadrato nella matrice</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=824"/>
		<updated>2014-11-10T21:56:27Z</updated>

		<summary type="html">&lt;p&gt;Eddy: /* Altre considerazioni e un'altra soluzione (rd) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Soluzione di LorenzoV ==&lt;br /&gt;
&lt;br /&gt;
Questo è un problema uscito per le fasi di qualificazione della Facebook Hacker Cup 2014.&lt;br /&gt;
Il codice sorgente del programma di seguito riportato è in grado di riconoscere se in una matrice quadrata è presente un quadrato &amp;quot;pieno&amp;quot;: il programma accetta in '''input''' un file come da esempio:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
#...&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
####&lt;br /&gt;
#..#&lt;br /&gt;
#..#&lt;br /&gt;
####&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
.....&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dove il primo intero T indica il numero di casi (o test) e gli altri interi n indicano la grandezza di ogni matrice nxn.&amp;lt;br&amp;gt;&lt;br /&gt;
Valgono i seguenti vincoli: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ T ≤ 20&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ N ≤ 20&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Seguendo questo esempio, in '''output''' il programma stamperà le seguenti righe:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Case #1: YES&lt;br /&gt;
Case #2: NO&lt;br /&gt;
Case #3: NO&lt;br /&gt;
Case #4: NO&lt;br /&gt;
Case #5: YES&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La matrice n. 2 contiene un # fuori dal quadrato, la matrice n. 3 contiene un quadrato non riempito e la matrice n. 4 contiene un rettangolo.&amp;lt;br&amp;gt;&lt;br /&gt;
Ecco il codice della mia soluzione:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct coordinate{&lt;br /&gt;
    int x;&lt;br /&gt;
    int y;&lt;br /&gt;
}coord;&lt;br /&gt;
&lt;br /&gt;
int max(int x, int y){&lt;br /&gt;
    if (x&amp;gt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int min(int x, int y){&lt;br /&gt;
    if (x&amp;lt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	FILE *fin;&lt;br /&gt;
	const int N=20;&lt;br /&gt;
	int i, j, k, h, n, T, M[N][N];&lt;br /&gt;
	int acase, find;&lt;br /&gt;
	coord asx, adx, bsx, bdx;&lt;br /&gt;
	char str[N];&lt;br /&gt;
	fin = fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
	if (fin == NULL){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Error opening file\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;T);&lt;br /&gt;
	if (T&amp;gt;20 || T&amp;lt;1){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Number of test cases not valid\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	for (k=0; k&amp;lt;T; k++){&lt;br /&gt;
        fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
        if (n&amp;gt;N){&lt;br /&gt;
            fprintf(stderr, &amp;quot;Number of cells too high\n&amp;quot;);&lt;br /&gt;
            exit(1);&lt;br /&gt;
        }&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(fin, &amp;quot;%s&amp;quot;, &amp;amp;str);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++){&lt;br /&gt;
                M[i][j]=str[j];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        asx.x=asx.y=-1;&lt;br /&gt;
        adx.x=adx.y=-1;&lt;br /&gt;
        bsx.x=bsx.y=-1;&lt;br /&gt;
        bdx.x=bdx.y=-1;&lt;br /&gt;
        /*Angolo in alto a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    asx.x=i;&lt;br /&gt;
                    asx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in alto a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    adx.x=i;&lt;br /&gt;
                    adx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bsx.x=i;&lt;br /&gt;
                    bsx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bdx.x=i;&lt;br /&gt;
                    bdx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Verifico che non sia un rettangolo*/&lt;br /&gt;
        acase=1;&lt;br /&gt;
        if (max(bsx.x, bdx.x)-min(asx.x, adx.x)!=max(bsx.y, bdx.y)-min(asx.y, adx.y)){&lt;br /&gt;
            acase=0;&lt;br /&gt;
        } else {&lt;br /&gt;
            /*Verifico se il quadrato è pieno*/&lt;br /&gt;
            for (i=min(asx.x, adx.x); i&amp;lt;=max(bsx.x, bdx.x); i++){&lt;br /&gt;
                for (j=min(asx.y, adx.y); j&amp;lt;=max(bsx.y, bdx.y); j++){&lt;br /&gt;
                    if (M[i][j]!='#'){&lt;br /&gt;
                        acase=0;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (acase) printf(&amp;quot;Case #%i: YES\n&amp;quot;, k+1);&lt;br /&gt;
        else printf(&amp;quot;Case #%i: NO\n&amp;quot;, k+1);&lt;br /&gt;
	}&lt;br /&gt;
	fclose(fin);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:LorenzoV|LorenzoV]] ([[User talk:LorenzoV|talk]]) 17:25, 1 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Nat ==&lt;br /&gt;
&lt;br /&gt;
Il codice che posto qui di seguito verifica che nella matrice presa in input da file ci sia un quadrato pieno, ma attraverso controlli diversi rispetto al codice precedente e con una matrice allocata dinamicamente (si possono passare in input matrici più grandi di 20*20).&lt;br /&gt;
Il programma prende lo stesso input della consegna postata da LorenzoV.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se compilate con gcc va aggiunto  il flag -lm perchè con la libreria math.h (per la radice quadrata) ci sono problemi. &amp;lt;br&amp;gt;&lt;br /&gt;
Es. gcc main.c -o programma -lm&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	FILE *text; &lt;br /&gt;
    	int n,i,j,k,counter,tmp,isx,jsx,boole,cases; int* vect;&lt;br /&gt;
	double squaroot; ;cases=0;&lt;br /&gt;
	text=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
    	if(text==NULL)&lt;br /&gt;
    	{&lt;br /&gt;
        	fprintf(stderr, &amp;quot;Invalid input.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
    	}&lt;br /&gt;
	&lt;br /&gt;
	/*Leggo il numero di casi*/&lt;br /&gt;
    	fscanf(text,&amp;quot;%d&amp;quot;,&amp;amp;cases);&lt;br /&gt;
	if(cases&amp;lt;=0)&lt;br /&gt;
    	{&lt;br /&gt;
        	fprintf(stderr, &amp;quot;Invalid input.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
    	}&lt;br /&gt;
	vect=malloc(cases*sizeof(int));&lt;br /&gt;
	printf(&amp;quot;\nCases =%d\n&amp;quot;,cases);&lt;br /&gt;
&lt;br /&gt;
  for(k=0;k&amp;lt;cases;k++)&lt;br /&gt;
  {     &lt;br /&gt;
	&lt;br /&gt;
	 counter=0;&lt;br /&gt;
&lt;br /&gt;
	/*Leggo la dimensione n della matrice in input*/&lt;br /&gt;
    	fscanf(text,&amp;quot;%d&amp;quot;,&amp;amp;n);&lt;br /&gt;
    	printf(&amp;quot;n=%d \n&amp;quot;,n);&lt;br /&gt;
&lt;br /&gt;
	/*Alloco una matrice M e un vettore r, che mi serve&lt;br /&gt;
	 per copiare l'input su M. &lt;br /&gt;
	In seguito setto tutto con un '.'*/&lt;br /&gt;
    	char **M;&lt;br /&gt;
    	M=(char**)malloc(n * sizeof(char*));&lt;br /&gt;
    	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
    	{M[i]=(char*)malloc(n * sizeof(char));}&lt;br /&gt;
&lt;br /&gt;
    	char *r;&lt;br /&gt;
    	r=(char*)malloc(n*sizeof(char));&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
		r[i]='.';&lt;br /&gt;
		for(j=0;j&amp;lt;n;j++)&lt;br /&gt;
			M[i][j]='.';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(text, &amp;quot;%s&amp;quot;, r);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
	               M[i][j]=r[j];          &lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	/*Stampa matrice*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
			printf(&amp;quot;%c&amp;quot;,M[i][j]);&lt;br /&gt;
&lt;br /&gt;
		printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*Conto i cancelletti*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
		{&lt;br /&gt;
			if(M[i][j]=='#')&lt;br /&gt;
			counter++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/*Logicamente si ha che se il numero &lt;br /&gt;
	di cancelletti non è un numero quadrato&lt;br /&gt;
	allora la matrice non potrà mai contenere un quadrato pieno.*/&lt;br /&gt;
&lt;br /&gt;
			/*Ho risolto il problema del &amp;quot;quadrato di lato 0&amp;quot;&lt;br /&gt;
			con un controllo sul counter dei cancelletti totali*/&lt;br /&gt;
	squaroot=sqrt(counter);&lt;br /&gt;
&lt;br /&gt;
	if(squaroot!=(int)squaroot||counter&amp;lt;1)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;\nThere isn't any square.\n\n&amp;quot;);&lt;br /&gt;
		vect[k]=0;&lt;br /&gt;
		goto final;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*Cerco il primo cancelletto,&lt;br /&gt;
	che sarà sicuramente il mio angolo &lt;br /&gt;
	in alto a sinistra del &lt;br /&gt;
	mio potenziale quadrato*/&lt;br /&gt;
	&lt;br /&gt;
			/*Ho risolto il goto con una variabile &lt;br /&gt;
			booleana che cambia valore nel momento&lt;br /&gt;
			in cui trovo il primo cancelletto.&lt;br /&gt;
			Uso il goto però per trattare l'errore  &lt;br /&gt;
			nel caso in cui	la radice del numero di &lt;br /&gt;
			cancelletti non sia intera.*/&lt;br /&gt;
&lt;br /&gt;
	boole=1;&lt;br /&gt;
	for(i=0;i&amp;lt;n&amp;amp;&amp;amp;boole;i++)&lt;br /&gt;
	{&lt;br /&gt;
       		 for(j=0;j&amp;lt;n&amp;amp;&amp;amp;boole;j++)&lt;br /&gt;
        	{&lt;br /&gt;
            		if(M[i][j]=='#')&lt;br /&gt;
            			boole=0;&lt;br /&gt;
        	}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/*Valuto solo la parte di matrice &lt;br /&gt;
	che inizia con il mio angolo sx&lt;br /&gt;
	e &amp;quot;spazzolo&amp;quot; solo per la lunghezza &lt;br /&gt;
	del mio lato(radice quadrata del numero di cancelletti)&lt;br /&gt;
	e scalo il numero dei cancelletti: se alla fine sono 0 vuol dire&lt;br /&gt;
	che nello spazio k*k (k&amp;lt;=n) ho trovato esattamente k*k cancelletti e non ce ne sono altri.&lt;br /&gt;
	Quindi è un quadrato pieno. */&lt;br /&gt;
	&lt;br /&gt;
			/*Ho risolto il segmentation fault controllando&lt;br /&gt;
			che la mia visita della matrice non esca dal range n &lt;br /&gt;
			oltre che dal range del lato del quadrato. &lt;br /&gt;
			Sottraggo 1 a i e j poichè nel momento in cui &lt;br /&gt;
                        boole cambia valore i cicli incrementano di 1 gli indici.*/&lt;br /&gt;
	isx=i-1; jsx=j-1; tmp=counter;&lt;br /&gt;
&lt;br /&gt;
	for(i=isx;i&amp;lt;(isx+(int)squaroot)&amp;amp;&amp;amp;i&amp;lt;n;i++)&lt;br /&gt;
	{&lt;br /&gt;
	        for(j=jsx;j&amp;lt;(jsx+(int)squaroot)&amp;amp;&amp;amp;j&amp;lt;n;j++)&lt;br /&gt;
	        {&lt;br /&gt;
	            if(M[i][j]=='#')&lt;br /&gt;
	            tmp--;&lt;br /&gt;
	        }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(tmp==0)&lt;br /&gt;
	{printf(&amp;quot;\nThere is a square! :D\n\n&amp;quot;);&lt;br /&gt;
	vect[k]=1;}&lt;br /&gt;
	else&lt;br /&gt;
	{printf(&amp;quot;\nThere isn't any square!\n\n&amp;quot;);&lt;br /&gt;
	vect[k]=0;}&lt;br /&gt;
	&lt;br /&gt;
	final:&lt;br /&gt;
&lt;br /&gt;
	free(M);&lt;br /&gt;
	free(r);&lt;br /&gt;
	&lt;br /&gt;
  }&lt;br /&gt;
	printf(&amp;quot;\nSTOP\n&amp;quot;);&lt;br /&gt;
	for(k=0;k&amp;lt;cases;k++)&lt;br /&gt;
	{&lt;br /&gt;
			&lt;br /&gt;
		printf(&amp;quot;CASE #%d :&amp;quot; ,k+1);		&lt;br /&gt;
		if(vect[k]==1)&lt;br /&gt;
		printf(&amp;quot;YES\n&amp;quot;);&lt;br /&gt;
		else printf(&amp;quot;NO\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	fclose(text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Nat|Nat]] ([[User talk:Nat|talk]]) 18:05, 2 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
== Soluzione di rd ==&lt;br /&gt;
&lt;br /&gt;
Ho provato a risolvere il problema giocando con i bit.&lt;br /&gt;
Il risultato e' riportato qui sotto.&lt;br /&gt;
&lt;br /&gt;
E' compatto ma un po' contorto...&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* count the # of bits set to 1 in an unsigned int */&lt;br /&gt;
int countones(unsigned int x) {&lt;br /&gt;
  int count;&lt;br /&gt;
  for (count=0; x!= 0; x&amp;gt;&amp;gt;=1)&lt;br /&gt;
    count += x &amp;amp; 1;&lt;br /&gt;
  return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* if there is one sequence of 1, return the length of that seq*/&lt;br /&gt;
int seqlen(unsigned int x) {&lt;br /&gt;
  while (x != 0 &amp;amp;&amp;amp; (x &amp;amp; 1)==0)&lt;br /&gt;
    x &amp;gt;&amp;gt;= 1;&lt;br /&gt;
  return countones(x+1)==1?countones(x):0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j;&lt;br /&gt;
  char line[20];&lt;br /&gt;
  unsigned int values,vsum,hsum;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  if (dim&amp;gt;20 || dim&amp;lt;1)&lt;br /&gt;
    error_n_die(&amp;quot;invalid matrix size&amp;quot;);&lt;br /&gt;
  for (i=values=hsum=vsum=0; i&amp;lt;dim; i++) {&lt;br /&gt;
    unsigned int bline;&lt;br /&gt;
    fscanf(fin,&amp;quot;%s&amp;quot;,line);&lt;br /&gt;
    for (j=bline=0; j&amp;lt;dim; j++)&lt;br /&gt;
      bline = (bline &amp;lt;&amp;lt; 1) | (line[j] == '#');&lt;br /&gt;
    values |= 1&amp;lt;&amp;lt;countones(bline);&lt;br /&gt;
    hsum = (hsum &amp;lt;&amp;lt; 1) | (bline != 0);&lt;br /&gt;
    vsum |= bline;&lt;br /&gt;
  }&lt;br /&gt;
  values |= 1&amp;lt;&amp;lt;countones(vsum) | 1&amp;lt;&amp;lt;countones(hsum);&lt;br /&gt;
  values &amp;amp;= ~1;&lt;br /&gt;
  values |= 1&amp;lt;&amp;lt;seqlen(vsum) | 1&amp;lt;&amp;lt;seqlen(hsum);&lt;br /&gt;
  return countones(values) == 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
  &lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 07:54, 4 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Altre considerazioni e un'altra soluzione (rd) ==&lt;br /&gt;
&lt;br /&gt;
(NB: le indicazioni in '''Bold text''' sono esercizi da svolgere qui sul blog.)&lt;br /&gt;
&lt;br /&gt;
Ho riguardato i programmi proposti.&lt;br /&gt;
&lt;br /&gt;
La soluzione di LorenzoV ha un problema. Lui cerca i quattro vertici e poi controlla che tutti gli elementi all'interno siano '#'.&lt;br /&gt;
Se provate con questa configurazione:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
.....&lt;br /&gt;
.###.&lt;br /&gt;
####.&lt;br /&gt;
.###.&lt;br /&gt;
.....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
vi dice che e' un quadrato. Si potrebbe correggere il programma cambiando il modo per cercare i vertici... '''come'''?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 /*Angolo in alto a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){ // controllo per righe&lt;br /&gt;
                    asx.x=i;&lt;br /&gt;
                    asx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in alto a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[j][i]=='#'){ // scambio indici, controllo per colonne&lt;br /&gt;
                    adx.x=i;&lt;br /&gt;
                    adx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[j][i]=='#'){ // scambio indici, controllo per colonne&lt;br /&gt;
                    bsx.x=i;&lt;br /&gt;
                    bsx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){ // controllo per righe&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bdx.x=i;&lt;br /&gt;
                    bdx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Eddy|Eddy]] ([[User talk:Eddy|talk]]) 21:40 Monday, 10 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
La soluzione di Nat invece funziona dal punto di vista algoritmico. Lui controlla che il numero di # sia un quadrato perfetto N^2 e quindi controlla che a partire dal primo # che si incontra scandendo la matrice in senso lessicografico tutti gli elementi nel quadrato a destra e in basso di lato N siano '#'.&lt;br /&gt;
&lt;br /&gt;
Pero'...&lt;br /&gt;
con questa configurazione:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
.....#####&lt;br /&gt;
##########&lt;br /&gt;
##########&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
il risultato e': Segmentation fault. '''Perch&amp;amp;eacute;?'''&lt;br /&gt;
&lt;br /&gt;
Inoltre se si fornisce una matrice vuota come:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
4&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dice che c'e' un quadrato (che sarebbe coerente, e' un quadrato di dimensione 0, ma secondo me le specifiche indicando &amp;quot;pieno&amp;quot; vogliono escludere questo caso).&lt;br /&gt;
&lt;br /&gt;
Ho poi un paio di commenti stilistici per Nat: la soluzione non rispetta le specifiche per il formato del file in input e usa un 'goto' non per casi di errore.&lt;br /&gt;
Il suo problema era &amp;quot;rompere&amp;quot; il doppio ciclo: '''come si puo' fare'''?&lt;br /&gt;
&lt;br /&gt;
Infine vi lascio questa altra soluzione.&lt;br /&gt;
Non usa alcuna memorizzazione per la matrice, neanche per una singola riga. Calcola se ci sia o meno un quadrato durante la lettura carattere per carattere.&lt;br /&gt;
Quindi anche se fosse data in input una matrice di un milione per un milione di elementi il programma userebbe sempre solo 8 interi.&lt;br /&gt;
&lt;br /&gt;
'''Chi ne descrive il funzionamento'''?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void flushtonl(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int c;&lt;br /&gt;
  while ((c=fgetc(fin)) != '\n' &amp;amp;&amp;amp; c!=EOF)&lt;br /&gt;
    ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j,c;&lt;br /&gt;
  int mini,maxi,minj,maxj;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  flushtonl(fin);&lt;br /&gt;
  mini=maxi=minj=maxj=-1;&lt;br /&gt;
  for (i=0; i&amp;lt;dim+1; i++) {&lt;br /&gt;
    int n=0;&lt;br /&gt;
    for (j=0; j&amp;lt;dim+1; j++) {&lt;br /&gt;
      c=(i&amp;lt;dim &amp;amp;&amp;amp; j&amp;lt;dim)?fgetc(fin):'.';&lt;br /&gt;
      if (mini&amp;lt;0) {&lt;br /&gt;
        if (c=='#') {&lt;br /&gt;
          if (minj&amp;lt;0) minj=j;&lt;br /&gt;
        } else {&lt;br /&gt;
          if (minj&amp;gt;=0) maxj=j-1,mini=i;&lt;br /&gt;
        }&lt;br /&gt;
      } else if (maxi&amp;lt;0) {&lt;br /&gt;
        if (c!='#' ^ (j &amp;lt; minj || j &amp;gt; maxj))&lt;br /&gt;
          if (c == '#' || j != minj)&lt;br /&gt;
            mini=maxi=minj=maxj=dim;&lt;br /&gt;
          else&lt;br /&gt;
            maxi=i-1;&lt;br /&gt;
      } else {&lt;br /&gt;
        if (c=='#')&lt;br /&gt;
          mini=maxi=minj=maxj=dim;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (i&amp;lt;dim) flushtonl(fin);&lt;br /&gt;
  }&lt;br /&gt;
  return maxj-minj == maxi-mini &amp;amp;&amp;amp; mini&amp;gt;=0 &amp;amp;&amp;amp; maxi&amp;lt;dim;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 12:45, 6 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
''c'era un bug. Ho corretto il confronto di riga 36 da &amp;quot;if (c == '#')&amp;quot; a &amp;quot;if (c == '#' || j != minj)&amp;quot;''.&lt;br /&gt;
'''Chi riesce a trovare il caso che non veniva correttamente riconosciuto? (spiegando il perch&amp;amp;eacute;!)'''&lt;br /&gt;
&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 20:30, 6 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Funzionamento''&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* funzione che &amp;quot;si mangia&amp;quot; quel che resta della riga &lt;br /&gt;
   per portare l'indicatore di posizione del file alla riga successiva */&lt;br /&gt;
void flushtonl(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int c;&lt;br /&gt;
  while ((c=fgetc(fin)) != '\n' &amp;amp;&amp;amp; c!=EOF)&lt;br /&gt;
    ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j,c;&lt;br /&gt;
/* rappresentano rispettivamente la prima riga, l'ultima riga, &lt;br /&gt;
   prima colonna, ultima colonna del quadrato */&lt;br /&gt;
&lt;br /&gt;
  int mini,maxi,minj,maxj;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  flushtonl(fin);&lt;br /&gt;
  mini=maxi=minj=maxj=-1;&lt;br /&gt;
  for (i=0; i&amp;lt;dim+1; i++) {&lt;br /&gt;
    int n=0; // credo sia superfluo&lt;br /&gt;
    for (j=0; j&amp;lt;dim+1; j++) {&lt;br /&gt;
      c=(i&amp;lt;dim &amp;amp;&amp;amp; j&amp;lt;dim)?fgetc(fin):'.';&lt;br /&gt;
&lt;br /&gt;
/* partendo da &amp;quot;in alto a sinistra&amp;quot; se non ho ancora trovato la prima riga */&lt;br /&gt;
      if (mini&amp;lt;0) {&lt;br /&gt;
        if (c=='#') {&lt;br /&gt;
          /* so che e` la prima colonna */&lt;br /&gt;
          if (minj&amp;lt;0) minj=j;&lt;br /&gt;
        } else {&lt;br /&gt;
          /* se sono qui, vuol dire che ho gia` trovato la prima colonna e c=='.'&lt;br /&gt;
             ho trovato l'ultima colonna (era la precedente) e setto prima riga */&lt;br /&gt;
          if (minj&amp;gt;=0) maxj=j-1,mini=i;&lt;br /&gt;
        }&lt;br /&gt;
     /* ho gia` trovato la prima riga, la prima colonna e l'ultima colonna&lt;br /&gt;
        mi manca solo l'ultima riga */&lt;br /&gt;
      } else if (maxi&amp;lt;0) {&lt;br /&gt;
        /* entrero` qui soltanto se:&lt;br /&gt;
           1. c=='.' e sono nel range delle colonne&lt;br /&gt;
           2. c=='#' e sono fuori dal range delle colonne */&lt;br /&gt;
        if (c!='#' ^ (j &amp;lt; minj || j &amp;gt; maxj))&lt;br /&gt;
          /* casi di errore:&lt;br /&gt;
             1. se c=='#' c'e` un '#' fuori dal quadrato&lt;br /&gt;
             2. e` stato aggiunto j != minj, poiche` non verrebbe riconosciuto &lt;br /&gt;
                ##&lt;br /&gt;
                #.   */ &lt;br /&gt;
          if (c == '#' || j != minj)&lt;br /&gt;
            mini=maxi=minj=maxj=dim;&lt;br /&gt;
          else&lt;br /&gt;
            maxi=i-1; // trovato ultima riga&lt;br /&gt;
      } else {&lt;br /&gt;
        /* trovato un &amp;quot;#&amp;quot; al di fuori del quadrato  */&lt;br /&gt;
        if (c=='#')&lt;br /&gt;
          mini=maxi=minj=maxj=dim;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (i&amp;lt;dim) flushtonl(fin);&lt;br /&gt;
  }&lt;br /&gt;
  /* controllo che le dimensioni siano stato rispettate */ &lt;br /&gt;
  return maxj-minj == maxi-mini &amp;amp;&amp;amp; mini&amp;gt;=0 &amp;amp;&amp;amp; maxi&amp;lt;dim;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Eddy|Eddy]] ([[User talk:Eddy|talk]]) 23:15 Monday, 10 November 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=823</id>
		<title>(Programma C) Un quadrato nella matrice</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=823"/>
		<updated>2014-11-10T20:22:01Z</updated>

		<summary type="html">&lt;p&gt;Eddy: /* Altre considerazioni e un'altra soluzione (rd) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Soluzione di LorenzoV ==&lt;br /&gt;
&lt;br /&gt;
Questo è un problema uscito per le fasi di qualificazione della Facebook Hacker Cup 2014.&lt;br /&gt;
Il codice sorgente del programma di seguito riportato è in grado di riconoscere se in una matrice quadrata è presente un quadrato &amp;quot;pieno&amp;quot;: il programma accetta in '''input''' un file come da esempio:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
#...&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
####&lt;br /&gt;
#..#&lt;br /&gt;
#..#&lt;br /&gt;
####&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
.....&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dove il primo intero T indica il numero di casi (o test) e gli altri interi n indicano la grandezza di ogni matrice nxn.&amp;lt;br&amp;gt;&lt;br /&gt;
Valgono i seguenti vincoli: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ T ≤ 20&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ N ≤ 20&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Seguendo questo esempio, in '''output''' il programma stamperà le seguenti righe:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Case #1: YES&lt;br /&gt;
Case #2: NO&lt;br /&gt;
Case #3: NO&lt;br /&gt;
Case #4: NO&lt;br /&gt;
Case #5: YES&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La matrice n. 2 contiene un # fuori dal quadrato, la matrice n. 3 contiene un quadrato non riempito e la matrice n. 4 contiene un rettangolo.&amp;lt;br&amp;gt;&lt;br /&gt;
Ecco il codice della mia soluzione:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct coordinate{&lt;br /&gt;
    int x;&lt;br /&gt;
    int y;&lt;br /&gt;
}coord;&lt;br /&gt;
&lt;br /&gt;
int max(int x, int y){&lt;br /&gt;
    if (x&amp;gt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int min(int x, int y){&lt;br /&gt;
    if (x&amp;lt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	FILE *fin;&lt;br /&gt;
	const int N=20;&lt;br /&gt;
	int i, j, k, h, n, T, M[N][N];&lt;br /&gt;
	int acase, find;&lt;br /&gt;
	coord asx, adx, bsx, bdx;&lt;br /&gt;
	char str[N];&lt;br /&gt;
	fin = fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
	if (fin == NULL){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Error opening file\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;T);&lt;br /&gt;
	if (T&amp;gt;20 || T&amp;lt;1){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Number of test cases not valid\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	for (k=0; k&amp;lt;T; k++){&lt;br /&gt;
        fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
        if (n&amp;gt;N){&lt;br /&gt;
            fprintf(stderr, &amp;quot;Number of cells too high\n&amp;quot;);&lt;br /&gt;
            exit(1);&lt;br /&gt;
        }&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(fin, &amp;quot;%s&amp;quot;, &amp;amp;str);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++){&lt;br /&gt;
                M[i][j]=str[j];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        asx.x=asx.y=-1;&lt;br /&gt;
        adx.x=adx.y=-1;&lt;br /&gt;
        bsx.x=bsx.y=-1;&lt;br /&gt;
        bdx.x=bdx.y=-1;&lt;br /&gt;
        /*Angolo in alto a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    asx.x=i;&lt;br /&gt;
                    asx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in alto a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    adx.x=i;&lt;br /&gt;
                    adx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bsx.x=i;&lt;br /&gt;
                    bsx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bdx.x=i;&lt;br /&gt;
                    bdx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Verifico che non sia un rettangolo*/&lt;br /&gt;
        acase=1;&lt;br /&gt;
        if (max(bsx.x, bdx.x)-min(asx.x, adx.x)!=max(bsx.y, bdx.y)-min(asx.y, adx.y)){&lt;br /&gt;
            acase=0;&lt;br /&gt;
        } else {&lt;br /&gt;
            /*Verifico se il quadrato è pieno*/&lt;br /&gt;
            for (i=min(asx.x, adx.x); i&amp;lt;=max(bsx.x, bdx.x); i++){&lt;br /&gt;
                for (j=min(asx.y, adx.y); j&amp;lt;=max(bsx.y, bdx.y); j++){&lt;br /&gt;
                    if (M[i][j]!='#'){&lt;br /&gt;
                        acase=0;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (acase) printf(&amp;quot;Case #%i: YES\n&amp;quot;, k+1);&lt;br /&gt;
        else printf(&amp;quot;Case #%i: NO\n&amp;quot;, k+1);&lt;br /&gt;
	}&lt;br /&gt;
	fclose(fin);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:LorenzoV|LorenzoV]] ([[User talk:LorenzoV|talk]]) 17:25, 1 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Nat ==&lt;br /&gt;
&lt;br /&gt;
Il codice che posto qui di seguito verifica che nella matrice presa in input da file ci sia un quadrato pieno, ma attraverso controlli diversi rispetto al codice precedente e con una matrice allocata dinamicamente (si possono passare in input matrici più grandi di 20*20).&lt;br /&gt;
Il programma prende lo stesso input della consegna postata da LorenzoV.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se compilate con gcc va aggiunto  il flag -lm perchè con la libreria math.h (per la radice quadrata) ci sono problemi. &amp;lt;br&amp;gt;&lt;br /&gt;
Es. gcc main.c -o programma -lm&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	FILE *text; &lt;br /&gt;
    	int n,i,j,k,counter,tmp,isx,jsx,boole,cases; int* vect;&lt;br /&gt;
	double squaroot; ;cases=0;&lt;br /&gt;
	text=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
    	if(text==NULL)&lt;br /&gt;
    	{&lt;br /&gt;
        	fprintf(stderr, &amp;quot;Invalid input.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
    	}&lt;br /&gt;
	&lt;br /&gt;
	/*Leggo il numero di casi*/&lt;br /&gt;
    	fscanf(text,&amp;quot;%d&amp;quot;,&amp;amp;cases);&lt;br /&gt;
	if(cases&amp;lt;=0)&lt;br /&gt;
    	{&lt;br /&gt;
        	fprintf(stderr, &amp;quot;Invalid input.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
    	}&lt;br /&gt;
	vect=malloc(cases*sizeof(int));&lt;br /&gt;
	printf(&amp;quot;\nCases =%d\n&amp;quot;,cases);&lt;br /&gt;
&lt;br /&gt;
  for(k=0;k&amp;lt;cases;k++)&lt;br /&gt;
  {     &lt;br /&gt;
	&lt;br /&gt;
	 counter=0;&lt;br /&gt;
&lt;br /&gt;
	/*Leggo la dimensione n della matrice in input*/&lt;br /&gt;
    	fscanf(text,&amp;quot;%d&amp;quot;,&amp;amp;n);&lt;br /&gt;
    	printf(&amp;quot;n=%d \n&amp;quot;,n);&lt;br /&gt;
&lt;br /&gt;
	/*Alloco una matrice M e un vettore r, che mi serve&lt;br /&gt;
	 per copiare l'input su M. &lt;br /&gt;
	In seguito setto tutto con un '.'*/&lt;br /&gt;
    	char **M;&lt;br /&gt;
    	M=(char**)malloc(n * sizeof(char*));&lt;br /&gt;
    	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
    	{M[i]=(char*)malloc(n * sizeof(char));}&lt;br /&gt;
&lt;br /&gt;
    	char *r;&lt;br /&gt;
    	r=(char*)malloc(n*sizeof(char));&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
		r[i]='.';&lt;br /&gt;
		for(j=0;j&amp;lt;n;j++)&lt;br /&gt;
			M[i][j]='.';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(text, &amp;quot;%s&amp;quot;, r);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
	               M[i][j]=r[j];          &lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	/*Stampa matrice*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
			printf(&amp;quot;%c&amp;quot;,M[i][j]);&lt;br /&gt;
&lt;br /&gt;
		printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*Conto i cancelletti*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
		{&lt;br /&gt;
			if(M[i][j]=='#')&lt;br /&gt;
			counter++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/*Logicamente si ha che se il numero &lt;br /&gt;
	di cancelletti non è un numero quadrato&lt;br /&gt;
	allora la matrice non potrà mai contenere un quadrato pieno.*/&lt;br /&gt;
&lt;br /&gt;
			/*Ho risolto il problema del &amp;quot;quadrato di lato 0&amp;quot;&lt;br /&gt;
			con un controllo sul counter dei cancelletti totali*/&lt;br /&gt;
	squaroot=sqrt(counter);&lt;br /&gt;
&lt;br /&gt;
	if(squaroot!=(int)squaroot||counter&amp;lt;1)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;\nThere isn't any square.\n\n&amp;quot;);&lt;br /&gt;
		vect[k]=0;&lt;br /&gt;
		goto final;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*Cerco il primo cancelletto,&lt;br /&gt;
	che sarà sicuramente il mio angolo &lt;br /&gt;
	in alto a sinistra del &lt;br /&gt;
	mio potenziale quadrato*/&lt;br /&gt;
	&lt;br /&gt;
			/*Ho risolto il goto con una variabile &lt;br /&gt;
			booleana che cambia valore nel momento&lt;br /&gt;
			in cui trovo il primo cancelletto.&lt;br /&gt;
			Uso il goto però per trattare l'errore  &lt;br /&gt;
			nel caso in cui	la radice del numero di &lt;br /&gt;
			cancelletti non sia intera.*/&lt;br /&gt;
&lt;br /&gt;
	boole=1;&lt;br /&gt;
	for(i=0;i&amp;lt;n&amp;amp;&amp;amp;boole;i++)&lt;br /&gt;
	{&lt;br /&gt;
       		 for(j=0;j&amp;lt;n&amp;amp;&amp;amp;boole;j++)&lt;br /&gt;
        	{&lt;br /&gt;
            		if(M[i][j]=='#')&lt;br /&gt;
            			boole=0;&lt;br /&gt;
        	}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/*Valuto solo la parte di matrice &lt;br /&gt;
	che inizia con il mio angolo sx&lt;br /&gt;
	e &amp;quot;spazzolo&amp;quot; solo per la lunghezza &lt;br /&gt;
	del mio lato(radice quadrata del numero di cancelletti)&lt;br /&gt;
	e scalo il numero dei cancelletti: se alla fine sono 0 vuol dire&lt;br /&gt;
	che nello spazio k*k (k&amp;lt;=n) ho trovato esattamente k*k cancelletti e non ce ne sono altri.&lt;br /&gt;
	Quindi è un quadrato pieno. */&lt;br /&gt;
	&lt;br /&gt;
			/*Ho risolto il segmentation fault controllando&lt;br /&gt;
			che la mia visita della matrice non esca dal range n &lt;br /&gt;
			oltre che dal range del lato del quadrato. &lt;br /&gt;
			Sottraggo 1 a i e j poichè nel momento in cui &lt;br /&gt;
                        boole cambia valore i cicli incrementano di 1 gli indici.*/&lt;br /&gt;
	isx=i-1; jsx=j-1; tmp=counter;&lt;br /&gt;
&lt;br /&gt;
	for(i=isx;i&amp;lt;(isx+(int)squaroot)&amp;amp;&amp;amp;i&amp;lt;n;i++)&lt;br /&gt;
	{&lt;br /&gt;
	        for(j=jsx;j&amp;lt;(jsx+(int)squaroot)&amp;amp;&amp;amp;j&amp;lt;n;j++)&lt;br /&gt;
	        {&lt;br /&gt;
	            if(M[i][j]=='#')&lt;br /&gt;
	            tmp--;&lt;br /&gt;
	        }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(tmp==0)&lt;br /&gt;
	{printf(&amp;quot;\nThere is a square! :D\n\n&amp;quot;);&lt;br /&gt;
	vect[k]=1;}&lt;br /&gt;
	else&lt;br /&gt;
	{printf(&amp;quot;\nThere isn't any square!\n\n&amp;quot;);&lt;br /&gt;
	vect[k]=0;}&lt;br /&gt;
	&lt;br /&gt;
	final:&lt;br /&gt;
&lt;br /&gt;
	free(M);&lt;br /&gt;
	free(r);&lt;br /&gt;
	&lt;br /&gt;
  }&lt;br /&gt;
	printf(&amp;quot;\nSTOP\n&amp;quot;);&lt;br /&gt;
	for(k=0;k&amp;lt;cases;k++)&lt;br /&gt;
	{&lt;br /&gt;
			&lt;br /&gt;
		printf(&amp;quot;CASE #%d :&amp;quot; ,k+1);		&lt;br /&gt;
		if(vect[k]==1)&lt;br /&gt;
		printf(&amp;quot;YES\n&amp;quot;);&lt;br /&gt;
		else printf(&amp;quot;NO\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	fclose(text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Nat|Nat]] ([[User talk:Nat|talk]]) 18:05, 2 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
== Soluzione di rd ==&lt;br /&gt;
&lt;br /&gt;
Ho provato a risolvere il problema giocando con i bit.&lt;br /&gt;
Il risultato e' riportato qui sotto.&lt;br /&gt;
&lt;br /&gt;
E' compatto ma un po' contorto...&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* count the # of bits set to 1 in an unsigned int */&lt;br /&gt;
int countones(unsigned int x) {&lt;br /&gt;
  int count;&lt;br /&gt;
  for (count=0; x!= 0; x&amp;gt;&amp;gt;=1)&lt;br /&gt;
    count += x &amp;amp; 1;&lt;br /&gt;
  return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* if there is one sequence of 1, return the length of that seq*/&lt;br /&gt;
int seqlen(unsigned int x) {&lt;br /&gt;
  while (x != 0 &amp;amp;&amp;amp; (x &amp;amp; 1)==0)&lt;br /&gt;
    x &amp;gt;&amp;gt;= 1;&lt;br /&gt;
  return countones(x+1)==1?countones(x):0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j;&lt;br /&gt;
  char line[20];&lt;br /&gt;
  unsigned int values,vsum,hsum;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  if (dim&amp;gt;20 || dim&amp;lt;1)&lt;br /&gt;
    error_n_die(&amp;quot;invalid matrix size&amp;quot;);&lt;br /&gt;
  for (i=values=hsum=vsum=0; i&amp;lt;dim; i++) {&lt;br /&gt;
    unsigned int bline;&lt;br /&gt;
    fscanf(fin,&amp;quot;%s&amp;quot;,line);&lt;br /&gt;
    for (j=bline=0; j&amp;lt;dim; j++)&lt;br /&gt;
      bline = (bline &amp;lt;&amp;lt; 1) | (line[j] == '#');&lt;br /&gt;
    values |= 1&amp;lt;&amp;lt;countones(bline);&lt;br /&gt;
    hsum = (hsum &amp;lt;&amp;lt; 1) | (bline != 0);&lt;br /&gt;
    vsum |= bline;&lt;br /&gt;
  }&lt;br /&gt;
  values |= 1&amp;lt;&amp;lt;countones(vsum) | 1&amp;lt;&amp;lt;countones(hsum);&lt;br /&gt;
  values &amp;amp;= ~1;&lt;br /&gt;
  values |= 1&amp;lt;&amp;lt;seqlen(vsum) | 1&amp;lt;&amp;lt;seqlen(hsum);&lt;br /&gt;
  return countones(values) == 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
  &lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 07:54, 4 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Altre considerazioni e un'altra soluzione (rd) ==&lt;br /&gt;
&lt;br /&gt;
(NB: le indicazioni in '''Bold text''' sono esercizi da svolgere qui sul blog.)&lt;br /&gt;
&lt;br /&gt;
Ho riguardato i programmi proposti.&lt;br /&gt;
&lt;br /&gt;
La soluzione di LorenzoV ha un problema. Lui cerca i quattro vertici e poi controlla che tutti gli elementi all'interno siano '#'.&lt;br /&gt;
Se provate con questa configurazione:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
.....&lt;br /&gt;
.###.&lt;br /&gt;
####.&lt;br /&gt;
.###.&lt;br /&gt;
.....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
vi dice che e' un quadrato. Si potrebbe correggere il programma cambiando il modo per cercare i vertici... '''come'''?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 /*Angolo in alto a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){ // controllo per righe&lt;br /&gt;
                    asx.x=i;&lt;br /&gt;
                    asx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in alto a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[j][i]=='#'){ // scambio indici, controllo per colonne&lt;br /&gt;
                    adx.x=i;&lt;br /&gt;
                    adx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[j][i]=='#'){ // scambio indici, controllo per colonne&lt;br /&gt;
                    bsx.x=i;&lt;br /&gt;
                    bsx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){ // controllo per righe&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bdx.x=i;&lt;br /&gt;
                    bdx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Eddy|Eddy]] ([[User talk:Eddy|talk]]) 21:40 Monday, 10 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
La soluzione di Nat invece funziona dal punto di vista algoritmico. Lui controlla che il numero di # sia un quadrato perfetto N^2 e quindi controlla che a partire dal primo # che si incontra scandendo la matrice in senso lessicografico tutti gli elementi nel quadrato a destra e in basso di lato N siano '#'.&lt;br /&gt;
&lt;br /&gt;
Pero'...&lt;br /&gt;
con questa configurazione:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
.....#####&lt;br /&gt;
##########&lt;br /&gt;
##########&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
il risultato e': Segmentation fault. '''Perch&amp;amp;eacute;?'''&lt;br /&gt;
&lt;br /&gt;
Inoltre se si fornisce una matrice vuota come:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
4&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dice che c'e' un quadrato (che sarebbe coerente, e' un quadrato di dimensione 0, ma secondo me le specifiche indicando &amp;quot;pieno&amp;quot; vogliono escludere questo caso).&lt;br /&gt;
&lt;br /&gt;
Ho poi un paio di commenti stilistici per Nat: la soluzione non rispetta le specifiche per il formato del file in input e usa un 'goto' non per casi di errore.&lt;br /&gt;
Il suo problema era &amp;quot;rompere&amp;quot; il doppio ciclo: '''come si puo' fare'''?&lt;br /&gt;
&lt;br /&gt;
Infine vi lascio questa altra soluzione.&lt;br /&gt;
Non usa alcuna memorizzazione per la matrice, neanche per una singola riga. Calcola se ci sia o meno un quadrato durante la lettura carattere per carattere.&lt;br /&gt;
Quindi anche se fosse data in input una matrice di un milione per un milione di elementi il programma userebbe sempre solo 8 interi.&lt;br /&gt;
&lt;br /&gt;
'''Chi ne descrive il funzionamento'''?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void flushtonl(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int c;&lt;br /&gt;
  while ((c=fgetc(fin)) != '\n' &amp;amp;&amp;amp; c!=EOF)&lt;br /&gt;
    ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j,c;&lt;br /&gt;
  int mini,maxi,minj,maxj;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  flushtonl(fin);&lt;br /&gt;
  mini=maxi=minj=maxj=-1;&lt;br /&gt;
  for (i=0; i&amp;lt;dim+1; i++) {&lt;br /&gt;
    int n=0;&lt;br /&gt;
    for (j=0; j&amp;lt;dim+1; j++) {&lt;br /&gt;
      c=(i&amp;lt;dim &amp;amp;&amp;amp; j&amp;lt;dim)?fgetc(fin):'.';&lt;br /&gt;
      if (mini&amp;lt;0) {&lt;br /&gt;
        if (c=='#') {&lt;br /&gt;
          if (minj&amp;lt;0) minj=j;&lt;br /&gt;
        } else {&lt;br /&gt;
          if (minj&amp;gt;=0) maxj=j-1,mini=i;&lt;br /&gt;
        }&lt;br /&gt;
      } else if (maxi&amp;lt;0) {&lt;br /&gt;
        if (c!='#' ^ (j &amp;lt; minj || j &amp;gt; maxj))&lt;br /&gt;
          if (c == '#' || j != minj)&lt;br /&gt;
            mini=maxi=minj=maxj=dim;&lt;br /&gt;
          else&lt;br /&gt;
            maxi=i-1;&lt;br /&gt;
      } else {&lt;br /&gt;
        if (c=='#')&lt;br /&gt;
          mini=maxi=minj=maxj=dim;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (i&amp;lt;dim) flushtonl(fin);&lt;br /&gt;
  }&lt;br /&gt;
  return maxj-minj == maxi-mini &amp;amp;&amp;amp; mini&amp;gt;=0 &amp;amp;&amp;amp; maxi&amp;lt;dim;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 12:45, 6 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
''c'era un bug. Ho corretto il confronto di riga 36 da &amp;quot;if (c == '#')&amp;quot; a &amp;quot;if (c == '#' || j != minj)&amp;quot;''.&lt;br /&gt;
'''Chi riesce a trovare il caso che non veniva correttamente riconosciuto? (spiegando il perch&amp;amp;eacute;!)'''&lt;br /&gt;
&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 20:30, 6 November 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=822</id>
		<title>(Programma C) Un quadrato nella matrice</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=(Programma_C)_Un_quadrato_nella_matrice&amp;diff=822"/>
		<updated>2014-11-10T20:11:41Z</updated>

		<summary type="html">&lt;p&gt;Eddy: /* Altre considerazioni e un'altra soluzione (rd) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Soluzione di LorenzoV ==&lt;br /&gt;
&lt;br /&gt;
Questo è un problema uscito per le fasi di qualificazione della Facebook Hacker Cup 2014.&lt;br /&gt;
Il codice sorgente del programma di seguito riportato è in grado di riconoscere se in una matrice quadrata è presente un quadrato &amp;quot;pieno&amp;quot;: il programma accetta in '''input''' un file come da esempio:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
..##&lt;br /&gt;
..##&lt;br /&gt;
#...&lt;br /&gt;
....&lt;br /&gt;
4&lt;br /&gt;
####&lt;br /&gt;
#..#&lt;br /&gt;
#..#&lt;br /&gt;
####&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
.....&lt;br /&gt;
5&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
#####&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dove il primo intero T indica il numero di casi (o test) e gli altri interi n indicano la grandezza di ogni matrice nxn.&amp;lt;br&amp;gt;&lt;br /&gt;
Valgono i seguenti vincoli: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ T ≤ 20&amp;lt;br&amp;gt;&lt;br /&gt;
1 ≤ N ≤ 20&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Seguendo questo esempio, in '''output''' il programma stamperà le seguenti righe:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Case #1: YES&lt;br /&gt;
Case #2: NO&lt;br /&gt;
Case #3: NO&lt;br /&gt;
Case #4: NO&lt;br /&gt;
Case #5: YES&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La matrice n. 2 contiene un # fuori dal quadrato, la matrice n. 3 contiene un quadrato non riempito e la matrice n. 4 contiene un rettangolo.&amp;lt;br&amp;gt;&lt;br /&gt;
Ecco il codice della mia soluzione:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct coordinate{&lt;br /&gt;
    int x;&lt;br /&gt;
    int y;&lt;br /&gt;
}coord;&lt;br /&gt;
&lt;br /&gt;
int max(int x, int y){&lt;br /&gt;
    if (x&amp;gt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int min(int x, int y){&lt;br /&gt;
    if (x&amp;lt;y) return x;&lt;br /&gt;
    else return y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	FILE *fin;&lt;br /&gt;
	const int N=20;&lt;br /&gt;
	int i, j, k, h, n, T, M[N][N];&lt;br /&gt;
	int acase, find;&lt;br /&gt;
	coord asx, adx, bsx, bdx;&lt;br /&gt;
	char str[N];&lt;br /&gt;
	fin = fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
	if (fin == NULL){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Error opening file\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;T);&lt;br /&gt;
	if (T&amp;gt;20 || T&amp;lt;1){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Number of test cases not valid\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	for (k=0; k&amp;lt;T; k++){&lt;br /&gt;
        fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
        if (n&amp;gt;N){&lt;br /&gt;
            fprintf(stderr, &amp;quot;Number of cells too high\n&amp;quot;);&lt;br /&gt;
            exit(1);&lt;br /&gt;
        }&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(fin, &amp;quot;%s&amp;quot;, &amp;amp;str);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++){&lt;br /&gt;
                M[i][j]=str[j];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        asx.x=asx.y=-1;&lt;br /&gt;
        adx.x=adx.y=-1;&lt;br /&gt;
        bsx.x=bsx.y=-1;&lt;br /&gt;
        bdx.x=bdx.y=-1;&lt;br /&gt;
        /*Angolo in alto a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    asx.x=i;&lt;br /&gt;
                    asx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in alto a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    adx.x=i;&lt;br /&gt;
                    adx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bsx.x=i;&lt;br /&gt;
                    bsx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bdx.x=i;&lt;br /&gt;
                    bdx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Verifico che non sia un rettangolo*/&lt;br /&gt;
        acase=1;&lt;br /&gt;
        if (max(bsx.x, bdx.x)-min(asx.x, adx.x)!=max(bsx.y, bdx.y)-min(asx.y, adx.y)){&lt;br /&gt;
            acase=0;&lt;br /&gt;
        } else {&lt;br /&gt;
            /*Verifico se il quadrato è pieno*/&lt;br /&gt;
            for (i=min(asx.x, adx.x); i&amp;lt;=max(bsx.x, bdx.x); i++){&lt;br /&gt;
                for (j=min(asx.y, adx.y); j&amp;lt;=max(bsx.y, bdx.y); j++){&lt;br /&gt;
                    if (M[i][j]!='#'){&lt;br /&gt;
                        acase=0;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (acase) printf(&amp;quot;Case #%i: YES\n&amp;quot;, k+1);&lt;br /&gt;
        else printf(&amp;quot;Case #%i: NO\n&amp;quot;, k+1);&lt;br /&gt;
	}&lt;br /&gt;
	fclose(fin);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:LorenzoV|LorenzoV]] ([[User talk:LorenzoV|talk]]) 17:25, 1 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Nat ==&lt;br /&gt;
&lt;br /&gt;
Il codice che posto qui di seguito verifica che nella matrice presa in input da file ci sia un quadrato pieno, ma attraverso controlli diversi rispetto al codice precedente e con una matrice allocata dinamicamente (si possono passare in input matrici più grandi di 20*20).&lt;br /&gt;
Il programma prende lo stesso input della consegna postata da LorenzoV.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se compilate con gcc va aggiunto  il flag -lm perchè con la libreria math.h (per la radice quadrata) ci sono problemi. &amp;lt;br&amp;gt;&lt;br /&gt;
Es. gcc main.c -o programma -lm&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    	FILE *text; &lt;br /&gt;
    	int n,i,j,k,counter,tmp,isx,jsx,boole,cases; int* vect;&lt;br /&gt;
	double squaroot; ;cases=0;&lt;br /&gt;
	text=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
    	if(text==NULL)&lt;br /&gt;
    	{&lt;br /&gt;
        	fprintf(stderr, &amp;quot;Invalid input.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
    	}&lt;br /&gt;
	&lt;br /&gt;
	/*Leggo il numero di casi*/&lt;br /&gt;
    	fscanf(text,&amp;quot;%d&amp;quot;,&amp;amp;cases);&lt;br /&gt;
	if(cases&amp;lt;=0)&lt;br /&gt;
    	{&lt;br /&gt;
        	fprintf(stderr, &amp;quot;Invalid input.\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
    	}&lt;br /&gt;
	vect=malloc(cases*sizeof(int));&lt;br /&gt;
	printf(&amp;quot;\nCases =%d\n&amp;quot;,cases);&lt;br /&gt;
&lt;br /&gt;
  for(k=0;k&amp;lt;cases;k++)&lt;br /&gt;
  {     &lt;br /&gt;
	&lt;br /&gt;
	 counter=0;&lt;br /&gt;
&lt;br /&gt;
	/*Leggo la dimensione n della matrice in input*/&lt;br /&gt;
    	fscanf(text,&amp;quot;%d&amp;quot;,&amp;amp;n);&lt;br /&gt;
    	printf(&amp;quot;n=%d \n&amp;quot;,n);&lt;br /&gt;
&lt;br /&gt;
	/*Alloco una matrice M e un vettore r, che mi serve&lt;br /&gt;
	 per copiare l'input su M. &lt;br /&gt;
	In seguito setto tutto con un '.'*/&lt;br /&gt;
    	char **M;&lt;br /&gt;
    	M=(char**)malloc(n * sizeof(char*));&lt;br /&gt;
    	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
    	{M[i]=(char*)malloc(n * sizeof(char));}&lt;br /&gt;
&lt;br /&gt;
    	char *r;&lt;br /&gt;
    	r=(char*)malloc(n*sizeof(char));&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
		r[i]='.';&lt;br /&gt;
		for(j=0;j&amp;lt;n;j++)&lt;br /&gt;
			M[i][j]='.';&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            fscanf(text, &amp;quot;%s&amp;quot;, r);&lt;br /&gt;
            for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
	               M[i][j]=r[j];          &lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	/*Stampa matrice*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
			printf(&amp;quot;%c&amp;quot;,M[i][j]);&lt;br /&gt;
&lt;br /&gt;
		printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*Conto i cancelletti*/&lt;br /&gt;
	for (i=0; i&amp;lt;n; ++i)&lt;br /&gt;
	{&lt;br /&gt;
        	for (j=0; j&amp;lt;n; j++)&lt;br /&gt;
		{&lt;br /&gt;
			if(M[i][j]=='#')&lt;br /&gt;
			counter++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/*Logicamente si ha che se il numero &lt;br /&gt;
	di cancelletti non è un numero quadrato&lt;br /&gt;
	allora la matrice non potrà mai contenere un quadrato pieno.*/&lt;br /&gt;
&lt;br /&gt;
			/*Ho risolto il problema del &amp;quot;quadrato di lato 0&amp;quot;&lt;br /&gt;
			con un controllo sul counter dei cancelletti totali*/&lt;br /&gt;
	squaroot=sqrt(counter);&lt;br /&gt;
&lt;br /&gt;
	if(squaroot!=(int)squaroot||counter&amp;lt;1)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;\nThere isn't any square.\n\n&amp;quot;);&lt;br /&gt;
		vect[k]=0;&lt;br /&gt;
		goto final;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*Cerco il primo cancelletto,&lt;br /&gt;
	che sarà sicuramente il mio angolo &lt;br /&gt;
	in alto a sinistra del &lt;br /&gt;
	mio potenziale quadrato*/&lt;br /&gt;
	&lt;br /&gt;
			/*Ho risolto il goto con una variabile &lt;br /&gt;
			booleana che cambia valore nel momento&lt;br /&gt;
			in cui trovo il primo cancelletto.&lt;br /&gt;
			Uso il goto però per trattare l'errore  &lt;br /&gt;
			nel caso in cui	la radice del numero di &lt;br /&gt;
			cancelletti non sia intera.*/&lt;br /&gt;
&lt;br /&gt;
	boole=1;&lt;br /&gt;
	for(i=0;i&amp;lt;n&amp;amp;&amp;amp;boole;i++)&lt;br /&gt;
	{&lt;br /&gt;
       		 for(j=0;j&amp;lt;n&amp;amp;&amp;amp;boole;j++)&lt;br /&gt;
        	{&lt;br /&gt;
            		if(M[i][j]=='#')&lt;br /&gt;
            			boole=0;&lt;br /&gt;
        	}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/*Valuto solo la parte di matrice &lt;br /&gt;
	che inizia con il mio angolo sx&lt;br /&gt;
	e &amp;quot;spazzolo&amp;quot; solo per la lunghezza &lt;br /&gt;
	del mio lato(radice quadrata del numero di cancelletti)&lt;br /&gt;
	e scalo il numero dei cancelletti: se alla fine sono 0 vuol dire&lt;br /&gt;
	che nello spazio k*k (k&amp;lt;=n) ho trovato esattamente k*k cancelletti e non ce ne sono altri.&lt;br /&gt;
	Quindi è un quadrato pieno. */&lt;br /&gt;
	&lt;br /&gt;
			/*Ho risolto il segmentation fault controllando&lt;br /&gt;
			che la mia visita della matrice non esca dal range n &lt;br /&gt;
			oltre che dal range del lato del quadrato. &lt;br /&gt;
			Sottraggo 1 a i e j poichè nel momento in cui &lt;br /&gt;
                        boole cambia valore i cicli incrementano di 1 gli indici.*/&lt;br /&gt;
	isx=i-1; jsx=j-1; tmp=counter;&lt;br /&gt;
&lt;br /&gt;
	for(i=isx;i&amp;lt;(isx+(int)squaroot)&amp;amp;&amp;amp;i&amp;lt;n;i++)&lt;br /&gt;
	{&lt;br /&gt;
	        for(j=jsx;j&amp;lt;(jsx+(int)squaroot)&amp;amp;&amp;amp;j&amp;lt;n;j++)&lt;br /&gt;
	        {&lt;br /&gt;
	            if(M[i][j]=='#')&lt;br /&gt;
	            tmp--;&lt;br /&gt;
	        }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(tmp==0)&lt;br /&gt;
	{printf(&amp;quot;\nThere is a square! :D\n\n&amp;quot;);&lt;br /&gt;
	vect[k]=1;}&lt;br /&gt;
	else&lt;br /&gt;
	{printf(&amp;quot;\nThere isn't any square!\n\n&amp;quot;);&lt;br /&gt;
	vect[k]=0;}&lt;br /&gt;
	&lt;br /&gt;
	final:&lt;br /&gt;
&lt;br /&gt;
	free(M);&lt;br /&gt;
	free(r);&lt;br /&gt;
	&lt;br /&gt;
  }&lt;br /&gt;
	printf(&amp;quot;\nSTOP\n&amp;quot;);&lt;br /&gt;
	for(k=0;k&amp;lt;cases;k++)&lt;br /&gt;
	{&lt;br /&gt;
			&lt;br /&gt;
		printf(&amp;quot;CASE #%d :&amp;quot; ,k+1);		&lt;br /&gt;
		if(vect[k]==1)&lt;br /&gt;
		printf(&amp;quot;YES\n&amp;quot;);&lt;br /&gt;
		else printf(&amp;quot;NO\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	fclose(text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Nat|Nat]] ([[User talk:Nat|talk]]) 18:05, 2 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
== Soluzione di rd ==&lt;br /&gt;
&lt;br /&gt;
Ho provato a risolvere il problema giocando con i bit.&lt;br /&gt;
Il risultato e' riportato qui sotto.&lt;br /&gt;
&lt;br /&gt;
E' compatto ma un po' contorto...&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* count the # of bits set to 1 in an unsigned int */&lt;br /&gt;
int countones(unsigned int x) {&lt;br /&gt;
  int count;&lt;br /&gt;
  for (count=0; x!= 0; x&amp;gt;&amp;gt;=1)&lt;br /&gt;
    count += x &amp;amp; 1;&lt;br /&gt;
  return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* if there is one sequence of 1, return the length of that seq*/&lt;br /&gt;
int seqlen(unsigned int x) {&lt;br /&gt;
  while (x != 0 &amp;amp;&amp;amp; (x &amp;amp; 1)==0)&lt;br /&gt;
    x &amp;gt;&amp;gt;= 1;&lt;br /&gt;
  return countones(x+1)==1?countones(x):0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j;&lt;br /&gt;
  char line[20];&lt;br /&gt;
  unsigned int values,vsum,hsum;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  if (dim&amp;gt;20 || dim&amp;lt;1)&lt;br /&gt;
    error_n_die(&amp;quot;invalid matrix size&amp;quot;);&lt;br /&gt;
  for (i=values=hsum=vsum=0; i&amp;lt;dim; i++) {&lt;br /&gt;
    unsigned int bline;&lt;br /&gt;
    fscanf(fin,&amp;quot;%s&amp;quot;,line);&lt;br /&gt;
    for (j=bline=0; j&amp;lt;dim; j++)&lt;br /&gt;
      bline = (bline &amp;lt;&amp;lt; 1) | (line[j] == '#');&lt;br /&gt;
    values |= 1&amp;lt;&amp;lt;countones(bline);&lt;br /&gt;
    hsum = (hsum &amp;lt;&amp;lt; 1) | (bline != 0);&lt;br /&gt;
    vsum |= bline;&lt;br /&gt;
  }&lt;br /&gt;
  values |= 1&amp;lt;&amp;lt;countones(vsum) | 1&amp;lt;&amp;lt;countones(hsum);&lt;br /&gt;
  values &amp;amp;= ~1;&lt;br /&gt;
  values |= 1&amp;lt;&amp;lt;seqlen(vsum) | 1&amp;lt;&amp;lt;seqlen(hsum);&lt;br /&gt;
  return countones(values) == 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
  &lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 07:54, 4 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Altre considerazioni e un'altra soluzione (rd) ==&lt;br /&gt;
&lt;br /&gt;
(NB: le indicazioni in '''Bold text''' sono esercizi da svolgere qui sul blog.)&lt;br /&gt;
&lt;br /&gt;
Ho riguardato i programmi proposti.&lt;br /&gt;
&lt;br /&gt;
La soluzione di LorenzoV ha un problema. Lui cerca i quattro vertici e poi controlla che tutti gli elementi all'interno siano '#'.&lt;br /&gt;
Se provate con questa configurazione:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
5&lt;br /&gt;
.....&lt;br /&gt;
.###.&lt;br /&gt;
####.&lt;br /&gt;
.###.&lt;br /&gt;
.....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
vi dice che e' un quadrato. Si potrebbe correggere il programma cambiando il modo per cercare i vertici... '''come'''?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 /*Angolo in alto a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[i][j]=='#'){ // controllo per righe&lt;br /&gt;
                    asx.x=i;&lt;br /&gt;
                    asx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in alto a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=0; j&amp;lt;n &amp;amp;&amp;amp; !find; j++){&lt;br /&gt;
                if (M[j][i]=='#'){ // scambio indici, controllo per colonne&lt;br /&gt;
                    adx.x=i;&lt;br /&gt;
                    adx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a sinistra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){&lt;br /&gt;
                if (M[j][i]=='#'){ // scambio indici, controllo per colonne&lt;br /&gt;
                    bsx.x=i;&lt;br /&gt;
                    bsx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        /*Angolo in basso a destra*/&lt;br /&gt;
        find=0;&lt;br /&gt;
        for (i=n; i&amp;gt;=0; i--){&lt;br /&gt;
            for (j=n; j&amp;gt;=0 &amp;amp;&amp;amp; !find; j--){ // controllo per righe&lt;br /&gt;
                if (M[i][j]=='#'){&lt;br /&gt;
                    bdx.x=i;&lt;br /&gt;
                    bdx.y=j;&lt;br /&gt;
                    find=1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-Eddy&lt;br /&gt;
&lt;br /&gt;
La soluzione di Nat invece funziona dal punto di vista algoritmico. Lui controlla che il numero di # sia un quadrato perfetto N^2 e quindi controlla che a partire dal primo # che si incontra scandendo la matrice in senso lessicografico tutti gli elementi nel quadrato a destra e in basso di lato N siano '#'.&lt;br /&gt;
&lt;br /&gt;
Pero'...&lt;br /&gt;
con questa configurazione:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
..........&lt;br /&gt;
.....#####&lt;br /&gt;
##########&lt;br /&gt;
##########&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
il risultato e': Segmentation fault. '''Perch&amp;amp;eacute;?'''&lt;br /&gt;
&lt;br /&gt;
Inoltre se si fornisce una matrice vuota come:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
4&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dice che c'e' un quadrato (che sarebbe coerente, e' un quadrato di dimensione 0, ma secondo me le specifiche indicando &amp;quot;pieno&amp;quot; vogliono escludere questo caso).&lt;br /&gt;
&lt;br /&gt;
Ho poi un paio di commenti stilistici per Nat: la soluzione non rispetta le specifiche per il formato del file in input e usa un 'goto' non per casi di errore.&lt;br /&gt;
Il suo problema era &amp;quot;rompere&amp;quot; il doppio ciclo: '''come si puo' fare'''?&lt;br /&gt;
&lt;br /&gt;
Infine vi lascio questa altra soluzione.&lt;br /&gt;
Non usa alcuna memorizzazione per la matrice, neanche per una singola riga. Calcola se ci sia o meno un quadrato durante la lettura carattere per carattere.&lt;br /&gt;
Quindi anche se fosse data in input una matrice di un milione per un milione di elementi il programma userebbe sempre solo 8 interi.&lt;br /&gt;
&lt;br /&gt;
'''Chi ne descrive il funzionamento'''?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void error_n_die(char *s)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr,&amp;quot;Error %s\n&amp;quot;,s);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void flushtonl(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int c;&lt;br /&gt;
  while ((c=fgetc(fin)) != '\n' &amp;amp;&amp;amp; c!=EOF)&lt;br /&gt;
    ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int isacube(FILE *fin)&lt;br /&gt;
{&lt;br /&gt;
  int dim,i,j,c;&lt;br /&gt;
  int mini,maxi,minj,maxj;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;dim);&lt;br /&gt;
  flushtonl(fin);&lt;br /&gt;
  mini=maxi=minj=maxj=-1;&lt;br /&gt;
  for (i=0; i&amp;lt;dim+1; i++) {&lt;br /&gt;
    int n=0;&lt;br /&gt;
    for (j=0; j&amp;lt;dim+1; j++) {&lt;br /&gt;
      c=(i&amp;lt;dim &amp;amp;&amp;amp; j&amp;lt;dim)?fgetc(fin):'.';&lt;br /&gt;
      if (mini&amp;lt;0) {&lt;br /&gt;
        if (c=='#') {&lt;br /&gt;
          if (minj&amp;lt;0) minj=j;&lt;br /&gt;
        } else {&lt;br /&gt;
          if (minj&amp;gt;=0) maxj=j-1,mini=i;&lt;br /&gt;
        }&lt;br /&gt;
      } else if (maxi&amp;lt;0) {&lt;br /&gt;
        if (c!='#' ^ (j &amp;lt; minj || j &amp;gt; maxj))&lt;br /&gt;
          if (c == '#' || j != minj)&lt;br /&gt;
            mini=maxi=minj=maxj=dim;&lt;br /&gt;
          else&lt;br /&gt;
            maxi=i-1;&lt;br /&gt;
      } else {&lt;br /&gt;
        if (c=='#')&lt;br /&gt;
          mini=maxi=minj=maxj=dim;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (i&amp;lt;dim) flushtonl(fin);&lt;br /&gt;
  }&lt;br /&gt;
  return maxj-minj == maxi-mini &amp;amp;&amp;amp; mini&amp;gt;=0 &amp;amp;&amp;amp; maxi&amp;lt;dim;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  FILE *fin;&lt;br /&gt;
  int ncases;&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  if ((fin=fopen(&amp;quot;input.txt&amp;quot;,&amp;quot;r&amp;quot;)) == NULL)&lt;br /&gt;
    error_n_die(&amp;quot;opening file&amp;quot;);&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;ncases);&lt;br /&gt;
  if (ncases&amp;gt;20 || ncases&amp;lt;1) error_n_die(&amp;quot;not valid # of cases&amp;quot;);&lt;br /&gt;
  for (i=0;i&amp;lt;ncases;i++)&lt;br /&gt;
    printf(&amp;quot;case #%d: %s\n&amp;quot;,i,isacube(fin)?&amp;quot;YES&amp;quot;:&amp;quot;NO&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 12:45, 6 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
''c'era un bug. Ho corretto il confronto di riga 36 da &amp;quot;if (c == '#')&amp;quot; a &amp;quot;if (c == '#' || j != minj)&amp;quot;''.&lt;br /&gt;
'''Chi riesce a trovare il caso che non veniva correttamente riconosciuto? (spiegando il perch&amp;amp;eacute;!)'''&lt;br /&gt;
&lt;br /&gt;
[[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 20:30, 6 November 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=805</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=805"/>
		<updated>2014-11-04T18:31:26Z</updated>

		<summary type="html">&lt;p&gt;Eddy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questo &amp;amp;egrave; il Wiki del Corso di Sistemi Operativi&lt;br /&gt;
&lt;br /&gt;
[http://www.cs.unibo.it/~renzo/so/portability.tgz portability.tgz]&lt;br /&gt;
&lt;br /&gt;
[[(Programma C) Un quadrato nella matrice]]&lt;br /&gt;
&lt;br /&gt;
[[&amp;quot;classi&amp;quot;_in_C]]&lt;br /&gt;
&lt;br /&gt;
[[Materiale dell'AA 2013-14]]&lt;br /&gt;
----&lt;br /&gt;
Ricordate che per creare un account o quando viene richiesto di risolvere un semplice calcolo occorre ricordare quanto scritto [[qui]]&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=%22classi%22_in_C&amp;diff=804</id>
		<title>&quot;classi&quot; in C</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=%22classi%22_in_C&amp;diff=804"/>
		<updated>2014-11-04T18:27:23Z</updated>

		<summary type="html">&lt;p&gt;Eddy: /* La mia soluzione (incapsulamento) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Paradigma OOP in C=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quando in classe abbiamo parlato di [[puntatori a funzione]] mi e` subito venuto in mente una cosa del genere:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int foo1 (int x);&lt;br /&gt;
&lt;br /&gt;
typedef struct classe&lt;br /&gt;
{&lt;br /&gt;
  int data;&lt;br /&gt;
  int (*foo) (int x);&lt;br /&gt;
} classe;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  classe *ptr;&lt;br /&gt;
  ptr = (classe*) malloc (sizeof (classe));&lt;br /&gt;
  ptr-&amp;gt;foo = &amp;amp;foo1;&lt;br /&gt;
  printf (&amp;quot;%d&amp;quot;, ptr-&amp;gt;foo(4));&lt;br /&gt;
  free(ptr);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int foo1 (int x)&lt;br /&gt;
{&lt;br /&gt;
  return x;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ptr-&amp;gt;foo()''' assomiglia molto ad un metodo!&lt;br /&gt;
&lt;br /&gt;
===Primi problemi===&lt;br /&gt;
&lt;br /&gt;
* se l'utente mi cambia l'indirizzo a cui punta foo?&lt;br /&gt;
* come rendo privati eventuali campi che voglio nascondere all'utente? [[Incapsulamento]]&lt;br /&gt;
* come derivo nuove classi a partire da quelle gia` definite? [[Ereditarietà]]&lt;br /&gt;
* come implemento il [[Polimorfismo]]?&lt;br /&gt;
&lt;br /&gt;
===La mia soluzione (incapsulamento)===&lt;br /&gt;
&lt;br /&gt;
* Scrivere una &amp;quot;classe&amp;quot; per modulo, nel relativo header dichiarare solo &amp;quot;i metodi che dovranno essere public&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef H__CLASS_H__H &lt;br /&gt;
#define H__CLASS_H__H &lt;br /&gt;
&lt;br /&gt;
/* la &amp;quot;classe&amp;quot; classe contiene una parola che puo`:&lt;br /&gt;
 * -essere cambiata&lt;br /&gt;
 * -essere stampata&lt;br /&gt;
 */&lt;br /&gt;
struct classe;&lt;br /&gt;
typedef struct classe classe;&lt;br /&gt;
&lt;br /&gt;
/* constructor */&lt;br /&gt;
classe* classeCreate(void);&lt;br /&gt;
&lt;br /&gt;
/* destructor */&lt;br /&gt;
void classeDestroy(classe *classe_ptr);&lt;br /&gt;
&lt;br /&gt;
/* public methods */&lt;br /&gt;
void cambiaParola (classe *classe_ptr, char *hello);&lt;br /&gt;
void stampa(classe *classe_ptr);&lt;br /&gt;
&lt;br /&gt;
#endif &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da notare che non ho definito la struttura, in questo modo l'utente che andra` ad utilizzarla non potra`&lt;br /&gt;
accedere ai campi, sara` costretto ad utilizzare &amp;quot;i metodi&amp;quot; dichiarati.&lt;br /&gt;
&lt;br /&gt;
* Implementare la relativa &amp;quot;classe&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;class.h&amp;quot;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct classe &lt;br /&gt;
{&lt;br /&gt;
	/* i campi sono privati!! */&lt;br /&gt;
	char *hello;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* constructor implementation */&lt;br /&gt;
&lt;br /&gt;
classe* classeCreate(void)&lt;br /&gt;
{&lt;br /&gt;
	classe *classe_ptr = NULL;&lt;br /&gt;
&lt;br /&gt;
	classe_ptr = (classe* ) malloc (sizeof (classe));&lt;br /&gt;
	if(classe_ptr == NULL)&lt;br /&gt;
					return NULL;&lt;br /&gt;
	memset (classe_ptr, 0, sizeof (classe));&lt;br /&gt;
&lt;br /&gt;
	classe_ptr-&amp;gt;hello = (char *) malloc (9*sizeof (char));&lt;br /&gt;
	strcpy (classe_ptr-&amp;gt;hello, &amp;quot;default&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	return classe_ptr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* destructor implementation */&lt;br /&gt;
&lt;br /&gt;
void classeDestroy (classe *classe_ptr)&lt;br /&gt;
{&lt;br /&gt;
	if (classe_ptr == NULL)&lt;br /&gt;
	{&lt;br /&gt;
		fprintf( stderr, &amp;quot;Null pointer error, classe_ptr is NULL\n&amp;quot;);&lt;br /&gt;
		exit (-4);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* sono sicuro che hello != null, poiche` l'utente&lt;br /&gt;
	 * non puo` gestirla al di fuori dei public methods &lt;br /&gt;
	 */&lt;br /&gt;
	free (classe_ptr-&amp;gt;hello);&lt;br /&gt;
	free (classe_ptr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* public methods implementation */&lt;br /&gt;
&lt;br /&gt;
void cambiaParola (classe *classe_ptr, char *src)&lt;br /&gt;
{&lt;br /&gt;
	/* dealloco *hello e creo spazio per *src */&lt;br /&gt;
	free (classe_ptr-&amp;gt;hello);&lt;br /&gt;
&lt;br /&gt;
	classe_ptr-&amp;gt;hello = (char *) malloc &lt;br /&gt;
					( (strlen(src) +1)*sizeof(char));&lt;br /&gt;
	strcpy (classe_ptr-&amp;gt;hello, src);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void stampa (classe *classe_ptr)&lt;br /&gt;
{&lt;br /&gt;
	printf (&amp;quot;%s\n&amp;quot;, classe_ptr-&amp;gt;hello);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* private methods */&lt;br /&gt;
&lt;br /&gt;
static void foo (void)&lt;br /&gt;
{&lt;br /&gt;
	/* something */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Per finire importare la &amp;quot;classe&amp;quot; ed utilizzarla:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;class.h&amp;quot;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
	classe *saluto;&lt;br /&gt;
	&lt;br /&gt;
	/* creo la &amp;quot;classe&amp;quot; saluto */&lt;br /&gt;
	saluto = classeCreate ();&lt;br /&gt;
	&lt;br /&gt;
	/* provo a stampare, N.B. non ho la minima&lt;br /&gt;
	 * idea di come sia fatta la struttura.&lt;br /&gt;
	 * NON posso fare:&lt;br /&gt;
	 * printf (&amp;quot;%s&amp;quot;, stampa-&amp;gt;hello);&lt;br /&gt;
	 */&lt;br /&gt;
&lt;br /&gt;
	//printf (&amp;quot;%s&amp;quot;, stampa-&amp;gt;hello);&lt;br /&gt;
	stampa (saluto);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/* cambio la parola, N.B. non ho la minima&lt;br /&gt;
	 * idea di come sia fatta la struttura.&lt;br /&gt;
	 * NON posso fare:&lt;br /&gt;
	 * strcpy (stampa-&amp;gt;hello, &amp;quot;ciao&amp;quot;);&lt;br /&gt;
	 */&lt;br /&gt;
&lt;br /&gt;
	//strcpy (stampa-&amp;gt;hello, &amp;quot;ciao&amp;quot;);&lt;br /&gt;
	cambiaParola (saluto, &amp;quot;ciao&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	stampa (saluto);&lt;br /&gt;
&lt;br /&gt;
	classeDestroy (saluto);&lt;br /&gt;
&lt;br /&gt;
	return 0;	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Conclusione=&lt;br /&gt;
&lt;br /&gt;
Non so se il modo in cui ho affrontato il problema sia corretto o errato, sono aperto a qualunque suggerimento (anche uno stravolgimento della mia idea e` ben accetto).&lt;br /&gt;
Rimangono ancora &amp;quot;aperti&amp;quot; i problemi:&lt;br /&gt;
# [[Ereditarietà]]&lt;br /&gt;
# [[Polimorfismo]]&lt;br /&gt;
&lt;br /&gt;
Sarei felice di ricevere suggerimenti in proposito!&lt;br /&gt;
&lt;br /&gt;
PS. Non ho scritto questo Topic per utilizzare il paradigma OOP in C, ero solo curioso di vedere se fossi riuscito o meno ad implementare qualcosa di simile al concetto di classe.&lt;br /&gt;
&lt;br /&gt;
=Download File=&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B0FK1WI24sl6a3oyYUlvQVlrN0k/view?usp=sharing Download: classi.tgz]&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=%22classi%22_in_C&amp;diff=795</id>
		<title>&quot;classi&quot; in C</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=%22classi%22_in_C&amp;diff=795"/>
		<updated>2014-11-02T22:13:23Z</updated>

		<summary type="html">&lt;p&gt;Eddy: /* Paradigma OOP in C */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Paradigma OOP in C=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quando in classe abbiamo parlato di [[puntatori a funzione]] mi e` subito venuto in mente una cosa del genere:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int foo1 (int x);&lt;br /&gt;
&lt;br /&gt;
typedef struct classe&lt;br /&gt;
{&lt;br /&gt;
  int data;&lt;br /&gt;
  int (*foo) (int x);&lt;br /&gt;
} classe;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  classe *ptr;&lt;br /&gt;
  ptr = (classe*) malloc (sizeof (classe));&lt;br /&gt;
  ptr-&amp;gt;foo = &amp;amp;foo1;&lt;br /&gt;
  printf (&amp;quot;%d&amp;quot;, ptr-&amp;gt;foo(4));&lt;br /&gt;
  free(ptr);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int foo1 (int x)&lt;br /&gt;
{&lt;br /&gt;
  return x;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ptr-&amp;gt;foo()''' assomiglia molto ad un metodo!&lt;br /&gt;
&lt;br /&gt;
===Primi problemi===&lt;br /&gt;
&lt;br /&gt;
* se l'utente mi cambia l'indirizzo a cui punta foo?&lt;br /&gt;
* come rendo privati eventuali campi che voglio nascondere all'utente? [[Incapsulamento]]&lt;br /&gt;
* come derivo nuove classi a partire da quelle gia` definite? [[Ereditarietà]]&lt;br /&gt;
* come implemento il [[Polimorfismo]]?&lt;br /&gt;
&lt;br /&gt;
===La mia soluzione (incapsulamento)===&lt;br /&gt;
&lt;br /&gt;
* Scrivere una &amp;quot;classe&amp;quot; per modulo, nel relativo header dichiarare solo &amp;quot;i metodi che dovranno essere public&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef H__CLASS_H__H &lt;br /&gt;
#define H__CLASS_H__H &lt;br /&gt;
&lt;br /&gt;
/* la &amp;quot;classe&amp;quot; classe contiene una parola che puo`:&lt;br /&gt;
 * -essere cambiata&lt;br /&gt;
 * -essere stampata&lt;br /&gt;
 */&lt;br /&gt;
struct classe;&lt;br /&gt;
typedef struct classe classe;&lt;br /&gt;
&lt;br /&gt;
/* constructor */&lt;br /&gt;
classe* classeCreate(void);&lt;br /&gt;
&lt;br /&gt;
/* destructor */&lt;br /&gt;
void classeDestroy(classe *classe_ptr);&lt;br /&gt;
&lt;br /&gt;
/* public methods */&lt;br /&gt;
void cambiaParola (classe *classe_ptr, char *hello);&lt;br /&gt;
void stampa(classe *classe_ptr);&lt;br /&gt;
&lt;br /&gt;
#endif &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da notare che non ho definito la struttura, in questo modo l'utente che andra` ad utilizzarla non potra`&lt;br /&gt;
accedere ai campi, sara` costretto ad utilizzare &amp;quot;i metodi&amp;quot; dichiarati.&lt;br /&gt;
&lt;br /&gt;
* Implementare la relativa &amp;quot;classe&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;class.h&amp;quot;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct classe &lt;br /&gt;
{&lt;br /&gt;
	/* i campi sono privati!! */&lt;br /&gt;
	char *hello;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* constructor implementation */&lt;br /&gt;
&lt;br /&gt;
classe* classeCreate(void)&lt;br /&gt;
{&lt;br /&gt;
	classe *classe_ptr = NULL;&lt;br /&gt;
&lt;br /&gt;
	classe_ptr = (classe* ) malloc (sizeof (classe));&lt;br /&gt;
	if(classe_ptr == NULL)&lt;br /&gt;
					return NULL;&lt;br /&gt;
	memset (classe_ptr, 0, sizeof (classe));&lt;br /&gt;
&lt;br /&gt;
	classe_ptr-&amp;gt;hello = (char *) malloc (9*sizeof (char));&lt;br /&gt;
	strcpy (classe_ptr-&amp;gt;hello, &amp;quot;default&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	return classe_ptr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* destructor implementation */&lt;br /&gt;
&lt;br /&gt;
void classeDestroy (classe *classe_ptr)&lt;br /&gt;
{&lt;br /&gt;
	if (classe_ptr == NULL)&lt;br /&gt;
	{&lt;br /&gt;
		fprintf( stderr, &amp;quot;Null pointer error, classe_ptr is NULL\n&amp;quot;);&lt;br /&gt;
		exit (-4);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* sono sicuro che hello != null, poiche` l'utente&lt;br /&gt;
	 * non puo` gestirla al di fuori dei public methods &lt;br /&gt;
	 */&lt;br /&gt;
	free (classe_ptr-&amp;gt;hello);&lt;br /&gt;
	free (classe_ptr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* public methods implementation */&lt;br /&gt;
&lt;br /&gt;
void cambiaParola (classe *classe_ptr, char *src)&lt;br /&gt;
{&lt;br /&gt;
	/* dealloco *hello e creo spazio per *src */&lt;br /&gt;
	free (classe_ptr-&amp;gt;hello);&lt;br /&gt;
&lt;br /&gt;
	classe_ptr-&amp;gt;hello = (char *) malloc &lt;br /&gt;
					( (strlen(src) +1)*sizeof(char));&lt;br /&gt;
	strcpy (classe_ptr-&amp;gt;hello, src);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void stampa (classe *classe_ptr)&lt;br /&gt;
{&lt;br /&gt;
	printf (&amp;quot;%s\n&amp;quot;, classe_ptr-&amp;gt;hello);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* private methods */&lt;br /&gt;
&lt;br /&gt;
static void foo (void)&lt;br /&gt;
{&lt;br /&gt;
	/* something */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Per finire importare la &amp;quot;classe&amp;quot; ed utilizzarla:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;class.h&amp;quot;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv)&lt;br /&gt;
{&lt;br /&gt;
	classe *saluto;&lt;br /&gt;
	&lt;br /&gt;
	/* creo la &amp;quot;classe&amp;quot; saluto */&lt;br /&gt;
	saluto = classeCreate ();&lt;br /&gt;
	&lt;br /&gt;
	/* provo a stampare, N.B. non ho la minima&lt;br /&gt;
	 * idea di come sia fatta la struttura.&lt;br /&gt;
	 * NON posso fare:&lt;br /&gt;
	 * printf (&amp;quot;%s&amp;quot;, stampa-&amp;gt;hello);&lt;br /&gt;
	 */&lt;br /&gt;
&lt;br /&gt;
	//printf (&amp;quot;%s&amp;quot;, stampa-&amp;gt;hello);&lt;br /&gt;
	stampa (saluto);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/* cambio la parola, N.B. non ho la minima&lt;br /&gt;
	 * idea di come sia fatta la struttura.&lt;br /&gt;
	 * NON posso fare:&lt;br /&gt;
	 * strcpy (stampa-&amp;gt;hello, &amp;quot;ciao&amp;quot;);&lt;br /&gt;
	 */&lt;br /&gt;
&lt;br /&gt;
	//strcpy (stampa-&amp;gt;hello, &amp;quot;ciao&amp;quot;);&lt;br /&gt;
	cambiaParola (saluto, &amp;quot;ciao&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	stampa (saluto);&lt;br /&gt;
&lt;br /&gt;
	classeDestroy (saluto);&lt;br /&gt;
&lt;br /&gt;
	return 0;	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Conclusione=&lt;br /&gt;
&lt;br /&gt;
Non so se il modo in cui ho affrontato il problema sia corretto o errato, sono aperto a qualunque suggerimento (anche uno stravolgimento della mia idea e` ben accetto).&lt;br /&gt;
Rimangono ancora &amp;quot;aperti&amp;quot; i problemi:&lt;br /&gt;
# [[Ereditarietà]]&lt;br /&gt;
# [[Polimorfismo]]&lt;br /&gt;
&lt;br /&gt;
Sarei felice di ricevere suggerimenti in proposito!&lt;br /&gt;
&lt;br /&gt;
PS. Non ho scritto questo Topic per utilizzare il paradigma OOP in C, ero solo curioso di vedere se fossi riuscito o meno ad implementare qualcosa di simile al concetto di classe.&lt;br /&gt;
&lt;br /&gt;
=Download File=&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B0FK1WI24sl6a3oyYUlvQVlrN0k/view?usp=sharing Download: classi.tgz]&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=%22classi%22_in_C&amp;diff=794</id>
		<title>&quot;classi&quot; in C</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=%22classi%22_in_C&amp;diff=794"/>
		<updated>2014-11-02T22:08:18Z</updated>

		<summary type="html">&lt;p&gt;Eddy: Come scrivere una &amp;quot;classe&amp;quot; in C?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Paradigma OOP in C=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quando in classe abbiamo parlato di [[puntatori a funzione]] mi e` subito venuto in mente una cosa del genere:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int foo1 (int x);&lt;br /&gt;
&lt;br /&gt;
typedef struct classe&lt;br /&gt;
{&lt;br /&gt;
  int data;&lt;br /&gt;
  int (*foo) (int x);&lt;br /&gt;
} classe;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  classe *ptr;&lt;br /&gt;
  ptr = (classe*) malloc (sizeof (classe));&lt;br /&gt;
  ptr-&amp;gt;foo = &amp;amp;foo1;&lt;br /&gt;
  printf (&amp;quot;%d&amp;quot;, ptr-&amp;gt;foo(4));&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int foo1 (int x)&lt;br /&gt;
{&lt;br /&gt;
  return x;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ptr-&amp;gt;foo()''' assomiglia molto ad un metodo!&lt;br /&gt;
&lt;br /&gt;
===Primi problemi===&lt;br /&gt;
&lt;br /&gt;
* se l'utente mi cambia l'indirizzo a cui punta foo?&lt;br /&gt;
* come rendo privati eventuali campi che voglio nascondere all'utente? [[Incapsulamento]]&lt;br /&gt;
* come derivo nuove classi a partire da quelle gia` definite? [[Ereditarietà]]&lt;br /&gt;
* come implemento il [[Polimorfismo]]?&lt;br /&gt;
&lt;br /&gt;
===La mia soluzione (incapsulamento)===&lt;br /&gt;
&lt;br /&gt;
* Scrivere una &amp;quot;classe&amp;quot; per modulo, nel relativo header dichiarare solo &amp;quot;i metodi che dovranno essere public&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef H__CLASS_H__H &lt;br /&gt;
#define H__CLASS_H__H &lt;br /&gt;
&lt;br /&gt;
/* la &amp;quot;classe&amp;quot; classe contiene una parola che puo`:&lt;br /&gt;
 * -essere cambiata&lt;br /&gt;
 * -essere stampata&lt;br /&gt;
 */&lt;br /&gt;
struct classe;&lt;br /&gt;
typedef struct classe classe;&lt;br /&gt;
&lt;br /&gt;
/* constructor */&lt;br /&gt;
classe* classeCreate(void);&lt;br /&gt;
&lt;br /&gt;
/* destructor */&lt;br /&gt;
void classeDestroy(classe *classe_ptr);&lt;br /&gt;
&lt;br /&gt;
/* public methods */&lt;br /&gt;
void cambiaParola (classe *classe_ptr, char *hello);&lt;br /&gt;
void stampa(classe *classe_ptr);&lt;br /&gt;
&lt;br /&gt;
#endif &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da notare che non ho definito la struttura, in questo modo l'utente che andra` ad utilizzarla non potra`&lt;br /&gt;
accedere ai campi, sara` costretto ad utilizzare &amp;quot;i metodi&amp;quot; dichiarati.&lt;br /&gt;
&lt;br /&gt;
* Implementare la relativa &amp;quot;classe&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;class.h&amp;quot;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct classe &lt;br /&gt;
{&lt;br /&gt;
	/* i campi sono privati!! */&lt;br /&gt;
	char *hello;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* constructor implementation */&lt;br /&gt;
&lt;br /&gt;
classe* classeCreate(void)&lt;br /&gt;
{&lt;br /&gt;
	classe *classe_ptr = NULL;&lt;br /&gt;
&lt;br /&gt;
	classe_ptr = (classe* ) malloc (sizeof (classe));&lt;br /&gt;
	if(classe_ptr == NULL)&lt;br /&gt;
					return NULL;&lt;br /&gt;
	memset (classe_ptr, 0, sizeof (classe));&lt;br /&gt;
&lt;br /&gt;
	classe_ptr-&amp;gt;hello = (char *) malloc (9*sizeof (char));&lt;br /&gt;
	strcpy (classe_ptr-&amp;gt;hello, &amp;quot;default&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	return classe_ptr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* destructor implementation */&lt;br /&gt;
&lt;br /&gt;
void classeDestroy (classe *classe_ptr)&lt;br /&gt;
{&lt;br /&gt;
	if (classe_ptr == NULL)&lt;br /&gt;
	{&lt;br /&gt;
		fprintf( stderr, &amp;quot;Null pointer error, classe_ptr is NULL\n&amp;quot;);&lt;br /&gt;
		exit (-4);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* sono sicuro che hello != null, poiche` l'utente&lt;br /&gt;
	 * non puo` gestirla al di fuori dei public methods &lt;br /&gt;
	 */&lt;br /&gt;
	free (classe_ptr-&amp;gt;hello);&lt;br /&gt;
	free (classe_ptr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* public methods implementation */&lt;br /&gt;
&lt;br /&gt;
void cambiaParola (classe *classe_ptr, char *src)&lt;br /&gt;
{&lt;br /&gt;
	/* dealloco *hello e creo spazio per *src */&lt;br /&gt;
	free (classe_ptr-&amp;gt;hello);&lt;br /&gt;
&lt;br /&gt;
	classe_ptr-&amp;gt;hello = (char *) malloc &lt;br /&gt;
					( (strlen(src) +1)*sizeof(char));&lt;br /&gt;
	strcpy (classe_ptr-&amp;gt;hello, src);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void stampa (classe *classe_ptr)&lt;br /&gt;
{&lt;br /&gt;
	printf (&amp;quot;%s\n&amp;quot;, classe_ptr-&amp;gt;hello);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* private methods */&lt;br /&gt;
&lt;br /&gt;
static void foo (void)&lt;br /&gt;
{&lt;br /&gt;
	/* something */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Per finire importare la &amp;quot;classe&amp;quot; ed utilizzarla:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;class.h&amp;quot;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv)&lt;br /&gt;
{&lt;br /&gt;
	classe *saluto;&lt;br /&gt;
	&lt;br /&gt;
	/* creo la &amp;quot;classe&amp;quot; saluto */&lt;br /&gt;
	saluto = classeCreate ();&lt;br /&gt;
	&lt;br /&gt;
	/* provo a stampare, N.B. non ho la minima&lt;br /&gt;
	 * idea di come sia fatta la struttura.&lt;br /&gt;
	 * NON posso fare:&lt;br /&gt;
	 * printf (&amp;quot;%s&amp;quot;, stampa-&amp;gt;hello);&lt;br /&gt;
	 */&lt;br /&gt;
&lt;br /&gt;
	//printf (&amp;quot;%s&amp;quot;, stampa-&amp;gt;hello);&lt;br /&gt;
	stampa (saluto);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/* cambio la parola, N.B. non ho la minima&lt;br /&gt;
	 * idea di come sia fatta la struttura.&lt;br /&gt;
	 * NON posso fare:&lt;br /&gt;
	 * strcpy (stampa-&amp;gt;hello, &amp;quot;ciao&amp;quot;);&lt;br /&gt;
	 */&lt;br /&gt;
&lt;br /&gt;
	//strcpy (stampa-&amp;gt;hello, &amp;quot;ciao&amp;quot;);&lt;br /&gt;
	cambiaParola (saluto, &amp;quot;ciao&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	stampa (saluto);&lt;br /&gt;
&lt;br /&gt;
	classeDestroy (saluto);&lt;br /&gt;
&lt;br /&gt;
	return 0;	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Conclusione=&lt;br /&gt;
&lt;br /&gt;
Non so se il modo in cui ho affrontato il problema sia corretto o errato, sono aperto a qualunque suggerimento (anche uno stravolgimento della mia idea e` ben accetto).&lt;br /&gt;
Rimangono ancora &amp;quot;aperti&amp;quot; i problemi:&lt;br /&gt;
# [[Ereditarietà]]&lt;br /&gt;
# [[Polimorfismo]]&lt;br /&gt;
&lt;br /&gt;
Sarei felice di ricevere suggerimenti in proposito!&lt;br /&gt;
&lt;br /&gt;
PS. Non ho scritto questo Topic per utilizzare il paradigma OOP in C, ero solo curioso di vedere se fossi riuscito o meno ad implementare qualcosa di simile al concetto di classe.&lt;br /&gt;
&lt;br /&gt;
=Download File=&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B0FK1WI24sl6a3oyYUlvQVlrN0k/view?usp=sharing Download: classi.tgz]&lt;/div&gt;</summary>
		<author><name>Eddy</name></author>
	</entry>
</feed>