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

Αρχάριος στη C χρειάζομαι βοήθεια!!!!!


popiva

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

Δημοσ.

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

χρειαζομαι την βοηθεια σας στην παρακατω ασκηση

να γραφει προγραμμα στην c που να διαβαζει μια ημερομηνια απο το standard input με την μορφη

25 feb 1974

και να τυπωνει στο standard output με την μορφη 25/2/95

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

εχει τις εξης εντολες την οποια δεν καταλαβαινω

if(!strcmp(mo,"jan")) m=1

else if (!strcmp(mo,"feb")) m=2

>>>

>>

>>

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

Ελπιζω να εκανα κατανοητο τι ακριβως δεν καταλαβαινω

ευχαριστω παιδια εκ το προτερων

Δημοσ.

>if(!strcmp(mo,"jan"))
   m=1
else if (!strcmp(mo,"feb"))
   m=2

 

Η strcmp παίρνει ως ορίσματα δύο strings (πίνακες χαρακτήρων) και κάνει λεξικογραφική σύγκριση μεταξύ τους. Επιστρέφει μία θετική τιμή αν το πρώτο string (το περιεχόμενο του mo δηλαδή) βρεθεί «μεγαλύτερο» από το string "jan". Αν ισχύει το αντίστροφο, επιστρέφει μία αρνητική τιμή. Και αν τα δύο strings είναι πανομοιότυπα, επιστρέφει την τιμή 0, όποτε όλη η συνθήκη που περιέχει η if αποτιμάται σε true (αληθής), εκτελείται η αμέσως επόμενη εντολή που δίνει στη μεταβλητή m την τιμή 1 και αγνοείται η γραμμή με την else if. Αν η συνθήκη είναι ψευδής, η ροή εκτέλεσης πηγαίνει απευθείας στην else if, όπου νομίζω ότι είναι εύκολο να καταλάβεις τί συμβαίνει, βάσει των παραπάνω.

Δημοσ.

Ευχαριστω για τη αμεση απαντηση κατα αρχήν.Καταλαβα τωρα τι ακριβως γινετε με την strcmp.Ξερεις αυτο που με μπερδευει ακομα και τωρα είναι η χρηση του τελεστη !.πριν την strcmp.Είναι η σημαντικος σε αυτό το σημειο.Αν δεν το βαλουμε θα εχουμε λαθος¨?

Δημοσ.

Χωρίς πειραματισμό, μερικά πράγματα δεν αφομοιώνονται εύκολα. Δες π.χ. τον παρακάτω κώδικα, κάνε τον compile και τρέξτον:

 

 

>#include <stdio.h>

int main() {

   if(0)
       printf("H syn8hkh 1 (0) einai alh8hs!\n");
   else
       printf("H syn8hkh 1 (0) einai pseydhs!\n");

   if(!0)
       printf("H syn8hkh 2 (!0) einai alh8hs!\n");
   else
       printf("H syn8hkh 2 (!0) einai pseydhs!\n");

   if(1 == 1)
       printf("H syn8hkh 3 (1==1) einai alh8hs!\n");
   else
       printf("H syn8hkh 3 (1==1) einai pseydhs!\n");

   if(!(1 == 1))
       printf("H syn8hkh 4 (!(1==1)) einai alh8hs!\n");
   else
       printf("H syn8hkh 4 (!(1==1)) einai pseydhs!\n");

   return 0;
}

Δημοσ.

Καλησπέρα.

Οι παραπάνω φίλοι είναι σωστοί ως προς τη λύση. Μια παρατήρηση μόνο. Είναι προγραμματιστικώς ορθότερο εαν έχεις πολλές επιλογές σε έναν βρόγχο να χρησιμοποιείς την εντολή switch αντί των if then. Κοίτα τον παρακάτω κώδικα:

>
switch (mo) {
case (!strcmp(mo,"jan")):
m=1;
case (!strcmp(mo,"feb")):
m=2; 

 

κλπ. Ελπίζω να βοήθησα.

Δημοσ.

KingDiamond αυτό δεν δουλεύει. Συγκρίνεις την αντίθετη αληθές-ψευδη τιμή που γυρνάει η συνάρτηση strcmp με την τιμή του mo.

 

>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
                                
int main(int argc, char **argv) {
 char month[bUFSIZ];
 struct { const char *month; char id; }
 months[] =       
   { { "jan", 1 },
     { "feb", 2 },
     { "mar", 3 },
     { "apr", 4 },
     /* ... */ };                                   
 size_t i, n, size = sizeof months / sizeof *months;
                                                   
 while(fgets(month, sizeof month, stdin) != NULL) {
   if(month[(n = strlen(month)) -1] == '\n')
     month[--n] = 0;                                                  
   for(i = 0; i < n; i++) month[i] = tolower((unsigned char)month[i]);
   for(i = 0; i < size; i++)                       
     if(strcmp(months[i].month, month) == 0) break;
   if(i != size) printf("%d\n", months[i].id);
   else printf("not found\n");
 }        
 return 0;
}

Παράδειγμα:

>
Jan
1
Feb
2
insomnia
not found
JAN
1

Δημοσ.
οίτα τον παρακάτω κώδικα:

>
switch (mo) {
case (!strcmp(mo,"jan")):
m=1;
case (!strcmp(mo,"feb")):
m=2; 

 

κλπ. Ελπίζω να βοήθησα.

 

η switch θέλει διακριτές τιμές και όχι δυναμικά υπολογιζόμενες. (ασε που δεν έχει και break επιπλέον).

 

Η switch φτιάχνει ένα πίνακα με τιμές των cases σε compile time και κάνει loop για match και μετά jump απο αυτόν τον πίνακα σε run time.

 

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

 

>
int get_the_month(const char *mo){
   //returns 0 on error or 1 to 12
   static const char *months = "janfebmaraprmayjunjulaugsepoctnovdec";
   const char * p = strstr(months, mo);
   if(p && strlen(mo)==3 && !strncmp(p,mo,3) && (p-months)%3 == 0)){
          //βρεθηκε και συμφωνούν και οι 3 χαρακτηρες (δεν ήταν δηλαδή τυχαίο π.χ. "ebm")
          return (p - months)/3 + 1;
   }
   return 0;
}

 

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

 

>int get_the_month(const char *mo){
   //returns 0 on error or 1 to 12
   static const char months[12][4] = {
              "jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"
   };
   size_t i;
   for(i=0;i<12;i++)
       if(!strcmp(mo,months[i]))//ή stricmp για αδιαφορια κεφαλαιων/πεζων
           return i+1;
   return 0;
}

 

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

 

>
int get_the_month(const char *mo){
   //returns 0 on error or 1 to 12
   static const char *months = "janfebmaraprmayjunjulaugsepoctnovdec";
   size_t i;
   for(i=0;i<12;i++)
        if(!strncmp(mo,months+i*3,3))
            return i+1;
   return 0;
}

Δημοσ.

Με προλάβανε οι προλαλήσαντες και νομίζω ότι το θέμα καλύφθηκε, αλλά αφού το έγραψα, το δημοσιεύω μπορεί να φανεί χρήσιμο σε κάποιον μελλοντικό user:

 

>
/* DD/MM/YYYY => DD-MONTH NAME-YYYY - directx */
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void)
{
char szInput[bUFSIZ] = "",
	 szMonth[bUFSIZ];
int nDay, nYear;

/* Prompt user for input */
printf("Please enter Date: ");
/* Read user input */
fgets(szInput, sizeof(szInput), stdin);
/* Break user input on DD/MMM/YYYY format */
if(sscanf(szInput, "%d %s %d", &nDay, szMonth, &nYear) == 3)
{
	int nVar;
	char *ptrMonth[] = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL",
						 "AUG", "SEP", "OCT", "NOV", "DEC" };

	/* Make szMonth upper */
	for(nVar = 0; nVar < strlen(szMonth); nVar++)
		szMonth[nVar] = toupper(szMonth[nVar]);
	/* Match szMonth with ptrMonth .. */
	for(nVar = 0; nVar < 12; nVar++)
		if(!strcmp(szMonth, ptrMonth[nVar]))
		{
			/* Show date in new format */
			printf("%.2d/%.2d/%.4d", nDay, nVar + 1, nYear);
			break;
		}
	if(nVar == 12)
		/* Invalid szMonth! */
		printf(" Invalid month - \"%s\"\n", szMonth);
}
else /* String should be D/M/Y compliant */
	printf(" Date type mismatch!\n");

/* End of program */
printf("\nPress Enter to exit..");
getchar();

return 0;
}

 

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

 

Υ.Γ.

Η stricmp είναι μια θαυμάσια λύση αλλά ορισμένοι ANSI-C compilers δεν την δέχονται :-(.

Δημοσ.

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

while(1)

{fgets(line1,n,ifp)

fgets(line2,n,ifp);

if ((line==null) && (line==null))

>>>

>>

>>

Δεν καταλαβαινω το 1 στην while

Επισης εχω το εξης

να γραφει function c που να καθοριζει την τιμη ενος διδιαστατου πινακα Α απο Ν ακεραιους συμφωνα με τον παρακατω κανονα

Α[ι,j]=1, αν ι + j ειναι αρτιος

A[i,j]=-1 αν =-1 αν i+j ειναι περιττος

και εχουμε

void fill(int**A,int N)

{

int i,j;

for(i=0;i<N;N++)

for(j=0;j<N;j++)

A[j]=((i+j)%2==0)?1:-1;

}

αν μπορεις καποιος ασ μου δωσει καποιες διευκρινησεις

ευχαριστω

 

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

 

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

while(1)

{fgets(line1,n,ifp)

fgets(line2,n,ifp);

if ((line==null) && (line==null))

>>>

>>

>>

Δεν καταλαβαινω το 1 στην while

Επισης εχω το εξης

να γραφει function c που να καθοριζει την τιμη ενος διδιαστατου πινακα Α απο Ν ακεραιους συμφωνα με τον παρακατω κανονα

Α[ι,j]=1, αν ι + j ειναι αρτιος

A[i,j]=-1 αν =-1 αν i+j ειναι περιττος

και εχουμε

void fill(int**A,int N)

{

int i,j;

for(i=0;i<N;N++)

for(j=0;j<N;j++)

A[j]=((i+j)%2==0)?1:-1;

}

αν μπορεις καποιος ασ μου δωσει καποιες διευκρινησεις

ευχαριστω

Δημοσ.

Το while(1) είναι ένα loop που εκτελείται για πάντα - όσο το 1=1 θα συνεχίζει να εκτελείται.

Το άλλο που ρωτάς, για τα arrays, φτιάξε πίνακες δύο διαστάσεων a[j], και δώσε αρχικές τιμές ανάλογα με τη θέση που βρίσκεσαι. Μόνο να θυμάσαι πως η πρώτη θέση του πίνακα είναι η μηδέν.

Αν googlάρεις και λίγο θα βρεις τη λύση.

good luck!:-)

  • 3 εβδομάδες αργότερα...
Δημοσ.

Παιδια γεια σας.χρειαζομαι ξανα τη βοηθεια σας.Τωρα για τη visual basic 6.

θελω να κατεβασω τη vb6 για κανω καποιες ασκησεις αλλα δεν τα καταφερνω.Μπορειτε να μου δωσετε καποια links

οποιαδηποτε βοηθεια μου ειναι απαραιτητη

ευχαριστω εκ το προτερων

Δημοσ.
Παιδια γεια σας.χρειαζομαι ξανα τη βοηθεια σας.Τωρα για τη visual basic 6.

θελω να κατεβασω τη vb6 για κανω καποιες ασκησεις αλλα δεν τα καταφερνω.Μπορειτε να μου δωσετε καποια links

οποιαδηποτε βοηθεια μου ειναι απαραιτητη

ευχαριστω εκ το προτερων

 

Σας βαζουν ασκησεις σε vb6 ?:-(

btw σε κανα torrent αν εχει. Τωρα να δωσει λεφτα για vb6 δε λεει. Ψαξε για visual studio enterprise edition 6

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

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

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