Newsgroup: it.comp.lang.c++
Titolo: esercizi c++

Volevo chiedervi un piccolo favore...lunedi mio fratello + piccolo ha
l'orale di un esame di informatica applicata in c++, anche se lui è
iscritto a meccanica, ed è uno degli ultimi esami che ha...Mi ha
mandato la traccia dello scritto che ha fatto ma non è sicuro di
averlo svolto giusto...Mi date una mano a svolgerlo in modo
corretto???  GRazie a tutti
Esercizio 1
Si descrivi il programma sottostante.  Inoltre, assumendo che la
sequenza dei caratteri digitata dall’utente sia “bK80ef6L”, si mostri
il contenuto del vettore v stampato sullo schermo.
#include <iostream.h>
#define DIM 6
int main(){
    char c, v[DIM];
    int k=0;
    for (int i=0; i<DIM; i++)   v='+';
    while ((c=getchar())!='\n' ) {
      if ( c>='A' && c<='Z')
        *(v+k++)=c;
      else if (c>='a' && c<='z')
        *(v+k++)=c - 'a' + 'A';
    }
    cout<<endl<<"v: ";
    for (int i=0; i<DIM; i++) cout<<v;
    cout<<endl;
    system("pause");
    return 0;
}
Esercizio 2
Si implementi una funzione bool  verifica (int  v[DIM], double *m1)
che memorizza nella variabile puntata da m1 la media degli elementi
presenti nelle posizioni pari del vettore v, e restituisce true se M
contiene almeno un numero primo nelle posizioni dispari, e false
altrimenti.
Per esempio, nel caso in cui v=[ 12  13  15  4]
la funzione deve restituire true (esiste il numero 13 presente nella
posizione 1 ) e memorizzare nella variabile puntata da m1 la media
degli elementi (12+15)/2=13.5.
Esercizio 3
Si realizzi un programma che effettua le seguenti operazioni:
1)   Legge (un carattere alla volta) una sequenza di parole, separate
dal simbolo ‘+’, memorizzandole nel vettore di caratteri v e
separandole con ‘\0’. Si assuma che anche la prima parola sia
preceduta dal simbolo ‘+’ e che ogni parola sia composta solo da
lettere o cifre, per cui non si devono memorizzare in v altri
caratteri o spazi intermedi digitati dall’utente.
Crea inoltre un vettore di puntatori chiamato vp, il cui elemento i-
esimo punta alla parola i-esima memorizzata nel vettore v. Per
esempio, nel caso in cui la sequenza in input sia “x +m   1+
m2+m_23\n"     v=[m1\0m2\0m23\0…].
Si assuma che la sequenza in input termini con l’inserimento di ‘\n’,
che il numero massimo di parole sia 80, mentre il numero massimo di
caratteri inseriti dall’utente sia 1000. Si creino a tale scopo i
simboli di costante MAX_P e MAX_C.
a)   Si mostri l’automa a stati finiti che modella tale scenario.
b)   Si crei la funzione leggi che riceve in input i vettori v e vp
come parametri e restituisce il numero di parole lette.

 degli elementi (12+15)/2=13.5.
Non credo.
v[] e' un vettore di cui non conosciamo la lunghezza (come ho detto,
questo e' C; se fosse C++, useresti un std::vector e non avresti
questo problema).
La dichiarazione fa supporre che il vettore sia sempre di DIM valori
(cosa alquanto bizzarra per una funzione, cmq), ma l'esempio dice
chiaramente di no. Non sapendo la lunghezza del vettore, ne' se c'e'
un valore sentinella, non e' possibile risolvere il problema.
Cmq, se la lunghezza fosse passata come parametro (o se si usasse uno
std::vector), il problema sarebbe alquanto semplice no?
* fai un loop sugli elementi pari, somma su un int, castalo da int a
double, e dividi per il numero di elementi
* fai un loop sugli elementi pari, passali a una funzioncina che
calcola se un numero e' primo (non credo sia richiesta una gran
sofisticazione qui :) bastera' controllare il resto della divisione
per tutti i valori dispari minori della radice del numero, ed e'
grasso che cola :) e al primo risultato true ritorna true, se no false
Pleg


Riguardo all'esercizio 1, l'hi compilato su Visual Studio e mi ritorna
"BKEFL+"
Il secondo l'ha svolto cosi :
Bool verifica ( int v (dim) double, *m1 ){
//calcolo la media dei numeri pari di posizione pari
int pos = 0;
for ( int i=0; i< v.length; i+=2 ){
m1 +=  v[i];
pos++;
}
m1 = m1 / pos;
//verifico numero primo
for ( int j=1; j< v.length; j+=2 ){
  int i,tmp=1, bool cont;
  for ( i = 1 ; i <= v[j]; i++){
    if( v[j] % i == 0 )
     tmp += 1;
    else continue;
  }
  if (tmp == 3) return true;
}
return false;
}
Qualche soluzione per l'esercizio 3 ???

Esercizio 2 -  l'ho appena svolto io e mi sembra corretto
#define dim 4
#include <cstdlib>
#include <math.h>
#include <iostream>
using namespace std;
bool IsPrime(int &x);
bool Verifica ( int v[dim], double *m1 );
int main(void) {
   double m1;
   int iArray[] = { 12, 13 , 15, 4};
   bool ris = Verifica(iArray, &m1);
   cout<<m1<<endl;
   cout<<boolalpha<<ris<<endl;
   system("pause");
   return 0;
}
bool Verifica ( int v[dim], double *m1 ){
   //calcolo la media dei numeri pari di posizione pari
   int pos = 0; double somma = 0;
   for ( int i=0; i< dim; i+=2 ){
      somma +=  v;
      pos++;
   }
   *m1 = somma/pos;
   //verifico numero primo
   for ( int j=1; j< dim; j+=2 )
      if(IsPrime(v[j]))
         return true;
   return false;
}
bool IsPrime(int &x){
   bool isPrime = true;
   for(int i = (int)sqrt(double(x)); i > 1; i--) {
      if(!(x%i)) {
         isPrime = false;
      }
   }
   if(isPrime) return true;
   else return false;



nessun altro aiuto????

Questo è il 3 esercizio risolto...potete dare un'occhiata??
#include "stdafx.h"
#include <iostream>
#define MaxC 1000;
#define MaxP 80;
#define Parola 1;
#define Altro 0;
char * cerca(int c, char v[], char * vp[]);
int main(int argc, char* argv[])
{
    printf("Esame\n");
    char c;
    char V[1000];
    char *Vp[80];
    int State;
    int i=0;
    int parole=0;
    while (c=getchar()!='\n')
    {
        switch (State){
        case 1:
            if (c=='+')
            {
                Vp[parole] = &V[i+1];
                V[i]='\0';
                i++;
                parole++;
            }
            if(!((c>='a'&&c<='z')||(c>='A'&&c<='Z'))||c!='+')
            {
                State=0;
                break;
            }
            V[i]=c;
            i++;
            break;
        case 0:
            if (c=='+')
            {
                Vp[parole] = &V[i+1];
                V[i]='\0';
                i++;
                parole++;
            }
            if ((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
            {
                V[i]=c;
                i++;
                State=1;
            }
            break;
        }
    }
     system("Pause");
    return 0;
}

