Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   СИ (https://forum.antichat.xyz/showthread.php?t=121382)

rubik-nerubik 19.05.2009 17:43

СИ++ (подправь код - получи аську)
 
Программа считывает текст из файла и выводит его на экран, заменив цифры от 0 до 9 на слова
"ноль", "один",...,"девять", начиная каждое предложение с новой строки.

Код:

#include <iostream>
#include <fstream>
#include <string>
#include <clocale>
using namespace std;

int main(){
    setlocale(LC_CTYPE, "Russian"); // для русских букв
    ifstream file("text.txt"); // открываем файл text.txt
    string str;
    string num[10] = {"ноль","один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять"};
    getline( file, str, static_cast<char>(EOF)); // считываем текст из файла

    cout << str;
    for( char ch = '0'; ch <= '9'; ch++ ){
        string::size_type index = 0;
        while(( index = str.find( ch, index )) != string::npos ){
            str.replace( index, 1, num[ch-'0'] );
        }
    }
    cout << "\n\n\nResultat:\n\n" << str;

    cin.sync();
    cout << "\n\n\n Enter to exit\n\n";
    getchar(); // пауза
    return 0;
}

нашел в нете, кто поможет пордерактировать так, чтоб работало в Borland C 3.1., т.е. ничего лишнего, а это не работает. вот.

Gar|k 19.05.2009 19:24

ну во первых это Си++, а не Си
во вторых вот нашел учебник для 9 класса ) (http://kpolyakov.narod.ru/school/c.htm)

используй двумерный массив
char num[10][10] = {"ноль","один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять"};

а для замены сделай отделную переменную буффер (char buff[1024]) и туда способом strcat (ст 32 в учбенике) помещай результат замены хех...

ну а анализировать тебе надо будет каждый байт файлика...
читай ту книжку толково ;)

rubik-nerubik 19.05.2009 19:31

с меня семизначная аська, за выполненный полностью результат, тут тупо поменять, для знающего человека пустяк =(


+у меня одномерный массив а не двух

Gar|k 19.05.2009 20:04

в личку тебе отправил...

rubik-nerubik 19.05.2009 21:22

ты её проверял с файлом????? а то пишет тупо error

rubik-nerubik 19.05.2009 21:24

кстати, тут пипец у те всякие fopen ))))))можно по проще код? 0_0 и проверь его сразу там, в Borland c 3.1, семизнак будет!!! не ссы, мне главное что пахало всё.

вот три фотки примеров http://www.rapidshare.ru/1044772 мнеб так, т.е. по простому без заморочек...

Gar|k 19.05.2009 22:10

канешн с файлом... просто его надо положить в диру с программой )

в файле записано 3513624 и все...

Gar|k 19.05.2009 22:15

чувак в тех примерах не Си а Си++ - это разные языки
бороды Си 3,1 у мя в памине нет проверял на бороде Си++ 6,0 проект создавал как чистый Си консольный все пашет... файл нужно ложить в папку с прогой или указывать полный путь до него

rubik-nerubik 19.05.2009 22:17

Цитата:

Сообщение от Gar|k
чувак в тех примерах не Си а Си++ - это разные языки
бороды Си 3,1 у мя в памине нет проверял на бороде Си++ 6,0 проект создавал как чистый Си консольный все пашет... файл нужно ложить в папку с прогой или указывать полный путь до него

http://upload.com.ua/get/900318320/ тут качни. я наю что файл должен лежать рядом с исходником ^_^. )))

проверь на "Privet clovarb 1 2 3. Privet 2 3 4 9. Aga aga 1" этом и не забывай, что прога должна ещё все предложения с новой строки

Gar|k 19.05.2009 23:20

ушло в личку... а дал ссылку ты мне на бороду Си++ 3.1 )
я изначально думал тебе просто циферки преобразовать надо а те заменить надо ммм ) хех

rubik-nerubik 20.05.2009 19:50

ну да. помогите, номерок АСИКЬЮ ещё в силе.

Gar|k 20.05.2009 23:44

а моя прога че не устраивает? яж те новую версию вроде отправлял

rubik-nerubik 21.05.2009 16:44

Цитата:

Сообщение от Gar|k
а моя прога че не устраивает? яж те новую версию вроде отправлял


неееее мне так, чтоб работало и небыло заморочек , и чтоб работало, повторюсь)) проверь плиз именно в той 3.1. ОООЧ надо.

Gar|k 21.05.2009 19:55

поставь патч прямые руки 1.0.2

fker 21.05.2009 20:12

Спешиал фор ю!) BC 3.1
написано кривовато конешно, но работает...
входные данные
http://img193.imageshack.us/img193/8392/inpt.th.jpg
результат
http://img193.imageshack.us/img193/9690/runingpr.th.jpg
сорец:
PHP код:

#include<conio.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void print_wrd(char *); //прототип ф-ии, преобраз цифру в слова
void main()
{
clrscr();
FILE *fPtr;
char *str[20],*wrd[30];
int i=0,j=0;
//открываем файл на чтение
if((fPtr=fopen("inpt.txt""rt"))==NULL){
   
printf("File could not be open =(\n");
   
getch();
   return;
   }
else{
   
//в цикле считываем строки из файла в массив str. кста макс строка может быть 50 байт
   
fgets(str[i],50,fPtr);
   while(!
feof(fPtr)){
       
i++;
       
fgets(str[i],50,fPtr);
       }
   
fclose(fPtr);
   }
//разбиваем каждую строку на слова при помощи strtok   
for(int k=0k<=ik++){
   
wrd[j]=strtok(str[k]," ");
   while(
wrd[j]!=NULL){
      
//передаем слово(цифру) ф-ии print_wrd которая уже и преобразует 123 в АдЫн Два Три  
      
print_wrd(wrd[j]);
      
j++;
      
wrd[j]=strtok(NULL," ");
      }
   }
getch();
}
void print_wrd(char *wrd)
{
char *cfr[]={"HOJIb","oDbIH","DBa","Tpu","4eTbIpu","n9Tb""6ecTb","CeMb","BoceMb","DeB9Tb"};
int n,i,c;
n=strlen(wrd);
//в цикле печатаем цифры из слова wrd
for(i=0i<ni++){
    
c=wrd[i]-48;//типа превращяем символ в цофру
    //проверка является-ли с цифрой, если является то выбираем ее из cfr
    
if(c>=0&&c<=9){
       
printf("%s ",cfr[c]);
       }
    }
printf("\n");


Все вместе в архиве

rubik-nerubik 21.05.2009 20:19

fker он из примера:
"Privet 1.
Privet 2. 3"

ВЫвел только:
"
ODblN
DVA
Tpu"

А надо
"Privet Odin.
Privet Dva.
Tpu"
Т.е. 1)каждое предложение с новой строки 2)чтобы всё выводилось на экран , не внимательно читал, а так, пашет клёва..... доработай и я тебе тогда отдам аську, заслужил

fker 21.05.2009 20:27

Нао было сразу выкладывать примеры входных данных и результат обработки =\
Тогда получаццо еще проще, но время нет делать\\ если тока завтро

Gar|k 21.05.2009 20:47

2 fker ихмо я круче

Код:

#include "stdlib.h"
#include "stdio.h"
#include "malloc.h"

int main(int argc, char * argv[]) {
FILE * f;
size_t buflen = 0,
result = 0,
si = 0;
unsigned char * buffer,
ch;

char num[10][10] = {
"nol",
"odin",
"dva",
"tri",
"chet",
"pat",
"shest",
"sem",
"vos",
"dev"
};

f = fopen("test.txt", "rb");
if (f == NULL) {
printf("Error open!");
return 1;
}

fseek(f, 0, SEEK_END);
buflen = ftell(f);
rewind(f);

buffer = (unsigned char * ) malloc(buflen);
if (buffer == NULL) {
printf("Memory error\n");
return 2;
}
result = fread(buffer, 1, buflen, f);
if (result != buflen) {
printf("Reading error\n");
return 3;
}

while (si < buflen) {
if (buffer[si] == '.') {
putc(buffer[si], stdout);
putc(0x0A, stdout);
}
else {
ch = buffer[si] - 0x30;

if (ch >= 0 && ch <= 9) {
printf("%s", num[ch]);
}
else {
putc(buffer[si], stdout);
}
}
si++;
}

free(buffer);

fclose(f);

getchar();

return 0;
}


rubik-nerubik 21.05.2009 20:54

жесть... чем он лучше?? у него код проще, можешь его код доделать? у тебя слишком замороченный))) "1)каждое предложение с новой строки 2)чтобы всё выводилось на экран" и всё.

fker 21.05.2009 21:20

пиу
 
PHP код:

#include<conio.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define fname "inpt.txt"
void print_wrd(char *);
void main()
{
clrscr();
char *cfr[]={"HOJIb","oDbIH","DBa","Tpu","4eTbIpu","n9Tb""6ecTb","CeMb","BoceMb","DeB9Tb"};
FILE *fPtr;
char *str[20],*wrd[30];
int i=0,j=0,n,c;
if((
fPtr=fopen(fname"rt"))==NULL){
   
printf("File could not be open =(\n");
   
getch();
   return;
   }
else{
   
fgets(str[i],50,fPtr);
   
//printf("%s",str[i]);
   
while(!feof(fPtr)){
       
i++;
       
fgets(str[i],50,fPtr);
       
//printf("%s",str[i]);
       
}
   
fclose(fPtr);
   }
for(
int k=0k<=ik++){
   
n=strlen(str[k]);
   for(
j=0j<=nj++){
      
c=str[k][j];
      if(
c>='0'&&c<='9')
         
printf(" %s",cfr[c-48]);
      else
         
printf("%c",c);
      }
   
printf("\n");
   }
getch();


блё, как ху*ва жить без инета=((

Gar|k 21.05.2009 21:22

он юзает команды strlen, strtok они нафиг не нужны ) зачем разбитвать строку на слова?
встретил цифру заменил ) встретил точку поставил перенос строки... все

fseek(f, 0, SEEK_END);
buflen = ftell(f);
rewind(f);

определяем скока байт файл занимает

buffer = (unsigned char * ) malloc(buflen); выделяем памяти под весь файл и туда считываем файл все... терь файл в памяти

побайтово движемся по памяти - файлу. если точка ставим перенос строки
если не точка

преобразовываем в цифру если от нуля до 9 то вместо этого пишем слово из массива num а если не цифра просто печатаем этот символ ) усе...

но я думаю можно круче сделать если напрямую указатель прибавлять ) тогда si не понадобится + можно еще несколько переменных убрать а то че они лишние хех

rubik-nerubik 21.05.2009 21:29

вооо пашет, вот тока бы чтоб каждое предложение с новой строки, это видимо, если находит точку, то перескакивает на новую строку походу...

rudvil 21.05.2009 21:47

Некрасиво конечно, но проще уже точно некуда
Код:

#include <iostream>
#include <fstream>
#include <ctype.h>
#include <string>
using namespace std;

int main () {
    string line;
    string filename;
    cout << "Vvedite imja/putj fajla\n";
    cin >> filename;
    ifstream file(filename.c_str());
    if (file.is_open()) {
        while (!file.eof()) {
            getline(file, line);
            for (int i = 0; i < line.length(); i++ ) {
                if (isdigit(line.at(i))) { // vidim cifru, vivodim ee
                    switch (atoi(line.substr(i, 1).c_str())) {
                        case 0:
                            cout << "NOLJ";
                            break;
                        case 1:
                            cout << "ADZIN";
                            break;
                        case 2:
                            cout << "DVA";
                            break;
                        case 3:
                            cout << "TRI";
                            break;
                        case 4:
                            cout << "CETIRE";
                            break;
                        case 5:
                            cout << "PJATJ";
                            break;
                        case 6:
                            cout << "SSESTJ";
                            break;
                        case 7:
                            cout << "SEMJ";
                            break;
                        case 8:
                            cout << "VOSEMJ";
                            break;
                        case 9:
                            cout << "DEVATJ";
                            break;
                    }
                }
                else if (line.at(i) == 46) { // vidim tochku t.e. konec stroki vivodim ee i novuju stroku
                    cout << line.at(i) << endl;
                }
                else { // vivodim vso ostalnoje
                    cout << line.at(i);
                }
            }
        }
        file.close();
    }
    else {
        cout << "Oshibka pri otkritii fajla " << filename << endl;
    }
    return 0;
}


rubik-nerubik 21.05.2009 22:02

Цитата:

Сообщение от rudvil
Некрасиво конечно, но проще уже точно некуда
Код:

#include <iostream>
#include <fstream>
#include <ctype.h>
#include <string>
using namespace std;

int main () {
    string line;
    string filename;
    cout << "Vvedite imja/putj fajla\n";
    cin >> filename;
    ifstream file(filename.c_str());
    if (file.is_open()) {
        while (!file.eof()) {
            getline(file, line);
            for (int i = 0; i < line.length(); i++ ) {
                if (isdigit(line.at(i))) { // vidim cifru, vivodim ee
                    switch (atoi(line.substr(i, 1).c_str())) {
                        case 0:
                            cout << "NOLJ";
                            break;
                        case 1:
                            cout << "ADZIN";
                            break;
                        case 2:
                            cout << "DVA";
                            break;
                        case 3:
                            cout << "TRI";
                            break;
                        case 4:
                            cout << "CETIRE";
                            break;
                        case 5:
                            cout << "PJATJ";
                            break;
                        case 6:
                            cout << "SSESTJ";
                            break;
                        case 7:
                            cout << "SEMJ";
                            break;
                        case 8:
                            cout << "VOSEMJ";
                            break;
                        case 9:
                            cout << "DEVATJ";
                            break;
                    }
                }
                else if (line.at(i) == 46) { // vidim tochku t.e. konec stroki vivodim ee i novuju stroku
                    cout << line.at(i) << endl;
                }
                else { // vivodim vso ostalnoje
                    cout << line.at(i);
                }
            }
        }
        file.close();
    }
    else {
        cout << "Oshibka pri otkritii fajla " << filename << endl;
    }
    return 0;
}


НАДО ДЛЯ Borland C++ 3.1 а не 6.0 ...=\ писал же ..((

nerezus 22.05.2009 10:53

И нравится вам юзать компилер, которому 20 лет и который не поддерживает современный C++.
Купи нетбук и поставь нормальную IDE, либо на флешку Code::Blocks запиши, он без установки пашет.

Gar|k 22.05.2009 11:37

2 nerezus
у чувака криворукие у него даж норманый рабочий исходник на Си не пашет

потом тему завел Си... а на самом деле ему нужна прога на Си++
в общем ппц

rubik-nerubik 23.05.2009 10:09

PHP код:

 #include<conio.h> 
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
#define fname "inpt.txt" 
void print_wrd(char *); 
void main() 

clrscr(); 
char *cfr[]={"HOJIb","oDbIH","DBa","Tpu","4eTbIpu","n9Tb""6ecTb","CeMb","BoceMb","DeB9Tb"}; 
FILE *fPtr
char *str[20],*wrd[30]; 
int i=0,j=0,n,c
if((
fPtr=fopen(fname"rt"))==NULL){ 
   
printf("File could not be open =(\n"); 
   
getch(); 
   return; 
   } 
else{ 
   
fgets(str[i],50,fPtr); 
   
//printf("%s",str[i]); 
   
while(!feof(fPtr)){ 
       
i++; 
       
fgets(str[i],50,fPtr); 
       
//printf("%s",str[i]); 
       

   
fclose(fPtr); 
   } 
for(
int k=0k<=ik++){ 
   
n=strlen(str[k]); 
   for(
j=0j<=nj++){ 
      
c=str[k][j]; 
      if(
c>='0'&&c<='9'
         
printf(" %s",cfr[c-48]); 
      else 
         
printf("%c",c); 
      } 
   
printf("\n"); 
   } 
getch(); 


кто может его подправить чтобы КАЖДОЕ предложение,9т.е. если найдётся точка, выводилось с новой строки

счас выводит из получаемого
TExt 1 2. TExt 2 3. 3 3
получает
Text odin dva. TExt dva tri. tri tri

а надо именно

Text odin dva.
TExt dva tri.
tri tri
вот. автор вышеперечисленного кода получит семизнак, как тока установлю на компе винду =\ а тот кто исправит тоже. че я жадина чтоли

043nKRuT0y 23.05.2009 11:56

По моему самый простой вариант перехода на новую строку ето в цыкле вставить проверку :
Код:

if ( str[k] == '.' )cout<<endl;
При такой проверке как только встретится точка курсор прыгнет на новую строку !

Да и вообще код какойто масивный для даного задания .... можно и попроще )

Я в разделе "Студентам с лабами" сделал ето заданице ))) Для проверку на точку в тот код просто вставь :
Код:

case '.' :
              cout<<endl;
              break;


Sn@k3 23.05.2009 18:49

про переход на новую строку. пихни в #27
Код:

...................
c=str[k][j];  c1=str[k][j-1];


        switch(c1) { case '.': printf("\n"); break;  }


      if(c>='0'&&c<='9') {
..............

ну и c1 задай.. вроде похоже на правду.

fker 26.05.2009 13:42

интересно ТС сдержал свое слово... Кому отправилась семерка?

Gar|k 26.05.2009 16:12

не мне ) тк ТС пощитал что "главное чтобы работало" у меня реализовано как-то сложно для его понимания ггг


Время: 12:02