Πρόβλημα σε άσκηση στη C

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
Michas1991
Buffer underflow exception
Buffer underflow exception
Posts: 2
Joined: Wed Nov 14, 2012 12:04 pm

Πρόβλημα σε άσκηση στη C

Post by Michas1991 » Wed Nov 14, 2012 12:10 pm

Έχω τον παρακάτω κώδικα τον οποίο όταν τον τρέξω εμφανίζεται ένα μενού. Όταν ο χρήστης επιλέξει την 1η επιλογή μπορεί να μετατρέψει ένα κείμενο από αγγλικούς χαρακτήρες με κεφαλαία σε morse code. Η δεύτερη επιλογή είναι να διαβάζει κείμενο από file και να το μετατρέπει σε morse code σε ένα άλλο file που δημιουργείται, αλλά αυτό δε δουλεύει. Η άσκηση ζητά να χρησιμοποιήσω pointers για αυτό. Μπορείτε να μου πείτε ποιο είναι το λάθος στον κώδικά μου; Ευχαριστώ.

Code: Select all

#include "stdafx.h"
#include "stdafx.h"
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <fstream> 
#include <iostream> 
#include <iomanip>

void encode ( char ch ); //encode function
void enter(); // text entry function
void file3(); // read from a file function
void main_menu();

char *morses[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};

int _tmain(int argc, _TCHAR* argv[]) {
main_menu();

}

void main_menu() {
//main menu
int opt;

printf("------------------------------------------------\n");
printf("--                Main Menu                   --\n");
printf("------------------------------------------------\n");
printf("-- Please Select An Option To Proceed --\n");
printf("-- 1. Convert keyboard entry to morse code --\n");
printf("-- 2. Convert a file to morse code --\n");
printf("------------------------------------------------\n\n");

printf("Enter an Option: ");
scanf_s("%d",&opt);
if ((opt!= 1) && (opt != 2) && (opt != 3)) { 
printf("\nInvalid Option..... Try Again: "); //checks to see a valid option is entered
scanf_s("%d",&opt);
}
 if (opt == 1) {
enter();
}
 if (opt == 2) { 
file3();

}
}

void enter() {

char *morses[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};
char* word = (char*)malloc(100*sizeof(char));
char* result = (char*)malloc(300*sizeof(char));
char *resStart = result;
printf("Enter a word with capitals to convert\n");//me kefalaia
scanf("%s", word);


while(*word != '\0')
{
strcpy(result, morses[*word-'A']);
result += strlen(morses[*word-'A']);
word++;
}
printf("%s",resStart);
}




void file3() {

FILE *ipfileptr; //Import file pointer
FILE *opfileptr; //New file pointer


char* input = (char*)malloc(100*sizeof(char));
char* result3 = (char*)malloc(300*sizeof(char));
char *resStart3 = result3;

ipfileptr = fopen("text.txt" , "r");// Open the text document portfolio2
opfileptr = fopen("text2.txt" ,"w"); //Creates a second text document with name portfolio

while((*input= getc(ipfileptr))!=EOF){ 

strcpy(result3, morses[*input-'A']);
result3 += strlen(morses[*input-'A']);
input++;
putc(*resStart3, opfileptr);
}
}
Last edited by cypher on Tue Jun 25, 2013 3:58 pm, edited 4 times in total.
Reason: greeklish -> ελληνικά & added code tags
User avatar
Spongebobu
Mbyte level
Mbyte level
Posts: 702
Joined: Mon Jul 02, 2012 6:54 pm
Academic status: Alumnus/a
Gender:
Location: In yo house

Re: Πρόβλημα σε άσκηση στη C

Post by Spongebobu » Wed Nov 14, 2012 12:41 pm

Θα βοηθούσε αν μας έλεγες ποιό ακριβώς είναι το πρόβλημα (σου πετάει exceptions, εμφανίζει λάθος δεδομένα?...).
Every time you make a typo the errorists win.
Fabio 2 - 1 Funk
User avatar
Eldebryn
Venus Former Team Member
Posts: 1116
Joined: Sat Sep 18, 2010 8:43 pm
Academic status: Alumnus/a
Gender:
Location: Somewhere in the Forgotten Realms...

Re: Πρόβλημα σε άσκηση στη C

Post by Eldebryn » Wed Nov 14, 2012 12:43 pm

Image<-- My profile playlists
Michas1991
Buffer underflow exception
Buffer underflow exception
Posts: 2
Joined: Wed Nov 14, 2012 12:04 pm

Re: Πρόβλημα σε άσκηση στη C

Post by Michas1991 » Wed Nov 14, 2012 1:02 pm

Spongebobu wrote:Θα βοηθούσε αν μας έλεγες ποιό ακριβώς είναι το πρόβλημα (σου πετάει exceptions, εμφανίζει λάθος δεδομένα?...).
Δημιουργεί το 2ο file κανονικότατα, αλλά είναι κενό. π.χ. αν δώσεις ABC στο πρώτο file δε δίνει στο 2ο file .--...-.-.
Last edited by Funk on Sat Jun 29, 2013 11:36 am, edited 2 times in total.
Reason: greeklish -> ελληνικά
jim_ailaion
Buffer underflow exception
Buffer underflow exception
Posts: 2
Joined: Tue Oct 09, 2012 8:40 am
Academic status: MSc
Gender:

Re: Πρόβλημα σε άκηση στη C

Post by jim_ailaion » Thu Nov 15, 2012 10:58 pm

Michas1991 wrote:Έχω τον παρακάτω κώδικα τον οποίο όταν τον τρέξω εμφανίζεται ένα μενού. Όταν ο χρήστης επιλέξει την 1η επιλογή μπορεί να μετατρέψει ένα κείμενο από αγγλικούς χαρακτήρες με κεφαλαία σε morse code. Η δεύτερη επιλογή είναι να διαβάζει κείμενο από file και να το μετατρέπει σε morse code σε ένα άλλο file που δημιουργείται, αλλά αυτό δε δουλεύει. Η άσκηση ζητά να χρησιμοποιήσω pointers για αυτό. Μπορείτε να μου πείτε ποιο είναι το λάθος στον κώδικά μου; Ευχαριστώ.

Code: Select all

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>

typedef struct Map{
	int element;
	int character;
}Map;
Map *map;

void encode ( char ch ); //encode function
void enter(); // text entry function
void file3(); // read from a file function
void main_menu();

char *morses[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};

int main(int argc, char * argv[]) {
main_menu();
}

void main_menu() {
//main menu
int initial_value;
int opt;
map = malloc(26*sizeof(struct Map));
int i=0;
initial_value = 'A';
for( i = 0; i < 26 ; i++)
{
	map[i].element = i;
	map[i].character = initial_value;
	initial_value++;
}

printf("------------------------------------------------\n");
printf("--                Main Menu                   --\n");
printf("------------------------------------------------\n");
printf("-- Please Select An Option To Proceed --\n");
printf("-- 1. Convert keyboard entry to morse code --\n");
printf("-- 2. Convert a file to morse code --\n");
printf("------------------------------------------------\n\n");

printf("Enter an Option: ");
scanf_s("%d",&opt);
if ((opt!= 1) && (opt != 2) && (opt != 3)) { 
printf("\nInvalid Option..... Try Again: "); //checks to see a valid option is entered
scanf_s("%d",&opt);
}
 if (opt == 1) {
enter();
}
 if (opt == 2) { 
file3();

}
}

void enter() {
char* word = (char*)malloc(100*sizeof(char));
char* result = (char*)malloc(300*sizeof(char));
char *resStart = result;
printf("Enter a word with capitals to convert\n");//me kefalaia
scanf("%s", word);


while(*word != '\0')
{
strcpy(result, morses[*word-'A']);
result += strlen(morses[*word-'A']);
word++;
}
printf("%s",resStart);
}

  int find_association_key(int c)
  {
     int i = 0;
	for( i = 0 ; i < 26 ; i++)
		if(map[i].character == c)
			return map[i].element;
	return i;	
  }
  void file3() {
  int key;
  int c;
  FILE *ipfileptr; //Import file pointer
  FILE *opfileptr; //New file pointer
  ipfileptr = fopen("text.txt" , "r");// Open the text document portfolio2
  opfileptr = fopen("text2.txt" ,"w"); //Creates a second text document with name portfolio
//


  while((c = fgetc(ipfileptr))!=EOF){
	if(c == '\n') break;
  	key = find_association_key(c);
//        printf("key = %d\n",key);
  	fprintf(opfileptr,"%s",morses[key]);
  }  

fclose(ipfileptr);
fclose(opfileptr);
  }
Οι προσθήκες που χρειάζονται είναι ένας association map,όπως το Map της C++,και μια συναρτησούλα για να βρίσκεις ουσιαστικά με βάση το γράμμα που έχεις διαβάσει,σε ποια θέση στον πίνακα morse είναι.Η fprintf εκτυπώνει ένα string.Η fgetc,όπως και η getc σου διαβάζει τον ascii κωδικό και άρα είναι int και όχι char,όπως το είχες βάλει.Επίσης με αυτό τον τρόπο δεν χρειάζεται να κάνεις τόσους pointers για αποτελέσματα κλπ.

Θέλει και άλλες διορθωσούλες αλλά το κομμάτι αυτό δουλεύει πλέον+ ότι συνεχίζεις να χρησιμοποιείς pointers.

//αν κάτι δεν είναι κατανοητό γιατί δουλεύει,πες το μου να στο εξηγήσω καλύτερα.
almeraki
Buffer underflow exception
Buffer underflow exception
Posts: 1
Joined: Mon Jun 24, 2013 2:07 pm
Academic status: 4th year
Gender:

Re: Πρόβλημα σε άσκηση στη C

Post by almeraki » Mon Jun 24, 2013 2:28 pm

SOS!!! Καλησπερα ειμαι νεα στο site και θελω την βοηθεια σας σε ενα προβλημα που αντιμετωπιζω και δεν μπορω να λυσω.. :smt017

Εστω ο μεταγλωτιστης εχει θεση την μεταβλητη χ και τον πινακα α στις διευθυνσεις μνημης 200 και 1500 αντιστοιχα. Τι θα εμφανιστει στην οθονη μετα την εκτελεση του παρακατω προγραμματος:

double x=70, *p, a[ ]={8, 5, 4, 7, 2, 9, 13, 73};
p=a; p=p+4;

cout<<"b:"<<*p+2<<" "<<*(a+3)<<" "<<*(p-1)<<" "<<p<<"\n";

p=&a[3]

cout<<"c:"<<p[-2]<<" "<<*p<<" "<<p[10]<<a[0]<<"\n";

p=&x;

cout<<"d:"<<*p<<" "<<*p+2<<" "<<x<<" "<<p<<"\n";

*p=*p+4;
cout<<e:"<<*p<<" "<<x<<" "<<" "<<p<<"\n";

Χρειαζομαι την λυση οποιος μπορει ας βοηθησει..Ευχαριστω!
p3040118
Buffer underflow exception
Buffer underflow exception
Posts: 2
Joined: Wed Mar 03, 2010 4:55 pm
Academic status: N>4
Gender:

Re: Πρόβλημα σε άσκηση στη C

Post by p3040118 » Tue Jun 25, 2013 12:07 pm

Χαίρετε. Χρειάζομαι βοήθεια σε ένα πρόβλημα που έχω.
Έχω το αρχείο stack.h με αυτά τα στοιχεία

Code: Select all

#ifndef _STACK_H_
#define _STACK_H_


typedef struct storeAddress{
        char odos[30];
        int ari8mos;
        int poscode;
              
        }address; 

typedef struct snode{
        char fname[30];
        char lname[30];
        char phone[10];
        address add;
        struct snode* next;
        
        } stackNode;
        
typedef struct{
        stackNode* top;
        unsigned int counter;
        
        }Stack;
        
void initStack(Stack* stackPtr);
stackNode* pop(Stack* stackPtr);
void  push(Stack* stackPtr,stackNode data);
int stackLength(Stack* stackPtr);
void checkNullPointer(void* pointer);                       

#endif
Έχω υλοποιήσει τις pop kai push αλλά δεν είμαι σίγουρος αν είναι καλύτερο η pop να επιστρέφει stackNode ή stackNode*
Ομοίως δεν είμαι βέβαιος αν πρέπει να βάλω όρισμα stackNode* στην push ή απλά stackNode.
Προβληματίζομαι γιατί δεν είμαι σίγουρος πότε πρέπει να κάνω free τον δείκτη που επιστρέφει η pop.
Ευχαριστώ
Last edited by Funk on Sat Jun 29, 2013 11:36 am, edited 3 times in total.
Reason: Greeklish
User avatar
Eldebryn
Venus Former Team Member
Posts: 1116
Joined: Sat Sep 18, 2010 8:43 pm
Academic status: Alumnus/a
Gender:
Location: Somewhere in the Forgotten Realms...

Re: Πρόβλημα σε άσκηση στη C

Post by Eldebryn » Tue Jun 25, 2013 4:40 pm

@p3040118

1) Για return θα έλεγα κάνε return σκέτο stackNode, έτσι γίνεται στο STD αν θυμάμαι καλά απο τα return types των δομών.
2) Στο όρισμα σου το καλύτερο είναι να βάλεις &stackNode απότι έχω ακούσει διότι έτσι παίρνεις reference(~4 byte) της διεύθυνσης αντί να αντιγράφεις όλα τα δεδομένα(το value) του stackNode που περνάει ο χρήστης και είναι πιο γρήγορο. Μην ξεχνάς να το χρησιμοποιείς κατάλληλα όμως μέσα στο body της μεθόδου.
3) Για αυτό δεν είμαι σίγουρος διότι δεν έχω ασχοληθεί ποτέ με data structures σε C++, αλλά αν τον pointer τον δημιουργείς μεσα στο body της μεθόδου έχω την αίσθηση οτι δεν χρειάζεται να απελευθερώσεις κάτι. Μόνο όταν κάνεις "new" ανησυχείς για αυτά.

-------
almeraki wrote:SOS!!! Καλησπερα ειμαι νεα στο site και θελω την βοηθεια σας σε ενα προβλημα που αντιμετωπιζω και δεν μπορω να λυσω.. :smt017

Εστω ο μεταγλωτιστης εχει θεση την μεταβλητη χ και τον πινακα α στις διευθυνσεις μνημης 200 και 1500 αντιστοιχα. Τι θα εμφανιστει στην οθονη μετα την εκτελεση του παρακατω προγραμματος:
Spoiler: εμφάνιση/απόκρυψη
double x=70, *p, a[ ]={8, 5, 4, 7, 2, 9, 13, 73}; p=a; p=p+4; cout<<"b:"<<*p+2<<" "<<*(a+3)<<" "<<*(p-1)<<" "<<p<<"\n"; p=&a[3] cout<<"c:"<<p[-2]<<" "<<*p<<" "<<p[10]<<a[0]<<"\n"; p=&x; cout<<"d:"<<*p<<" "<<*p+2<<" "<<x<<" "<<p<<"\n"; *p=*p+4; cout<<e:"<<*p<<" "<<x<<" "<<" "<<p<<"\n";
Χρειαζομαι την λυση οποιος μπορει ας βοηθησει..Ευχαριστω!
Έχεις συντακτικό σε:
p=&a[3];
cout<<"e:"

Γενικά τρέχωντάς το μου κάνει print
b:4 7 7 002EFB9c
c:5 7 2.1271e-3148
d:70 72 70 002EFBD0
e:74 74 002EFBD0

Πιστεύω με λίγο διάβασμα σε pointers, arrays και references δεν θα έχεις τόσο πρόβλημα να το καταλάβεις, εννοείται οτι τα τελευταία κομμάτια θα προσπαρμοστούν βάση της αρχικής σου υπόθεσης περί θέσεων.
Last edited by Funk on Sat Jun 29, 2013 11:36 am, edited 2 times in total.
Reason: double post merged
Image<-- My profile playlists
User avatar
stranger
Mbyte level
Mbyte level
Posts: 512
Joined: Fri Nov 26, 2010 3:14 am
Academic status: N>4
Gender:
Location: Athens, Greece

Re: Πρόβλημα σε άσκηση στη C

Post by stranger » Tue Jun 25, 2013 8:49 pm

p3040118 wrote:Χαίρετε. Χρειάζομαι βοήθεια σε ένα πρόβλημα που έχω.
Έχω το αρχείο stack.h με αυτά τα στοιχεία

Code: Select all

#ifndef _STACK_H_
#define _STACK_H_


typedef struct storeAddress{
        char odos[30];
        int ari8mos;
        int poscode;
              
        }address; 

typedef struct snode{
        char fname[30];
        char lname[30];
        char phone[10];
        address add;
        struct snode* next;
        
        } stackNode;
        
typedef struct{
        stackNode* top;
        unsigned int counter;
        
        }Stack;
        
void initStack(Stack* stackPtr);
stackNode* pop(Stack* stackPtr);
void  push(Stack* stackPtr,stackNode data);
int stackLength(Stack* stackPtr);
void checkNullPointer(void* pointer);                       

#endif
Έχω υλοποιήσει τις pop kai push αλλά δεν είμαι σίγουρος αν είναι καλύτερο η pop να επιστρέφει stackNode ή stackNode*
Ομοίως δεν είμαι βέβαιος αν πρέπει να βάλω όρισμα stackNode* στην push ή απλά stackNode.
Προβληματίζομαι γιατί δεν είμαι σίγουρος πότε πρέπει να κάνω free τον δείκτη που επιστρέφει η pop.
Ευχαριστώ
Κάνε την pop να επιστρέφει int που αντιπροσωπεύει αν όλα πήγαν καλά ή όχι (πχ. αν πας να κάνεις pop άδειο stack επιστρέφει -1, ώστε να ξέρει ο client αν έγινε το pop).

Για τo στοιχείο που γίνεται pop βάλε ως 2η παράμετρο ένα pointer στο node. Το αν θα το κάνεις free εξαρτάται από το ποιος έχει την ευθύνη του memory management: η υλοποίηση του stack ή οι χρήστες. O kανόνας είναι ότι όσες φορές καλείς τη malloc ακριβώς τόσες πρέπει να καλείς και τη free.

Αν θέλεις πες μου και θα σου φτιάξω ένα generic Stack.
Post Reply

Return to “Προγραμματισμός”