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

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

Δημοσ.

Όταν μπορέσεις στείλτο με π.μ. Λίγο για την έξοδο δεν το κατάλαβα. Τυπώνεις on the fly? Αν όχι, δεν θέλεις και 2η λούπα για το τύπωμα; Αν ναι, το κάνουμε visually 80s style ( :lol:) στα errors?... δηλαδή τυπώνουμε on the fly κι ότι είναι λάθος, το σβήνουμε πάλι on-the-fly με backspace?

 

EDIT:

 

Τώρα που το ξανασκέφτομαι, ούτε πως ελέγχεις χωρίς λούπα το ending-condition έχω καταλάβει :(

 

EDIT2:

 

Για το ending-condition, μήπως το κρατάς σε ξεχωριστό string και ελέγχεις on-the-fly τα i του συγκρινόμενα με το εκάστοτε getchar() κατά την είσοδο?

pm :)
  • Απαντ. 46
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Αν θεωρήσουμε σαν λούπες το τύπωμα string (είτε με puts είτε με printf) τότε δεν γίνεται με μονή λούπα.

Ακόμα κι αν τυπώνεις on-the-fly μετά αν έχει τυπώσει Ν χαρακτήρες και εμφανιστεί μετά ενας χαρακτήρας που δεν επιτρέπεται και πρέπει να σβήσεις με backspace,  τότε χρειάζεσαι άλλη μια λούπα για τα backspace...

 

edit: κι εγώ θέλω pm!!!! :P

Δημοσ.

Ok αφού υπάρχει ενδιαφέρον σε περισσότερους από έναν συμμετέχοντες δεν έχει νόημα να στέλνω σε κάθε έναν ξεχωριστό pm, το βάζω λοιπόν σε spoiler, άλλωστε είναι μια εξεζητημένη λύση που δεν νομίζω να δοκιμάσει κανένας να χρησιμοποιήσει.

 

 

/*
 * Simple like banner "something" by xdir. (r2)
 *
 *  compiled with C++ Buidler
 */
#include <stdio.h>
#include <string.h>
#include <ctype.h>

/* This should be enough (const length is a bit lame/inefficient, I know) */
#define OUTLEN	(BUFSIZ * 4) + 1

int main(void)
{
	char strIn[BUFSIZ],
		 strOut[OUTLEN];

	enum eState { INPUT, PROCESS, OUTPUT, QUIT };

	int nState = INPUT, nInLen, nInChr = 0, nOutChr = 1, isLetter;

	while(nState != QUIT)
	{
		switch(nState)
		{
			case INPUT:
				nInChr = 0;
				nOutChr = 1;

				/*
				 * Read user input, BUFSIZ on C++ Builder is equal to the maximum line
				 *  length of stdin (Win32 Console).
				 */
				printf("Enter text:");

				if(!fgets(strIn, BUFSIZ, stdin))
					putchar('\a');

				/* Empty input? */
				if(*strIn == '\n')
					continue;

				/* Fill strOut with spaces ;-) */
				memset(strOut, ' ', OUTLEN);

				nInLen = strlen(strIn);

				/* Process input while building the output */
				*strOut = '*';

				nState = PROCESS;
				break;
			case PROCESS:
				if(nInChr < nInLen - 1)
				{
					/* Break when input chr. is not in range A-Z or space! */
					if(!(isLetter = isalpha(strIn[nInChr])) && !isspace(strIn[nInChr]))
					{
						printf("Invalid input - %c\n", strIn[nInChr]);
                        nState = INPUT;
					}
					else
					{
						/*
						 * When next input chr. is letter add a leading & trailing
						 *  space else add just one.
						 */
						if(isLetter)
							nOutChr++;

						/* At the same time make sure that output chr. will be in uppercase.. */
						strOut[isLetter ? nOutChr++: nOutChr] = toupper(strIn[nInChr]);
						strOut[(nOutChr += 2) - 1] = '*';
					}

					nInChr++;
				}
				else
					nState = OUTPUT;
				break;
			case OUTPUT:
				strOut[nOutChr] = '\0';

				/* Finish? */
				if(!strcmp(strOut, "* T * H * I * S * * I * S * * T * H * E * * E * N * D *"))
					nState = QUIT;
				else
				{
					puts(strOut);
					nState = INPUT;
                }
				break;
		}
	}

	/* bye!! */
	return 0;
}
ΕΙΣΟΔΟΣ / ΕΞΟΔΟΣ:

Enter text:welcome to samos
* W * E * L * C * O * M * E * * T * O * * S * A * M * O * S *
Υ.Γ.

01. Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder και Windows Console και μπορεί να περιέχει bugs ή άλλες αβλεψίες.

02. Για το indenting δεν μπορώ να κάνω κάτι (σπάει στο paste)

 

  • Like 6
Δημοσ.

Thanks για το ποστ DirectX!

 

Τελικά με λούπες είναι και η έξοδος ( puts() ) και η σύγκριση για stop ( strcmp() ) ;)

 

ΥΓ. Αν ευκαιρήσω αργότερα (πιθανότατα όμως αύριο) θα δοκιμάσω να το κάνω έτσι όπως περιέγραψα, δηλαδή με on-the-fly σύγκριση του κάθε χαρακτήρα εισόδου με τον χαρακτήρα στην αντίστοιχη θέση του sentinel string "* T * H * I * S * * I * S * * T * H * E * * E * N * D *", μήπως τελικά καταφέρουμε να το κάνουμε πραγματικά με μία μόνο λούπα (αν δηλαδή γίνεται).

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

..και μια έκδοση όπου το while αναλαμβάνει να εκτελέσει και τις εργασίες των συναρτήσεων της string.h (strlen, memset, strcmp)

 

 

 

/*
 * Simple like banner "something" by xdir. (r3.1)
 *
 *  compiled with C++ Buidler
 */
#include <stdio.h>
#include <ctype.h>

/* This should be enough (const length is a bit lame/inefficient, I know) */
#define OUTLEN	(BUFSIZ * 4) + 1
#define ENDLEN	55

int main(void)
{
	char strIn[BUFSIZ],
		 strOut[OUTLEN];

	const char *strEnd = "* T * H * I * S * * I * S * * T * H * E * * E * N * D *";

	enum eState { INPUT, MEMSET, LEN, PROCESS, OUTPUT, CMP, QUIT };

	int nState = INPUT, nInLen, nInChr = 0, nOutChr = 1, isLetter;

	while(nState != QUIT)
	{
		switch(nState)
		{
			case INPUT:
				nInChr = nInLen = 0;
				nOutChr = 0;

				/*
				 * Read user input, BUFSIZ on C++ Builder is equal to the maximum line
				 *  length of stdin (Win32 Console).
				 */
				printf("Enter text:");

				if(!fgets(strIn, BUFSIZ, stdin))
					putchar('\a');

				/* Empty input? */
				if(*strIn == '\n')
					continue;

				nState = MEMSET;
				break;
			case MEMSET:
				/* Fill strOut with spaces ;-) */
				if(nOutChr < OUTLEN)
                    strOut[nOutChr++] = ' ';
				else
				{
					strOut[(nOutChr = 1) - 1] = '*';
					nState = LEN;
                }

				break;
			case LEN:
				/* Calculate input length.. */
				if(strIn[nInLen])
					nInLen++;
				else
					nState = PROCESS;
				break;
			case PROCESS:
				/* Process input while building the output */
				if(nInChr < nInLen - 1)
				{
					/* Break when input chr. is not in range A-Z or space! */
					if(!(isLetter = isalpha(strIn[nInChr])) && !isspace(strIn[nInChr]))
					{
						printf("Invalid input - %c\n", strIn[nInChr]);
                        nState = INPUT;
					}
					else
					{
						/*
						 * When next input chr. is letter add a leading & trailing
						 *  space else add just one.
						 */
						if(isLetter)
							nOutChr++;

						/* At the same time make sure that output chr. will be in uppercase.. */
						strOut[isLetter ? nOutChr++: nOutChr] = toupper(strIn[nInChr]);
						strOut[(nOutChr += 2) - 1] = '*';

						nInChr++;
					}
				}
				else
				{
					strOut[nOutChr] = '\0';
					nInChr = 0;
					nState = CMP;
				}
				break;
			case CMP:
				/*
				 * Compare strOut to ENDSTR and decide what to do
				 *  (r3 was buggy - backported from r4)
				 */
				if(nOutChr == ENDLEN)
				{
					if(strOut[nInChr] != strEnd[nInChr])
					{
						nState = OUTPUT;
						nInChr = 0;
					}
					else
						nInChr++;

					if(nInChr == nOutChr)
						nState = QUIT;
				}
				else
					nState = OUTPUT;
				break;
			case OUTPUT:
				/* Finish? */
				if(nInChr < nOutChr)
					putchar(strOut[nInChr++]);
				else
				{
                    putchar('\n');
					nState = INPUT;
				}
				break;
		}
	}

	/* bye!! */
 	return 0;
}
Υ.Γ.

Δυστυχώς δεν έχω χρόνο για περαιτέρω έλεγχο - μπορεί να υπάρχουν bugs ή άλλες αβλεψίες.

 

 

Επεξ/σία από Directx
  • Like 3
Δημοσ.

Πρόλαβε ο φίλος DirectX, on-the-fly τα πάντα, με χρήση του ending-condition ως ξεχωριστό sentinel string για άμεση σύγκριση των i του κατά την είσοδο.

 

Αυτό είναι όντως μια λούπα :)


EDIT:

 

Έτσι όπως το πάμε, σε λίγο θα το κάνουμε assembly :lol:

 

EDIT2:

 

Τελικά είναι 2 λούπες, τώρα παρατήρησα την fgets()! Τέσπα, δεν είμαι τώρα για άλλα ζόρια, έχουν κοκκινήσει τα μάτια μου από το πρωί. Βλέπουμε πάλι από αύριο.

Δημοσ.

Προσθήκη ενός ακόμα state για την ανάγνωση από το πληκτρολόγιο (+ bugfix στον έλεγχο εξόδου) - έφυγε και η fgets.

 

 

/*
 * Simple like banner "something" by xdir. (r4 - insane)
 *
 *  compiled with C++ Buidler
 */
#include <stdio.h>
#include <ctype.h>

/* This should be enough (const length is a bit lame/inefficient, I know) */
#define OUTLEN	(BUFSIZ * 4) + 1
#define ENDLEN  55

int main(void)
{
	char strIn[BUFSIZ],
		 strOut[OUTLEN];

	const char *strEnd = "* T * H * I * S * * I * S * * T * H * E * * E * N * D *";

	enum eState { INPUT, GETCHAR, MEMSET, LEN, PROCESS, OUTPUT, CMP, QUIT };

	int nState = INPUT, nInLen, nInChr = 0, nOutChr = 1, isLetter;

	while(nState != QUIT)
	{
		switch(nState)
		{
			case INPUT:
				nInChr = nInLen = nOutChr = 0;

				/*
				 * Read user input, BUFSIZ on C++ Builder is equal to the maximum line
				 *  length of stdin (Win32 Console).
				 */
				printf("Enter text:");
				nState = GETCHAR;
				break;
			case GETCHAR:
				/* Read stdin until \n */
				if((strIn[nOutChr++] = getchar()) == '\n')
					if(*strIn == '\n')
						nState = INPUT;
					else
					{
						strIn[nOutChr] = '\0';
						nInChr = nInLen = nOutChr = 0;
						nState = MEMSET;
                    }
				break;
			case MEMSET:
				/* Fill strOut with spaces ;-) */
				if(nOutChr < OUTLEN)
					strOut[nOutChr++] = ' ';
				else
				{
					strOut[(nOutChr = 1) - 1] = '*';
					nState = LEN;
                }

				break;
			case LEN:
				/* Calculate input length.. */
				if(strIn[nInLen])
					nInLen++;
				else
					nState = PROCESS;
				break;
			case PROCESS:
				/* Process input while building the output */
				if(nInChr < nInLen - 1)
				{
					/* Break when input chr. is not in range A-Z or space! */
					if(!(isLetter = isalpha(strIn[nInChr])) && !isspace(strIn[nInChr]))
					{
						printf("Invalid input - %c\n", strIn[nInChr]);
                        nState = INPUT;
					}
					else
					{
						/*
						 * When next input chr. is letter add a leading & trailing
						 *  space else add just one.
						 */
						if(isLetter)
							nOutChr++;

						/* At the same time make sure that output chr. will be in uppercase.. */
						strOut[isLetter ? nOutChr++: nOutChr] = toupper(strIn[nInChr]);
						strOut[(nOutChr += 2) - 1] = '*';

						nInChr++;
					}
				}
				else
				{
					strOut[nOutChr] = '\0';
					nInChr = 0;
					nState = CMP;
				}
				break;
			case CMP:
				/*
				 * Compare strOut to ENDSTR and decide what to do
				 *  (r3 was buggy)
				 */
				if(nOutChr == ENDLEN)
				{
					if(strOut[nInChr] != strEnd[nInChr])
					{
						nState = OUTPUT;
						nInChr = 0;
					}
					else
						nInChr++;

					if(nInChr == nOutChr)
						nState = QUIT;
				}
				else
					nState = OUTPUT;
				break;
			case OUTPUT:
				/* Finish? */
				if(nInChr < nOutChr)
					putchar(strOut[nInChr++]);
				else
				{
                    putchar('\n');
					nState = INPUT;
				}
				break;
		}
	}

	/* bye!! */
 	return 0;
}
Μπορεί να υπάρχουν bugs ή άλλες αβλεψίες κλπ.

 

 

Καλή συνέχεια.

  • Like 3
Δημοσ.

Προσθήκη ενός ακόμα state για την ανάγνωση από το πληκτρολόγιο (+ bugfix στον έλεγχο εξόδου) - έφυγε και η fgets.

 

 

/*
 * Simple like banner "something" by xdir. (r4 - insane)
 *
 *  compiled with C++ Buidler
 */
#include <stdio.h>
#include <ctype.h>

/* This should be enough (const length is a bit lame/inefficient, I know) */
#define OUTLEN	(BUFSIZ * 4) + 1
#define ENDLEN  55

int main(void)
{
	char strIn[BUFSIZ],
		 strOut[OUTLEN];

	const char *strEnd = "* T * H * I * S * * I * S * * T * H * E * * E * N * D *";

	enum eState { INPUT, GETCHAR, MEMSET, LEN, PROCESS, OUTPUT, CMP, QUIT };

	int nState = INPUT, nInLen, nInChr = 0, nOutChr = 1, isLetter;

	while(nState != QUIT)
	{
		switch(nState)
		{
			case INPUT:
				nInChr = nInLen = nOutChr = 0;

				/*
				 * Read user input, BUFSIZ on C++ Builder is equal to the maximum line
				 *  length of stdin (Win32 Console).
				 */
				printf("Enter text:");
				nState = GETCHAR;
				break;
			case GETCHAR:
				/* Read stdin until \n */
				if((strIn[nOutChr++] = getchar()) == '\n')
					if(*strIn == '\n')
						nState = INPUT;
					else
					{
						strIn[nOutChr] = '\0';
						nInChr = nInLen = nOutChr = 0;
						nState = MEMSET;
                    }
				break;
			case MEMSET:
				/* Fill strOut with spaces ;-) */
				if(nOutChr < OUTLEN)
					strOut[nOutChr++] = ' ';
				else
				{
					strOut[(nOutChr = 1) - 1] = '*';
					nState = LEN;
                }

				break;
			case LEN:
				/* Calculate input length.. */
				if(strIn[nInLen])
					nInLen++;
				else
					nState = PROCESS;
				break;
			case PROCESS:
				/* Process input while building the output */
				if(nInChr < nInLen - 1)
				{
					/* Break when input chr. is not in range A-Z or space! */
					if(!(isLetter = isalpha(strIn[nInChr])) && !isspace(strIn[nInChr]))
					{
						printf("Invalid input - %c\n", strIn[nInChr]);
                        nState = INPUT;
					}
					else
					{
						/*
						 * When next input chr. is letter add a leading & trailing
						 *  space else add just one.
						 */
						if(isLetter)
							nOutChr++;

						/* At the same time make sure that output chr. will be in uppercase.. */
						strOut[isLetter ? nOutChr++: nOutChr] = toupper(strIn[nInChr]);
						strOut[(nOutChr += 2) - 1] = '*';

						nInChr++;
					}
				}
				else
				{
					strOut[nOutChr] = '\0';
					nInChr = 0;
					nState = CMP;
				}
				break;
			case CMP:
				/*
				 * Compare strOut to ENDSTR and decide what to do
				 *  (r3 was buggy)
				 */
				if(nOutChr == ENDLEN)
				{
					if(strOut[nInChr] != strEnd[nInChr])
					{
						nState = OUTPUT;
						nInChr = 0;
					}
					else
						nInChr++;

					if(nInChr == nOutChr)
						nState = QUIT;
				}
				else
					nState = OUTPUT;
				break;
			case OUTPUT:
				/* Finish? */
				if(nInChr < nOutChr)
					putchar(strOut[nInChr++]);
				else
				{
                    putchar('\n');
					nState = INPUT;
				}
				break;
		}
	}

	/* bye!! */
 	return 0;
}
Μπορεί να υπάρχουν bugs ή άλλες αβλεψίες κλπ.

 

 

Καλή συνέχεια.

 

Ήμουν σίγουρος οτι θα το έκανες κι αυτό!!! ;) :D :D :D :D

Δημοσ.

παιδιά έπρεπε η πρόταση να περικλείεται από   " * ".

προσπαθώ να διορθώσω τον κώδικα που ανάρτησα..αλλά δεν γίνεται τίποτα...ενώ νομίζω πως είμαι κάπως κοντά στην λύση. 

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

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

 

 

  printf("*");
                    metritis++;
                    printf("\n");//προσθέστε την εντολή αυτή γιατί την είχα ξεχάσει 
            printf("dwse mia protasi :\n");
                gets(prot);
                  }
 
        return 0;
}
  • Moderators
Δημοσ.

παιδιά έπρεπε η πρόταση να περικλείεται από   " * ".

προσπαθώ να διορθώσω τον κώδικα που ανάρτησα..αλλά δεν γίνεται τίποτα...

Όταν λες δεν γίνεται τίποτα, μπορείς να είσαι λίγο πιο συγκεκριμένος; Δεν κάνει compile; Πετάει κάποιο σφάλμα όταν το τρέχεις; Τι ακριβώς βγάζει σαν έξοδο;
Δημοσ.

Όταν λες δεν γίνεται τίποτα, μπορείς να είσαι λίγο πιο συγκεκριμένος; Δεν κάνει compile; Πετάει κάποιο σφάλμα όταν το τρέχεις; Τι ακριβώς βγάζει σαν έξοδο;

 

#include<stdio.h>
#include<string.h>
#include<ctype.h>
main()
{
    int i,j,k,metritis,d=0;
    char prot[200],prot1[200];
    printf("dwse mia protasi :\n");
    gets(prot);
    while(stricmp(prot,"END OF PROGRAM")!=0){
 
 
            if(stricmp(prot,"END OF PROGRAM")==0)
                return 0;
            else
             for(i=0;i<strlen(prot);i++){
                 if((prot[i]>=97)&&(prot[i]<=122))
                    prot1[i]=prot[i]-'a' + 'A';
                else
                    prot1[i]=prot[i];
 
            }
            metritis=strlen(prot);
            for(j=0;j<metritis;j++){
                    if(prot1[j]!=32){
                       for(k=0;k<4;k++){
                            printf("*");}}
                    else {
                        for(k=0;k<3;k++){
                            printf("*");
                        }//edw tha einai i proti grammi//
                    }}
                    printf("*");
                    printf("\n");
                    for(i=0;i<metritis;i++)
                    {
                        printf("*");
                        if(prot1[i]!=32){
                            printf("%c",prot1[i]);
                        }
                        else
                            printf("%c",prot1[i]);
                        if(i==metritis-1)
                            printf("*");
                    }
                    printf("\n");
                    for(j=0;j<metritis;j++){
                        if(prot1[j]!=32)
                        {
                            for(k=0;k<4;k++)
                            {
                                printf("*");
                            }
                        }
                        else{
                            for(k=0;k<3;k++)
                                printf("*");
                        }//triti grammi//
                    }
                    printf("*");
                    metritis++;
                    printf("\n");
            printf("dwse mia protasi :\n");
                gets(prot);
                  }
 
        return 0;
}

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα

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