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

Ερωτήσεις για C


capoelo

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

anyway :)

 

έψαξα και βρήκα οτι η getchar() επιστρέφει το ASCII value (σε δεκαδικη μορφη )

για εναν μονο χαρακτηρα κατι μας ειπαν τωρα :D

 

τελοςπαντων... απο οσο διαβασα δεν πρεπει να δινεις αριθμους στην getchar()

δεν ειναι για αυτο το πραγμα προορισμενη. Θα ειχα περιεργεια παντως

να δω πως το λυνει ο τυπος. Τι χρησιμοποιει να το λυσει απο την στιγμη που δεν εχει μιλησει

ουτε για πινακες , ουτε για δεικτες , ουτε για συμβολοσειρες και ουτε για την atoi() και την

επεξεργασια εισοδου σαν string κτλπ. Θα ειχα πραγματικα μεγαλη περιεργεια. Δεν θα ασχοληθω αλλο

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

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

Μια ακόμη εκδοχή σε C δίχως switch, δείκτες αλλά μόνο με stdio.h (& πίνακα εισόδου), έτσι για την ιστορία:

 

 

>
/*
* Telephone Alphabet in C without switch and nothing but stdio.h
* xdir.
*/

#include <stdio.h>

int main(void) {

char In[bUFSIZ];

while(1)
{
	printf("Phone number or Enter to quit:");

	if(!fgets(In, BUFSIZ, stdin))
		perror("STDIN");
	else
	{
		int Chr;

		if(In[0] == '\n') /* Exit? */
			break;

		for(Chr = 0; In[Chr] != '\0'; Chr++)
		{
			int Digit = In[Chr] - '0'; /* Convert ASCII chr. to integer */

			if(Digit >= 0 && Digit <= 9)
				putchar(In[Chr]); /* Print numbers */
			else
			{
				if(In[Chr] >= 'a' && In[Chr] <= 'z')
					In[Chr] -= 32; /* Make it uppercased */

				if(In[Chr] < 'A' || In[Chr] > 'Z') /* Print non alphabet chrs. */
					putchar(In[Chr]);
				else
				{
					if(In[Chr] >= 'A' && In[Chr] <= 'C') putchar('2');
					if(In[Chr] >= 'D' && In[Chr] <= 'F') putchar('3');
					if(In[Chr] >= 'G' && In[Chr] <= 'I') putchar('4');
					if(In[Chr] >= 'J' && In[Chr] <= 'L') putchar('5');
					if(In[Chr] >= 'M' && In[Chr] <= 'O') putchar('6');
					if(In[Chr] >= 'P' && In[Chr] <= 'S') putchar('7');
					if(In[Chr] >= 'T' && In[Chr] <= 'V') putchar('8');
					if(In[Chr] >= 'W' && In[Chr] <= 'Z') putchar('9');
				}
			}
		}
	}
}

return 0;
}

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έχω τον παρακάτω κώδικα,ο οποίος υλοποιεί το κρυπτοσύστημα του Καίσαρα(κάθε γράμμα κωδικοποιείται με το επόμενο του).Θέλω μόνο να το βελτιώσω ώστε να μην εμφανίζει αυτό που πληκτρολογώ αλλά απευθείας την κρυπτογράφηση.Πως μπορώ να το κάνω;

 

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

 

int main(void)

{

char ch;

 

printf("Enter your message: \n");

ch=getche();

 

while(ch!='\r')

{

printf("%c",ch+1);

ch=getche();

}

 

system("Pause");

 

return 0;

}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

>
#include <stdlib.h>
#include <conio.h>

int main( void )
{
char c;

_cprintf("Enter your message: ");
while ( '\r' != (c=getch()) )
	_putch( c+1 );
_putch( '\n' );

system("pause");
return 0;
}

 

Ο αλγόριθμός σου είναι λάθος όμως, στον Καίσαρα πρέπει να κάνει rotate (π.χ. το επόμενο του 'z' να είναι το 'a').

 

ΥΓ. Βάζε τους κώδικες που ποστάρεις στο φόρουμ μέσα σε [ code] [ /code] tags (χωρίς τα κενά μετά τα [ )

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ο κρυτπαλγοριθμος του Καίσαρα πρέπει να δέχεται και μια πρόσθετη ποσότης...

 

The key....

 

 

Where is the key??? :D

 

Αυτη ειναι και η βασική διαφορα της κρυπτογράφησης με την κωδικοποίηση.

Στην κρυπτογραφηση πρεπει να ξές το κλειδι για να κάνεις τους μετασχηματισμούς σου.

 

Εχεις διαβάσει τον αλγόριθμο πριν σκεφτείς να τον κάνεις σε C?

 

http://en.wikipedia.org/wiki/Caesar_cipher

 

 

Kαλη Ανάσταση - Καλο πάσχα σε όλους.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βασικα επειδη ξαναφρεσκάρω τους πίνακες δοκιμασα να κάνω μια μπαρούφα οπως αυτη ->

 

>

#include<stdio.h>
#define LEN 2

int main(void)
{
int array[LEN][LEN]={{0}};
int i , j;

printf("\n * Before filling * ");

for(i=0; i<LEN; i++)
for(j=0; j<LEN; j++)
  printf("\n array[%d][%d] = %d " , i , j , array[i][j]);
   
printf("\n * After filling * ");

array[LEN][LEN]={ { 0 , 1 } , { 2 , 3 } };

	for(i=0; i<LEN; i++)
	for(j=0; j< LEN; j++)
  printf("\n array[%d][%d] = %d " , i , j , array[i][j]);

   return 0;
}

 

Oποτε ο compiler αρχισε να γκρινιαζει ->

 

> tests2.c:17: error: expected expression before ‘{’ token  

 

Λογικα αυτο εγινε επειδη δεν μπορεις να κανεις αρχικοποιηση 2 φορες. Το initialization γινεται μοναχα μια φορα ενω εκχωρησεις μεσα στο loop στον πινακα μπορω να κανω οσες θέλω (οσο και το μηκος του) για να ειμαστε και 100% ακριβεις χωρις καποιο overflow :D

 

Οποτε το διόρθωσα καπως ετσι

 

> 
#include<stdio.h>
#define LEN 2

int main(void)
{
int array[LEN][LEN]={{0}};
int i , j , count=0;

printf("\n * Before filling * ");

for(i=0; i<LEN; i++)
for(j=0; j<LEN; j++)
  printf("\n array[%d][%d] = %d " , i , j , array[i][j]);
   
printf("\n * After filling * ");

	for(i=0; i<LEN; i++)
	{
	for(j=0; j<LEN; j++)
	{
  array[i][j]=count++; 
  printf("\n array[%d][%d] = %d " , i , j , array[i][j]);
 }
}

   return 0;
}
//----------------------------------------------------------------------

 

Να ρωτησω κατι αλλο για οποιον εχει το βιβλιο του King στην Σελ. 168

 

δινει σαν macros κατι τετοιο -->

 

> #define SIZE ((int) (sizeof(a) / sizeof(a[0]))) 

 

Δεν θα ηταν καλυτερο να το ονοματιζε length? Και να μην εκανε συγχυση με SIZE

γιατι SIZE πχ ειναι τα 40 bytes που θα δωσει ο sizeof για το πινακάκι . Ενω το μηκος ειναι 10

(Για 10 στοιχεια) και 4 bytes καθε στοιχειο τυπου int.

 

:D

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

...

 

Να ρωτησω κατι αλλο για οποιον εχει το βιβλιο του King στην Σελ. 168

 

δινει σαν macros κατι τετοιο -->

 

> #define SIZE ((int) (sizeof(a) / sizeof(a[0]))) 

 

Δεν θα ηταν καλυτερο να το ονοματιζε length? Και να μην εκανε συγχυση με SIZE

γιατι SIZE πχ ειναι τα 40 bytes που θα δωσει ο sizeof για το πινακάκι . Ενω το μηκος ειναι 10

(Για 10 στοιχεια) και 4 bytes καθε στοιχειο τυπου int.

 

:D

 

Ναι, συμφωνώ κι εγώ πως "len" θα ήταν πιο ακριβής ονομασία.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

καλησπερα παιδια . εχω να λυσω μια ασκηση σε c και ψαχνομαι.

η ασκηση ειναι η εξης: έχουμε κάποιους αθλητές μπάσκετ και ο κάθε εθλητής δεν παίζει

πάνω από έναν αγώνω με κάποιον άλλον. Θέλουμε πρόγραμμα απαντήσεων των αθλητών

που θα ελεγχει αν οι αγωνες εχουν γινει με τρόοπ συμβατο , δηλαδή

με βάση τον παραπάνω κανονα ή όχι.

Δηλαδη εχουμε δεδομενα εισοδου τον αριθμο N που δειχνει αριθμο

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

Δεδομενα εξοδου το 1 αν εχουμε συμβατη απαντηση και το 0 αν οχι.

παραδειγμα εισοδου : 4 3 3 3 3 παραδειγμα εξοδου : 1

1 0 0

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

καλησπερα παιδια . εχω να λυσω μια ασκηση σε c και ψαχνομαι.

η ασκηση ειναι η εξης: έχουμε κάποιους αθλητές μπάσκετ και ο κάθε εθλητής δεν παίζει

πάνω από έναν αγώνω με κάποιον άλλον. Θέλουμε πρόγραμμα απαντήσεων των αθλητών

που θα ελεγχει αν οι αγωνες εχουν γινει με τρόοπ συμβατο , δηλαδή

με βάση τον παραπάνω κανονα ή όχι.

Δηλαδη εχουμε δεδομενα εισοδου τον αριθμο N που δειχνει αριθμο

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

Δεδομενα εξοδου το 1 αν εχουμε συμβατη απαντηση και το 0 αν οχι.

παραδειγμα εισοδου : 4 3 3 3 3 παραδειγμα εξοδου : 1

1 0 0

 

Καταρχήν καλώς ήρθες στο φόρουμ. Έπειτα, το θέμα του νήματος είναι γενικές ερωτήσεις για την γλώσσα C δηλαδή ερωτήσεις τύπου "γιατί γίνεται αυτό ?", "τι μέγεθος έχει εκείνο ?", "τι σημαίνει ο τάδε τελεστής" και τέτοιο στυλ. Δεν είναι για λύση ασκήσεων δηλαδή. Λύσε την άσκησή σου και αν έχεις κάποια απορία στη συμπεριφορά της γλώσσας, ευχαρίστως να απαντήσουμε.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι, συμφωνώ κι εγώ πως "len" θα ήταν πιο ακριβής ονομασία.

 

Σε αυτον τον κωδικα

 

>
#include <stdio.h>    
#define NUM_RATES ((int) (sizeof(value) / sizeof(value[0])))
#define INITIAL_BALANCE 100.00   

int main( void )
{
int i , low_rate , num_years , year;
double value[5];

printf(" Enter interest rate: ");
scanf("%d" , &low_rate);

printf(" Enter number of years: ");
scanf("%d" , &num_years);

printf("\n Years");

for(i=0; i< NUM_RATES; i++)
{
	printf("%6d%%", low_rate + i);
	value[i]=INITIAL_BALANCE;
}

printf("\n");

for(year=1; year<=num_years; year++)
{
	printf("%3d   " , year);
	for(i=0; i< NUM_RATES; i++)
		{
			value[i] += (low_rate + i ) / 100.0 * value[i];
			printf("%7.2f" , value[i]);
		}
		printf("\n");
	}
		
       return 0;
}

 

που υπαρχει και στην Σελ. 169 και η εξοδος του στην Σελ.168

εμενα τα αποτελεσματα στο χαρτι μου βγαινανε ολα 112,0 παντως οχι 112,36 ας πουμε...

το ,36 πως βγαινει?? Λογω του double τυπου στον πινακα?

 

Μολις θα μπει στο inner loop ας πουμε θα εχει απο την προηγουμενη for το 106,0

 

οποτε θα ειναι 6+0/100,0 * 106,0 + 106,0 το οποιο δινει 112,0

 

ειναι θεμα δηλαδη precision στον ΗΥ?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μολις θα μπει στο inner loop ας πουμε θα εχει απο την προηγουμενη for το 106,0

 

οποτε θα ειναι 6+0/100,0 * 106,0 + 106,0 το οποιο δινει 112,0

 

ειναι θεμα δηλαδη precision στον ΗΥ?

 

Γιατί σου δίνει 112 στο χαρτί ? 6 / 100 * 106 = 6,36 οπότε αν το προσθέσεις στο υπάρχον 106 μας δίνει 112,36.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γιατί σου δίνει 112 στο χαρτί ? 6 / 100 * 106 = 6,36 οπότε αν το προσθέσεις στο υπάρχον 106 μας δίνει 112,36.

 

lol εχεις δικιο. Οτι να ναι. Ειμαι κουρασμενος ωρες ωρες και παιδευομαι με ηλιθιοτητες. :/

 

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

 

Έστω :

 

> 

/* Αναγνωση ενος χαρακτήρα απο το stdin 
* Αγνοώντας τις αλλαγές γραμμής
* */
#include<stdio.h>

int main(void)

{
char ch;


for(;
{
	printf(" Give a char: ");
	
	while((ch=getchar()) == '\n')
	;
	
	if( ch == 'q')
	
	break;
	
	else
	
	printf(" You gave : %c \n" , ch);
	
} 

/*printf(" Give a character: ");  
   scanf(" %c" , &ch);
   
   printf(" You gave : %c \n" , ch); */


return 0;
}

 

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

στην getchar ομως ειδα οτι αυτο δεν ισχυει... αν πχ δωσεις

 

> while((ch=getchar()) == ' ') 

και σαν εισοδο μετα ΕΝΤΕR

 

θα βγει απο το loop και θα τον εκτυπωσει κανονικα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

>
#include<stdio.h>

int main(void)
{
char ch;

for (; {
	printf(" Give a char: ");

	while ((ch = getchar()) == ' ') ;

	if (ch == 'q')
		break;
	else
		printf(" You gave : %c \n", ch);
}

return 0;
}

 

Μην αφήνεις πολλές κενές γραμμές γιατί δυσκολεύεται ο αναγνώστης (Σε διπλωματικές συνήθως βλέπω πολλά κενά για να αυξάνονται οι σελίδες :P ). Συνήθως αφήνονται κενές γραμμές όπου διαχωρίζονται "ενότητες" όπως μετά τις δηλώσεις μεταβλητών (στην C89 δεν μπορούσες να έχεις δηλώσεις μεταβλητών μετά από την πρώτη εντολή όπως στην C99 οπότε όλες οι δηλώσεις μεταβλητών ήταν στην αρχή και αποτελούσαν μια "ενότητα"), πριν το return, κτλ.

 

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

στην getchar ομως ειδα οτι αυτο δεν ισχυει... αν πχ δωσεις

 

> while((ch=getchar()) == ' ') 

και σαν εισοδο μετα ΕΝΤΕR

 

θα βγει απο το loop και θα τον εκτυπωσει κανονικα.

 

Αν κατάλαβα καλά αυτό που περιγράφεις, λογικό μου ακούγεται. Η εντολή "while ((ch=getchar()) == ' ');" (έχε υπόψην το ερωτηματικό) καλεί την getchar η οποία επιστρέφει μεν ένα χαρακτήρα στην μεταβλητή ch αλλά η λειτουργία της τελειώνει όταν πληκτρολογήσεις Enter. Έστω ότι εσύ δίνεις "g5 wkl<Enter>". Η μεταβλητή ch έχει την τιμή 'g' η οποία εμφανίζεται με την printf. Εκτελείται πάλι το for και ξανακαλείται η getchar. Επειδή όμως υπάρχουν χαρακτήρες στο buffer δεν σου ζητάει input και η ch παίρνει την τιμή '5'. Όπως βλέπεις στο while υπάρχει το ερωτηματικό οπότε όταν η getchar επιστρέψει space, θα ξαναδιαβαστεί ένας χαρακτήρας έτσι ουσιαστικά αγνοείς το space και η ch παίρνει την τιμή 'w'. Αυτό συνεχίζεται μέχρι την τιμή '\n' η οποία τυπώνεται και αυτή κανονικά αφού έτσι είπες στο πρόγραμμα. Την επόμενη φορά δεν υπάρχουν άλλοι χαρακτήρες στο buffer οπότε η getchar περιμένει να ξαναδώσεις νέες τιμές.

 

Όταν πληκτρολογείς σκέτο Enter, γίνεται το ίδιο και εμφανίζεται κανονικά η αλλαγή γραμμής μια και αγνοείς μόνο το space.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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