Jump to content
Rpg²S Forum
  • 0

Alcuni dubbi sulle basi del C


Tio
 Share

Question

Allora: ho iniziato a seguire il corso di programmazione e oggi abbiamo iniziato a creare i nostri primi programmi.. cose molto semplici, però non ho preso appunti a penna e non mi ricordo alcuni comandi di base che avevamo usato nell'esercitazione (e che dovremo usare agli esami).. vi dico precisamente qual'è il problema.

 

Usando Dev-C++, stavo cercando di costruire questo programma semplicissimo:

#include <stdio.h>
main(){int a,b,c;
printf("scrivi 3 numeri e trovo la somma\n");
scanf("%d %d %d",&a, &b, &c);
printf("\n%d", a+b+c);

  }

se premo f9 me lo fa partire, mi fa scrivere i numeri, premo invio e me lo chiude subito senza visualizzarmi la somma.. ricordo che in laboratorio prima della parentesi graffa finale avevamo scritto 2 righe, però non ricordo precisamente com'erano scritte.. mi pare che una fosse getchar() e l'altra fflushqualcosa.. però non ricordo precisamente come si scrivono, in che ordine e voglio sapere precisamente a cosa servono entrambi XD

grazie a tutti quelli che mi aiuteranno e scusate i dubbi scemi XD

EDIT: risolto xD le righe erano fflush(stdin) e getchar().. appena ho bisogno di altri aiuti (molto presto XD ) continuo ad usare sto topic..

"Dopo gli ultimi Final Fantasy, ho capito solamente una cosa: che il gioco è bello quando Nomura poco."

Making is not dead. You are dead.
RELEASE: La Bussola d'Oro | Download | Video di anteprima - La Partenza di Hanna

http://i.imgur.com/cFgc2lW.png

Prova Standrama!

Link to comment
Share on other sites

  • Answers 101
  • Created
  • Last Reply

Top Posters For This Question

Top Posters For This Question

Recommended Posts

  • 0
p=&cognomi;

questo è l'errore, manca di compatibilità dimensionale

non consideri inoltre che per tutti i giri del for guarderai sempre lo stesso elemento perché nel do while ridefinisci sempre p

io metterei

p = cognomi[i];

 

p++, che anche con p definito bene non si muove come vorresti (inoltre lo resetti!) perché si muove di un char in avanti nella stringa]

puoi anche definire p come

char ** p;
p = cognomi,
scanf("%s",p[i]);

I Miei Script:
Salva Schermata (3 Aprile 2012)
Attacco Personalizzabile (2 Aprile 2012)
Keyboard Input (Porting) (17 Marzo 2012)
Continua...

Link to comment
Share on other sites

  • 0

Non so quanto ve ne freghi, cmq ho preso 25 e 26 (programmazione e laboratorio) :P

E tutto grazie ai miei tutor personali che mi hanno aiutato in questo topic, in particolare Keroro XD

 

non ho il coraggio di leggere l'ultimo post di Keroro, credo che non toccherò il C finchè non inizia il secondo semestre (quando tornerò per farmi aiutare in strutture dati) XD

"Dopo gli ultimi Final Fantasy, ho capito solamente una cosa: che il gioco è bello quando Nomura poco."

Making is not dead. You are dead.
RELEASE: La Bussola d'Oro | Download | Video di anteprima - La Partenza di Hanna

http://i.imgur.com/cFgc2lW.png

Prova Standrama!

Link to comment
Share on other sites

  • 0

#include <time.h>
#include <stdio.h>

int main(int argc,char *argv[]){
time_t tempo = time(0);
struct tm * data = gmtime(&tempo);

printf("%d/%d/%d\n",data->tm_mday,data->tm_mon+1,data->tm_year+1900);
	
return 0;
}

 

quindi

int giorno = data->tm_mday;
int mese = 1+ data->tm_mon;
int anno = data->tm_year+1900;

 

edit: naturalmente devi fare free(data); prima dell'uscita del programma, l'avevo dimenticato :)

Edited by Keroro

I Miei Script:
Salva Schermata (3 Aprile 2012)
Attacco Personalizzabile (2 Aprile 2012)
Keyboard Input (Porting) (17 Marzo 2012)
Continua...

Link to comment
Share on other sites

  • 0

Rieccomi qui a rompere.

Ho iniziato da una settimana "Algoritmi e strutture dati", e sto già impazzendo per 2 esercizi.

Bando alla ciance cmq, ecco il primo:

Il coefficiente binomiale fornisce il numero totale di gruppi di k elementi che si possono formare disponendo di un totale di n elementi. Ad esempio, se ad una festa ci sono 10 persone che non si conoscono e che si vogliono presentare, il numero totale di strette di man sarà dato da tutte le coppie possibili, ovvero 45, il coefficiente binomiale di 10 su 2.

 

Ricorsivamente può essere definito come:

(N su K) = (N-1 su K)+(N-1 SU K-1)

 

Scrivere un programma C per calcolare un coefficiente binomiale.

Proporre sia una soluzione ricorsiva che iterativa.

Io sono riuscito a fare solamente quella iterativa.. le funzioni ricorsive le ho anche capite bene nella teoria, ma in questo caso mi esce difficile perchè bisogna passare 2 valori alla funzione.

Quella iterativa l'ho fatta così e mi dà giusta:

#include <stdio.h>

int main()
{int i,j;
float n,k,soluzione=0;

do {
printf("valore di n: "); scanf("%f",&n);
printf("valore di k: "); scanf("%f",&k);
if (n<k || k<=0) printf("valori non validi\n");
} while(n<k || k<=0);

for(i=n-1;i>0;i--)
{
for(j=k-1;j>0;j--)
soluzione+=(i/j);
printf("\n");
}

printf("la soluzione e': %f",soluzione);

fflush(stdin);getchar();

return 0;}

Quella ricorsiva non riesco proprio a farla, e sto cercando di capirla da una settimana..

 

Secondo esercizio: questo qui è ancora più incasinato, quasi nessun mio collega c'è riuscito.

Bisogna farlo sia ricorsivamente che iterativamente, ma va bene anche solamente in modo ricorsivo.

In un sistema di numerazione le cifre assumono i valori compresi tra 0 e BASE-1. Si vogliano generare tutti i numeri costituiti da NDATI cifre.
BASE e NDATI siano forniti da tastiera.

Ad esempio, per BASE=2 ed NDATI=3 il programma dovrà restituire la sequenza:
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

Io son riuscito a trovare il numero di righe (che si ottiene da BASE elevato NDATI), ma non riesco ad andare oltre XD Ho provato tutti i calcoli immaginabili, ma non riesco a trovare un procedimento logico per far uscire i numeri in così tante sequenze possibili.

"Dopo gli ultimi Final Fantasy, ho capito solamente una cosa: che il gioco è bello quando Nomura poco."

Making is not dead. You are dead.
RELEASE: La Bussola d'Oro | Download | Video di anteprima - La Partenza di Hanna

http://i.imgur.com/cFgc2lW.png

Prova Standrama!

Link to comment
Share on other sites

  • 0
Ho iniziato da una settimana "Algoritmi e strutture dati", e sto già impazzendo per 2 esercizi.

Fai per caso Ingegneria Informatica, perchè io ho un corso con lo stesso nome, solo che si programma in c++, invece che in c.

Detto questo ecco l'esercizio l'avevo fatto a suo tempo quando facevo fondamenti di informatica I, è in c++, ma la base è la stessa.

#include <iostream>
using namespace std;

int binomiale(int n, int k)
{
if (n<k || k<0)return -1;
if (n==k || k==0) return 1;
return (binomiale(n-1,k) + binomiale(n-1,k-1));
}
int main()
{
int n,k;
cin >> n >> k;
 if(binomiale(n,k)==-1)cout<<"errore dati non corretti"<<endl;
 else cout<<"binomiale:"<<binomiale(n,k)<<endl;
system("Pause");
return 0;
}

Per l'altro è piuttosto complicato ci penso un po' e poi lo posto.

http://www.rpg2s.net/awards/bestscripter1.jpg

Se avete bisogno di modifiche, correzioni o creazioni da zero di script RGSS, allora visitate la mia bottega.

La bottega di Sylaer

Link to comment
Share on other sites

  • 0

Faccio informatica e basta ^^

Grazie mille cmq.. era più semplice del previsto, stavo facendo ragionamenti molto più complessi XD

Aspetto per l'altro esercizio :F

"Dopo gli ultimi Final Fantasy, ho capito solamente una cosa: che il gioco è bello quando Nomura poco."

Making is not dead. You are dead.
RELEASE: La Bussola d'Oro | Download | Video di anteprima - La Partenza di Hanna

http://i.imgur.com/cFgc2lW.png

Prova Standrama!

Link to comment
Share on other sites

  • 0

Ho risolto anche il secondo esercizio, non ho avuto molto tempo per lavorarci, quindi la versione ricorsiva non ce l'ho, questa è la versione iterativa, sempre in c++.

int combina(int n, int k)
{
for(int i=0;i<(int)pow(n,k);i++)
{
		for(int j=k-1;j>=0;j--)
		{
				cout<<(i/(int)pow(n,j))%n <<' ';
		}
		cout<<endl;
}
}

http://www.rpg2s.net/awards/bestscripter1.jpg

Se avete bisogno di modifiche, correzioni o creazioni da zero di script RGSS, allora visitate la mia bottega.

La bottega di Sylaer

Link to comment
Share on other sites

  • 0

Inizializza un array di interi (eventualmente di char se vuoi sfruttare anche basi maggiori di 10) con NDATI elementi (ovviamente cominciamo con tutti uguali a 0).

A questo punto fai un ciclo che non fa altro che modificare l'ultima cifra dell'arrey e ogni volta sputa fuori il numero.

Quando arrivi a i=base-1, controlli di non aver finito (tutti gli elementi dell'arrey=base-1), quindi resetti a 0 l'ultima casella e incrementi la casella a fianco (che ovviamente segue la stessa identica regola per il riporto).

Non mi smebra difficile...

fu BMX, Bator, e quant'altro

 

Niente firma dinamica...

Link to comment
Share on other sites

  • 0
Secondo esercizio: questo qui è ancora più incasinato, quasi nessun mio collega c'è riuscito.

mio dio che branco di noobs XD braccia rubate all'agricoltura u,u

 

ecco una soluzione con una funzione ricorsiva scritta in 10 min e neanche testata, rileggendo per postare ho visto il msg di lino, l'abbiamo pensata uguale =D (non sono solo :biggrin: )

 

struct cifra {
unsigned char c; //base minore di 256 (metti int se vuoi usare basi più grandi) 
}

struct cifra * numero = NULL;

//stampanum(numero,base,dati);
//prima di chiamarla controlla base <256 e ndati > 0
void stampanum(struct cifra * num,int BASE,int NDATI){
int i,riporto = 1,fine = 0;	
//alloca
if (!num) num = (struct cifra*)calloc(NDATI,sizeof(struct cifra));
//stampa
for (i =0; i<NDATI; i++) printf(" %d ",num[i].c);
printf("\n");
//incrementa
i = NDATI-1;
num[i].c++;
do {
	if (num[i].c < BASE-1)
		riporto = 0;
	else {
		num[i].c = 0;
		if (i<=0) fine = 1;
		else num[--i]+=1;
	}
}while (riporto && (!fine));
if (!fine) stampanum(num,BASE,DATI);
else free(num);
}

 

EDIT: modificato printf("%d"); in printf(" %d ");

Edited by Keroro

I Miei Script:
Salva Schermata (3 Aprile 2012)
Attacco Personalizzabile (2 Aprile 2012)
Keyboard Input (Porting) (17 Marzo 2012)
Continua...

Link to comment
Share on other sites

  • 0

Scusa Keroro, ma che gusto c'è a trovare la soluzione di questo esercizio con gli array e le strutture, è troppo facile.

Tio ti ho fatto anche quello ricorsivo, sempre in c++.

#include "math.h"
int modline(int n,int k, int i)
{
if(k==0){cout << i%n<<endl;return 0;}
cout<<(i/(int)pow(n,k))%n<<' ';
return modline(n,k-1,i);
}
int combina(int n,int k,int i=-1)
{
 if(i==-1)i=(int)pow(n,k)-1;
 if(i==0)return modline(n,k-1,i);
 combina(n,k,i-1);
 return modline(n,k-1,i);
}

http://www.rpg2s.net/awards/bestscripter1.jpg

Se avete bisogno di modifiche, correzioni o creazioni da zero di script RGSS, allora visitate la mia bottega.

La bottega di Sylaer

Link to comment
Share on other sites

  • 0
Scusa Keroro, ma che gusto c'è a trovare la soluzione di questo esercizio con gli array e le strutture, è troppo facile.
in realtà è solo una stringa mascherata per rendere il programma estensibile

è che preferisco scrivere soluzioni comprensibili piuttosto che impelagarmi con algoritmi matematici :D

 

#include "math.h"

int modline(int n,int k, int i)

{

if(k==0){cout << i%n<<endl;return 0;}

cout<<(i/(int)pow(n,k))%n<<' ';

return modline(n,k-1,i);

}

int combina(int n,int k,int i=-1)

{

if(i==-1)i=(int)pow(n,k)-1;

if(i==0)return modline(n,k-1,i);

combina(n,k,i-1);

return modline(n,k-1,i);

}

I Miei Script:
Salva Schermata (3 Aprile 2012)
Attacco Personalizzabile (2 Aprile 2012)
Keyboard Input (Porting) (17 Marzo 2012)
Continua...

Link to comment
Share on other sites

  • 0

Anch'io sono convinto che sia meglio un algoritmo più comprensibile, e se avessi dovuto programmarlo per utilizzarlo da qualche parte non avrei di certo scelto una roba matematica così complicata, e soprattutto non avrei mai usato le funzioni ricorsive(visto che col mio algoritmo se immetti 1 e 16 come valori, ti crasha per troppa roba nella stack).

Visto che questo è solo un esercizio il cui scopo principale è, presumo imparare come programmare le funzioni ricorsive e iterative, non ha senso usare array o altro.

http://www.rpg2s.net/awards/bestscripter1.jpg

Se avete bisogno di modifiche, correzioni o creazioni da zero di script RGSS, allora visitate la mia bottega.

La bottega di Sylaer

Link to comment
Share on other sites

  • 0

Grazie a tutti XD

L'unica cosa è che di C++ ne so meno di niente.. cosa fanno precisamente il comando cout e tutti quei

"Dopo gli ultimi Final Fantasy, ho capito solamente una cosa: che il gioco è bello quando Nomura poco."

Making is not dead. You are dead.
RELEASE: La Bussola d'Oro | Download | Video di anteprima - La Partenza di Hanna

http://i.imgur.com/cFgc2lW.png

Prova Standrama!

Link to comment
Share on other sites

  • 0
Si scusa Tio, ma a me hanno insegnato a programmare in c++ e non in c quindi non so come si usano le print o printf o scan e compagnia. In c++ esiste una semplice libreria che definisce una classe di stream di ingresso(cin) e di uscita(cout), sono classi quindi non sono supportate dal c.

http://www.rpg2s.net/awards/bestscripter1.jpg

Se avete bisogno di modifiche, correzioni o creazioni da zero di script RGSS, allora visitate la mia bottega.

La bottega di Sylaer

Link to comment
Share on other sites

  • 0

Sto facendo un altro esercizio dove c'è un errore che veramente non mi spiego..

L'esercizio consiste nel creare un programma dove, dato un labirinto di 0 e 1, bisogna trovare la via d'uscita passando per gli 0 partendo da un certo punto (i bordi del labirinto sono tutti posti a 1).

Il problema non sta nell'algoritmo di ricerca percorso, ma nel main.

Il main è questo qui:

main()
{	 
  int i,j;
 
  printf("LABIRINTO:\n\n");
  for(i=0;i<N+2;i++)
  for(j=0;j<P+2;j++) 
  {lab[i][j]=rand()%2;
  if (i==0 || j==0 || i==N+1 || j==P+1 ) lab[i][j] = 1;}

//queste sono delle posizioni che ho creato per far generare un percorso completo.. niente d'importante cmq
  lab[1][1]=0;
  lab[3][2]=0;
  lab[10][8]=0;	
  
  for(i=0;i<N+2;i++)
  {for(j=0;j<P+2;j++) printf("%2d",lab[i][j]);
  printf("\n");}

  path();
  
  fflush(stdin);getchar();}

Da qui praticamente creo il labirinto con 0 e 1 casuali, poi ho assegnato a 0 un paio di variabili per fare in modo che esista un percorso di 0 dall'inizio alla fine. Poi stampa il labirinto e chiama la funzione di ricerca percorso.

E qui mi accade una cosa senza senso:

se lascio il richiamo alla funzione path() (che viene fatto dopo la stampa su video del labirinto), praticamente nella prima riga mi cambia alcuni 1 in 0 (quando invece dovrebbero essere tutti 1 perchè è il bordo del labirinto), nonostante la stampa venga fatta prima.

Se invece elimino il richiamo alla funzione di ricerca, il labirinto viene stampato nel modo giusto (però ovviamente non c'è il richiamo alla funzione che è la cosa su cui si basa l'esercizio XD ).

 

Posto pure gli elementi importanti che ho stampato prima del main..

#define N 10
#define P 10
int lab[N+2][P+2];

 

Cmq, nel caso l'errore fosse nell'esercizio completo, lo posto qui.. avverto però che è incasinato da capire senza sapere prima la logica che c'è dietro XD

 

#include <stdio.h>
#include <stdlib.h>
#define N 10
#define P 10
#define RIGA_USCITA 9
#define COL_USCITA 8
#define MAX_RIGA 12
#define MAX_COL 12

typedef struct {
	int vert;
	int orizz;
	} offset;
	
offset mossa[8] = {(-1,0),(-1,1),(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1)};
	
typedef struct {
	int riga;
	int col;
	int dir;} elemento;

elemento stack[N*P];

int lab[MAX_RIGA][MAX_COL];
int top=-1;
//int base=-1;
int RIGA_ENTRATA =1; int COL_ENTRATA = 1;

void add(int *top, elemento item)
{ //aggiunge un elemento alla coda
if (*top >= N*P-1){
				  printf("\ncoda piena!");
				  return;}
stack[++*top] = item;
}

elemento del(int *top)
{ //elimina il primo elemento dalla coda
if (*top==-1) printf("\ncoda vuota!");
else
return stack[(*top)--];
}	  
  
void path(void)
{
int i, j, riga, col, riga_succ, col_succ, dir, trovato = 0;
elemento posizione;
int segna[MAX_RIGA][MAX_COL];

for(riga=0;riga<MAX_RIGA;riga++)
 for(col=0;col<MAX_COL;col++) segna[riga][col]=0;
segna[1][1] = 1; top = 0;
stack[0].riga = RIGA_ENTRATA; stack[0].col = COL_ENTRATA; stack[0].dir = 0;
while(top>-1 && !trovato){
posizione = del(&top);
riga = posizione.riga; col=posizione.col; dir =posizione.dir;
while(dir<8 && !trovato) {
riga_succ= riga + mossa[dir].vert;
col_succ = col + mossa[dir].orizz;

if(riga_succ==RIGA_USCITA && col_succ==COL_USCITA) trovato=1;
else if(!lab[riga_succ][col_succ] && !segna[riga_succ][col_succ]) {
segna[riga_succ][col_succ] = 1;
posizione.riga = riga; posizione.col = col; posizione.dir = ++dir;
add(&top,posizione);
riga = riga_succ; col = col_succ; dir = 0;
}
else ++dir;
}
}
   if (trovato){
	   printf("il percorso e':\n");
	   printf("riga col dir\n");
	   for(i=0;i<=top;i++)
	   printf("%2d%5d%5d\n",stack[i].riga,stack[i].col,stack[i].dir-1);
	   printf("\n%2d%5d%",riga,col);
	   printf("\n%2d%5d%",RIGA_USCITA,COL_USCITA);
	   }
	   else printf("il labirinto non ha un percorso di uscita\n");
	   
	   
  }
   }

main()
{	 
  int i,j;
 
  printf("LABIRINTO:\n\n");
  for(i=0;i<N+2;i++)
  for(j=0;j<P+2;j++) 
  {lab[i][j]=rand()%2;
  if (i==0 || j==0 || i==N+1 || j==P+1 ) lab[i][j] = 1;}

  lab[1][1]=0;
  lab[3][2]=0;
  lab[10][8]=0;	
  
  for(i=0;i<N+2;i++)
  {for(j=0;j<P+2;j++) printf("%2d",lab[i][j]);
  printf("\n");}

  path();
  
  fflush(stdin);getchar();}

 

 

"Dopo gli ultimi Final Fantasy, ho capito solamente una cosa: che il gioco è bello quando Nomura poco."

Making is not dead. You are dead.
RELEASE: La Bussola d'Oro | Download | Video di anteprima - La Partenza di Hanna

http://i.imgur.com/cFgc2lW.png

Prova Standrama!

Link to comment
Share on other sites

  • 0
Sinceramente, non c'ho capito niente. Cosa devi fare nell'esercizio? E' un labirinto quello in ingresso fatto da 0 e 1, ma è una matrice, e il programma cosa deve fare?

http://www.rpg2s.net/awards/bestscripter1.jpg

Se avete bisogno di modifiche, correzioni o creazioni da zero di script RGSS, allora visitate la mia bottega.

La bottega di Sylaer

Link to comment
Share on other sites

  • 0

Il labirinto è costruito tramite una matrice di 0 e 1. Data l'entrata (posizione riga 1, colonna 1) e l'uscita (posizione riga 9, colonna 8), il programma deve dire se esiste un percorso passando solamente per gli 0, e in seguito dire le coordinate.. L'algoritmo di ricerca è un po' strano come funziona (l'abbiamo fatto a lezione.. cmq ogni posizione viene memorizzata in una coda, poi viene provata ogni direzione dove c'è uno 0 in cui non si è ancora passati.. e se si arriva in un vicolo cieco, viene eliminata dalla coda la posizione memorizzata per poi continuare a provare le direzioni dalla posizione precedente finchè non si arriva alla fine o finchè lo stack non è vuoto, ovvero non ha trovato una strada).

Aldilà dell'algoritmo, il problema me lo dà proprio nel main però XD

Da qui praticamente creo il labirinto con 0 e 1 casuali, poi ho assegnato a 0 un paio di variabili per fare in modo che esista un percorso di 0 dall'inizio alla fine. Poi stampa il labirinto e chiama la funzione di ricerca percorso.

E qui mi accade una cosa senza senso:

se lascio il richiamo alla funzione path() (che viene fatto dopo la stampa su video del labirinto), praticamente nella prima riga mi cambia alcuni 1 in 0 (quando invece dovrebbero essere tutti 1 perchè è il bordo del labirinto), nonostante la stampa venga fatta prima.

Se invece elimino il richiamo alla funzione di ricerca, il labirinto viene stampato nel modo giusto (però ovviamente non c'è il richiamo alla funzione che è la cosa su cui si basa l'esercizio XD ).

"Dopo gli ultimi Final Fantasy, ho capito solamente una cosa: che il gioco è bello quando Nomura poco."

Making is not dead. You are dead.
RELEASE: La Bussola d'Oro | Download | Video di anteprima - La Partenza di Hanna

http://i.imgur.com/cFgc2lW.png

Prova Standrama!

Link to comment
Share on other sites

  • 0

a me non da questo problema, questo:

 

http://img382.imageshack.us/img382/6370/immaginegy7.th.png

 

è quello che ho ottenuto mandando in esecuzione, l'unica modifica che ho fatto per poter compilare con visualc++ 6.0 è stata :offset mossa[8] = {{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};

Fiero membro della:

[img]http://img87.imageshack.us/img87/9409/yumenosoftgw5.png[/img]

[url="http://rpg2s.net/forum/index.php?showtopic=1529"][img]http://img225.imageshack.us/img225/8845/tenshibanxd5.png[/img][/url] [color="#0000FF"][b]A [i][url="http://yumeno.altervista.org/"][color="#9932CC"]YumeNo-Soft[/color][/url][/i] Production[/b][/color]
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share


×
×
  • Create New...