PDA

View Full Version : Potreste controllare se è giusto


M86
29-01-2003, 14:34
controllate se gli esercizi contenuti in questi 3 files sono giusti

M86
29-01-2003, 14:35
parte due

M86
29-01-2003, 14:36
parte tre

M86
29-01-2003, 14:47
3.12
a)scorretto
b)scorretto
c)scorretto
d)Scorretto
e)corretto
f)corretto
g)scorretto
h)scorretto
i)scorretto
j)scorretto
k)scorretto
i)scorretto

3.13
il primo aggiunge 1 a cnt finchè l'indirizzo cui punta st è valido
il secondo agginge 1 a cnt se il carattere *st è assegnato

3.14
a)Questi due programmi sono una specie di benchmark che verifica quanti errori compie la CPU ripetendo un operazione di assegnamento solo che nel primo caso aggiunge un errore solo se comparando pc con un stringa (pc2) avente un array di caratteri + grande di 1, la funzione restituisce true, mentre nel secondo il programma aggiunge un errore solo se la seconda stringa è identica alla prima come l'istruzione di assegnamento comanda
b)non ne ho la più pallida idea

3.15
non so cosa sia un contenitore astratto e non ho la più pallida idea di cosa cambiare

M86
31-01-2003, 14:51
Nessuno può aiutarmi?
Dove è il problema? forse le immagini non sono abbastanza chiare, perchè io riesco a leggerle ma se qualcuno non ci riesce sitemo la cosa
Ma se il probleme è un altro allora non ci perdo neanche tempo

cionci
31-01-2003, 17:33
Originally posted by "M86"

3.12
a)scorretto
b)scorretto
c)scorretto
d)Scorretto
e)corretto
f)corretto
g)scorretto
h)scorretto
i)scorretto
j)scorretto
k)scorretto
i)scorretto

Mi sembra ok...
Originally posted by "M86"


3.13
il primo aggiunge 1 a cnt finchè l'indirizzo cui punta st è valido
il secondo agginge 1 a cnt se il carattere *st è assegnato

Il primo aggiunge 1 a cnt finchè l'indirizzo cui punta st è diverso da 0... dire che un indirizzo è valido o meno è un po' un forzatura...
Il secondo aggiunge 1 a cnt finchè il carattere puntato da st (st è costante, ma viene incrementato il vaore puntato da st) è diverso da 0

Aspetta che guardo gli altri...

cionci
31-01-2003, 17:51
Originally posted by "M86"


3.14
a)Questi due programmi sono una specie di benchmark che verifica quanti errori compie la CPU ripetendo un operazione di assegnamento solo che nel primo caso aggiunge un errore solo se comparando pc con un stringa (pc2) avente un array di caratteri + grande di 1, la funzione restituisce true, mentre nel secondo il programma aggiunge un errore solo se la seconda stringa è identica alla prima come l'istruzione di assegnamento comanda
b)non ne ho la più pallida idea

a) entrambi i programmi eseguono la stessa cosa...comparano 2 copie di una stessa stringa e contano eventuali errori. La funzione strcmp torna 0 quando sono uguali quindi errori viene incrementato solo se le stringhe sono diverse... L'operatore != fra due string esegue una comparazione ed errori viene incrementato solo se le due stringhe sono diverse...
b) secondo me è più veloce la prima ;) Non a caso il kernel di Linux è sviluppato in C e non in C++...se sail motivo spiegamelo perchè io ho comparato diverse volte lo stesso programma fatto con la STL e con la libreria std C ed è sempre risultato vincente quello fatto con la libreria std C...
Originally posted by "M86"


3.15
non so cosa sia un contenitore astratto e non ho la più pallida idea di cosa cambiare
Secondo me string non è un tipo astratto...un tipo astratto per quanto ne so io sono vector e tutto quello che ha a che fare con i template... A me che per astratto non venga inteso un tipo di dato che non ha una dimensione predefinita...

M86
31-01-2003, 19:45
Originally posted by "cionci"


b) secondo me è più veloce la prima ;)
eppure lì dice esattamente il contrario e porta dei dati ottenuti proprio con unix; infatti io sapevo che linux è in C solo perchè nel lontano '90 non c'era il C++

M86
31-01-2003, 19:50
il "c" e il "d" del 3.12 sono sbagliati perchè puntano a stringhe già sbagliate, anche se vorrei chiederti il "&" serve quando voglio assegnare il "valore" di una stringa ad un altra mediante parentesi

Ps. ho un altro dubbio
Ma il programma 3.14 trova qualche errore io non posso provare perchè ho il compilatore della borland trial che è un casino da imparare ad usare
PPS. Conosci qualche compilatore molto semplice che non mi chiede di creare l'interfaccia grafica e mi fa girare il programma sotto DOS §(mi interesserebbe imparare a programmare sotto linux ma prima devo capire windows)

cionci
01-02-2003, 08:36
Originally posted by "M86"


eppure lì dice esattamente il contrario e porta dei dati ottenuti proprio con unix; infatti io sapevo che linux è in C solo perchè nel lontano '90 non c'era il C++
Nel '90 il C++ c'era... E' nato nel 1983... Poi il '90 non è tanto lontano...
Il fatto è che la programmazione funzionale è intrinsecamente più veloce della programmazione a oggetti...
strcpy lavora su due puntatori a char (4 byte ciascuno) che vengono immessi nello stack per la chiamata a strcpy...
Una stringa è un vettore di byte...quindi strcpy non fa altro che copiare uno ad uno il contenuto del vattore (magari chiamando memcpy)...
In questo caso l'operatore di assegnamento è abbastanza simile...infatti prende come parametri reali il riferimento all'oggetto da creare ed il rifermento all'oggetto da cui copiare (8 byte)...
Anche questa chiama probabilmente la memcpy e fa una copia del vettore... Però già l'operatore non può copiare solamente il contenuto, ma anche altre cose (come ad esempio alcune variabili, ad esempio il numero dei componenti della stringa)...e qui è già intrinsecamente più lenta (anche se di molto poco comunque è più lenta)...

Riguardo ai compilatori allora ti consiglio un compilatore compatibile con il GCC di Linux... Qui c'è anche un ambiente grafico integrato... Come compilatore prendi il Mingw 2.95...
http://www.bloodshed.net/dev/devcpp.html

La "&" in C++ ha tanti usi...
Il primo che c'è in C serve per ottenere l'indirizzo di una variabile...

int a;
int *p = &a;

Un'altro serve per creare alias che sono appunto altri nomi per la stesa variabile...

int b;
int &a = b; //a e b sono la stessa cosa

int &f(int &c) //passaggio per riferimento
{
return c + 1; //c è un alias della variabile che viene passata a f
}

int x, y = 0;

x = f(y); //x è un alias di c che è un alias di y -> x è un alias di y
//x e y valgono entrambe 1
x = 2; //x e y valgono entrambe 2

cionci
01-02-2003, 09:09
Tanto per dimostrarti ciò che ti dicevo :

#include <windows.h>
#include <mmsystem.h>
#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[])
{
int start = timeGetTime();
string uno("Proviamo una bella stringa lunga");

for(int i=0; i<10000000; ++i)
{
string due = uno;
if(due != uno)
;
}

int end = timeGetTime();

cout << "STL C++ : " << float(end - start)/1000.0 << endl;

start = timeGetTime();
char *strUno = "Proviamo una bella stringa lunga";

for(int i=0; i<10000000; ++i)
{
char *strDue;
strcpy(strDue, strUno);

if(strcmp(strDue, strUno))
;
}

end = timeGetTime();

cout << "Liberia standard C : " << float(end - start)/1000.0 << endl;
return 0;
}

Output :

H:\>Prova\Progetto1.exe
STL C++ : 2.742
Liberia standard C : 1.161

H:\>

Quidni le proporzioni stanno esattamente al contrario di quanto riportato dal libro... Come compilatore ho usato quello che ti ho fatto scaricare...

M86
01-02-2003, 15:49
Cosa significa l'errore
e perchè se provo a disabilitare l'opzione "accept $ in identifier" gli errori salgono a 70 anche su due righe di codice

cionci
01-02-2003, 16:28
Boh...mai vista... Hai scaricato la versione con GCC 2.95 (la seconda nella pagina) ? Non scaricare la versione con GCC 3.2...

M86
02-02-2003, 08:32
Originally posted by "cionci"

Boh...mai vista... Hai scaricato la versione con GCC 2.95 (la seconda nella pagina) ? Non scaricare la versione con GCC 3.2...
ehm...troppo tardi :D

ma ora provvedo

M86
02-02-2003, 08:34
Già che ci sei puoi controllare anche questi; specialmente il terzo esercizio



Esercizi

Esercizio 3.16
Spiegate il significato delle seguenti cinque definizioni e identificate quelle non valide.
(a) int i;
(b) const int ic;
(e) const int *pic;
(d) int *const cpi;
(e) const int *const cpic;
Esercizio 3.17
Quali delle seguenti inizializzazioni sono valide? Perché?
(a) int i = -1;
(b) const int ic = i;
(e) const int *pic = ⁣
(d) int *const cpi = ⁣
(e) const int *const cpic = ⁣
Esercizio 3.18
Sulla base della definizione dell'esercizio precedente, quali dei seguenti assegnamenti sono legali? Perché?
(a) i = ic;
(b) pic = ⁣
(e) cpi = pic;
(d) pic = cpic;
(e) cpic = ⁣
(f) ic = *cpic;

Svolgimento
3.16
a)Valido: crea una variabile di tipo int
b)Non valido (costante non inizializzata); crea un oggetto costante di tipo int
c)Non valido (perché non inizializzato), creazione di un puntatore a variabile intera costante
d)Non valido (non inizializzato), creazione di un puntatore costante ad oggetto intero non costante
e)Non valido (non inizializzato), creazione di un puntatore costante ad oggetto intero costante

3.17
a)Valida, crea una variabile di tipo int
b)Valida, crea un oggetto intero costante
c)Valida, crea un puntatore ad oggetto costante
d)Non valida, crea un puntatore costante ad oggetto non costante e gli assegna un valore indirizzo
e)Valida, assegna ad un puntatore costante ad oggetto il valore di un oggetto costante.

3.18
a)Non legale: ad I non può essere assegnato se stesso
b)Legale (ma non ne sono proprio sicuro), assegna il valore di un oggetto costante ad un puntatore ad oggetto costante
c)Non legale, assegna ad un puntatore costante ad oggetto non costante un valore indirizzo
d)?
e)Legale; assegna ad un puntatore costante ad oggetto costante il valore di un oggetto costante
f)Non legale, IC non può essere modificato

Solo al puntatore costante ad oggetto non costante non può essere assegnato un indirizzo giusto?

cionci
02-02-2003, 18:41
Originally posted by "M86"

a)Non legale: ad I non può essere assegnato se stesso
b)Legale (ma non ne sono proprio sicuro), assegna il valore di un oggetto costante ad un puntatore ad oggetto costante
c)Non legale, assegna ad un puntatore costante ad oggetto non costante un valore indirizzo
d)?
e)Legale; assegna ad un puntatore costante ad oggetto costante il valore di un oggetto costante
f)Non legale, IC non può essere modificato

a) E' legale... E' come fare i = i; che è una istruzione perfettamente legale...
d) E' legale assegnare un puntatore costante ad un puntatore non costante dello stesso tipo (puntatore a intero costante)...
Originally posted by "M86"

Solo al puntatore costante ad oggetto non costante non può essere assegnato un indirizzo giusto?
Solo ad un puntatore costante a qualsiasi oggetto (costante o non costante) non può essere assegnato un indirizzo....

M86
02-02-2003, 20:16
se l'assegnazione D è legale allora ad un puntatore ad oggetto costante posso assegnare un puntatore costante ad oggetto costante; ma scusa non è inutile: anche senza assegnazione non potrò modificare ne l'oggetto indicato ne il puntatore che lo punta

cionci
03-02-2003, 09:19
Però gli puoi cambiare il contenuto a quel puntatore e fargli puntare ad un altro oggetto costante...

const int a = 4;
const int b = 5;
const int *p = a;

int c = p + 5;
p = &b:
c = p + 5;

M86
03-02-2003, 13:04
hai ragione

Il compilatore 2.95 da questi due errori al listato
C:\Documents and Settings\Michele Sgrillo\Desktop\Untitled1.cpp
[Warning] In function `int main(int, char **)':
41 C:\Documents and Settings\Michele Sgrillo\Desktop\Untitled1.cpp
parse error at end of input

cionci
03-02-2003, 13:49
Il nuovo progetto che hai creato sei sicuro che sia un progetto C++ ?

Chapa questo progetto e provalo...

M86
03-02-2003, 14:16
ma perchè devo per forza creare un proggetto, il sorgente semplice non va bene?

Ps. Che lavoro fai?

M86
03-02-2003, 14:22
comunque ora da questo errore

M86
03-02-2003, 14:23
comunque ora il log da questo messaggio


Compiler: Default compiler
Building Makefile: "C:\Documents and Settings\Michele Sgrillo\Desktop\Makefile.win"
Executing make...
make.exe -f "C:\Documents and Settings\Michele Sgrillo\Desktop\Makefile.win" all
g++.exe main.o -o "Progetto1.exe" -L"C:/Programmi/Dev-Cpp/lib" H:/Dev-Cpp/lib/libwinmm.a -I"C:/Programmi/Dev-Cpp/include" -I"C:/Programmi/Dev-Cpp/include"

g++.exe: H:/Dev-Cpp/lib/libwinmm.a: No such file or directory

make.exe: *** [Progetto1.exe] Error 1

Execution terminated

cionci
03-02-2003, 15:00
C'è restato il mio path per la libreria... Vai su Progetto -> Opzioni -> Compilatore -> Opzioni di compilazione -> Aggiungi libreria -> vai nella dir di Dev-CPP...poi lib e cerchi il file libwinmm.a

Di lavoro faccio il programmatore...ma studio ancora all'università...

M86
03-02-2003, 19:20
non è che ce l'abbia con te ma il programma riporta solo il tempo della STL C++ e non quello della libreria standard C

Ps. Che facoltà frequenti e sopratutto il C++ non si fa tutto in un esame, vero?

M86
03-02-2003, 19:25
Ho una curiosità: oltre libwinmma ci sono un sacco di librerie, dove posso trovare un elenco in italiano di che librerie sono...

A costo di metterci una vita a paragrafo devo capirlo bene il C++ così poi posso approfondire un cosa che mi trascino dietro da quando ho 12 anni: le reti neurali, tu ne ha mai "vista all'opera" una?

cionci
03-02-2003, 19:31
Originally posted by "M86"

non è che ce l'abbia con te ma il programma riporta solo il tempo della STL C++ e non quello della libreria standard C

Ps. Che facoltà frequenti e sopratutto il C++ non si fa tutto in un esame, vero?
Per il programma eseguilo da riga di comando... Sparisce la schermata...

Frequento (ancora) Ing. Informatica... Io la teoria sul C++ l'ho fatta in due esami...

Per le reti neurali...sì le conosco...è una delle cose che mi è più piaciuto fare all'università... Ci ho fatto un riconoscitore ottico... Una specie di base per un OCR...

M86
04-02-2003, 11:56
grazie in effetti è la metà, non cancellarti da questo thread perchè preferirei non aprirne di nuovi per farmi controllare degli esercizi