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

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

Δημοσ.

Έχω μία ερώτηση σχετικά με την c. Πώς μπορώ να αποσυμπιέσω μία συμπιεσμένη συμβολοσειρά που εισάγει ο χρήστης απο το πληκτρολόγιο;;; Δηλαδή ο χρήστης να εισάγει 2t3d και εγώ να πρέπει να του εμφανίζω την συμβολοσειρά tttddd. Σκέφτομαι οτι μπορεί να πάιζει κάτι με  τις συναρτήσεις isalpha και isdigit.Προσπάθησα λίγο με αυτά. Μήπως έχει κανείς καμία ιδέα επί του θέματος ή έναν τρόπο σκέψης που θέλει να μοισραστεί μπας και δουλέψει το πρόγραμμα;;; 

Ευχαριστώ guyss!!

Δημοσ.

Δεν χρειάζεσαι τα isdigit/isalpha καθόλου. Η μορφή των δεδομένων που σου δίνεται είναι συγκεκριμένη. Μια ακολουθία από ζευγάρια αριθμών και χαρακτήρων, Ο αριθμός σου λέει πόσες φορές να επαναλάβεις τον χαρακτήρα. Δες εδώ αν θες περισσότερες λεπτομέρειες επάνω σ' αυτή την μέθοδο συμπίεσης, αν και είναι εξαιρετικά απλή.

https://en.wikipedia.org/wiki/Run-length_encoding

Δημοσ.

Επειδή είμαι καινούργια ,σκέφτομαι πολλόυς τροπους με αποτέλεσμα το ευκολο να το κάνω δυσκολο και να μπερδευομαι απο μονη μου . Το isalpha και το isdigit το σκεφτηκα γιατι λεει αν δεν υπαρχει ψηφίο μπροστα εμφανίζεται μία φορα ο χαρακτήρας. Θα προσπαθήσω να σκεφτω λίγο πιο απλά και αν δω οτι δεν ,θα παραθέσω τον κώδικα μου ! Thanks ! 

Δημοσ.

Δηλαδή θες κάτι που να δουλεύει μόνο με αλφαβητικούς χαρακτήρες? Ρωτάω επειδή αν κάνεις τη χρήση των αριθμών προαιρετική, χάνεις τη δυνατότητα να μπορείς να αντιπροσωπεύσεις όλους τους χαρακτήρες. Για παράδειγμα, το παρακάτω δε μπορεί να συμπιεστεί, επειδή περιλαμβάνει και αριθμούς:

 

dssssjjjjj1000000w
γίνεται:
1d4s5j11601w

εξαρτάται βέβαια πώς θες να αποθηκεύσεις αυτές τις πληροφορίες.

Δημοσ.

Μπερδεψα τον εαυτο μου ,τωρα θα μπερδεψω και σένα . Εγω θέλω να αποσυμπιέσω μία συμβολοσειρά η οποία μπορεί να είναι του τυπου 3t4d και να μου εμφανίσει tttdddd ή μπορει να είναι 3t4dk και να πρεπει να μου εμφανισει tttddddk .Μπροστα απο το k δνε έχει αριθμο αρα πρεπει να το εμφανίσει μόνο μία φορα. Και λέω πωωωωως θα ελεγξω αν έχει μπροστά ψηφίο,χμμμ isdigit και καταμπερδευτηκαααα... Anyways μου έστειλες το run length encoding και το ψάχνω τώρα ,να πειραματιστώ λίγο και αν δεν βγαίνει θα παραθέσω κώδικα και όποιος το δει ,βοηθάει !

Δημοσ.

Σκέφτηκες ότι ο αριθμός μπορεί να είναι και διψήφιος;;;;; (πχ r23kd4rt)

 

Γενικά ο αλγόριθμος είναι ο εξής

times μια μεταβλητή που θα έχει το ποσες φορές θα τυπώσει τον χαρακτήρα

 

Αν διαβαζω χαρακτήρα και το times είναι μηδέν

τυπώνω τον χαρακτήρα μια φορά

αλλιώς Αν διαβάζω χαρακτήρα και το times είναι διαφορετικό από το μηδέν

τυπώνω χαρακτήρα times φορές

κάνω το times μηδεν

αλλιως Αν διαβάζω ψηφίο

αν το times είναι μηδέν 

κάνω το times όσο με το ψηφίο

αλλιώς

κάνω το times  = 10 * (το παλιο times) + το ψηφίο

αλλιώς

τερματίζω

 

Καλό κώδικα!  :-)

Δημοσ.

Τον προσπάθησα τον κώδικα που μου έδωσες όμως ειναι κάθε φορά για έναν χαρακτήρα. Εγώ θέλω ολόκληρο το string ! Απ 'οτι έψαξα η C δεν δέχεται strings.Δημιουργώντας για παράδειγμα έναν πίνακα λοιπόν τύποθ char str []="  "; έχω το εξής πρόβλημα. Αν ήξερα το μέγεθος του πίνακα ,καθώς η συμβολοσειρά δινεται απο τον χρήστη θα μπορούσα να στοιχείο το στοιχείο ,θέση τη θέση ,να ελεγξω αν προκειται για χαρακτήρα ή αριθμό. Πιστεύετε εσείς οτι θα έπρεπε να χρησιμοποιήσω strlen για να πάρω το μέγεθος ή είναι ανώφελο ; :/ 

Όσον αφορά τώρα για το run length encoding θεωρώ πως δεν με βοηθάει γιατί 1ον εγώ προσπαθώ να κάνω decoding και 2ον είμαι πολύ αρχάρια για να μπορέσω να το φτιάξω πάνω στα μέτρα μου και να δουλέψει . Δεν θέλω λύση της άσκησης απλά να μου πείτε πως μπορώ σε έναν πίνακα να διαβάσω χαράκτηρα-χαρακτήρα ;εφαγα τα νιάτα μου να ψάχνω στο ίντερνετ ! :fear:  :-D

 

Ευχαριστώ για την ανταπόκριση btw guys ! :) 

Δημοσ.

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

Οπότε διαβάζεις την είσοδο σε έναν πίνακα char και από εκεί ελέγχεις ένα έναν τους χαρακτήρες.

 

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

Δες Link.png Site: ΕΔΩ πως μπορείς να το κάνεις

 

Όταν το κάνεις αυτό τότε μελετάς πως να δεσμεύσεις δυναμικά χώρο για τον πίνακα όπως για παράδειγμα προτείνει Link.png Site: ΕΔΩ

Δημοσ. (επεξεργασμένο)

Χρειάστηκε να θυμηθώ πολλά για να το κάνω :-)

#include <stdio.h>

int main(void){
  int  sum=0 ;
  char ch;
  printf("Enter the sequence :");
  scanf("%c", &ch);
  while (ch!= '\n')
  {
    if (ch>='A' && sum==0)
	printf("%c", ch);
    else if (ch>='A' && sum!=0 ){
	for (int i=0;i<sum;i++)
	printf("%c", ch);
	sum=0;}
    else 
	sum=sum*10+(ch-'0');
    scanf("%c", &ch);
     }
  
  return 0;
}

Επεξ/σία από k33theod
  • Like 6
Δημοσ.
#include <stdio.h>
#include <string.h>
 
int main ()
{
 
    int i,j,length;
 
    int times;
 
    char str[]=" ";
 
 
    gets(str);
 
    length=strlen(str);
 
    for (i=0;i<=length;i++)
    {
 
 
    if(str>='a'&& str<='z')
      {
 
      printf("%c",str);
 
      }
 
 
 
    else if(str>='1' && str<='9')
    {
        times=(int) str;
 
    }
 
for(i=0;i<=times;i++)
 
    printf("%c",times*str);
}
 
}

Ο κωδικας που σας παράθεσα είναι λάθος αλλα τουλαχιστον τώρα εμαθα !! Σας ευχαριστω !!

Δημοσ.

το 

 

times = (int) str;

 

είναι λάθος γιατί μετατρέπει τον χαρακτήρα στον ASCII κωδικό του. πχ το '5' το κάνει 53

ένας τρόπος είναι να εκμεταλευτείς ότι τα ψηφια είναι διαδοχικά στον ASCII και να γράψεις

 

times = (int)str - int('0');

Δημοσ.

Ενημερωτικά, δε χρειάζεται να castάρετε τους χαρακτήρες, μετατρέπονται σε int από μόνοι τους όταν κάνετε πράξεις μ' αυτούς.

 

times = str[i] - '0';
Δημοσ.

Σας ευχαριστώ όλους για τις απαντήσεις σας . Μπορεί να μην κατάφερα να την λύσω 100% την άσκηση όμως εφτασα σε ενα αρκετα καλό σημειο με την βοηθεια σας και ειμαι ικανοποιημενη αν και αρχαρια !! :-D  :-D  :-)

Δημοσ.

Δες και μια πιο ετσι προσεγγση

 

 



int decode(const char* input, char* output, int szOutput);
int encode(const char* input, char* output, int szOutput);
void print(const char* s);
void fillRandomRepeat(char* input, int len, const char* palet);

int main(int, char**)
{
	char buf[512] = { 0 };
	char buf1[512] = { 0 };
	char *it;
	int ret,i;

	fillRandomRepeat(buf, 511, "abcdefg");
	printf("random data\n");
	print(buf);

	ret = encode(buf, buf1, 511);
	printf("encoded data\n");
	print(buf1);
	ret = decode(buf1, buf, 511);
	printf("decoded data\n");
	print(buf);

	return 0;
}

int decode(const char* input, char* output, int szOutput)
{
	int len = 0;
	const char* it = input;
	int charCount;
	for (;
	{
		charCount = atoi(it);
		if (!charCount)
			charCount = 1; //default;
		for (; !isalpha(*it) && *it; ++it);
		len += charCount + 1;
		if (szOutput < len && output)
			return -1;
		if (output)
			for (; charCount > 0; charCount--)
				*output++ = *it;

		if (*it++ == NULL)
			break;
	}
	return len;
}

int encode(const char* input, char* output, int szOutput)
{
	const char* it = input;
	int len = 0;
	char buf[128];
	int counter = 1;
	char currentChar = *it;

	if (strlen(input) < 2)
		return -1;

	do
	{
		it++;
		if (currentChar != *it)
		{
			if (counter > 1)
			{
				itoa(counter, buf, 10);
				len += strlen(buf);
				if (len > szOutput)
					return -1;
				
				strcpy(output, buf);
				output += strlen(buf);
			}
			if (len++ > szOutput)
				return -1;
			counter = 0;
			*output++ = currentChar;
			currentChar = *it;
		

			
		}
		counter++;
	} while (*it != NULL);
	return len;
}
void print(const char* s)
{
	printf("======= data begin ==========\n%s\n========= data end ============\n", s);
}

void fillRandomRepeat(char* input, int len,const char* palet)
{
	int i, paletSize;
	char r = *palet;
	paletSize = strlen(palet);
	for (i = 0; i < len; i++)
	{
		if (rand() % 100 < 30)
			r = palet[rand() % paletSize];
		input[i] = r;
	}
} 

 

 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...