codice:
#include <stdio.h>
#include <stdlib.h> /* I N F O 23.07.2013 h 10.30 */
#include <string.h>
#include <ctype.h>
#define DIM 32
#define archivio "funzione.dat"
#define archivio2 "derivata.dat"
/* Prototipi delle funzioni */
void presenta();
void acquisisci(char *funzione);
void costruiscifx();
int strpos(char *funzione, char *token);
int ScriviFunz(char fxpref[DIM], char nomefile[]);
void elabora();
int LeggiFunz(char fxpref[DIM], char nomefile[]);
int ScriviDer(char fxder[DIM], char nomefile[]);
int LeggiDer(char fxder[DIM], char nomefile[]);
char radice[1];
int lun,lfx,lfsin,lfdes,lprimofdes;// variabili lunghezza funzione: primitiva,sottoalberosx, sottoalberodx
int indprimarad; // posizione prima radice della funzione
char fxprefissa[DIM]="";
char derivata[DIM]="";
char token[18]={'+','-','*','/','^','1','2','3','4','5','6','7','8','9','s','c','x','\0'};// vettore dei token ammessi
char funzione[DIM];
int j; // indice vettore dei token ammessi
int trovato=0; // flag esito ricerca token
char fdes[DIM]=""; // sottoalberodx
char fsin[DIM]=""; // sottoalberosx
char sim[DIM]; // appoggio singolo carattere della funzione
int passo,esiste;
int main(int argc, char *argv[]) {
presenta();
acquisisci(funzione);// acquisizione funzione derivanda
costruiscifx();
elabora();
LeggiDer(derivata, archivio);
printf("\nderivata prima della funzione = %s\n ",derivata);
system("PAUSE");
return 0;
}
void costruiscifx(){
lun=strlen(funzione);lfx=lun;
passo=0;
j=0;//indice dei caratteri ammessi
while (strlen(fxprefissa)<lfx){
while (trovato==0){
lun=strlen(funzione);
strcpy(sim,&token[j]);
lfsin=strpos(funzione,sim);
if(lfsin==-1) // lfsin= posizione della radice
{/* elemento non trovato */ }
else{passo++;
strncpy(radice,sim,1);
trovato=1;
memset(fsin, '\0', sizeof(fsin)); // inizializza la stringa col carattere di terminazione
strncpy(fsin,funzione,lfsin);
lfdes=lun-(lfsin+1);
if (passo==1) {indprimarad=lfsin;lprimofdes=lfdes;}
memset(fdes, '\0', sizeof(fdes)); // inizializza la stringa col carattere di terminazione
strncpy(fdes,&funzione[lfsin+1],lfdes);
strcat(fxprefissa,radice);strcpy(funzione,"");
strcpy(funzione,fsin);strcat(funzione,fdes);
if(lfsin==1)
{
strcat(fxprefissa,fsin);strcpy(funzione,"");
strcpy(funzione,fdes);
}
}
j++;
}
j=0;
trovato=0;
}
printf("\nScrittura su file...\n");
ScriviFunz(fxprefissa, archivio);//il file dati viene scritto
return;
}
void elabora(){
int coseno=1;int seno=1;int ele=0;
int j,coeff,grado,app;
char cc[DIM];//carattere corrente della funzione prefissa
char tri[3];// variabile temporanea per contenere sx o cx
char auxco[3];
char auxgr[3];
char segno[2];
memset(segno, '\0',sizeof(segno));
esiste=LeggiFunz(fxprefissa, archivio);
if (esiste==1){
lun=strlen(fxprefissa);
coeff=1;
memset(cc, '\0', sizeof(cc));
memset(tri, '\0', sizeof(tri));
strncat(segno,&fxprefissa[0],1);
j=0;//indice dei caratteri ammessi
while ((j<lun)&&(coseno!=0)){j++; // cerca la presenza della funzione coseno -
memset(cc, '\0', sizeof(cc));
strncat(cc,&fxprefissa[j],1);
coseno=strcmp(cc,"c");
app=atoi(cc);
if ((app>=1)&&(app<=9)){coeff=coeff*app;grado=0;}
}
j=0;//indice dei caratteri ammessi
while ((j<lun)&&(seno!=0)){j++; // cerca la presenza della funzione seno
memset(cc, '\0', sizeof(cc));
strncat(cc,&fxprefissa[j],1);
seno=strcmp(cc,"s");
}
j=0;//indice dei caratteri ammessi
while ((j<lun)&&(ele==0)){j++; // cerca la presenza della funzione seno
memset(cc, '\0', sizeof(cc));
strncat(cc,&fxprefissa[j],1);
if(strcmp(cc,"^")==0) {ele=j;coeff=atoi(&fxprefissa[ele-1]);grado=atoi(&fxprefissa[ele+2]);coeff=coeff*grado;};
}
memset(derivata, '\0', sizeof(derivata));
if(coseno==0) {//coseno trovato il segno della derivata cambia
strcpy(tri,"sx");
if (strcmp(segno,"-")==0) {strcpy(derivata,"+");}
else {strcpy(derivata,"-");}
}
if(seno==0) {//il segno della derivata non cambia
strcpy(tri,"cx");
strcat(derivata,segno);
}
if(ele!=0) {
if (grado>1){//derivata di termine di grado > 1
grado--;itoa(coeff,auxco,10);itoa(grado,auxgr,10);
strcat(derivata,"*");strcat(derivata,auxco);strcat(derivata,"^x");strcat(derivata,auxgr);strcat(derivata,tri);
}
else
if (grado=1){//derivata di termine di grado = 1
itoa(coeff,auxco,10);
strcat(derivata,auxco);strcat(derivata,tri);
}
}
else { strcat(derivata,tri);} //derivata della costante
ScriviDer(derivata, archivio2);
}
else printf("Impossibile aprire in lettura il file %s\n", archivio);
return;
}
int ScriviFunz(char fxpref[DIM], char nomefile[])
{
FILE *fp;
fp = fopen(nomefile, "w");
if( fp == NULL)
{
printf("Impossibile aprire in scrittura il file %s\n", nomefile);
return 0;
}
fwrite(fxpref,32,1,fp);
return 1;
}
int LeggiFunz(char fxpref[DIM], char nomefile[])
{
FILE *fp;
printf("\nLettura funzione derivanda da file... ");
fp = fopen(archivio, "r");
if( fp == NULL)
{
printf("\nL'archivio non esiste. Impossibile aprire in lettura il file %s\n", fp);
return 0;
}
fread(fxpref,32,1,fp);
return 1;
}
int ScriviDer(char fxder[DIM], char nomefile[])
{
FILE *fp;
fp = fopen(nomefile, "w");
if( fp == NULL)
{
printf("Impossibile aprire in scrittura il file %s\n", nomefile);
return 0;
}
fwrite(fxder,32,1,fp);
return 1;
}
int LeggiDer(char fxder[DIM], char nomefile[])
{
FILE *fp;
printf("\nLettura derivata prima della funzione da file... ");
fp = fopen(nomefile, "r");
if( fp == NULL)
{
printf("\nL'archivio non esiste. Impossibile aprire in lettura il file %s\n", fp);
return 0;
}
fread(fxder,32,1,fp);
return 1;
}
void presenta(){
printf("\n\Inserire la funzione da derivare osservando le seguenti regole:\n");
printf("\nI termini goniometrici ammessi sono:\n");
printf("\n\tdigitare sx = per ottenere: sen(x)");
printf("\n");
printf("\n\tdigitare cx = per ottenere: cos(x)");
printf("\n");
printf("\nI monomi ammessi sono:\n");
printf("\n\tdigitare 3*x^1 per ottenere: 3* x (elevato a 1)");
printf("\n");
printf("\n\tdigitare 4*x^3 per ottenere: 4* x (elevato a 3)\n");
printf("\n\t\tEsempio: 8*x^3-cx \n");
printf("\nDigitare la funzione:");
}
void acquisisci(char *funzione){
fgets(funzione,DIM,stdin);
funzione[strlen(funzione)-1] = 0;
}
int strpos(char *funzione, char *token){
//dichiarazioni
int i,j,n,l;
//inizializzazioni
l=1;
n = strlen(funzione)-l+1;
//calcoli
for(i=0;i<n;i++){
for(j=0;j<l&&token[j]==funzione[i+j];j++);
if(j==l)
return i;// restituisce la posizione del token all'interno della stringa funzione
}
return -1;// restituisce -1 poiché il token corrente non corrisponde ad alcun carattere della funzione
}
Qualcuno sa come calcolarlo?