PDA

Просмотр полной версии : СИ


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
чувак в тех примерах не Си а Си++ - это разные языки
бороды Си 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
а моя прога че не устраивает? яж те новую версию вроде отправлял


неееее мне так, чтоб работало и небыло заморочек , и чтоб работало, повторюсь)) проверь плиз именно в той 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/my.php?image=inpt.jpg)
результат
http://img193.imageshack.us/img193/9690/runingpr.th.jpg (http://img193.imageshack.us/my.php?image=runingpr.jpg)
сорец:
#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=0; k<=i; k++){
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=0; i<n; i++){
c=wrd[i]-48;//типа превращяем символ в цофру
//проверка является-ли с цифрой, если является то выбираем ее из cfr
if(c>=0&&c<=9){
printf("%s ",cfr[c]);
}
}
printf("\n");
}

Все вместе в архиве (http://slil.ru/27679546)

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
#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=0; k<=i; k++){
n=strlen(str[k]);
for(j=0; j<=n; j++){
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
Некрасиво конечно, но проще уже точно некуда
#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
#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=0; k<=i; k++){
n=strlen(str[k]);
for(j=0; j<=n; j++){
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
не мне ) тк ТС пощитал что "главное чтобы работало" у меня реализовано как-то сложно для его понимания ггг