Форум программистов, компьютерный форум CyberForum.ru

Заменить числа числительными - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Laxus
Сообщений: n/a
18.12.2008, 12:37     Заменить числа числительными #1
Текст задачи:
Имееться текстовый файл, в котором храниться некоторый текст. В тексте встречаються числа, записаные в цифровом представлении, а после числа в скобках одной буквой указан падеж, в котором это число следует читать. Напишите программу, которая на основе имеющегося файла создаст новый файл, заменяя числа количественными числительными в указаном падеже.

Ф-ю которая которая переводит число (long int) и падеж (int от 1 до 6) в числетельное нужного падежа (char*) я сделал с помощью туевой кучи case'ов. Она вроде работает. А с остальным у меня проблемы. Да еще и кодировка Дос и Вин разные (но это еще можно решить досконвертером).

Япланировал сделать так:
прочитать файл в строку (желательно одну)
а дальше проверять каждый символ, если он нечисло то писать в файл, если это код числа, то записывать эти символы в какую-то переменную пока эти символы - числа (while(isdigit(str[i])) вроде что-то типа этого) как только числа кончились, надо перевести указатель на букву падежа (тоесть пропускатьсимволы пока не дойдем до скобки, и еще плюс один) вот из нее как-то надо выделить падеж. Затем сворганить число из выделеного числа переведенного в long int и падежа в виде числа int и записать эту строку в файл, и дальше опять проверять следующие символы и записывать их в файл если это не число...
PS:обьяснил как смог....

Ну у меня так не вышло, из-за ошибок в коде , да и насчет алгоритма я тоже не очень сильно уверен в его верности. Помогите решить, сроки уже на исходе. Решать надо на си
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2008, 12:37     Заменить числа числительными
Посмотрите здесь:

Замена двухзначных чисел числительными на русском C++ Builder
Ввести с клавиатуры 10 чисел. Если среди них есть числа большие 15, заменить их на 15. Напечатать все полученные числа. C++
если старшая цифра числа четная то все числа стоящие на четных позиция заменить... C++
есть числа нужно их заменить на другие числа из таблицы!! C++
C++ Замена цифр в тексте числительными
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
18.12.2008, 12:47     Заменить числа числительными #2
Выложи сюда свой код. Пусть и с ошибками.
Laxus
Сообщений: n/a
18.12.2008, 13:35     Заменить числа числительными #3
Я там начал эксперементировать со всем, так что там уже все щас через сраку сделано..
Код
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int padej(char x)
  {if(x=='И'||x=='и') return 1;
  if(x=='Р'||x=='р') return 2;
  if(x=='Д'||x=='д') return 3;
  if(x=='В'||x=='в') return 4;
  if(x=='Т'||x=='т') return 5;
  if(x=='П'||x=='п') return 6;
  printf("ЋиЁЎЄ* Ї*¤Ґ¦*!");
  return 1;
  }
void n_part(long int n,int p,int* np1,int* np2,int* np3)
  {long int del=1;
  long int k;
  switch(p)
     {case 3: del=del*1000;
     case 2: del=del*1000;
     case 1: del=del*1000; break;
     case 0: del=1;
     }
  if(n!=3)
    k=n/del-n/(del*1000)*1000;
  else
    k=n/del;
  printf("\n n=%ld p=%d del=%ld k=%ld \n",n,p,del,k);
  *np1=k/100;
  *np2=k/10-*np1*10;
  *np3=k-*np1*100-*np2*10;
  }
void sklonyator(long int n,int padej,char* k)
  {int i,np1,np2,np3;
  char rez[200]="";
  if(n)
    /*{if(n<0)
      {strcat(rez,"минус ");
      n=-n;
      }*/

    for(i=3;i>=0;i--)
      {n_part(n,i,&np1,&np2,&np3);
      if(np1||np2||np3)
	  {
	//sotny
      switch(np1)
	{case 1:
	  switch(padej)
	    {case 1:case 4:strcat(rez,"сто "); break;
	    default: strcat(rez,"ста ");
	    }
	  break;
	case 2:
	  switch(padej)
	    {case 1:case 4:strcat(rez,"двести "); break;
	    case 2:strcat(rez,"двухсот "); break;
	    case 3:strcat(rez,"двумстам "); break;
	    case 5:strcat(rez,"двумстами "); break;
	    case 6:strcat(rez,"двухстах "); break;
	    }
	  break;
	case 3:
	  switch(padej)
	    {case 1:case 4:strcat(rez,"триста "); break;
	    case 2:strcat(rez,"трехсот "); break;
	    case 3:strcat(rez,"тремстам "); break;
	    case 5:strcat(rez,"тремястами "); break;
	    case 6:strcat(rez,"трехстах "); break;
	    }
	  break;
	case 4:
	  switch(padej)
	    {case 1:case 4:strcat(rez,"четыреста "); break;
	    case 2:strcat(rez,"четырехсот "); break;
	    case 3:strcat(rez,"четыремстам "); break;
	    case 5:strcat(rez,"четырьмястами "); break;
	    case 6:strcat(rez,"четырехстах "); break;
	    }
	  break;
	case 5:
	  switch(padej)
	    {case 1:case 4:strcat(rez,"патьсот "); break;
	    case 2:strcat(rez,"пятисот "); break;
	    case 3:strcat(rez,"пятистам "); break;
	    case 5:strcat(rez,"пятьюстами "); break;
	    case 6:strcat(rez,"пятистах "); break;
	    }
	  break;
	case 6:
	  switch(padej)
	    {case 1:case 4:strcat(rez,"шестьсот "); break;
	    case 2:strcat(rez,"шестисот "); break;
	    case 3:strcat(rez,"шестистам "); break;
	    case 5:strcat(rez,"шестьюстами "); break;
	    case 6:strcat(rez,"шестистах "); break;
	    }
	  break;
	case 7:
	  switch(padej)
	    {case 1:case 4:strcat(rez,"семьсот "); break;
	    case 2:strcat(rez,"семисот "); break;
	    case 3:strcat(rez,"семистам "); break;
	    case 5:strcat(rez,"семьюстами "); break;
	    case 6:strcat(rez,"семистах "); break;
	    }
	  break;
	case 8:
	  switch(padej)
	    {case 1:case 4:strcat(rez,"восемьсот "); break;
	    case 2:strcat(rez,"восьмисот "); break;
	    case 3:strcat(rez,"восьмистам "); break;
	    case 5:strcat(rez,"восмьюстами "); break;
	    case 6:strcat(rez,"восьмистах "); break;
	    }
	  break;
	case 9:
	  switch(padej)
	    {case 1:case 4:strcat(rez,"девятьсот "); break;
	    case 2:strcat(rez,"девятисот "); break;
	    case 3:strcat(rez,"девятистам "); break;
	    case 5:strcat(rez,"девятьюстами "); break;
	    case 6:strcat(rez,"девятистах "); break;
	    }
	  break;
	}
      //desyatki
      switch(np2)
	{case 1:
	  switch(np3)
	    {case 0:
	      switch(padej)
		{case 1:case 4:strcat(rez,"десять "); break;
		case 2:case 3:case 6:strcat(rez,"десяти "); break;
		case 5:strcat(rez,"десятью "); break;
		}
	      break;
	    case 1:
	      switch(padej)
		{case 1:case 4:strcat(rez,"одиннадцать "); break;
		case 2:case 3:case 6:strcat(rez,"одиннадцати "); break;
		case 5:strcat(rez,"одиннадцатью "); break;
		}
	      break;
	    case 2:
	      switch(padej)
		{case 1:case 4:strcat(rez,"двенадцать "); break;
		case 2:case 3:case 6:strcat(rez,"двенадцати "); break;
		case 5:strcat(rez,"двенадцатью "); break;
		}
	      break;
	    case 3:
	      switch(padej)
		{case 1:case 4:strcat(rez,"тринадцать "); break;
		case 2:case 3:case 6:strcat(rez,"тинадцати "); break;
		case 5:strcat(rez,"тринадцатью "); break;
		}
	      break;
	    case 4:
	      switch(padej)
		{case 1:case 4:strcat(rez,"четырнадцать "); break;
		case 2:case 3:case 6:strcat(rez,"четырнадцати "); break;
		case 5:strcat(rez,"четырнадцатью "); break;
		}
	      break;
	    case 5:
	      switch(padej)
		{case 1:case 4:strcat(rez,"пятнадцать "); break;
		case 2:case 3:case 6:strcat(rez,"пятнадцати "); break;
		case 5:strcat(rez,"пятнадцатью "); break;
		}
	      break;
	    case 6:
	      switch(padej)
		{case 1:case 4:strcat(rez,"шестнадцать "); break;
		case 2:case 3:case 6:strcat(rez,"шестнадцати "); break;
		case 5:strcat(rez,"шестнадцатью "); break;
		}
	      break;
	    case 7:
	      switch(padej)
		{case 1:case 4:strcat(rez,"семнадцать "); break;
		case 2:case 3:case 6:strcat(rez,"семнадцати "); break;
		case 5:strcat(rez,"семнадцатью "); break;
		}
	      break;
	    case 8:
	      switch(padej)
		{case 1:case 4:strcat(rez,"восемнадцать "); break;
		case 2:case 3:case 6:strcat(rez,"восемнадцати "); break;
		case 5:strcat(rez,"восемнадцатью "); break;
		}
	      break;
	    case 9:
	      switch(padej)
		{case 1:case 4:strcat(rez,"девятнадцать "); break;
		case 2:case 3:case 6:strcat(rez,"девятнадцати "); break;
		case 5:strcat(rez,"девятнацатью "); break;
		}
	    }
	  break;
	case 2:
	  switch(padej)
		{case 1:case 4:strcat(rez,"двадцать "); break;
		case 2:case 3:case 6:strcat(rez,"двадцати "); break;
		case 5:strcat(rez,"двадцатью "); break;
		}
	  break;
	case 3:
	  switch(padej)
		{case 1:case 4:strcat(rez,"тридцать "); break;
		case 2:case 3:case 6:strcat(rez,"тридцати "); break;
		case 5:strcat(rez,"тридцатью "); break;
		}
	  break;
	case 4:
	  switch(padej)
		{case 1:case 4:strcat(rez,"сорок "); break;
		default:strcat(rez,"сорока "); break;
		}
	  break;
	case 5:
	  switch(padej)
		{case 1:case 4:strcat(rez,"пятьдесят "); break;
		case 2:case 3:case 6:strcat(rez,"пятидесяти "); break;
		case 5:strcat(rez,"пятьюдесятью "); break;
		}
	  break;
	case 6:
	  switch(padej)
		{case 1:case 4:strcat(rez,"шестьдесят "); break;
		case 2:case 3:case 6:strcat(rez,"шестидесяти "); break;
		case 5:strcat(rez,"шестьюдесятью "); break;
		}
	  break;
	case 7:
	  switch(padej)
		{case 1:case 4:strcat(rez,"семьдесят "); break;
		case 2:case 3:case 6:strcat(rez,"семидесяти "); break;
		case 5:strcat(rez,"семьюдесятью "); break;
		}
	  break;
	case 8:
	  switch(padej)
		{case 1:case 4:strcat(rez,"восемьдесят "); break;
		case 2:case 3:case 6:strcat(rez,"восьмидесяти "); break;
		case 5:strcat(rez,"восмьюдесятью "); break;
		}
	  break;
	case 9:
	  switch(padej)
		{case 1:case 4:strcat(rez,"девяносто "); break;
		default:strcat(rez,"девяноста "); break;
		}
	}
      //edinicy
      if(np2!=1)
	{switch(np3)
	  {case 1:
	    if(i==1)
	      {switch(padej)
		{case 1:strcat(rez,"одна "); break;
		case 4:strcat(rez,"одну "); break;
		default:strcat(rez,"одной "); break;
		}
	      break;
	      }
	    switch(padej)
		{case 1:case 4:strcat(rez,"один "); break;
		case 2:strcat(rez,"одного "); break;
		case 3:strcat(rez,"одному "); break;
		case 5:strcat(rez,"одним "); break;
		case 6:strcat(rez,"одном "); break;
		}
	    break;
	  case 2:
	    switch(padej)
		{case 1:case 4:
		  if(i==1){strcat(rez,"две "); break;}
		  strcat(rez,"два "); break;
		case 2: case 6:strcat(rez,"двух "); break;
		case 3:strcat(rez,"двум "); break;
		case 5:strcat(rez,"двумя "); break;
		}
	    break;
	  case 3:
	    switch(padej)
		{case 1:case 4:strcat(rez,"три "); break;
		case 2: case 6:strcat(rez,"трех "); break;
		case 3:strcat(rez,"трем "); break;
		case 5:strcat(rez,"тремя "); break;
		}
	    break;
	  case 4:
	     switch(padej)
		{case 1:case 4:strcat(rez,"четыре "); break;
		case 2: case 6:strcat(rez,"четырех "); break;
		case 3:strcat(rez,"четырем "); break;
		case 5:strcat(rez,"четырьмя "); break;
		}
	    break;
	  case 5:
	    switch(padej)
		{case 1:case 4:strcat(rez,"пять "); break;
		case 2:case 3:case 6:strcat(rez,"пяти "); break;
		case 5:strcat(rez,"пятью "); break;
		}
	    break;
	  case 6:
	    switch(padej)
		{case 1:case 4:strcat(rez,"шесть "); break;
		case 2:case 3:case 6:strcat(rez,"шести "); break;
		case 5:strcat(rez,"шестью "); break;
		}
	    break;
	  case 7:
	    switch(padej)
		{case 1:case 4:strcat(rez,"семь "); break;
		case 2:case 3:case 6:strcat(rez,"семи "); break;
		case 5:strcat(rez,"семью "); break;
		}
	    break;
	  case 8:
	    switch(padej)
		{case 1:case 4:strcat(rez,"восемь "); break;
		case 2:case 3:case 6:strcat(rez,"восьми "); break;
		case 5:strcat(rez,"восмью "); break;
		}
	    break;
	  case 9:
	    switch(padej)
		{case 1:case 4:strcat(rez,"девять "); break;
		case 2:case 3:case 6:strcat(rez,"девяти "); break;
		case 5:strcat(rez,"девятью "); break;
		}
	  }
	}
	switch(i)
	  {case 1:
	    switch(np3)
	      {case 1:
		switch(padej)
		  {case 1:strcat(rez,"тысяча "); break;
		  case 2:strcat(rez,"тысячи "); break;
		  case 3:strcat(rez,"тысяче "); break;
		  case 4:strcat(rez,"тысячу "); break;
		  case 5:strcat(rez,"тысячью "); break;
		  case 6:strcat(rez,"тысяче "); break;
		  }
		break;
	      case 2:case 3:case 4:
		switch(padej)
		  {case 1:case 4:strcat(rez,"тысячи "); break;
		  case 2:strcat(rez,"тысяч "); break;
		  case 3:strcat(rez,"тысячам "); break;
		  case 5:strcat(rez,"тысачами "); break;
		  case 6:strcat(rez,"тысячах "); break;
		  }
		break;
	      default:
		switch(padej)
		  {case 1:case 2:case 4:strcat(rez,"тысяч "); break;
		  case 3:strcat(rez,"тысячам "); break;
		  case 5:strcat(rez,"тысячами "); break;
		  case 6:strcat(rez,"тысячах "); break;
		  }
	      }
	    break;
	  case 2:
	    switch(np3)
	      {case 1:
		switch(padej)
		  {case 1:case 4:strcat(rez,"миллион "); break;
		  case 2:strcat(rez,"миллиона "); break;
		  case 3:strcat(rez,"миллиону "); break;
		  case 5:strcat(rez,"миллионом "); break;
		  case 6:strcat(rez,"миллионе "); break;
		  }
		break;
	      case 2:case 3:case 4:
		switch(padej)
		  {case 1:case 4:strcat(rez,"миллиона "); break;
		  case 2:strcat(rez,"миллионов "); break;
		  case 3:strcat(rez,"миллионам "); break;
		  case 5:strcat(rez,"миллионами "); break;
		  case 6:strcat(rez,"миллионах "); break;
		  }
		break;
	      default:
		switch(padej)
		  {case 1:case 2:case 4:strcat(rez,"миллионов "); break;
		  case 3:strcat(rez,"миллионам "); break;
		  case 5:strcat(rez,"миллионами "); break;
		  case 6:strcat(rez,"миллионах "); break;
		  }
	      }
	    break;
	  case 3:
	    switch(np3)
	      {case 1:
		switch(padej)
		  {case 1:case 4:strcat(rez,"миллиард "); break;
		  case 2:strcat(rez,"миллиарда "); break;
		  case 3:strcat(rez,"миллиарду "); break;
		  case 5:strcat(rez,"миллиардом "); break;
		  case 6:strcat(rez,"миллиарде "); break;
		  }
		break;
	      case 2:case 3:case 4:
		switch(padej)
		  {case 1:case 4:strcat(rez,"миллиарда "); break;
		  case 2:strcat(rez,"миллиардов "); break;
		  case 3:strcat(rez,"миллиардам "); break;
		  case 5:strcat(rez,"миллиардами "); break;
		  case 6:strcat(rez,"миллиардах "); break;
		  }
		break;
	      default:
		switch(padej)
		  {case 1:case 2:case 4:strcat(rez,"миллиардов "); break;
		  case 3:strcat(rez,"миллиардам "); break;
		  case 5:strcat(rez,"миллиардами "); break;
		  case 6:strcat(rez,"миллиардах "); break;
		  }
	      }
	  }
      }
      }
      }
  strcat(k,rez);
  }
void main()
  {char txt[50][80];
  char str[40000];
  char chislo[11];
  char file[200];
  char rezultat[300];
  printf("\n  ‚ўҐ¤ЁвҐ ?¬п д*©«* (Їгвм): ");
  scanf("%s",&file);
  FILE *f;
  f=fopen(file,"r+");

  FILE *g;
  g=fopen("log.txt","w");
  int t;

  int i=0,j=0;
  do
   {fgets(txt[i],79,f);
   t=strlen(txt[i]);
   txt[i][80]='\0';
   strcat(str,txt[i]);
   i++;
   }
  while(!feof(f));
  i=0;
  fprintf(g,"%s",&str);
  //fprintf(g,"%s",&str);
  fclose(g);
  while(str[j]) //Ї®Є* Ґбвм бЁ¬ў®«л
    {if(isdigit(str[j])) //Ґб«Ё бЁ¬ў®« - бЁ¬ў®« жЁдал
      {while(isdigit(str[j]))  //Ї®Є* бЁ¬ў®« - бЁ¬ў®« жЁдал
	{chislo[i]=str[j]; // §*ЇЁбм зЁб«* Ё§ жЁда
	j++;
	i++;
	}
	chislo[i]='\0';
	i=0;
    //  while(str[j]!='(')  //гЄ*§*вҐ«м ¤®иҐ« ¤® бЄ®ЎЄЁ
    //	{j++;
     //	}
      j++; //гЄ*§*⥫м ** Ї*¤Ґ¦Ґ
      sklonyator(atol(chislo),padej(str[j]),rezultat);
      fprintf(g,"%s",&rezultat);
      j=j+2;//гЄ*§*вҐ«м §* бЄ®ЎЄ®©
      }
    fprintf(g,"%s",str[j]);
    j++;
    }
    fclose(f);
  }
Ch3r3p0sha
0 / 0 / 0
Регистрация: 12.10.2009
Сообщений: 11
14.01.2010, 16:35     Заменить числа числительными #4
Это уже готовая программа, она работает? Просто у меня есть программа, которая преобразует число в слова, но я не знаю как написать основной текст программы, где идет замена в файле
Yandex
Объявления
14.01.2010, 16:35     Заменить числа числительными
Ответ Создать тему
Опции темы

Текущее время: 01:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru