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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2010, 21:47   #1
cuzo
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 11
По умолчанию Задача на С++. Символы,строки.

Двумерный массив n × m содержит некоторые буквы русского алфавита, расположенные в произвольном порядке. Написать программу, проверяющую, можно ли из этих букв составить данное слово S. Каждая буква массива используется не более одного раза.

Я написал некоторую часть кода,но я перепробовал все виды сравнения символов из матрицы и символа из строки. Все они выдают либо неправильный результат ,либо ошибку процессора.

Цитата:
#include <math.h>
#include <stdio.h>
#include <string.h>




int main()
{
int l,m,n,i,j,g,kol,del,a,b;
char arr[5][5],
char *stroka[20];
bool check;


i
printf("\n Vvedite dliny stroki = ");
scanf("%d",&l);
printf("\nVvedite slovo S (kazdyu byvky vvedite 4erez probel): ");
for(g=1;g<=l;g++)
scanf("%s",&stroka[g]);

printf("\nVVedite koli4etsvo stolbcov matrici ");
scanf("%d",&n);
printf("\nVvedite koli4estvo strok matrici ");
scanf("%d",&m);
printf("\nVvedite matricy russkix bykv\n");
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
printf("arr[%d",i) ;
printf(",%d",j);
printf("]=");
scanf("%s",&arr[i][j]);

}




g=1;
kol=0;
while (g<=l)
{
check=false;
metka:
for (i=1;i<=1;i++)
for (j=1;j<=1;j++)
{
a=(int)arr[i][j];
b=(int)stroka[g];
printf("\n%d",a);
printf("\n%d",b);

if(a==b) (Не получается сделать данное сравнение)

{
kol=kol+1;
check=true;
}
if (check!=false)
{
g=g+1;
goto metka;
}
}

g=g+1;

}

printf("\n%d",kol);
printf("\n%d",l);
if (kol!=l)
printf("\nNelzya sostavit dannoe slovo iz bykv matrici");
else
printf("\nDannoe slovo mozno sostvit iz byk matrici");



getchar();
getchar();
return 0;
}

Может ли кто-нибудь помочь? Возможно именно идея решения задачи неверна?
cuzo вне форума Ответить с цитированием
Старый 07.01.2010, 12:26   #2
cuzo
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 11
По умолчанию

Может кто-нибудь что-то посоветовать?
cuzo вне форума Ответить с цитированием
Старый 07.01.2010, 16:07   #3
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

for (i=1;i<=1;i++)
for (j=1;j<=1;j++)

смотри на условия выполнения тела цикла. код в циклах будет выполнятся только один раз. наверно там надо поставить i<=m и j<=n.
_Ч_ вне форума Ответить с цитированием
Старый 07.01.2010, 16:18   #4
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

еще
в индекс первого элемента массива не 1 как в паскале, а 0. у тебя везде 1.

char* stroka[20]; - это массив указателей на символы а не массив символов. надо char stroka[20].

нигде нет проверок на всякие выходы за границы массивов и т.п.

код надо разбивать на функции.

посмотреть что такое STL, хотябы что такое std::string, которая живет в #include <string>

да и вообще все написано пипец как плохо.
_Ч_ вне форума Ответить с цитированием
Старый 07.01.2010, 17:07   #5
cuzo
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 11
По умолчанию

Так как мне сравнить символ из строки с символом из матрицы?
cuzo вне форума Ответить с цитированием
Старый 07.01.2010, 18:10   #6
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

см ниже 1234567890

Последний раз редактировалось _Ч_; 07.01.2010 в 18:45.
_Ч_ вне форума Ответить с цитированием
Старый 07.01.2010, 18:11   #7
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

Код:
// circle.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string>
#include <vector>
#include <iostream>
#include <exception>
#include <algorithm>
#include <limits>

using namespace std;

typedef vector< vector<char> > Matrix;

void ClearInputStream()
{
  cin.clear();
  cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
}

void CheckInputStream()
{
  if (!cin)
    throw logic_error("Input stream has been corrupted (entered data are incorrect).");
  ClearInputStream();
}

void GetWord(string& word)
{
  cout << "Enter a word: ";
  cin >> word;
  CheckInputStream();
}

void GetMatrix(Matrix& matrix)
{
  int columns = 0;
  cout << "Enter columns count: ";
  cin >> columns;
  CheckInputStream();
  if (0 >= columns || columns > 5)
    throw logic_error("The columns count must be in [1..5] range.");

  int rows = 0;
  cout << "Enter rows count: ";
  cin >> rows;
  CheckInputStream();
  if (0 >= rows || rows > 5)
    throw logic_error("The rows count must be in [1..5] range.");

  for (int i = 0; i < rows; ++i)
  {
    vector<char> row;
    for (int j = 0; j < columns; ++j)
    {
      char ch = 0;
      cout << "arr[" << i << ',' << j << "] = ";
      cin >> ch;
      CheckInputStream();
      row.push_back(ch);
    }
    matrix.push_back(row);
  }
}

void DoCheck(const string& word, const Matrix& matrix)
{
  std::vector<char> chars;
  //for (Matrix::const_iterator it = matrix.begin(), end = matrix.end(); it != end; ++it)
  //  chars.insert(chars.end(), it->begin(), it->end());

  // это почти тоже самое что и выше, только для новичков это должно быть понятнее.
  for (size_t i = 0, size = matrix.size(); i < size; ++i)
    chars.insert(chars.end(), matrix[i].begin(), matrix[i].end());


  bool isMatrixGood = true;
  //for (string::const_iterator it = word.begin(), end = word.end(); it != end; ++it)
  //{
  //  const size_t countInWord = count(it, word.end(), *it);
  //  const size_t countInMatrix = count(chars.begin(), chars.end(), *it);
  //  if (countInWord > countInMatrix)
  //  {
  //    isMatrixGood = false;
  //    break;
  //  }
  //}

  // это почти тоже самое что и выше, только для новичков это должно быть понятнее.
  for (size_t i = 0, size = word.size(); i < size; ++i)
  {
    const char ch = word[i];
    const size_t countInWord = count(&word[i], &word[size - 1], ch);
    const size_t countInMatrix = count(&chars[0], &chars[chars.size() - 1], ch);
    if (countInWord > countInMatrix)
    {
      isMatrixGood = false;
      break;
    }
  }


  if (isMatrixGood)
    cout << "The word CAN be constructed from chars of the matrix." << endl;
  else
    cout << "The word CANNOT be constructed from chars of the matrix." << endl;
}

void DoMain()
{
  string word;
  GetWord(word);

  Matrix matrix;
  GetMatrix(matrix);

  DoCheck(word, matrix);
}

int _tmain(int argc, _TCHAR* argv[])
{
  try
  {
    DoMain();
  }
  catch (const exception& e)
  {
    cout << "Error: " << e.what() << endl;
  }

  return 0;
}
_Ч_ вне форума Ответить с цитированием
Старый 07.01.2010, 18:16   #8
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

смотреть надо в void DoCheck(const string& word, const Matrix& matrix).
не понимаю нафига там матрица, но идея такая.
все символы матрицы сливаются в одномерный массив.

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

и не надо вытаться там что-то оптимизировать, понятность происходящего по умолчанию всегда на первом месте
_Ч_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
строки и символы AlinAA Фриланс 3 17.05.2018 14:08
Задача на Символы и строки в Delphi. ClassicV Помощь студентам 2 30.11.2009 11:40
Строки и символы 111111 Общие вопросы C/C++ 2 16.12.2008 18:18
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27