ζητάει το όνομα ενός αρχείου το οποίο θα περιέχει ανά γραμμή

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: Super-Moderators, WebDev Moderators

Απάντηση
panospcm
Δημοσιεύσεις: 4
Εγγραφή: 24 Μάιος 2006 00:12

ζητάει το όνομα ενός αρχείου το οποίο θα περιέχει ανά γραμμή

Δημοσίευση από panospcm » 24 Μάιος 2006 00:33

hello guys!!
mipos exete kamia idea pos lynontai autes oi askiseis stin C ?

α) Θα ζητάει το όνομα ενός αρχείου το οποίο θα περιέχει ανά γραμμή κάποιο τυχαίο αριθμό. Θα ανοίγει το αρχείο και θα ελέγχει κάθε αριθμό για το αν είναι πρώτος. Sto telos tha grafei tous protous arithmous se ena allo arxeio
β) θα ζητάει το όνομα ενός αρχείου το οποίο θα περιέχει κείμενο. Θα ζητάει ένα αλφαριθμητικό. Θα ανοίγει το αρχείο και θα ψάχνει για το συγκεκριμένο αλφαριθμητικό. Κάθε φορά που θα το συναντάει θα αυξάνει ένα counter. Στο τέλος του προγράμματος θα τυπώνεται ο αριθμός των εμφανίσεων του συγκεκριμένου αλφαριθμητικού.

γ) tha zitaei to onoma tou arxeiou to opoio periexei keimeno(A-Z,a-z). to arxeio auto tha to anoigei kai tha to kryptografei me ton algorithmo tou kaisara. Το κρυπτογραφημένο κείμενο θα αποθηκεύεται σε ένα νέο αρχείο. O algorithmos tou kaisara metakinei kathe gramma kata 3 theseis stin alphavito.(Α->D, B->E).


Opiadipote boitheia tha itan xrisimi... :D
Τελευταία επεξεργασία από το μέλος panospcm την 29 Μάιος 2006 13:32, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

ζητάει το όνομα ενός αρχείου το οποίο θα περιέχει ανά γραμμή

Δημοσίευση από dva_dev » 24 Μάιος 2006 10:43

Ο βασικός αλγόριθμος είναι ο ίδιος:

Κώδικας: Επιλογή όλων

Ανοιξε κάποιο αρχείο που επιλέγει ο χρήστης
Διάβασε μια γραμμή
Οσο δεν είσαι στο τέλος του αρχείου
    Κάνε κάτι με αυτή τη γραμμή (διαφορετικό για τα α,β,γ)
    Διάβασε μια ακόμα γραμμή
Τέλος Οσο
Κλείσε το αρχείο που άνοιξες
Τέλος
Τώρα για το α) και γ) ανοίγεις (και κλείνεις στο τέλος) 2 αρχεία, το 1ο για ανάγνωση και το 2ο για γράψιμο.

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

Για παράδειγμα για το α) θα γίνει:

Κώδικας: Επιλογή όλων

Διάβασε το όνομα του αρχείου εισόδου
Διάβασε το όνομα του αρχείου εξόδου
Ανοιξε το αρχείο εισόδου για ανάγνωση
Ανοιξε το αρχείο εξόδου για γράψιμο
Διάβασε ένα νούμερο (από το αρχείο εισόδου)
Οσο δεν είσαι στο τέλος του αρχείου

    Εκτέλεσε τον αλγόριθμο για έλεγχο αν είναι πρώτος αριθμός 
    Αν είναι πρώτος αριθμός
        Γράψε τον αριθμό στο αρχείο εξόδου
    τέλος Αν

    Διάβασε ένα ακόμα νούμερο (από το αρχείο εισόδου)
Τέλος Οσο
Κλείσε το αρχείο εξόδου
Κλείσε το αρχείο εισόδου
Τέλος

panospcm
Δημοσιεύσεις: 4
Εγγραφή: 24 Μάιος 2006 00:12

ζητάει το όνομα ενός αρχείου το οποίο θα περιέχει ανά γραμμή

Δημοσίευση από panospcm » 25 Μάιος 2006 17:21

thanks gia tin apantisi alla exo problima me ta arxeia...mou diavazei mono tin proti grammi tou arxeiou...pia einai i epanalipsi gia na sinexisei se olo to arxeio

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

ζητάει το όνομα ενός αρχείου το οποίο θα περιέχει ανά γραμμή

Δημοσίευση από dva_dev » 25 Μάιος 2006 18:30

Η ίδια εντολή που διαβάζει την πρώτη γραμμή διαβάζει και τις επόμενες, αρκεί να την βάλεις μέσα σε ένα βρόγχο.
Τι κώδικα έχεις γράψει μέχρι στιγμής;

panospcm
Δημοσιεύσεις: 4
Εγγραφή: 24 Μάιος 2006 00:12

ζητάει το όνομα ενός αρχείου το οποίο θα περιέχει ανά γραμμή

Δημοσίευση από panospcm » 29 Μάιος 2006 00:57

tin elysa tin proti xaris tin boitheia sou.oriste o kodikas

Κώδικας: Επιλογή όλων

#include<stdio.h>
#include<stdlib.h>
 
int main&#40;void&#41;
&#123;
   FILE *outfile;
   FILE *infile;
   int N; 
              
   int D;  
              
   int N_is_prime;  

   infile=fopen&#40;"C&#58;/old.txt","r"&#41;;
    
outfile=fopen&#40;"C&#58;/primes.txt","w"&#41;;

	fscanf&#40;infile, "%d", &N&#41;;


   while&#40;fscanf&#40;infile, "%d", &N&#41; > 0&#41;&#123;
	  
   
	   N_is_prime = 1;      
	  
	  for &#40;D = 2; D < N; D++&#41;
      &#123;
          
		  
		  if &#40; N%D == 0 &#41; N_is_prime = 0; // an to ypoloipo 0 tote einai prwtos		 
		 
      &#125;




      if &#40;N_is_prime == 1&#41; fprintf&#40;outfile, " O arithmos %d einai prwtos\n", N&#41;;  

   

   &#125;
   fclose&#40;outfile&#41;;
   fclose&#40;infile&#41;;

  
   return 0;  
&#125;
gia ta alla dyo tora opoiadipote boitheia gia ton algorythmo tha itan euprosdekti :lol:

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

ζητάει το όνομα ενός αρχείου το οποίο θα περιέχει ανά γραμμή

Δημοσίευση από dva_dev » 29 Μάιος 2006 10:56

Αρκετά καλός (κάποιον άλλο κώδικα δεν είχες βάλει ή δεν θυμάμαι καλά; ) 3 παρατηρησούλες μόνο:
1) το fscanf ακριβώς πριν το while σβήσε το γιατί έτσι όπως είναι χάνεις το πρώτο νούμερο.
Κάνεις ένα read (το οποίο και αγνοείς), και αμέσως μετά ξανακάνεις (μέσα στη συνθήκη του while το οποίο και επεξεργάζεσαι για να υπολογίσεις τους πρώτους).
2) Αλλαξε το σχόλιο στο if ( N%D == 0 ) N_is_prime = 0; γιατί αν το υπόλοιπο είναι 0 τότε ΔΕΝ είναι πρώτος.
3) Το όνομα του αρχείου παίζει έτσι όπως το έχεις "C:/old.txt" ή μήπως θέλει "C:\\old.txt". Το ίδιο και για το άλλο.

Στο δεύτερο που ζητάς για να απλοποιήσουμε λίγο τα πράγματα υποθέτουμε ότι οι λέξεις που περιέχει το αρχείο είναι μέχρι ένα ορισμένο μήκος (MAX_WORD_LENGTH) το οποίο ορίζεις όσο μεγάλο θέλεις, αν και ένα νούμερο πάνω από 500 μάλλον θα ήταν περίεργο (πάντως παίζει ότι και να βάλεις αρκεί να χωράει σε int. Αν χρειαστείς μεγαλύτερο θα πρέπει να αλλάξεις τα int σε long).
Ο κώδικας είναι βασισμένος στον δικό σου.

Κώδικας: Επιλογή όλων

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

//Το μέγιστο μήκος της κάθε λέξης είναι 50 χαρακτήρες
#define MAX_WORD_LENGTH 50

int main&#40;void&#41;
&#123;
	FILE *infile;

	char searchWord&#91;MAX_WORD_LENGTH + 1&#93;; //+1 για το τελικό '\0'
	char readWord&#91;MAX_WORD_LENGTH + 1&#93;;
	char *charIndex;
	int nFound;
	int searchWordLength;
	int readWordLength;
	int i;

	infile=fopen&#40;"C&#58;\\old.txt","r"&#41;;
	printf&#40;"Dose th lexi &#40;mexri %d xarakthres.&#41;&#58;", MAX_WORD_LENGTH&#41;;
	scanf&#40;"%s", searchWord&#41;;

	nFound=0;
	searchWordLength = strlen&#40;searchWord&#41;;

	while&#40;fscanf&#40;infile, "%s", readWord&#41; > 0&#41;
	&#123;
		readWordLength = strlen&#40;readWord&#41;;
		charIndex = readWord;
		for &#40;i=0; i <= readWordLength - searchWordLength; i++&#41;
		&#123;
			if &#40;strncmp&#40;searchWord, &#40;charIndex+i&#41;, searchWordLength&#41;==0&#41;
				nFound++;
		&#125;
	&#125;
	fclose&#40;infile&#41;;

	printf &#40;"Vrethike %d fores.", nFound&#41;;

	return 0;
&#125;
Για το τρίτο δεν νομίζω να έχεις πρόβλημα αφού έκανες το πρώτο.

panospcm
Δημοσιεύσεις: 4
Εγγραφή: 24 Μάιος 2006 00:12

ζητάει το όνομα ενός αρχείου το οποίο θα περιέχει ανά γραμμή

Δημοσίευση από panospcm » 29 Μάιος 2006 13:29

thanks.eixes dikio gia to fscanf , den to eixa dei. tora mporeis na mou eksigiseis ti exeis kanei mesa stin while ston kodika sou?giati den polykatalava. episis gia to 3o exo provlima, sto oti den mou emfanizei ta kena kai sta teleutaia grammata xyz den ta kanei abc antoistoixa

aspoume oti paei etsi

Κώδικας: Επιλογή όλων


#include <stdio.h>

void main&#40;int args, char *argc&#91;&#93;&#41;

&#123;

FILE *infile;
FILE *outfile;

char N;


   infile=fopen&#40;"C&#58;/old.txt","r"&#41;; 
    
outfile=fopen&#40;"C&#58;/caesar.txt","w"&#41;; 


   

 while&#40;fscanf&#40;infile, "%c ", &N&#41; > 0&#41;&#123; 
   

N=N+3;


fprintf&#40;outfile,"%c",N&#41;;

&#125;

 fclose&#40;outfile&#41;; 
   fclose&#40;infile&#41;; 

   
&#125; 

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

ζητάει το όνομα ενός αρχείου το οποίο θα περιέχει ανά γραμμή

Δημοσίευση από dva_dev » 29 Μάιος 2006 20:06

Αυτό που κάνει είναι ότι ψάχνει μέσα στην λέξη που διαβάζει από το αρχείο είναι να βρεί
πόσες φορές υπάρχει η λέξη που δίνεις.
Αν έχεις δώσει εσύ τη λέξη "ΠΑΤΑ" υπολογίζει το μήκος της -> 4 χαρακτήρες.
και διαβάζει από το αρχείο κάποια στιγμή τη λέξη "ΠΑΤ"
Υπολογίζει το μήκος της λέξης "ΠΑΤ" -> 3 χαρακτήρες.
Με το for (...) αγνοεί όλες τις λέξεις που το μήκος της λέξης που διαβάζει από το
αρχείο είναι μικρότερο από το μήκος της λέξης που έδωσες αφού προφανώς δεν θα τη βρεί.
ακόμα και αν η λέξη ήταν "ΠΑΤ" 3 χαρακτήρες ή "ΠΑ" (2 χαρακτήρες) δεν υπάρχει λόγος να ψάξει,
άρα ασχολείται μόνο με λέξεις που είναι τουλάχιστον όσους χαρακτήρες είναι και η λέξη
που έδωσες (τουλάχιστον 4).
Για αυτές τις λέξεις ψάχνει να βρεί αν η λέξη που έδωσες εμφανίζεται και πόσες φορές.
Εστω λοιπόν ότι έχει διαβάσει την λέξη "ΠΑΤΑΤΑΚΙΑ" (8 χαρακτήρες) από το αρχείο.
Συγκρίνει από τον i χαρακτήρα της λέξης αυτής και για 4 χαρακτήρες κάθε φορά (όσο είναι το μήκος
της λέξης που έδωσες) μήπως είναι η λέξη που έδωσες.
Αν είναι αυξάνει τον μετρητή ότι βρέθηκε και συνεχίζει από τον επόμενο χαρακτήρα και μετά.
Αυτό γίνεται μέχρι να φτάσει στους τελευταίους 4 χαρακτήρες, γιατί δεν έχει νόημα να
συνεχίσει παραπέρα με τους τελευταίους 3 ή 2 ή 1 αφού δεν πρόκειται να βρεί τίποτα.
Κάνει τα ίδια με την επόμενη λέξη που διαβάζει από το αρχείο.
Σχηματικά οι συγκρίσεις που γίνονται είναι οι εξής:

Κώδικας: Επιλογή όλων

ΠΑΤΑ		&#40;η λέξη που έδωσες&#41;
ΠΑΤΑ----	&#40;η λέξη που διάβασε από το αρχείο&#41;. Στο 1ο loop τσεκάρει τους χαρακτήρες &#40;0-3&#41; και την βρίσκει.
-ΑΤΑΤ---	Στο 2ο loop τσεκάρει τους χαρακτήρες &#40;1-4&#41;, δεν βρίσκει τίποτα.
--ΤΑΤΑ--	Στο 3ο 
---ΑΤΑΚ--	4ο
----ΤΑΚΙ-	5ο
-----ΑΚΙΑ	6ο
			Δεν έχει νόημα να συνεχίσει από εδώ και κάτω δεν πρόκειται να βρεί τίποτα.
Αν η λέξη που είχαμε δώσει ήταν "ΑΤΑ" και η λέξη που είχε διαβάσει ήταν "ΠΑΤΑΤΑΚΙΑ"
Σχηματικά οι συγκρίσεις που γίνονται είναι οι εξής:

Κώδικας: Επιλογή όλων

ΑΤΑ			&#40;η λέξη που έδωσες&#41;
ΠΑΤ-----	Στο 1ο loop τσεκάρει τους χαρακτήρες &#40;0-2&#41; δεν βρίσκει τίποτα.
-ΑΤΑ----	Στο 2ο loop τσεκάρει τους χαρακτήρες &#40;1-4&#41;, βρίσκει 1η φορά.
--ΤΑΤ---	Στο 3ο loop δεν βρίσκει τίποτα.
---ΑΤΑ---	4ο, βρίσκει πάλι για 2η φορά
----ΤΑΚ--	5ο
-----ΑΚΙ-	6ο
------ΚΙΑ	7ο
			Δεν έχει νόημα να συνεχίσει από εδώ και κάτω δεν πρόκειται να βρεί τίποτα.
Πρέπει να είναι αρκετά κατανοητό (γιατί ίδρωσα να γράφω - δεν έχω και air condition...).
:pepsi:

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

ζητάει το όνομα ενός αρχείου το οποίο θα περιέχει ανά γραμμή

Δημοσίευση από soteres2002 » 29 Μάιος 2006 20:49

basika mono mia mikri paratirisi, an theloume na eimaste pistoi ston arxiko algorithmo prepei na exei antikatastathei me to eksis to tmima elegxou gia to telos tis rois tou arxeiou. opote

while(!feof(stream)) {
....
}

eksalou stin C etsi palebetai auto os sinithos.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

ζητάει το όνομα ενός αρχείου το οποίο θα περιέχει ανά γραμμή

Δημοσίευση από dva_dev » 29 Μάιος 2006 22:23

λέξη "ΠΑΤΑΤΑΚΙΑ" (8 χαρακτήρες)
:oops: άκυρο, είναι 9 χαρακτήρες :oops:
episis gia to 3o exo provlima, sto oti den mou emfanizei ta kena
H fscanf ουσιαστικά κόβει λέξεις/αριθμούς/... στους διαχωριστικούς χαρακτήρες
(κενά, αλλαγή γραμμής, tabs, και ένα σωρό άλλα. Ακόμα δεν μπορείς να ξέρεις αν είναι
ένα κενό ανάμεσα στις λέξεις σου ή 50 για να κάνεις κάποια υπόθεση και να προχωρήσεις,
εκτός και αν θέσεις ΕΣΥ περιορισμούς εξαρχής για τη μορφή του αρχείου, αν και πως θα χωρίζονται οι λέξεις,
αν θα υπάρχουν σημεία στίξης, αλλαγές γραμμής κ.λπ.
Σε μια πιο γενική περίπτωση (που θα πρότεινα) θα μπορούσες:

α) να διαβάσεις το αρχείο (και να κάνεις την αλλαγή χαρακτήρα χαρακτήρα γράφωντας στο αρχείο τον χαρακτήρα που επεξεργάστηκες).
β) να διαβάσεις ολόκληρες γραμμές από το αρχείο, και να επεξεργαστείς χαρακτήρα χαρακτήρα ολόκληρη τη γραμή, και στο τέλος να πας να γράψεις ολόκληρη τη γραμμή στο αρχείο. Κάνεις το ίδιο με την επόμενη γραμμή.
kai sta teleutaia grammata xyz den ta kanei abc antoistoixa
Αυτό που πρέπει να κάνεις είναι να ελέγχεις αν (μετά την πρόσθεση) έχεις ξεπεράσει το "Z" ή "z"
και να κάνεις μια μετακίνηση στην αρχή (ουσιαστικά αφαιρώντας ολόκληρο το αλφάβητο).

Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <ctype.h>

void main&#40;int args, char *argc&#91;&#93;&#41;
&#123;
	FILE *infile;
	FILE *outfile;
	char N;

	infile=fopen&#40;"C&#58;\\old.txt","r"&#41;;
	outfile=fopen&#40;"C&#58;\\caesar.txt","w"&#41;;

	while&#40;fread&#40;&N, sizeof&#40;char&#41;, 1, infile&#41; > 0&#41;
	&#123;
		//Θα ασχοληθούμε μόνο με τα γράμματα. Κενά, νούμερα, σημεία στίξης κλπ
		//τα αγνοούμε και τα γράφουμε όπως είναι.
		if &#40;isalpha&#40;N&#41;&#41;
		&#123;
			N=N+3;
			//Κοιτάμε μήπως πρέπει να μετακινήσουμε το γράμμα στην αρχή του αλφαβήτου
			if &#40; &#40;N > 'z'&#41; ||
				 &#40;&#40;N < 'a'&#41; && &#40;N > 'Z'&#41;&#41; &#41;
			&#123;
				N=N-&#40;'Z'-'A'+1&#41;;
			&#125;
		&#125;
		fwrite&#40;&N, sizeof&#40;char&#41;, 1, outfile&#41;;
	&#125;
	fclose&#40;outfile&#41;;
	fclose&#40;infile&#41;;
&#125;

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες