freestuff.gr αρχική σελίδα
 FAQFAQ    ΑναζήτησηΑναζήτηση   Λίστα ΜελώνΛίστα Μελών   Ομάδες ΜελώνΟμάδες Μελών   <b>Εγγραφή Μέλους</b>Εγγραφή Μέλους 
 ΠροφίλΠροφίλ   Επιλογές μέλους Επιλογές   Τα bookmarks μου Τα bookmarks μου   Προσωπικά μηνύματαΠροσωπικά μηνύματα 
  διαφήμιση  

Καλώς ήρθατε στο forum μας! Για να συμμετάσχετε στις συζητήσεις θα πρέπει να είσαστε μέλος. Γίνετε μέλος τώρα!.

ασκηση C με πινακες


 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Moderators:  Super-Moderators, WebDev Moderators
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [4 Μηνύματα]      Bookmarks Tags: πίνακεςάσκηση Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
ΑποστολέαςΜήνυμα
kousanos


Μέλος από: 24 Ιουν 2009
Μηνύματα: 3

View users profile
ΜήνυμαΣτις: 02 Δεκ 2009 15:53    Θέμα: ασκηση C με πινακες
Περιγραφή θέματος: ασκηση C με πινακες
Απάντηση με παράθεση  Mark this post and the followings unread

εχω μια ασκηση που λεει να της δοσουμε μια λεξη με κεφαλαια και το προγραμμα να βαζει τα κεφαλαια σε ενα νεο πινακα .Θα βρίσκει πρώτα όλα τα φωνήεντα του αλφαριθμητικού και θα αντιστρέφει τη σειρά τους και μετά θα βρίσκει όλα τα
σύμφωνα του αλφαριθμητικού και θα αντιστρέφει τη σειρά τους. Στο τέλος θα τυπώνει στην οθόνη το αποτέλεσμα. εγω εχω φτιαξει μια συναρτηση που να ελεγχει για κεφαλαια αλλη μια για την αντιστροφή των φωνηέντων και αλλη μια για την αντιστροφή των συμφώνων. εχω σκαλωσει και δεν μπορω να ενωσω του πινακες δλδ οταν δινω μονο φωνηεντα ή μονο συμφωνα δουλευει αν τα δωσω ολα μαζι δεν δουλευει...μπορειτε να βοηθήσετε?
κώδικας:

#include<stdio.h>
#include<stdlib.h>
char x[128];
char isupper(char[],int k);
char iscon(char x[],int pos_psifia);
char isvowels(char x[],int pos_psifia);
int pos_psifia,k,i,j,timi;
 main()
{
  printf("dose sim");
  gets(x);
     while(x[i])                                                // find the length of the sting
      {
         i++;
      }
         pos_psifia=i;
         printf("pos_psifia");
         printf("%d",pos_psifia);
   if(pos_psifia>128)
   {
      printf("dosate parapano xaraktires sto string");    //elegxos megethos sumvoloseiras
      exit(0);
   }

   isupper(x,pos_psifia);
    system("pause");
}




/********************************SINARTISEIS*****************************/
char isupper(char x[],int k)
{   
void isvowels(char x[],int c);
char tiposi[128];
char kef[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char sim[]="BCDFGHGKLMNPQRSTVWXYZ";
int i,v=0;
char fon[]="AEOIU";
char sum[]="BCDFGHJKLMNPQRSTVWXYZ";
for(i=0;i<=pos_psifia;i++)
{   timi=0;
   for(k=0;k<=26;k++)
   {
      if(x[i]==kef[k])
         {
            tiposi[i]=kef[k];
            timi=1;
         
         }
   }
      
   if (timi==0)
   {
      printf("oxi");
      exit(0);
   }

}
   puts(tiposi);
   isvowels(x,pos_psifia);
   iscon(x,pos_psifia);
    return(0);
}





   char isvowels(char x[],int pos_psifia)
   {
      char kef[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char sim[]="BCDFGHGKLMNPQRSTVWXYZ";
int i,f,b,fo[128],thesi[128],j,orio,temp_1,m,z,pos_fo,v=0;
char fon[]="AEOIU";
char sum[]="BCDFGHJKLMNPQRSTVWXYZ";
char kai[128];
void iscon(char x[],int pos_psifia);
    j=0;
    f=0;
   for(i=0;i<=pos_psifia;i++)
   {
      for(k=0;k<=4;k++)
      {
         if(x[i]==fon[k])
         {
            fo[j]=i;
            j++;
         
         
         }
      
      }
   }
      //EDO THA BEI IS CONSO
   iscon(x,pos_psifia);
   
   
   pos_fo=j;
   
   
   

   for(i=0;i<pos_fo;i++)
   {
      thesi[i]=fo[i];
   }


   if((pos_fo%2)==0)
   {
      orio=pos_fo/2;
      for(i=0;i<orio;i++)
      {
         temp_1=fo[i];
         fo[i]=fo[pos_fo-i-1];
         fo[pos_fo-i-1]=temp_1;
      }
      for(b=0;b<pos_fo;b++)
      {
         z=thesi[b];
         m=fo[b];
         kai[z]=x[m];
      }
   }
   else if((pos_fo%2)!=0)
   {
      orio=pos_fo%2;
         for(i=0;i<orio;i++)
      {
         temp_1=fo[i];
         fo[i]=fo[pos_fo-i-1];
         fo[pos_fo-i-1]=temp_1;
      }
      for(b=0;b<pos_fo;b++)
      {
         z=thesi[b];
         m=fo[b];
         kai[z]=x[m];
      }
   }


   for (b=0;b<pos_fo;b++)
      printf("%c",kai[b]);
   

}




   char iscon(char x[],int pos_psifia)
   {
char kef[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char sim[]="BCDFGHGKLMNPQRSTVWXYZ";
int i,f,s,b,thesi1[128],su[128],orio,temp_1,m,z,pos_su,v=0;
char fon[]="AEOIU";
char sum[]="BCDFGHJKLMNPQRSTVWXYZ";
char kai[128];
f=0;
   for(i=0;i<=pos_psifia;i++)
   {
      
         for(s=0;s<=20;s++)
      {
         if(x[i]==sum[s])
         {
            su[f]=i;
            f++;
         }
      }
   }
pos_su=f;

   

   for(i=0;i<pos_su;i++)
   {
      thesi1[i]=su[i];
   }

   if((pos_su%2)==0)
   {
      orio=pos_su/2;
      for(i=0;i<orio;i++)
      {
         temp_1=su[i];
         su[i]=su[pos_su-i-1];
         su[pos_su-i-1]=temp_1;
      }
      for(b=0;b<pos_su;b++)
      {
         z=thesi1[b];
         m=su[b];
         kai[z]=x[m];
      }
   }
   else if((pos_su%2)!=0)
   {
      orio=pos_su%2;
         for(i=0;i<orio;i++)
      {
         temp_1=su[i];
         su[i]=su[pos_su-i-1];
         su[pos_su-i-1]=temp_1;
      }
      for(b=0;b<pos_su;b++)
      {
         z=thesi1[b];
         m=su[b];
         kai[z]=x[m];
      }
   
   
    }

   for (b=0;b<pos_su;b++)
      printf("%c",kai[b]);

   }
nkast


Μέλος από: 15 Νοε 2009
Μηνύματα: 137

View users profile Visit posters website
ΜήνυμαΣτις: 31 Δεκ 2009 09:01    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Δεν κατάλαβα!
Η αντιστροφή θα γίνει στον πίνακα με τα κεφαλαία; Η στον αρχικό πίνακα;
Τί θα γίνει αν δώσω και μικρά;

Εστω οτι δίνουμε 'KOUSANOS'.
Θα πρέπει να επιστρέψει
1) 'OAUO' & 'SNSK'
ή
2) 'SOANUSOK' ;

Για το 2 θα πρεπει να δουλεψεις επάνω στον ίδιο πινακα και οχι να μεταφερεις τους χαρακτήρες σε δευτερο.
Αν πάλι είναι το 1 , τι ενοεις δεν δουλευει; δεν παιρνεις το αναμενομενο αποτελεσμα ή σου 'βαραει';

Οπως και αν έχει, τα εχεις κάνει μπάχαλο! ToolTimes at work Προσπάθησε να σπάσεις το προγραμμα σε ποιο κατανοητες λογικες οντότητες.
Οταν βλέπω συνάρτηση isupper καταλαβαίνω οτι κανει κατι πολυ συγκεκριμένο. Αλλα εσυ πας και καλεις τις isvowels(...) & iscon(...) εκει μέσα! Λογικά αυτές θα επρεπε να είναι στο main.

Ξεκίνα απο χαμηλά φτίαχνοντας 3 απλές συναρτήσεις
bool isUpper(char ch);
bool isVowel(char ch);
bool isUpper(char ch);
Αυτές θα παίρνουν ενα χαρακτήρα και θα επιστρέφουν TRUE/FALSE αναλόγος. Μην μπείς στο πειρασμό να βάλεις τίποτα αλλο εκει μεσα πέρα απο αυτο που λέει το ονομα τους.
Συνέχεισε απο εκει και χτίσε σιγα σιγα το πρόγραμμα σου.

Το ποιο σωστό είναι να ξεκινίσεις απο ψηλά προς τα κάτω αλλα δεν μπορω να βοηθείσω γιατι δεν εχω καταλάβει τι ακριβως ζητάει η ασκηση.
alex599


Μέλος από: 17 Δεκ 2008
Βοηθήματα: 3
Μηνύματα: 66

Περιοχή: Πάτρα
View users profile Send email to user
ΜήνυμαΣτις: 31 Δεκ 2009 11:22    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Κατ'αρχήν μάθε να γράφεις πιο καθαρά και αν το πρόγραμμα γίνεται σπαγγέτι στην κυριολεξία έστω και αν χρησιμοποιεις συναρτήσεις, γράφε ΣΧΟΛΙΑ! Να καταλαβαίνουμε τι κάνει κάθε συνάρτηση ή τι δείχνει μια μεταβλητή. Έτσι όπως το βλέπω έχει αρκετά λάθη. Ακόμη τα printf() σου να έχουν πιο καθαρά μηνύματα το printf("oxi") δεν μ λέει τίποτα για το τι ήταν λάθος.

Οι συναρτήσεις δεν χρειάζεται να είναι char αν δεν επιστρέφουν τίποτα! Βάλτες καλύτερα void.
Μετά, με την exit(0) τερματίζει άμεσα το πρόγραμμα και δεν προλαβαίνεις να δεις που έκανε λάθος αν έκανε.

Μετά έχεις έναν πίνακα tiposi στον οποίο πας και βάζεις γράμματα αν είναι κεφαλαία (στην πρώτη συνάρτηση) σε σημεία "άκυρα" δηλαδή (επειδή αρχικά αυτός έχει σκουπίδια) μπορεί να σου βγει αυτό: ΑL@$#%$&L ενώ εσύ έδωσες ALL μόνο και μόνο επειδή το for έτρεχε!

Βάλε έναν counter που αρχίζει από -1 και πάει μέχρι εκεί που βρίσκει κεφαλαία, δηλαδή θα τον αυξάνεις μέσα στο if και θα κάνεις tiposi[counter]=kef[k]. Ακόμη το ίδιο το if πρέπει να βγει έξω από το πρώτο for που έχεις αλλιώς έτσι και το τελευταίο σου γράμμα είναι μικρό το timi γίνεται 0 και μένει έτσι και άρα εκτυπώνεις λάθος μήνυμα. Βάλτο έτσι:

for(i=0;i<=pos_psifia;i++)
{
timi=0;
for(k=0;k<=26;k++)
{
if(x[i]==kef[k])
{
++counter;
tiposi[counter]=kef[k];
timi=1;
}
}
}
if (timi==0)
{
printf("Katholou kefalaia\n");
return ;
}
printf("%s\n",tiposi);

Μέχρι και την πρώτη συνάρτηση είδα..μετά βαρέθηκα να σου πω την αλήθεια. έχεις αρκετά λάθη και δεν είναι καλά γραμμένο. Προσπάθησε το. Αν το δω παραπέρα θα ξαναγράψω..

ΥΓ: Η C δεν υποστηρίζει bool τύπο.

_________________
while(!dead()) ++knowledge;
mariosal
Honorary Member

Μέλος από: 09 Νοε 2007
Βοηθήματα: 1
Νέα: 2
Scripts: 1
Μηνύματα: 256+


View users profile
ΜήνυμαΣτις: 02 Ιαν 2010 23:58    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

Το πρώτο που πρέπει να κάνεις είναι να διορθώσεις το Coding Style σου. Σου προτείνω αυτό το coding style http://www.dionyziz.com/Style

Οι συναρτήσεις isUpper, isLower υπάρχουν στη ctype.h

http://www.cplusplus.com/reference/clibrary/cctype/isupper/

Να δίνεις αγγλικές ονομασίες στο πρόγραμμά σου.
Εμφάνιση Μηνυμάτων:   
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [4 Μηνύματα] Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Τώρα είναι 05 Δεκ 2016 10:31 | All times are UTC + 2


Email This Page to Someone! add to Favorites

     Powered by p h p B B © 2001,2005 p h p B B Group
Για άμεση επικοινωνία με τον διαχειριστή του freestuff.gr στο email: freestuff.gr(παπάκι)gmail.com


Copyright © 1999-2013 Freestuff.gr All Rights Reserved  
Version Aegean, designed by N. Tsaganos