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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2010, 21:03   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию массивы строк

Код:
sing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace lz6
{
    class Program
    {
        static string[] same(string s1, string s2)
        {
            int long1 = s1.Length;
            int long2 = s2.Length;
            int space1 = 0, space2 = 0;//число пробело в каждой строке
            /* определяем
             число пробелов в двух строках (для того чтобы знать сколько элементов
             будет в массиве строк*/
            for (int i = 0; i < long1; i++)
            {
                if (s1[i] == ' ')
                    space1++;
            }
            for (int i = 0; i < long2; i++)
            {
                if (s2[i] == ' ')
                    space2++;
            }
            //массивы строк
            string[] strmas1 = new string[space1];
            string[] strmas2 = new string[space2];
            string[] mainstrmas;//массив из повторяющихся слов
            //работаем с первой строкой
            for (int i = 0; i < long1; i++)
            {
                int j = 0;//номер строки в массиве строк
                if (s1[i] != ' ')
                {
                    strmas1[i][j] = s1[i];
                }
                else
                {
                    j++;//начинается работа с другой строкой в массиве строк
                }
            }
            //работаем со второй строкой
            for (int i = 0; i < long2; i++)
            {
                int j = 0;//номер строки в массиве строк
                if (s2[i] != ' ')
                {
                    strmas2[i][j] = s2[i];
                }
                else
                {
                    j++;//начинается работа с другой строкой в массиве строк
                }
            }
            //далее сравниваем элементы из вух массивов
            int number_same = 0;//число повторений
            for (int i = 0; i < long1; i++)
            {
                for (int j = 0; j < long2; j++)
                { 
                    if (strmas1[i] == strmas2[j])
                    {
                        mainstrmas [number_same] = strmas1[i];
                        //return number_same;
                        number_same++;                    
                    }
                }
                return mainstrmas;
            }

        }
        static void Main(string[] args)
        {
            string str1 = " ", str2 = " ";
            Console.WriteLine("Введите первое предложение:");
            str1 = Console.ReadLine();
            Console.WriteLine("Введите второе предложение:");
            str2 = Console.ReadLine();
        }
    }
}
проблема состоит в том, что в этом месте strmas1[i][j] = s1[i]; компилятор пишет, что присвоить нельзя, что string.this[int] доступна только для чтения.
и ещё 2 вопросика: правильно ли я сделал возвращение массива? и можно ли сделать так, чтобы эта функция помимо массива строк возвращала ещё и int

if (strmas1[i] == strmas2[j])
{
mainstrmas [number_same] = strmas1[i];
//return number_same;
number_same++;
}хотелось бы чтобы после того как я уберу эти // у меня прога скопмилилась
Dimarik вне форума Ответить с цитированием
Старый 23.02.2010, 01:34   #2
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

Ну...а если мы передодим в переменую
Код:
string s1
слово скажем "проблема"
в нем нету пробелов... те размерность массива
Код:
strmas1 = new string[space1];
будет равна нулю. Но компилятор это не считает ошибкой...
а вот тут...
Код:
strmas2[i][j] = s2[i];
уже проблема;-) дальше думаю сами справитесь...
dampirik вне форума Ответить с цитированием
Старый 23.02.2010, 08:58   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Dimarik
А если не секрет как задача звучит полностью?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.02.2010, 10:37   #4
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

задача состоит в том, что надо ввести 2 предложения и вывести слова, которые есть и в первом и во втором предложении

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace lz6
{
    class Program
    {
        static string[] same(string s1, string s2)
        {
            int long1 = s1.Length;
            int long2 = s2.Length;
            int space1 = 0, space2 = 0;//число пробелов в каждой строке
            /* определяем
             число пробелов в двух строках (для того чтобы знать сколько элементов
             будет в массиве строк*/
            for (int i = 0; i < long1; i++)
            {
                if (s1[i] == ' ')
                    space1++;
            }
            for (int i = 0; i < long2; i++)
            {
                if (s2[i] == ' ')
                    space2++;
            }
            //массивы строк
            string[] strmas1 = new string[space1];
            string[] strmas2 = new string[space2];
            string[] mainstrmas;//массив из повторяющихся слов
            //работаем с первой строкой
            for (int i = 0; i < long1; i++)
            {
                int j = 0;//номер строки в массиве строк
                if (s1[i] != ' ')
                {
                    strmas1[j][i] = s1[i];
                }
                else
                {
                    j++;//начинается работа с другой строкой в массиве строк
                }
            }
            //работаем со второй строкой
            for (int i = 0; i < long2; i++)
            {
                int j = 0;//номер строки в массиве строк
                if (s2[i] != ' ')
                {
                    strmas2[j][i] = s2[i];
                }
                else
                {
                    j++;//начинается работа с другой строкой в массиве строк
                }
            }
            //далее сравниваем элементы из вух массивов
            int number_same = 0;//число повторений
            for (int i = 0; i < long1; i++)
            {
                for (int j = 0; j < long2; j++)
                { 
                    if (strmas1[i] == strmas2[j])
                    {
                        mainstrmas [number_same] = strmas1[i];
                        //return number_same;
                        number_same++;                    
                    }
                }
                return mainstrmas;
            }

        }
        static void Main(string[] args)
        {
            string str1 = " ", str2 = " ";
            Console.WriteLine("Введите первое предложение:");
            str1 = Console.ReadLine();
            Console.WriteLine("Введите второе предложение:");
            str2 = Console.ReadLine();
            string[] sMAS;
            sMAS = same(str1, str2);
            int i = 0;
            while (sMAS[i]!="")
            {
                Console.WriteLine(sMAS[i]);
                i++;
            }
            Console.ReadKey();
        }
    }
}
в принципе я малость понял на что мне указывал dampirik.
надо было написать не strmas2[i][j] = s2[i];
а strmas2[j][i] = s2[i];
я исправил, но ошибка сохранилась. потом запустил несмотря на эту ошибку. в итоге никакой оишбки в процессе выполнения программы не выскочило, но она просто не сработала как надо. я скорее всего неправильно цикл написал
while (sMAS[i]!="")
{
Console.WriteLine(sMAS[i]);
i++;
}
другого в голову не пришло, так как размерность массива я не знаю. Кстати. по поводу размерности массива. можно ли из функции static string[] same(string s1, string s2) каким-нибудь образом ещё и вытащить //return number_same;
но получится что функция возвращает 2 типа значений, причём не перегруженная функция. чёт странно. может можно сделать в объявлении просто public number_same?

Последний раз редактировалось Stilet; 23.02.2010 в 12:49.
Dimarik вне форума Ответить с цитированием
Старый 23.02.2010, 14:00   #5
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

Код:
sMAS[i]!=""
ой не нравиться мне эта запись....
я думаю нужно либо до конца массива гонять.. либо до конца предложения...
А я бы сказал вы меня не особо поняли...если я ввиду слово "проблема" то вы создаете массив размерностью 0...а это уже касяк
Код:
static string[] same(string s1, string s2)
        {
            int long1 = s1.Length;
            int long2 = s2.Length;
            int space1 = 0, space2 = 0;//число пробелов в каждой строке
            /* определяем
             число пробелов в двух строках (для того чтобы знать сколько элементов
             будет в массиве строк*/
            for (int i = 0; i < long1; i++)
            {
                if (s1[i] == ' ')
                    space1++;
            }
            for (int i = 0; i < long2; i++)
            {
                if (s2[i] == ' ')
                    space2++;
            }
            //массивы строк
            string[] strmas1 = new string[space1];
            string[] strmas2 = new string[space2];
Код:
int j = 0;//номер строки в массиве строк
тогда уж не номер строки а номер слова...

Код:
if (strmas1[i] == strmas2[j])
                    {
                        mainstrmas [number_same] = strmas1[i];
                        //return number_same;
                        number_same++;                    
                    }
А если не равняеться? то выводить не чего не будем?

Цитата:
задача состоит в том, что надо ввести 2 предложения и вывести слова, которые есть и в первом и во втором предложении
Ваш код не удовлетворяет условям задачи....
dampirik вне форума Ответить с цитированием
Старый 23.02.2010, 15:18   #6
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace lz6
{
    class Program
    {
        static int number_same = 0;//число повторений
        static string[] same(string s1, string s2)
        {
            int long1 = s1.Length;
            int long2 = s2.Length;
            int space1 = 0, space2 = 0;//число пробелов в каждой строке
            /* определяем
             число пробелов в двух строках (для того чтобы знать сколько элементов
             будет в массиве строк*/
            for (int i = 0; i < long1; i++)
            {
                if (s1[i] == ' ')
                    space1++;
            }
            for (int i = 0; i < long2; i++)
            {
                if (s2[i] == ' ')
                    space2++;
            }
            //массивы слов
            /* число слов на 1 больше, чем 
              число пробелов*/
            string[] strmas1 = new string[space1+1];
            string[] strmas2 = new string[space2+1];
            string[] mainstrmas;//массив из повторяющихся слов
            //работаем с первой строкой
            for (int i = 0; i < long1; i++)
            {
                int j = 0;//номер слова в массиве строк
                if (s1[i] != ' ')
                {
                    strmas1[j][i] = s1[i];
                }
                else
                {
                    j++;//начинается работа с другим словом в массиве строк
                }
            }
            //работаем со второй строкой
            for (int i = 0; i < long2; i++)
            {
                int j = 0;//номер слова в массиве строк
                if (s2[i] != ' ')
                {
                    strmas2[j][i] = s2[i];
                }
                else
                {
                    j++;//начинается работа с другим словом в массиве строк
                }
            }
            //далее сравниваем элементы из вух массивов
            
            for (int i = 0; i < long1; i++)
            {
                for (int j = 0; j < long2; j++)
                { 
                    if (strmas1[i] == strmas2[j])
                    {
                        mainstrmas [number_same] = strmas1[i];
                        number_same++;
                        Console.WriteLine(strmas1[i]);
                    }
                }
                return mainstrmas;
            }

        }
        static void Main(string[] args)
        {
            string str1 = " ", str2 = " ";
            Console.WriteLine("Введите первое предложение:");
            str1 = Console.ReadLine();
            Console.WriteLine("Введите второе предложение:");
            str2 = Console.ReadLine();
            string[] sMAS = new string [number_same];
            sMAS = same(str1, str2);
            int i = 0;
            while (i < number_same)
            {
                Console.WriteLine(sMAS[i]);
                i++;
            }
            Console.ReadKey();
        }
    }
}
я исправил указанные ошибки.
1. static int number_same = 0;//число повторений. почему-то без ключевого слова static начинает ругаться компилятор. даж если напишешь publi cint number_same = 0. и я тут хз почему ругается.
2.
Код:
 //массивы слов
            /* число слов на 1 больше, чем 
              число пробелов*/
            string[] strmas1 = new string[space1+1];
            string[] strmas2 = new string[space2+1];
3.
Код:
            while (i < number_same)
            {
                Console.WriteLine(sMAS[i]);
                i++;
            }
4. И почему код не соответствует условиям задачи? Есть ц предложения, 2 строки. я каждую строку разбиваю по словам, получается два массива строк. Затем создаю ещё один массив строк, который буду использовать только для повторяющихся слов. С помощью цикла прогоняю и если у меня есть одинаковые слова, то они попадают в тот массив, а если нет, то ничего туда не попадает
Dimarik вне форума Ответить с цитированием
Старый 23.02.2010, 15:29   #7
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

а проблема-таки сохранилась. Error 1 Property or indexer 'string.this[int]' cannot be assigned to -- it is read only C:\Documents and Settings\Dimarik\Мои документы\Visual Studio 2008\Projects\lz6\lz6\Program.cs 41 21 lz6

Последний раз редактировалось Dimarik; 23.02.2010 в 15:49.
Dimarik вне форума Ответить с цитированием
Старый 23.02.2010, 16:07   #8
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

Цитата:
задача состоит в том, что надо ввести 2 предложения и вывести слова, которые есть и в первом и во втором предложении
Код:
static void Main(string[] args)
		{
			Console.WriteLine("введите первое предложение");
			string predl1 = Console.ReadLine();
				//"первое предложение? буква и второе слово!"; 
			Console.WriteLine("введите второе предложение");
			string predl2 = Console.ReadLine();
				//"второе предложение, новое слово?! цифра - первое апреля"; 
			
			char[] znak = {' ', '.', '!', ',', '?', '-'};
			string[] slova = predl1.Split(znak, StringSplitOptions.RemoveEmptyEntries);
			string[] slova2 = predl2.Split(znak, StringSplitOptions.RemoveEmptyEntries);

			Console.WriteLine("слова которые есть в обоих предложениях: \r\n");
		
			foreach (string str in slova)
			{
				foreach (string str2 in slova2)
				{
					if (str == str2)					
						Console.WriteLine(str);
					
				}
			}
			Console.ReadLine();
		}
m0nax вне форума Ответить с цитированием
Старый 23.02.2010, 16:10   #9
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

m0nax! спасибо большое! всё рационально и правильно сделано. но всё-таки хотелось бы узнать, почему компилятор ругается.
Error 1 Property or indexer 'string.this[int]' cannot be assigned to -- it is read only C:\Documents and Settings\Dimarik\Мои документы\Visual Studio 2008\Projects\lz6\lz6\Program.cs 41 21 lz6
именно в этом месте
strmas1[j][i] = s1[i];
Dimarik вне форума Ответить с цитированием
Старый 23.02.2010, 16:14   #10
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Ошибка происходит именно из-за того, что пишет компилятор, т.е. значение strmas1[j][i] доступно только для чтения.
Предлагаю более простое решение:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace lz6
{
	class Program
	{
		static List<string> GetSameWords(string s1, string s2)
		{
			List<string> result = new List<string>();
			string[] s1Word = s1.Split(' ');
			string[] s2Word = s2.Split(' ');
			foreach (string str in s1Word)
			{
				if (s2Word.Contains(str))
					result.Add(str);
			}

			return result;
		}
		
		static void Main(string[] args)
		{
			string str1 = " ", str2 = " ";
			Console.WriteLine("Введите первое предложение:");
			str1 = Console.ReadLine();
			Console.WriteLine("Введите второе предложение:");
			str2 = Console.ReadLine();
			List<string> sameWords = GetSameWords(str1, str2);
			foreach (string str in sameWords)
				Console.WriteLine(str);
			Console.ReadKey();
		}
	}
}

Последний раз редактировалось Hollander; 23.02.2010 в 16:21.
Hollander вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задачи: на двумерные массивы,обработку строк,обработку текстовых файлов. (Паскаль) Yaro Помощь студентам 2 12.11.2009 12:55
С++. Массивы строк Serv Помощь студентам 1 01.07.2009 19:39
Задания по ДЕЛФИ (массивы, потом с использованием файлов и строк) ramaboss Помощь студентам 11 14.12.2008 17:29
Pascal , Массивы строк Alyonka_v Помощь студентам 1 05.12.2007 23:26
Двумерные массивы. Формирование одномерного массива из сумм строк матрицы, кратных числу k (в С++) Fimogen Помощь студентам 3 19.11.2007 07:30