Sequenza di toni audio ZVEI1 - domanda da principiante

di il
2 risposte

Sequenza di toni audio ZVEI1 - domanda da principiante

Buongiorno a tutti,
sono un novellino del c++ e sto cercando di imparare creando qualche programma a me utile.
Nella fattispecie sto elaborando un programma capace di emettere un "treno" di note secondo lo standard ZVEI1 utilizzato su alcuni apparati radio.
Lo ZVEI1 è così articolato: vi sono tutti i numeri dallo 0 al 9 e le lettere dalla A alla E, a ciascun simbolo è assegnata una frequenza audio.
Il mio obiettivo è: raccogliere il codice a 5 cifre inserito dall'utente secondo lo standard suddetto(può essere misto numeri/lettere), far generare la "melodia" da trasmettere via radio.
Ho iniziato a creare il listato ma mi sono arenato,
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <process.h>

using namespace std;

// array contenente le frequenze corrispondenti ai simboli della codifica ZVEI1 (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
int frequenza_zvei1[16] = {2400, 1060, 1160, 1270, 1400, 1530, 1670, 1830, 2000, 2200, 2800, 810, 970, 885, 2600, 680};
// lunghezza del singolo tono in ms
int t_tono = 40;
// spazio fra ogni singolo tono in ms
int t_spazio = 10;
// codice a 5 cifre che dovrà inserire l'utente
string codice_selettiva = "";
// array riempito con la scomposizione delle cifre costituenti il codice inserito dall'utente
int cifre_sel[5];

int i;

    int main (int argc, char *argv[])
{

   system("color 1E");
   cout << "\nCODIFICATORE ZVEI1" << endl;
while (1>0)
    {
    cout << "\n-------------------------------------------------------------------------" << endl;
    cout << "\nINSERIRE LA SEQUENZA SELCALL E PREMERE INVIO PER GENERARE: \n" << endl;
    cin >> codice_selettiva;
    i = codice_selettiva.length();
    if (i<5 or i>5)
    {
        cout << "\n\a\a\aERRORE - SEQUENZA SELCALL NON CONFORME"<<endl;
        getchar();
        getchar();
        system("cls");
    }
    else
    {
        //DA INSERIRE funzione per creazione dei toni audio DA INSERIRE
        cout << "\nSELCALL INVIATA! VERIFICARE TONO DI RITORNO PER CONFERMA RICEZIONE";
        getchar();
        getchar();
        system("cls");
    }
    }
}
Dunque io pensavo di scomporre il codice a 5 cifre inserito dall'utente e usare la singola cifra come indice dell'array per andare a ripescare la frequenza che mi interessa...il problema è come andare a pescare la frequenza se l'utente inserisce una lettera (che non posso usare come indice).
Per il resto penso di essere in grado di arrangiarmi...almeno credo!
Immagino che il codice che finora ho scritto non sia il massimo della raffinatezza, se qualcuno volesse commentarlo proponendo miglioramenti gliene sarei infinitamente grato! GRAZIE! Nicolò

2 Risposte

  • Re: Sequenza di toni audio ZVEI1 - domanda da principiante

    Inanzitutto togli dal mezzo quei maledetti system("qualcosa").
    Ti posto un pò di codice scritto in c,da dove partire per poi convertirlo in c++ sarà una passeggiata.
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdarg.h>
    #include <windows.h>
    
    ///BASE WINDOWS CONSOLE FUNCTION
    
    void simplegetline(char* line)
    {
        while ( (*line++ = getchar()) != '\n');
        *(--line)='\0';
    }
    
    void gotoxy (short x,short y)
    {
        COORD coord = {x, y};
        HANDLE hconsole  = GetStdHandle(STD_OUTPUT_HANDLE);
        if (hconsole == INVALID_HANDLE_VALUE) return;
        SetConsoleCursorPosition (hconsole,coord );
    }
    
    void cls()
    {
        CONSOLE_SCREEN_BUFFER_INFO csbi;
        const COORD startCoords = {0,0};
        DWORD dummy;
        HANDLE hconsole  = GetStdHandle(STD_OUTPUT_HANDLE);
        if (hconsole == INVALID_HANDLE_VALUE) return;
        GetConsoleScreenBufferInfo(hconsole,&csbi);
        FillConsoleOutputAttribute(hconsole,0,csbi.dwSize.X * csbi.dwSize.Y,startCoords,&dummy);
        FillConsoleOutputCharacter(hconsole,' ',csbi.dwSize.X * csbi.dwSize.Y,startCoords,&dummy);
        gotoxy(0,0);
    }
    
    void textcolor(unsigned short color)
    {
        HANDLE hconsole  = GetStdHandle(STD_OUTPUT_HANDLE);
        if (hconsole == INVALID_HANDLE_VALUE) return;
        SetConsoleTextAttribute(hconsole,color);
    }
    
    void printfk(char* format,...)
    {
        va_list ap;
        va_start(ap,format);
    
        char data[32];
        char* pdata;
        int vap;
        char* pcap;
        double dap;
        int* piap;
        int process;
        while (*format != '\0')
        {
            if (*format != '%')
            {
                putchar(*format);
                ++format;
            }
            else
            {
                pdata = data;
                process = 0;
                while (*format != '\0')
                {
                    *pdata++ = *format++;
                    switch (*format)
                    {
                        case 'd':
                        case 'i':
                        case 'o':
                        case 'u':
                        case 'x':
                        case 'X':
                        case 'c':
                            vap = va_arg(ap,int);
                            *pdata++ = *format++;
                            *pdata = '\0';
                            printf(data,vap);
                            process = 1;
                        break;
                        case 's':
                            pcap = va_arg(ap,char*);
                            *pdata++ = *format++;
                            *pdata = '\0';
                            printf(data,pcap);
                            process = 1;
                        break;
                        case 'e':
                        case 'f':
                        case 'g':
                            dap = va_arg(ap,double);
                            *pdata++ = *format++;
                            *pdata = '\0';
                            printf(pdata,dap);
                            process = 1;
                        break;
                        case 'p':
                        case 'n':
                            piap = va_arg(ap,int*);
                            *pdata++ = *format++;
                            *pdata = '\0';
                            printf(data,piap);
                            process = 1;
                        break;
                        case '%':
                            *pdata++ = *format++;
                            *pdata = '\0';
                            printf(data);
                            process = 1;
                        break;
                        case 'k':
                            if (pdata - data == 1)
                                vap = va_arg(ap,int);
                            else
                            {
                                *pdata = '\0';
                                data[0] = '0';
                                vap = atoi(data);
                            }
                            ++format;
                            textcolor(vap);
                            process = 1;
                        break;
                    }//switch %
                    if (process) break;
                }//while %
            }//is %
        }//every char format
    
        va_end(ap);
    }
    
    int main()
    {
    
        int frequenza_zvei1[16] = {2400, 1060, 1160, 1270, 1400, 1530, 1670, 1830, 2000, 2200, 2800, 810, 970, 885, 2600, 680};
        char read[80];
        int codifica[5];
    
        printfk("%12kCODIFICATORE ZVEI1\n\n");
        printfk("%14kInsert code:%15k");
            simplegetline(read);
        printf ("\n");
    
        int ncodifica;
        for (ncodifica = 0; ncodifica < 5; ncodifica++)
        {
            if (read[ncodifica] >= '0' && read[ncodifica] <= '9')
            {
                codifica[ncodifica] = frequenza_zvei1[read[ncodifica] - '0'];
            }
            else if (read[ncodifica] >= 'A' && read[ncodifica] <= 'F')
            {
                codifica[ncodifica] = frequenza_zvei1[read[ncodifica] - 'A' + 10];
            }
            else if (read[ncodifica] >= 'a' && read[ncodifica] <= 'f')
            {
                codifica[ncodifica] = frequenza_zvei1[read[ncodifica] - 'a' + 10];
            }
            else
            {
                codifica[0] = -1;
                codifica[1] = read[ncodifica];
            }
        }
    
        if (codifica[0] == -1)
        {
            printfk("%12kErrore carattere %c non conosciuto\n",codifica[1]);
            textcolor(7);
            return -1;
        }
        else if (read[ncodifica] != '\0')
        {
            printfk("%12kErrore lunghezza codice errata\n");
            textcolor(7);
            return -2;
        }
    
        textcolor(15);
        printf("Frequenze inserite:\n");
    
        int i;
        for (i=0; i < 5 ; i++)
        {
            printf("[%d] = %d\n",i,codifica[i]);
        }
        return 0;
    }
    
  • Re: Sequenza di toni audio ZVEI1 - domanda da principiante

    Grazie,
    ad essere sincero ci ho capito poco XD comunque vedrò di ragionarci sopra. Ho ancora molto da studiare, sono proprio all'inizio!Grazie 1000 ancora! Nicolò
Devi accedere o registrarti per scrivere nel forum
2 risposte