Προς το περιεχόμενο

Εργασια λειτουργικα σε c


irini22

Προτεινόμενες αναρτήσεις

Δημοσ.

greatst το σε ποιόν αριθμό αντιστοιχεί ο χαρακτήρας δεν έχει να κάνει με την C οπότε προφανώς δεν υπάρχει στο πρότυπο της. Από κει και πέρα, άμα ο άλλος δεν βαράει ηρωήνες πριν σχεδιάσει character set, οι αριθμοί θα είναι στην σειρά.

 

το c - 'a' είναι ποίο portable και ευανάγνωστο σαν κώδικας από το c - 97.

 

edit: Και αμα ανοίξεις του c manual του kernighan έτσι θα τον δεις να έχει γράψει κώδικα.

  • Απαντ. 42
  • Δημ.
  • Τελ. απάντηση
Δημοσ.
greatst το σε ποιόν αριθμό αντιστοιχεί ο χαρακτήρας δεν έχει να κάνει με την C οπότε προφανώς δεν υπάρχει στο πρότυπο της.

...

 

Δεν νομίζω ότι είναι τόσο "αθώα" τα πράγματα... :-)

 

Ρίξε μια ματιά στο Misconception 4 στη διεύθυνση http://www.cpp-software.net/documents/c_misconceptions.html :shifty:

Δημοσ.

Θεωρητικά συμφωνώ μαζί σου, σε πρακτικό επίπεδο (και σε θεωρητικό από την πλευρά των character tables) όμως ο κώδικας αυτός δουλεύει και θα δουλεύει για πολλά χρόνια ακόμα διότι βασίζεται στην θέση των Αγγλικών χαρακτήρων όπως ορίζονται στο standard (7-bit) ASCII Character Table το οποίο καθορίζει την αύξουσα θέση των κεφαλαίων και μικρών αγγλικών χαρακτήρων από το 1967-8 και μετά (ουσιαστικά παραθέτει το αγγλικό αλφάβητο μια φορά στα κεφαλαία και μια φορά σε πεζά), οπότε πρακτικά κάθε λειτουργικό σύστημα που ακολουθεί το συγκεκριμένο de facto πλέον ASCII Standard εγγυάται ως implementation ότι ο κώδικας θα δουλέψει όπως πρέπει (από τον ZX Spectrum ως τα σύγχρονα PC :D).

 

Τώρα αν κάποιος στοχεύει σε κάποιο διαφορετικό character table standard (πχ. EBCDIC) από το 7bit ASCII table τα πράγματα μπορεί να διαφέρουν αλλά όσον αφορά τον έλεγχο τις αγγλικής αλφαβήτου που εμπίπτει στο 7bit ASCII Table είναι τόσο σπάνια περίπτωση (σε πρακτικό επίπεδο πάντα) που αν δεν έχεις πραγματικά καλούς λόγους να ασχοληθείς μαζί της είναι άνευ σημασίας.

 

Υ.Γ.

Οι θέσεις των αγγλικών χαρακτήρων του 7bit ASCII Standard έχουν περάσει στις ίδιες θέσεις και στο Unicode char-set αποδεικνύοντας την καθολική του αποδοχή.

 

Είναι λογικό το ANSI C Standard να μην ασχολείται με αυτό το ζήτημα διότι ξεφεύγει από τους σκοπούς του, τούτα τα θέματα αφορούν character sets standards οπότε λόγο έχει το 7bit ASCII και άλλα ανάλογα standards.

Δημοσ.

Α ρε ΤΕΙ Λαμίας και κ.Αντωνή μας τρως την ψυχή!:devil: Πάλι καλά τα πέρασα τα λειτουργικά :lol: αλλά αυτή την εργασία δεν πρέπει να την είχα σωστή...:whistle: Οπότε μη περιμένεις να μπορώ να στη δώσω. Sorry...

Καλή επιτυχία...:-)

Δημοσ.
τει λαμιας η εργασια σωστα irini22?Την ιδια εχω αλλα ρε παιδια προσπαθηστε και λιγο να την προχωρησετε μονοι σας και γενικα για να κανετε Post κατι φταστε ως ενα σημειο και ρωτηστε κατι ποιο συγκεκριμενο οπως π.χ. τι ειναι ο αλγοριθμος Vigenere και πως υλοποιειται.Ουτε εγω ξερω αλλα ψαχνω και σιγουρα κατι θα βρω

 

γεια εχω κ εγω την ιδια εργασία κ θα ηθελα να ρωτησω αν ξερεις τιποτα για τον αλγόριθμο Vigenere???

Δημοσ.
γεια εχω κ εγω την ιδια εργασία κ θα ηθελα να ρωτησω αν ξερεις τιποτα για τον αλγόριθμο Vigenere???

 

>/*-Vigenere Cipher Demo (c) by Directx-(non Autoclave Cipher version)----------------*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

/*
* Pragmas for CodeGear/Borland C-Compilers.
*/
#ifdef __BORLANDC__
   #pragma hdrstop
#endif

/*-C custom function prototypes----------------------------------------------*/
char **_MakeVigenereMatrix(void);
char **_KillVigenereMatrix(char**,int);

/* Standard English Alphabet [26]
*
* If you change this value, you must also review the local _MakeVigenereMatrix 
* function variable: pszAlphabet.
*/
#define    _VIGENERE_ALPHABET_LEN    26
#undef    _VIGENERE_GREEK_TABULA_RECTA

#ifdef _DEBUG
   void   _DebugVigenere(char**,int);
#endif

#ifdef __BORLANDC__
   #pragma argsused
#endif
int main(int argc, char* argv[])
{
   char **pbyVigenereMatrix = NULL;
   int nPlainChar, nDecrypt = 0;

   printf("Vigenere Cipher Example by Directx\n\n");
        
   if(argc<3 || argc>4)        
       printf(" Usage: VIGENERE password plaintext [-d]\n");
   else
    {         
       /*
        * Password should be up to 26 characters wide.
        */
       if(strlen(argv[1])>_VIGENERE_ALPHABET_LEN)
           printf(" Input Error: Very long password - \"%s\"\n",argv[1]);
       else
        {
           /*
            * Do we want to de-crypt a Vigenere?
            */
           if(argc==4)         
            if(!strcmp(argv[3],"-d") || !strcmp(argv[3],"-D"))
               nDecrypt = 1;

           /*
            * Create an English Vigenere Cipher-Matrix ("Tabula Recta").
            */
           if((pbyVigenereMatrix=_MakeVigenereMatrix())==NULL)
               printf(" System Error: Not enough memory for Vigenere Cipher!\n");        
           else
            {
               #ifdef _DEBUG
                   _DebugVigenere(pbyVigenereMatrix,_VIGENERE_ALPHABET_LEN);
                   putchar('\n');
               #endif

               printf(" Key\t:%s\n %s\t:%s\n %s\t:",argv[1],
                                                    (nDecrypt)?"Cipher":"Plain:",
                                                    argv[2],                
                                                    (!nDecrypt)?"Cipher":"Plain:");

               /*
                * Apply Vigenere Cipher (or de-cipher) on argv[2] using 
                * key stored on argv[1]..
                */
               for(nPlainChar=0;nPlainChar<strlen(argv[2]);nPlainChar++)
                {      
                   int    nVigenereKeyA = nPlainChar % strlen(argv[1]),
                       nCol, nRow,
                       nVigenereKeyB = -1,
                       nLetterIndex;            

                   /*
                    * Encrypt or de-crypt?
                    */                                         
                   if(nDecrypt)
                    {
                       /* 
                        * Decipher Vigenere.
                        */
                       for(nCol=0;nCol<_VIGENERE_ALPHABET_LEN;nCol++)
                        {
                           char *pszCharIdx;
                       
                           if(isalpha(argv[1][nVigenereKeyA]))
                            {
                               if(pbyVigenereMatrix[nCol][0]==toupper(argv[1][nVigenereKeyA]))
                                {
                                   if((pszCharIdx = memchr(&pbyVigenereMatrix[nCol][0],
                                                            toupper(argv[2][nPlainChar]),
                                                            _VIGENERE_ALPHABET_LEN))==NULL)
                                    {
                                       nVigenereKeyB = -3;
                                       break;
                                    }

                                   nLetterIndex = pszCharIdx-&pbyVigenereMatrix[nCol][0];

                                   printf("%c",nLetterIndex+'A');
                                   nVigenereKeyB = 1;
                                }                             
                            }
                        }
                    }
                   else
                    {
                       /*
                        * Cipher Vigenere.
                        */
                       for(nCol=0;nCol<_VIGENERE_ALPHABET_LEN;nCol++)
                        {                     
                           if(isalpha(argv[2][nPlainChar]))                 
                            {
                               if(pbyVigenereMatrix[nCol][0]==toupper(argv[1][nVigenereKeyA]))
                                 {
                                   nVigenereKeyB = 1;
                                   nLetterIndex = toupper(argv[2][nPlainChar])-'A';

                                   printf("%c",pbyVigenereMatrix[nCol][nLetterIndex]);                        
                                   break;
                                 }            
                            }
                           else
                               nVigenereKeyB=-2;                    
                       }
                    }                         

                   /*
                    * Some short of Vigenere fault?
                    */
                   if(nVigenereKeyB==-1)
                    {
                       printf(" \a\n\nUnexpected error: Cannot find Vigenere key column (%c)\n",argv[1][nVigenereKeyA]);
                       break;
                    }                 
                   if(nVigenereKeyB==-2)
                    {
                       printf(" \a\n\nVigenere error: Plain text contains illegal character '%c'\n",argv[2][nPlainChar]);
                       break;
                    }
                   if(nVigenereKeyB==-3)
                    {
                       printf(" \a\n\nUnexpected error: Cannot find Vigenere key row (%c)\n",argv[2][nPlainChar]);
                       break;
                    }                                  
               }

               /*
                * Free Vigenere Cipher-Matrix and other program resources..
                */
               pbyVigenereMatrix = _KillVigenereMatrix(pbyVigenereMatrix,_VIGENERE_ALPHABET_LEN+1);
            }
        }
    }
   
   /*
    * Confirm quit.
    */
   printf("\n\nPress Enter to exit..");
   getchar();

   return 0;
}
/*---------------------------------------------------------------------------*/
char **_MakeVigenereMatrix(void)
{
   /*
    * Build a standard Vigenere Matrix for the English language.
    */
   char **pbyVigenere = NULL,
         *pszAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
                       /*01234567890123456789012345*/
   int nCol, nRow, nChar;

   /*
    * Create a Vigenere Matrix -2D- C array..
    */            
   if((pbyVigenere=calloc(_VIGENERE_ALPHABET_LEN+1,sizeof(int)))==NULL)
       return NULL;        
   for(nCol=0;nCol<_VIGENERE_ALPHABET_LEN+1;nCol++)
    if((pbyVigenere[nCol]=calloc(_VIGENERE_ALPHABET_LEN+1,sizeof(int)))==NULL)
     {
       /* 
        * On error attempt to get rid of the incomplete
        * Vigenere Cipher-Matrix..
        */
       return _KillVigenereMatrix(pbyVigenere,nCol-1);
     }
   
   /*
    * Fill Vigenere Matrix with multi-Ceasar cipher-lines..
    */
   for(nCol=0;nCol<_VIGENERE_ALPHABET_LEN;nCol++)
    {
       #ifdef _VIGENERE_GREEK_TABULA_RECTA
           nChar = pszAlphabet[0];
           memmove(pszAlphabet,&pszAlphabet[1],strlen(pszAlphabet)-1);     
           pszAlphabet[_VIGENERE_ALPHABET_LEN-1] = nChar;
       #endif        

       for(nRow=0;nRow<_VIGENERE_ALPHABET_LEN;nRow++)
           pbyVigenere[nCol][nRow] = pszAlphabet[nRow];
       
       #ifndef _VIGENERE_GREEK_TABULA_RECTA
       /*
        * Scroll pszAlphabet:
        *  ABCDEF <- BCDEFA
        *            CDEFBA
        *              DEFBAC
        *                ...    
        */     
       nChar = pszAlphabet[0];
       memmove(pszAlphabet,&pszAlphabet[1],strlen(pszAlphabet)-1);     
       pszAlphabet[_VIGENERE_ALPHABET_LEN-1] = nChar;
       #endif
    }

   /*
    * Return 2D Vigenere Matrix..
    */
   return    pbyVigenere;
}

char **_KillVigenereMatrix(char **pbyVigenereMatrix,int nDimensions)
{
   /*
    * De-allocate pbyVigenereMatrix.
    */
   int nCol, nRow;

   for(nCol=0;nCol<nDimensions;nCol++)
       free(pbyVigenereMatrix[nCol]);
   free(pbyVigenereMatrix);    

   return (pbyVigenereMatrix = NULL);
}

#ifdef _DEBUG
void   _DebugVigenere(char **pbyVigenereMatrix,int nDimensions)
{
   /*
    * Print a Vigenere Cipher-Matrix on Stdout.
    */
   int nCol, nRow, nRowNumber = 1;

   printf("   ");
   for(nRow=1;nRow<=nDimensions;nRow++)
       printf("%d",nRow%10);
   putchar('\n');    
   printf("   ");    
   for(nRow=1;nRow<=nDimensions;nRow++)
       printf("-");
   printf("\n");

   for(nCol=0;nCol<nDimensions;nCol++)
    {
       for(nRow=0;nRow<nDimensions;nRow++)
        {
           if(nRowNumber)
            {
               printf("%.2d ",nCol+1);
               nRowNumber = 0;
            }                             
           putchar(pbyVigenereMatrix[nCol][nRow]);
        }
       putchar('\n');
       nRowNumber = 1;
   }        
}
#endif

 

 

αυτο ισως σε βοηθησει.Συγνωμη που αργησα να απαντησω απλα ελλειπα και δεν ειχα ιντερνετ

 

---------- Το μήνυμα προστέθηκε στις 05:26 ----------

 

Α παιδια επισης να σας πω οτι η narbi εχει κανει τουλαχιστον ενα λαθος στον κωδικα της με βαση την εκφωνηση.

 

Το ονομα του αρχειου που αποθηκευονται τα αποτελεσματα της εντολης ps -A πρεπει να περαστει σαν παραμετρος και οχι οπως το εχει δωσει στη system ως processes.txt

>system("ps -A>myfolder/processes.txt");

Δημοσ.

Για περισσότερες πληροφορίες σχετικά με τον παραπάνω κώδικα διαβάστε, εδώ: http://www.insomnia.gr/forum/showpost.php?p=1784494&postcount=88

 

Ασχολήθηκε με το Vigenere cipher για την πλάκα μου το 2007 οπότε ο κώδικας δεν αποσκοπεί να αποτελέσει λύση σε ασκήσεις κτλ απλά είναι μια εφαρμογή του τρόπου που θα εφάρμοζε ένα κρυπτογράφος εκείνης της εποχής το Vigenere που περιγράφει ο Simon Singh στο βιβλίο του "Κώδικες και Μυστικά".

 

Τώρα αν βοηθήσει έχει καλός αν όχι θα πρέπει να το ψάξετε μόνοι σας.

 

Από εκεί και πέρα καλή τύχη σε όλους!!

:-)

Δημοσ.

@T-spoilerGR: Ο κώδικας που έχω δώσει εδώ σαν τελικό είναι μακρυά από τη σωστή και πλήρη λύση της άσκησης..Είναι απλά μια προσπάθεια... Κι εκτός από αυτό με τη system που λες δε νομίζω ότι γίνεται σωστά κ το encryption-decryption...

Δημοσ.

μια μικρή παρατήρηση να κάνω πάνω στον κώδικα σου :

1)δεν δημιουργείς πουθενά το αρχείο key.txt το οποίο δίνεις ως παράμετρο , η συνάρτηση filetoarray δημιουργεί έναν πίνακα K[letteres] πίνακα αλλά χωρίς τπτ μέσα .

2)στην συνάρτηση getInt ελένχεις αν το γράμμα είναι κεφαλαίο ή μικρό και το αποτέλεσμα της πράξης c=(a+k)%N; θα είναι πάντα μικρότερο του 25 το οποίο αντιστιχεί σε χαρακτήρες ΝULL SOH STX βλεπε ascii table. c=65+(a+k)%N; μάλλον είναι πιο σωστό αλλα τα κωδικοποιεί όλα κεφαλαία ...

 

αυτά απο εμένα , έκανες πάρα πολύ καλή δουλεία και μας βοήθισες πολύ με την εργασία μας :) :)

Δημοσ.

γεια και εμεις την ιδια εργασια εχουμε καταφεραμε να κανουμε το παρακατω αλλα μας βγαζει στην πρωτη printf error κανεις βοι8εια?

#include<unistd.h>

#include<stdio.h>

#include <stdlib.h>

#include<sys/types.h>

 

main(int argc,char *argv)

{

int Rtvalue,i;

 

Rtvalue=fork(); /*Dimiourgia diergasias*/

 

if(Rtvalue==0){

printf("\n Thygatriki Diergasia");

system("mkdir Askisi1");

system("ps -A >>Askisi1/file.txt");

exit(0);

}

else{ /*Goniki Diergasia*/

printf("\n Goniki Diergasia") ;

encrypt(argc, argv);

}

return 0;

}

int encrypt(int argc, char *argv[])

{

 

FILE *fp;

char *pin, *key,a;

int i, c=0, j=0;

 

 

 

 

if(argc!=4) { //elegxos orismatwn

printf("\n Error");

return 0;

}

 

if((fp=fopen("file.txt", "r"))==NULL) { //diavasma to arxiko file

printf("\n lathos sto file1");

exit(1);

}

pin=malloc(sizeof(char)); //dhmiourgia xorou sti mnimi iso me 1 xaraktira gia gemisma pinaka pin

for(c=0;(pin[c]=fgetc(fp))!=EOF;c++) pin=realloc(pin, sizeof(char)*(c+1)); //dhmiourgia xwrou isou me to arxiko

fclose(fp);

 

 

 

if((fp=fopen(argv[2], "r"))) { //diavasma to kleidi

printf("\n Cannot open file");

exit(1);

}

key=malloc(sizeof(char));

for(c=0;(key[c]=fgetc(fp))!=EOF;c++) key=realloc(key, sizeof(char)*(c+1));

fclose(fp);

 

 

if((fp=fopen(argv[3], "w"))==NULL) { //dhmiourgia arxeiou

printf("\n Cannot open file ");

exit(1);

}

for(i=0;pin!=EOF;i++){

if(key[j]==EOF) j=0;

fprintf(fp, "%c", ((pin-'a'+key[j]-'a')%26)+'a'); //pernaei ton kryptografimeno xaraktira sto arxeio

j++;

 

}

fclose(fp);

 

return 0;

}

Άσκηση

Να κατασκευάσετε ένα πρόγραμμα το οποίο δημιουργεί μια νέα διεργασία. Η θυγατρική διεργασία θα δημιουργεί ένα νέο κατάλογο και θα τοποθετεί εκεί ένα αρχείο που θα περιέχει το αποτέλεσμα της εκτέλεσης της εντολής ps -Α. Θα εμφανίζει όλες τις ταυτότητες διεργασιών που ανήκουν στην ίδια ομάδα με αυτή.

Η γονική διεργασία θα κρυπτογραφεί το παραπάνω αρχείο, χρησιμοποιώντας ένα κλειδί από ένα άλλο αρχείο εισόδου και θα γράφει σε ένα τρίτο αρχείο την έξοδο της πράξης κρυπτογράφησης Τα τρία παραπάνω αρχεία θα δίνονται ως παράμετροι.

Η κρυπτογράφηση θα γίνει με χρήση του αλγόριθμου Vigenere. Ο αλγόριθμος αυτός εργάζεται ως εξής: τα γράμματα του αλφαβήτου κωδικοποιούνται με αριθμούς με αρχή το μηδέν. Δηλαδή το Α αντιστοιχεί στο 0, το Β στο 1, το C στο 2, κλπ. Ο αλγόριθμος παίρνει το κείμενο εισόδου και προσθέτει σε αυτό το κείμενο που αντιστοιχεί στο κλειδί, τοποθετώντας τα γράμματα το ένα κάτω από το άλλο και προσθέτοντας τα γράμματα που είναι στην ίδια θέση. Αν το κείμενο του κλειδιού είναι μικρότερο από αυτό του κειμένου εισόδου, τότε επαναλαμβάνεται. Για παράδειγμα παρακάτω κρυπτογραφείται το κείμενο SECURE με τη λέξη KEY για κλειδί:

S EC URE

KEY KEY

Η πράξη της κρυπτογράφησης είναι η εξής: c=(a+k)mod n, όπου a είναι ένα γράμμα του κειμένου εισόδου, k είναι το αντίστοιχο γράμμα κλειδιού, c το κρυπτογραφημένο γράμμα και n το σύνολο των γραμμάτων του αλφαβήτου. Οπότε στο παραπάνω παράδειγμα το κρυπτοκείμενο που θα παραχθεί θα είναι: CΙAEVC.

Η υλοποίηση της άσκησης θα γίνει ως εξής: πρώτα θα διαβάζονται τα κείμενα του κλειδιού και του αρχικού κειμένου από τα αντίστοιχα αρχεία τους και αφού τοποθετηθούν σε πίνακες, θα ακολουθεί η πράξη κρυπτογράφησης. Οι πίνακες που θα χρησιμοποιηθούν πρέπει να είναι δυναμικοί και σε καμιά περίπτωση στατικοί. Για το λόγο αυτό θα χρησιμοποιηθούν οι γνωστές συναρτήσεις δέσμευσης μνήμης malloc και realloc.

Επίσης, το πρόγραμμα που θα κατασκευαστεί θα πρέπει να κάνει έλεγχο λαθών κατά τη σύνταξη της εντολής με κατάλληλη έκδοση διαγνωστικών μηνυμάτων.

  • 1 μήνα μετά...
Δημοσ.

Μια λύση για την εν λόγω άκσηση μπορείτε να βρείτε εδώ. Όσοι ενδιαφέρονται ακόμη για να μάθουν μιας κ το εξάμηνο τελείωσε...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...