Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2012, 10:49   #1
White Dragon
 
Регистрация: 20.11.2012
Сообщений: 8
Вопрос запускаются, но не работают две программы, на строки и на файлы

Обе задачи затыкаются где то в циклах, я понимаю что не хватает знаний но от этого не легче...

задача 1 на строки

Код:
/* Символьная строка заканчивается восклицательным знаком (!).
   Слова в ней отделены друг от друга точкой с запятой (;).
   Найти те слова, которые начинаются и оканчиваются одной и той же буквой*/


#include <iostream.h>
#include <conio.h>
#include <LOCALE.H>
#include <string.h>


void main()
{
 clrscr();          //Чистим экран
 setlocale(0,"");  //Чтобы русские буквы были читабельны
 char str [] = "до;точки;с;запятой;страус;после;точки;с;запятой;текст";
 char str1[11],str2[25];



 int i=0; //j=0;
for (i=0; i<strlen(str); i++) /* Цикл работает пока не встретится признак
			  конца строки */
  {
   if (str[i] == ';' || i == 0)
   {
    if ((i == 0 && str[i] == ';')||str[i] == ';')
     //Если точка с запятой в начале строки
    {
     i+=1;
     int j=0;
     for (j=0; (str[i]!=';' || str[i]!='!'); i++,j++)
     // Пока не дойдем до следующей <;> или конца строки <!>
     {
      str1[j] = str[i]; //Сохраняем слово в промежуточную строку
     }
     if (str1[j] == str1[1]) //Если последняя занесенная буква равна первой
			     // тогда сохраняем результат в 3й строке
     {
      strcat (str2,str1);
      strcpy(str1,'\0');  //Чистим строку
     }
    }
    else
    {
     int j=0;
    for (j=0; ((str[i]!=';') || (str[i]!='!'));i++,j++)
     //Если начало строки без точки с запятой
     {
      str1[j] = str[i];
     }
     if (str1[j] == str1[1])
     {
      strcat (str2,str1);
      strcpy(str1,'\0');
     }
    }
   }
  }

cout << str << endl << "Искомые слова: " << str2 ;

getch ();
}
задача 2 на файлы

Код:
/* Дан файл, содержащий текст на русском языке
   и некоторая буква. Найти слово, содержащее
   наибольшее количество указанных букв*/

#include <iostream.h>
#include <conio.h>
#include <LOCALE.H>
#include <string.h>
#include <process.h>    //функция exit()
#include <stdio.h>

void main()
{
 clrscr();          //Чистим экран
 setlocale( LC_ALL,"Russian" );  //Чтобы русские буквы были читабельны
FILE *stream;
   stream = fopen("tdoc.txt", "rt");//только чтение, текстовый режим
   int ch,i=0,j=0,k=0;
   char a = 'а', str[15],str1[15];

   if (stream==NULL) {printf("\nФайл не существует");exit(-1);}
   printf("\nФайл успешно открыт " "\n");

/*   fseek(stream, 0, SEEK_SET);//на начало файла, смещение от начала файла 0 ком-
			 //понетнов
   do {
   ch = fgetc(stream);     //получить символ из файла
   cout<<char(ch);    //вывод в виде символа
      } while (ch != EOF); //до конца файла*/

   fseek(stream, 0, SEEK_SET);
   do {
   ch = fgetc(stream);     //получить символ из файла
    if (ch != ' ')
    cout << ch;
    do
       {
	str[i] = ch;
	ch = fgetc(stream);
	if (ch != ' ' || ch != EOF || ch != '\0') i++;
       }while (ch != ' ' || ch != EOF || ch != '\0');

    for (i=0;i<strlen(str);i++)
       if (str[i]==a) j++;

       if (j>k)
	 {
	  strcpy(str1,'\0');
	  strcpy (str1,str);
	 }
      } while (ch != EOF); //до конца файла

   cout << str1 << endl;
   fclose(stream);//закрыть файл

getch ();
}
White Dragon вне форума Ответить с цитированием
Старый 20.11.2012, 11:02   #2
Axrik
Форумчанин
 
Аватар для Axrik
 
Регистрация: 17.12.2011
Сообщений: 111
По умолчанию

Ошибку пока что не искал, но вот это
Код:
int j=0;
for (j=0; ((str[i]!=';') || (str[i]!='!'));i++,j++)
можно записать так
Код:
for (int j=0; str[i]!=';' || str[i]!='!'; i++, j++)
И не объявляйте j несколько раз, это ни к чему
Axrik вне форума Ответить с цитированием
Старый 20.11.2012, 11:18   #3
White Dragon
 
Регистрация: 20.11.2012
Сообщений: 8
Сообщение

Цитата:
Сообщение от Axrik Посмотреть сообщение
Ошибку пока что не искал, но вот это
Код:
int j=0;
for (j=0; ((str[i]!=';') || (str[i]!='!'));i++,j++)
можно записать так
Код:
for (int j=0; str[i]!=';' || str[i]!='!'; i++, j++)
И не объявляйте j несколько раз, это ни к чему
Просто искал корень зла и решил, что беда в локальной переменной для цикла, однако дело в чем то еще...
White Dragon вне форума Ответить с цитированием
Старый 20.11.2012, 11:40   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Код:
strcpy(str1,'\0');//Эквивалентно strcpy(str1, NULL), эквивалентно "программа, падай!"
Компилятор должен был выдать предупреждение о приведении типов. Он это сделал? Если да, приучитесь обращать внимание на предупреждения; если нет - найдите в Вашем компиляторе опцию "выдавать все предупреждения" и включите.
Abstraction вне форума Ответить с цитированием
Старый 20.11.2012, 12:06   #5
White Dragon
 
Регистрация: 20.11.2012
Сообщений: 8
Сообщение

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Код:
strcpy(str1,'\0');//Эквивалентно strcpy(str1, NULL), эквивалентно "программа, падай!"
Компилятор должен был выдать предупреждение о приведении типов. Он это сделал? Если да, приучитесь обращать внимание на предупреждения; если нет - найдите в Вашем компиляторе опцию "выдавать все предупреждения" и включите.
нет не показывает, консоль Borland C++ Version 3.1 не знаю где там это включить.
Если вы считаете что проблема в этом, как мне тогда корректно очистить строку?
Код:
str1[1]='\0';
с таким вариантом прога так же запускается и не пашет...
Или моя ошибка в чем то другом? может я вас не понял? объясните
White Dragon вне форума Ответить с цитированием
Старый 20.11.2012, 12:22   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Borland C++ Version 3.1
Мама.

Я считаю, что проблема, как минимум, в этом. Попробуйте задействовать отладчик (кажется, он там был). Если не получится - тупо в начале каждой итерации внешнего цикла выводите в консоль значения всех существенных переменных и смотрите, когда они разойдутся с Вашими ожиданиями.
Abstraction вне форума Ответить с цитированием
Старый 20.11.2012, 13:14   #7
White Dragon
 
Регистрация: 20.11.2012
Сообщений: 8
По умолчанию Дополнение по задаче со строками.

Криво работает условие
Код:
for (j=0; (str[i]!=';' || str[i]!='!'); i++,j++)
     // Пока не дойдем до следующей <;> или конца строки <!>
     {
      str1[j] = str[i]; //Сохраняем слово в промежуточную строку
     }
в переменную зафигачивается вся строка ПОЧЕМУ!!! и не просто зафигачивается а все продолжает и продолжает всовывать в переменную символы... i все растет и растет...
White Dragon вне форума Ответить с цитированием
Старый 20.11.2012, 13:19   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

А. Ну логично. Если str[i]=='!', первое условие true, второе false, true || false = true.
Если str[i]==';', первое условие false, второе true, false || true = true.
Если что-то третье, то true||true = true.
Abstraction вне форума Ответить с цитированием
Старый 20.11.2012, 13:35   #9
White Dragon
 
Регистрация: 20.11.2012
Сообщений: 8
По умолчанию

Abstraction подскажете как это обойти?
White Dragon вне форума Ответить с цитированием
Старый 20.11.2012, 13:51   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Я подскажу, как в такие ловушки не попадать. Если не можете сообразить условие в уме - выносите в функцию:
Код:
//Проверка, является ли символ концом слова
bool IsEndOfWord(char symbol){
  if(symbol == ';') return true;
  if(symbol == '!') return true;
  return false;
}

//В цикле
for(int j=0; !IsEndOfWord(str[i]); ++i, ++j)
В качестве бесплатного бонуса, теперь очень легко модифицировать условие, если вдруг решим добавить новые разделители...
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не запускаются программы С++ Vasya85 Общие вопросы C/C++ 8 26.06.2012 13:51
Не запускаются программы stenl1 Операционные системы общие вопросы 7 08.08.2011 22:20
Почему две программы с инди одновременно работают некорректно? TwiX Работа с сетью в Delphi 1 12.12.2009 15:22
Не запускаются программы anGeee Помощь студентам 3 18.11.2008 20:37
расшифруйте две строки программы Cooler Общие вопросы Delphi 1 22.11.2006 14:54