Η σελίδα μας αναβαθμίστηκε, γι' αυτό τον λόγο τα μέλη μας θα πρέπει να ζητήσουν νέο κωδικό πρόσβασης από την υπηρεσία "Αποστολή κωδικού πρόσβασης".
Εάν το email με τον νέο κωδικό δεν έρθει στο inbox κοιτάξτε και στο spam folder. Ο server είναι φρέσκος και δεν έχει το reputation που του αξίζει.

Question C++

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

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

Απάντηση
Karamela
Δημοσιεύσεις: 1
Εγγραφή: 01 Δεκ 2004 21:11

Question C++

Δημοσίευση από Karamela » 01 Δεκ 2004 23:51

Prospathw na kanw mia askisi h opoia diavazei tous xaraktires tis lexeis apo ena arxeio kai ws output na exei ton arithmo twn n lexewn kai twn xaraktirwn kai diafora alla.H mia sunartisi pou eftiaxa einai auti: :o

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

char get_next_char(ifstream& in)
{	char c;
	string g;
	in.get(c);
	if (c==$)// edw thelw na min diavazei to $ kai tis lexeis meta
                {getline(in,g);
	c=' ';
	}
	return c;
}
Twra thelw na ftiaxw mia sunartisi pou na kalei autin kai na diavazei tis lexeis. BAsika exw kanei kai thn deuteri function. Yparxri kapoios pou mporei na help?

Yawkin
Δημοσιεύσεις: 15
Εγγραφή: 13 Νοέμ 2004 14:26

Question C++

Δημοσίευση από Yawkin » 22 Δεκ 2004 23:35

Πρώτον με συγχωρείς, δε θυμάμαι καλά τις εντολές getline(), e.t.c.

Δε νομίζω ότι είναι δύσκολο αυτό που ζητάς. Πρέπει να προσέξεις τα εξής:

Να διαβάζεις έναν-έναν τους χαρακτήρες

Κάθε φορά που βρίσκεις κενό προσθέτεις 1 στη μεταβλητή words

Πόσο θα θεωρείς το ελάχιστο μήκος για μία λέξη (πχ η λέξη ο θα θεωρείται σαν λέξη ναι ή όχι?)

Προσοχή στα σημεία στίξης. Π.χ. μπορεί να υπάρχει μια φράση που έχει ένα κόμμα , έτσι όπως το έχω γράψει (δηλαδή να μην είναι κολλημένο με τη λέξη). Θα μετρηθεί το κόμμα σαν μια άλλη λέξη. Μη μετράς λοιπόν τους ειδικούς χαρακτήρες.

Όσο για το σύνολο των χαρακτήρων απλώς πρέπει να αποφασίσεις, θέλεις να μετράς και τα κενά? τα σημεία στίξης?

Αν ακόμη θέλεις να μετράς προτάσεις, κανένα πρόβλημα. Μέτρα τις τελείες.

DIRECTX
Δημοσιεύσεις: 1
Εγγραφή: 27 Δεκ 2004 09:28

Question C++

Δημοσίευση από DIRECTX » 27 Δεκ 2004 09:51

Χμ.. εγώ ακολούθησα διαφορετική τακτική σχεδιάζοντας ένα πρόγραμμα (σε Borland Builder -Borland C/C++ 32bit Compiler 5.6.4-, περιβάλλον Windows Console, καθώς δεν ασχολούμαι με την περίφημη C++ Template library) :

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


//-Read File Words (FCOUNT)-(c) 2004 by DIRECTX--4--BCC32-Windows--------------

#include <stdio.h>
#include <alloc.h>
#include <string.h>
#include <conio.h>
#include <fcntl.h>
#include <io.h>

int   nFile;

long  lFileLen,
      lWordsCount=0,
      lWordsCharacters=0,
      lOrphanCharacters=0,
      lLinesCount=0;

char  *pszFileBuffer =  NULL,
      *pszStrToken   =  NULL;

long  ConvertBuffer  &#40;char *pszBuffer&#41;;

void main&#40;int argc,char *argv&#91;&#93;&#41;
&#123;
  // Check syntax parameters..
  if&#40;argc==1&#41;
   &#123;
     printf&#40;" Usage&#58; FCOUNT   filename\n"&#41;;
     return;
   &#125;

  // Open file for binary mode reading
  if&#40;&#40;nFile=open&#40;argv&#91;1&#93;,O_RDONLY|O_BINARY&#41;&#41;==-1&#41;
   &#123;
     printf&#40;" File I/O Error&#58; Cannot open file - %s\n",argv&#91;1&#93;&#41;;
     return;
   &#125;
  // Find file length
  if&#40;&#40;lFileLen=filelength&#40;nFile&#41;&#41;==-1L&#41;
   &#123;
     close&#40;nFile&#41;;
     printf&#40;" File I/O Error&#58; Cannot get file length - %s\n",argv&#91;1&#93;&#41;;
     return;
   &#125;
  // Allocate enough memory to hold entire Stream &#40;+2=\0 string trailing in C&#41;
  if&#40;&#40;pszFileBuffer=&#40;char*&#41;malloc&#40;lFileLen+2&#41;&#41;==NULL&#41;
   &#123;
     close&#40;nFile&#41;;
     printf&#40;" Memory Error&#58; Not enough memory to load file - %s &#40;%ldKB req.&#41;\n",
            argv&#91;1&#93;,lFileLen&#41;;
     return;
   &#125;
  memset&#40;pszFileBuffer,0,lFileLen+2&#41;;

  // Read Stream to memory!!
  if&#40;read&#40;nFile,&#40;char*&#41;pszFileBuffer,lFileLen&#41;==-1&#41;
   &#123;
     free&#40;pszFileBuffer&#41;;
     close&#40;nFile&#41;;
     printf&#40;" File I/O Error&#58; File read failure - %s\n",argv&#91;1&#93;&#41;;
     return;
   &#125;
  // Get rid of Stream handle
  close&#40;nFile&#41;;

  /* Convert pszBuffer control characters to spaces.. and
     count it's lines &#40;each line is marked as 'new line' \n&#41;
  */
  lLinesCount  =  ConvertBuffer&#40;pszFileBuffer&#41;;

  /* Search for words&#58;
         0.Is the file buffer empty??
         1.The rule is that each word gets separated with spacees
         2.Should we though of words for strings of 1 character??
            lets considerate them as Orphan characters &#58;-&#41;
  */
  if&#40;&#40;pszStrToken=strtok&#40;pszFileBuffer," "&#41;&#41;!=NULL&#41;
   &#123;
     do&#123;
         lWordsCount++;

         if&#40;strlen&#40;pszStrToken&#41;==1&#41;
          &#123; lOrphanCharacters++; &#125;
         else
          &#123; lWordsCharacters+=strlen&#40;pszStrToken&#41;; &#125;

         printf&#40;" Word = '%s' Sum = %ld\n",pszStrToken,lWordsCharacters&#41;;
       &#125;while&#40;&#40;pszStrToken=strtok&#40;NULL," "&#41;&#41;!=NULL&#41;;
   &#125;

  // Deallocate memory!!
  free&#40;pszFileBuffer&#41;;

  // Return statistics..
  printf&#40;"  Lines             found&#58;   %ld\n",lLinesCount&#41;;
  printf&#40;"  Words             found&#58;   %ld\n",lWordsCount&#41;;
  printf&#40;"  Characters        found&#58;   %ld\n",lWordsCharacters&#41;;
  printf&#40;"  Orphan characters found&#58;   %ld\n",lOrphanCharacters&#41;;
  printf&#40;"  Total characters  found&#58;   %ld\n",lWordsCharacters+lOrphanCharacters&#41;;
                               //^ MS-Word like result

  printf&#40;" .. Hit a key to quit .. "&#41;;
  getch&#40;&#41;;
&#125;

long  ConvertBuffer  &#40;char *pszBuffer&#41;
&#123;
  /*  1.Count each new line character as separated line!!
      2.Change every pszBuffer new line \n and carrier return \r to space
      assuring correct strtok functionallity!
  */
  long   lCharIndex,lLinesCount=0;

  for&#40;lCharIndex=0;lCharIndex<=strlen&#40;pszBuffer&#41;;lCharIndex++&#41;
   &#123;
     lLinesCount+=&#40;pszBuffer&#91;lCharIndex&#93;=='\n'&#41;?1&#58;0;

     if&#40;pszBuffer&#91;lCharIndex&#93;=='\n' ||
        pszBuffer&#91;lCharIndex&#93;=='\r'&#41;
      &#123;
        pszBuffer&#91;lCharIndex&#93;=' ';
      &#125;
   &#125;

  return lLinesCount-1;
&#125;

Που:
1ον) Ανοίγει το αρχείο σε κατάσταση δυαδικής ανάγνωσης.
2ον) Μαθαίνει το μέγεθος του.
3ον) Δεσμεύει την ανάλογη μνήμη (+2 bytes για τα control code της C).
4ον) Διαβάζει το αρχείο στην μνήμη.
5ον) Κλείνει τα αρχείο.
6ον) Μετρά από την μνήμη τους ειδικούς χαρακτήρες που υποδεικνύουν αλλαγή γραμμής στο κείμενο (\n = new line), -1 καθώς μετράμε από το μηδέν, ύστερα μαζί με τους χαρακτήρες επιστροφής γραμμής (\r = carrier return) τους μετατρέπει σε χαρακτήρες κενού (space).
7ον) Με την βοήθεια της strtok λαμβάνει έκαστη λέξη από την μνήμη ως μπλοκ χαρακτήρων διαχωρισμένο με κενό (space).
8ον) Μετρά τους χαρακτήρες που απαρτίζουν την λέξη και τους προσθέτει στους ήδη υπάρχοντες.
9ον) Μετρά τις λέξεις που έχει επιστρέψει η strtok ως τώρα.
10ον) Μετρά ως «Ορφανούς» χαρακτήρες, εκείνα τα μπλοκ για την strtok που έχουν μέγεθος 1 χαρακτήρα.
11ον) Αποδεσμεύει την δεσμευμένη μνήμη, παρουσιάζει τα αποτελέσματα (προσθέτει - παρουσιάζει σε ανεξάρτητη γραμμή, τους Ορφανούς χαρακτήρες στους Συνολικούς χαρακτήρες, για να έχουμε και ένα αποτέλεσμα σε στυλ Word), αναμένει πάτημα πλήκτρου και ολοκληρώνει την εκτέλεση της εφαρμογής.

Καλή τύχη!!

:wink:

Απάντηση

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

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

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