2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Помогите написать несложную програмку
Сообщение06.12.2005, 19:42 
Ребята помогите написать несложную програмку на СИ! Я её написал но алгоритм слишком сложный и огромный! Для хранения строк я использовал массив! Как написать програмку по проще? Помогите а!

Задачка: словом назовём всякую последовательность букв латинского алфавита длины не более 20. Предложением- всякую последовательность не более 30 слов, разделённых одним или несколькими пробелами! Концом предложения является символ ? , . , ! (P.S. запятая не является концом предложения)

Написать программу читающую заданное предложение и контролирующую его правильность и
выполняющую функцию которая по целым K и N находит и меняет в предложении K и N слова.
Затем ето предложение выводится на экран, при этом кол-во пробелов между словами сохраняется

Уважаемый Kaktus, Drakosha, CHUVAK или как вас еще там. Было бы очень здорово, если бы вы
1) зарегистрировались
2) завели себе одну тему в Математике и одну тему в Computer Science, и в них бы писали свои задачи
3) перестали использовать большие буквы и восклицательные знаки (в других ваших сообщениях, не в этом). Такое эмоциональное выделение текста на форумах называется "крик" и допускается только если текст сообщения имеет большую важность для форумчан. Вам не следует привлекать внимание к своим сообщениям таким способом.
Dan_Te

 
 
 
 
Сообщение06.12.2005, 20:37 
поместите где нибудь свое решение (лучше на каком-нибудь fileshare). посмотрим, попробуем помочь.

 
 
 
 
Сообщение06.12.2005, 20:58 
Вот моя прога большая правда? P.S. почему-то некоторые операторы заменились смайликами!!!

Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define Esc 27
#define MAX_STRING 30
#define MAX_WORD 20
int k,n,t,f,M_temp=0,run=0,SS=0,error=0,TEMP=0;
char Str[MAX_STRING][MAX_WORD+2],Sp[MAX_STRING],scan_spase=0;

void ReadData()
{
   char ch,er;
   int i,j=0,x,y,s,detect=0,o;
   for(s=0;s<MAX_STRING;s++)
        Sp[s]=0;
   j=0;
   printf("\n\n");
   printf("******************** The program is started *********************\n\n");
   printf("Please inter the sentences:\n");
   while(j<MAX_STRING)
   {
      for(i=1;i<(MAX_WORD+3);i++)
      {
         if(i==(MAX_WORD+2))
             {
                    x=wherex();
               y=wherey();
               printf("\n\aError 001: Length of a word exceeds norm!");
               gotoxy((x-1),y);
               printf(" ");
               gotoxy((x-1),y);
               i--;
             }
         if(j==MAX_STRING)
         {


                    x=wherex();
               y=wherey();
               printf("\n\aError 002: Is long the sentences above than norm! Enter '!' or '?' or '.'!");
               gotoxy((x-1),y);
               printf(" ");
               gotoxy((x-1),y);
               j--;
               while(er!='.' && er!='?' && er!='!')
                                        {
                  er=getche();
                  printf("\b");
                  if(er=='.' || er=='?' || er=='!')
                  {
                     ch=er;
                                               
                     if(ch=='!')
                                                        {
                                                           printf("!");
                        M_temp=1;
                                                        }
                     if(ch=='.')
                                                        {
                                                           printf(".");
                        M_temp=2;
                                                        }
                     if(ch=='?')
                                                        {
                        printf("?");
                        M_temp=3;
                                                        }
                                                        goto M;
                                                }
                  if(er=='\b')
                                      {
                                              y=wherey();
                     i=0;
                     j=0;
                     gotoxy(1,y);
                     printf("                                                                            ");
                                                        printf("\n                                                                          ");
                                              gotoxy(1,y);
                                                        break;
                  }



                                        }


                        }

         ch=getche();

         if((ch==' ') && (run==0))
         {                       
            scan_spase=1;
                                SS=1;
                                Sp[j]--;
                        }
                        run=1;

                       
         if((ch>='A')&&(ch<='z')&&(ch!=Esc)||(ch==' ')||(ch=='!')||(ch=='.')||(ch=='?'))
         {
                       
            if(ch=='!')
            M_temp=1;

            if(ch=='.')
            M_temp=2;

            if(ch=='?')
            M_temp=3;


          M:   y=wherey();
                                x=wherex();
            gotoxy(1,y+1);
            printf("                                                                                                  ");
            gotoxy(x,y);

                                if((ch!=' ') && (ch!='!') && (ch!='.') && (ch!='?'))
            Str[j][i]=ch;

            if(ch==' ')
            {
                Sp[j]++;
                                    if((detect!=1) && (scan_spase!=1))
                                    {
                                        Str[j][i]=0;
                         i=0;
                    j+=1;
               detect=1;
                                    }
                else                                 
                                    i=0;
                                   
            }
            else
                                {
                                   detect=0;
                                   scan_spase=0;
                                }

                   if((ch=='!')||(ch=='.')||(ch=='?'))
            {
               
                                        if((Str[j][1]>='A') && (Str[j][1]<='z'))
               {}
                                   else
                                        {
                                        TEMP=1;
                                        }

                                       t=j+1;
                     break;
            }
         }
         else
         {
            if(ch==Esc)
            {
                    y=wherey();
                                   x=wherex();                   
               gotoxy(x-1,y);
               printf(" ");
               printf("\n\n*********************The program is closed***********************");
                                        error=1;                                       
               return;
            }
            if(ch=='\b')
                                {
                    for(o=1;o<=j;o++)
                                        Sp[o]=0;

               for(o=0;o<j+1;o++)
                    {
                  for(i=1;Str[j][i]!=0;i++)
                  Str[o][i]=0;
               
               }

                                        y=wherey();
               i=0;
               j=0;
               gotoxy(1,y);
               printf("                                                                                                                                                          ");
                                        gotoxy(1,y);

            }
                                else
                                {
               x=wherex();
               y=wherey();
               printf("\a\nError 003: You should enter only latin letters!");
               gotoxy((x-1),y);
               printf(" ");
               gotoxy((x-1),y);
               i--;
               continue;
                                 }

         }


      }
        break;
   }
   printf("\n");

}



void main()
{
   int K,N,incorrect_size,number,incorrect_number,i,j,temp=0,a=0,b=0,max,min,MAX,MIN;
   char temp1[MAX_WORD+2];
   clrscr();

   ReadData();

   Sp[t-1]++;       
      if(error!=1)
      {
   printf("\n**************The sentences is entered successfully**************");
   printf("\n\nEnter whole 'K' and 'N' for replacement of words in sentences:");
      }

if(error!=1)
{
    while(1)
    {
   for(;;)               
        {
           incorrect_number=0;
            printf("\nPlease, inter K=");
             fflush(stdin);
       if((scanf("%d.%d",&K,&incorrect_number))==0)
       {
              printf("Error 001: you have intered not number!\n");
              continue;
       }
       else
       {
              if((K<1)||(K>(t-TEMP)))
              {
         printf("Error002:  0 < K <= %d\n",(t-TEMP));
          continue;
              }
              else
              {
                 if(incorrect_number!=0)
                      {
                  printf("\nError003: you have intered not an integer number!\n");
                  continue;
                 }
                 else
                      break;
                   }
       }
   }


   
   for(;;)
        {
      incorrect_number=0;
            printf("Please, inter N=");
             fflush(stdin);
       if((scanf("%d.%d",&N,&incorrect_number))==0)
       {
              printf("Error 001: you have intered not number!\n");
              continue;
       }
       else
       {
              if((N<1)||(N>t-(TEMP)))
              {   
             printf("Error002:  0 < N <= %d\n",(t-TEMP));
             continue;
              }
              else
              {
                 if(incorrect_number!=0)
                      {
                  printf("\nError003: you have intered not an integer number!\n");
                  continue;
                 }
                 else
                      break;
                   }
       }
   }
       

     if(K==N)
     printf("\nThe incorrect data. Try again.");
     else
     break;

     }


   printf("\n****************The entered data are accepted********************\n\n");
   printf("The resulting sentences:\n");
   for(i=1;Str[K-1][i]!=0;i++)
   a++;
        for(i=1;Str[N-1][i]!=0;i++)
        b++;

   if(a>b)
        {
      max=a;
      min=b;
                MAX=K;
      MIN=N;
   }
   else
   {
      max=b;
      min=a;
      MAX=N;
      MIN=K;
        }



        for(i=1;i<=max;i++)
        temp1[i]=Str[MAX-1][i];

   for(i=1;i<=min;i++)
   Str[MAX-1][i]=Str[MIN-1][i];

   for(i=1;i<=max;i++)
        Str[MIN-1][i]=temp1[i];

        Str[MAX-1][min+1]=0;



          if(SS!=1)
        {
      for(j=0;j<t;j++)
           {
         for(i=1;Str[j][i]!=0;i++)
         printf("%c",Str[j][i]);
               while(temp<Sp[j+1])
                   {
                             printf(" ");
                           temp++;
                   }       
                   temp=0;
      }
   }
   else
   { 
      for(j=0;j<t;j++)
           {
         while(temp<Sp[j])
                   {
                             printf(" ");
                           temp++;
         }
         for(i=1;Str[j][i]!=0;i++)
         printf("%c",Str[j][i]);
                   temp=0;
      }
        }



               if(M_temp==1)
               printf("!");
                                         
               if(M_temp==2)
               printf(".");

               if(M_temp==3)
               printf("?");
             printf("\n\n***************The program is successfully executed**************");
             printf("\n\n\aPress any key for closing the program!\n");
                       getche();

  }
}

 
 
 
 
Сообщение07.12.2005, 01:43 
Если считать, что предложение вводится в виде одной записи с консоли,
могу предложить следующее:

код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <stdio.h>

#define MAX_LEN_WORD  20
#define MAX_CNT_WORD  30
#define LEN_BUF       1000

char  buf[LEN_BUF + 1];

int main(int argc, char* argv[])
{
  char  c, *s, *begin, b_N, b_K, e_N, e_K;
  int   nword, N, K, tmp;
  char  *begin_K, *end_K, *begin_N, *end_N;

  nword = 0;
  begin_K = end_K = begin_N = end_N = NULL;

  // Вввод чисел N и K
  printf("Enter N,K: ");
  gets(buf);
  sscanf(buf, "%d %d", &N, &K);
  if(N < 1 || N > MAX_CNT_WORD || K < 1 || K > MAX_CNT_WORD)
  {
    printf("\nBad Param N,K\n");
    return(0);
  }

  // Отсортируем N и K в порядке возрастания
  if(N > K)
  {
    tmp = N;
    N = K;
    K = tmp;
  }

  // Вввод предложения
  printf("Enter Statement:\n");
  gets(s = buf);

  for(;;)
  {
    // Не слишком ли много слов в предложении?
    if(++nword > MAX_LEN_WORD)
    {
      printf("Error Limit Word\n");
      return(0);
    }

    // Поиск начала очередного слова
    // Для этого игнорируем все пустые символы
    while((c = *s) == ' ' || c == '\t' || c == '\n')
      ++s;

    // Больше нет слов?
    if(c == 0)
    {
      printf("Bad End Statements\n");
      return(0);
    }

    // Фиксируем начало слова
    begin = s;

    // Слово должно начинаться с латинской буквы
    if(!(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'))
    {
      printf("Bad Word %d\n", nword);
      return(0);
    }

    // Пройдемся по английским буквам, пока они не закончатся...
    while((c = *++s) >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
      ;

    // Не слишком ли длинное слово получилось?
    if(s - begin > MAX_LEN_WORD)
    {
      printf("Error Max Len Word %d\n", nword);
      return(0);
    }

    // Сохраним координаты начала и конца слова, если порядок
    // этого слова совпадает с N или K
    if(nword == N)
    {
      begin_N = begin;
      end_N = s;
    }
    else if(nword == K)
    {
      begin_K = begin;
      end_K = s;
    }

    // А не закончилось ли все предложение?
    if(c == '.' || c == '?' || c == '!')
    {
      // В этом случае после ?.! могут следовать только пустые символы
      while((c = *++s) == ' ' || c == '\n' || c == '\t')
        ;

      // Встретился не пустой символ?
      if(c)
      {
        printf("Bad End Statements\n");
        return(0);
      }
      break;
    }

    // Слово должно заканчиваться пустым символом
    if(c != ' ' && c != '\t' && c != '\n')
    {
      printf("Bad Word %d\n", nword);
      return(0);
    }
  }

  // А есть ли в нашем предложении слова с номерами N и K?
  if(begin_K == NULL || end_K == NULL || begin_N == NULL || end_N == NULL)
  {
    printf("No Word N or K\n");
    return(0);
  }

  // А теперь самое простое - обменять местами слова N и K

  // Если N и K совпадают, то ничего делать не надо
  if(N == K)
  {
    printf("\n%s\n", buf);
    return(0);
  }

  // Сохраним символы, которыми начинаются и заканчиваются переставляемые слова
  b_N = *begin_N;
  b_K = *begin_K;

  e_N = *end_N;
  e_K = *end_K;

  // Запишем туда нули
  *begin_N = *begin_K = *end_N = *end_K = 0;

  // А теперь печать
  printf("\n%s%c%s%c%s%c%s%c%s\n",
    buf,
    b_K, begin_K + 1,
    e_N, end_N + 1,
    b_N, begin_N + 1,
    e_K, end_K + 1);

  return 0;
}

 
 
 
 
Сообщение07.12.2005, 01:57 
В тексте программы символы точка с запятой и вслед за ней правая круглая скобка
превратились в смайлик - там должен быть бесконечный цикл for

---
Исправил. (dm)

 
 
 
 
Сообщение07.12.2005, 07:39 
Спасибо за прогу! Но char buf[LEN_BUF + 1]; как я понял есть глобальная переменная верно?

 
 
 
 
Сообщение07.12.2005, 14:37 
Точнее - глобальный массив символов

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group