Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
6 / 4 / 2
Регистрация: 18.01.2019
Сообщений: 43

Заменить подстроку другой подстрокой в массиве

18.01.2019, 22:40. Показов 2089. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программирую недавно. Задачка - консольный калькулятор.
В данном коде я пытаюсь обработать умножение чисел. Моя идея состоит в том, чтобы при умножении двух чисел, они заменялись в массиве на одно число. Которое дальше можно было бы снова умножать, складывать с чем то и так далее.
Я попробовал сделать это двумя способами

Первый способ:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Консольный_калькулятор_2
{
    class Program
    {
        static void Main(string[] args)
        {
            string multiplication = "";
            int previous = 0;
            int next = 0;
            Console.WriteLine("Введите выражение");
            string str = Console.ReadLine();
            string[] x = str.Split(' ').ToArray();
            if (x.Contains("*"))
            {
                previous = (Convert.ToInt32(x.GetValue(Array.IndexOf(x, "*") - 1)));
                next = (Convert.ToInt32(x.GetValue(Array.IndexOf(x, "*") + 1)));
                multiplication = (previous * next).ToString();
                string multiplicationstring = previous.ToString() + " " + "*" + " " + next.ToString();
                string[] array = x.Except(multiplicationstring).ToArray();
            }
            for (int i = 0; i < x.Length; i++)
            {
                Console.WriteLine(x[i]);
            }
            Console.ReadKey();
        }
    }
}
Т.е. здесь я сначала делю строку на массив подстрок. Затем нахожу первое вхождение знака умножить. Беру предыдущее от него и последующее значение и перемножаю. Например, в выражении 2*3*5, программа должная найти 2*3 и заменить это на 6, чтобы получилось 6*5. Но в данном случае программа выдает ошибку:

Ошибка CS1929 'string[]" не содержит определение для "Except", и наиболее подходящий перегруженный метод расширения "Queryable.Except<char>(IQueryable<char> , IEnumerable<char>)" требует наличия получателя типа "IQueryable<char>".

Второй способ, почти тоже самое, только меняю строку несколько иным способом

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Консольный_калькулятор_2
{
    class Program
    {
        static void Main(string[] args)
        {
            string multiplication = "";
            int previous = 0;
            int next = 0;
            Console.WriteLine("Введите выражение");
            string str = Console.ReadLine();
            string[] x = str.Split(' ').ToArray();
            if (x.Contains("*"))
            {
                previous = (Convert.ToInt32(x.GetValue(Array.IndexOf(x, "*") - 1)));
                next = (Convert.ToInt32(x.GetValue(Array.IndexOf(x, "*") + 1)));
                multiplication = (previous * next).ToString();
                string multiplicationstring = previous.ToString() + " " + "*" + " " + next.ToString();
                for (int i = 0; i < x.Length; i++)
                {
                    x[i] = x[i].Replace(multiplicationstring, multiplication);
                }      
            }
            for (int i = 0; i < x.Length; i++)
            {
                Console.WriteLine(x[i]);
            }
            Console.ReadKey();
        }
    }
}
Тут все работает, но печатает он не то, что нужно, а весь исходный массив.
Результаты:

Вообщем, помогите, пожалуйста, я программирую совсем недавно и вообще не понимаю, в чем ошибка
Миниатюры
Заменить подстроку другой подстрокой в массиве  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.01.2019, 22:40
Ответы с готовыми решениями:

Вывести частоту символов в строке и заменить строку другой подстрокой
Требовалось из строк создать текст и уже в нём подсчитать частоту появления символов и заменить строку подстрокой. Попытался это сделать в...

Заменить в строке заданное слово (подстроку) другой заданой подстрокой
Помогите резить задачу: дана страка, заменить в стоке заданное слово(подстроку) заданой подстракой (не одинакавой длины) подскажите...

Ввести массив строк символов (текст), которые могут содержать подстроки “child”. Заменить в тексте каждую подстроку “child” подстрокой “children”.
Помогите написать программу на языке Си Ввести массив строк символов (текст), которые могут содержать подстроки “child”. Заменить в...

4
9 / 6 / 3
Регистрация: 15.08.2018
Сообщений: 55
19.01.2019, 05:00
Предлагаю сделать все проще. Заполнить массив числами и через цикл foreach их перемножить.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.Linq;
 
namespace Тест
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Введите выражение");
            string str = Console.ReadLine();
 
            //Заполняем массив нашими числами
            string[] allNum = str.Split('*').ToArray();
 
            int sum = 1;
            //Считаем произведение
            foreach(string s in allNum)
            {
                sum *= Convert.ToInt32(s);
            }
 
            //Выводим результат
            Console.WriteLine(sum);
            Console.ReadLine();
        }
    }
}
Это работает только при условии корректного ввода данных. Советую добавить проверку на эти условия.
1
315 / 244 / 149
Регистрация: 03.10.2017
Сообщений: 886
Записей в блоге: 1
19.01.2019, 10:13
Лучший ответ Сообщение было отмечено danilamironov как решение

Решение

Без учёта последовательности операций



Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//Rextester.Program.Main is the entry point for your code. Don't change it.
//Compiler version 4.0.30319.17929 for Microsoft (R) .NET Framework 4.5
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
 
namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            char[] sign={'+','-','*','/'};
            string str="5*5*6";
        
            List<string> list= new List<string>();
        
            int i=0;
            while (i<str.Length)
            {                
                if (char.IsDigit(str[i]))
                {
                    int j=i;
                    i++;
                    
                    while (i<str.Length && char.IsDigit( str[i])) i++;
                    
                    list.Add(str.Substring(j,i-j));                    
                }
                  
                if (i<str.Length && sign.Contains(str[i])) list.Add(str[i].ToString());
               
                i++;             
            }
            
            
            int result=int.Parse(list[0]);
            
            for (i=1;i<list.Count-1;i++)
            {                
                switch (list[i]) 
                {
                    case "*":
                            result*=int.Parse(list[i+1]);
                        break;
                }
                
            }
            
 
            
            Console.WriteLine(result);
            
        }
    }
}

Добавлено через 10 минут
А это если нужно, чтобы удалялось каждый раз при операции
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//Rextester.Program.Main is the entry point for your code. Don't change it.
//Compiler version 4.0.30319.17929 for Microsoft (R) .NET Framework 4.5
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
 
namespace Rextester
{
    public class Program
    {
        private static void Print(List<string> list)
        {
            for (int j=0;j<list.Count;j++) Console.Write(list[j]);
            Console.WriteLine();
        }
        
        private static void Operation(List<string> list)
        {
            int result=int.Parse(list[0]);
            
            switch (list[1]) 
                {
                    case "*":
                            result*=int.Parse(list[2]);
                            list[0]=result.ToString();
                            list.RemoveRange(1,2);                            
                        break;                    
                }
        }
        
        private static List<string> StringToList()
        {
            char[] sign={'+','-','*','/'};
            string str="5*5*6";
        
            List<string> list= new List<string>();
        
            int i=0;
            while (i<str.Length)
            {                
                if (char.IsDigit(str[i]))
                {
                    int j=i;
                    i++;
                    
                    while (i<str.Length && char.IsDigit( str[i])) i++;
                    
                    list.Add(str.Substring(j,i-j));                    
                }
                  
                if (i<str.Length && sign.Contains(str[i])) list.Add(str[i].ToString());
               
                i++;             
            }
            
            return list;
        }
        
        
        public static void Main(string[] args)
        {
            
            List<string> list=StringToList();
            
            int result=int.Parse(list[0]);
            
            
            
            Print(list);
            
            while(1<list.Count-1)
            {                
                Operation(list);
                
                Print(list);
                
            }
                        
            
        }
    }
}


Добавлено через 13 минут
А это учётом операций

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//Rextester.Program.Main is the entry point for your code. Don't change it.
//Compiler version 4.0.30319.17929 for Microsoft (R) .NET Framework 4.5
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
 
namespace Rextester
{
    public class Program
    {
        private static void Print(List<string> list)
        {
            for (int j=0;j<list.Count;j++) Console.Write(list[j]);
            Console.WriteLine();
        }
        
        private static int FindMulDiv(List<string> list)
        {
            int i=1;
            while (i<list.Count && list[i]!="/" && list[i]!="*") i++;
            
            return i;
        }
        
        private static void Operation(List<string> list)
        {
            int i=FindMulDiv(list);
            
            if (i==list.Count) i=1;
                
            double result=double.Parse(list[i-1]);
            
            switch (list[i]) 
                {
                    case "*":
                            result*=int.Parse(list[i+1]);
                            list[i-1]=result.ToString();
                            list.RemoveRange(i,2);                            
                        break;   
                
                    case "+":
                            result+=int.Parse(list[i+1]);
                            list[i-1]=result.ToString();
                            list.RemoveRange(i,2);  
                        break;
                    case "/":
                            result/=int.Parse(list[i+1]);
                            list[i-1]=result.ToString();
                            list.RemoveRange(i,2);  
                        break;
                    case "-":
                            result-=int.Parse(list[i+1]);
                            list[i-1]=result.ToString();
                            list.RemoveRange(i,2);  
                        break;
               
                }
        }
        
        private static List<string> StringToList()
        {
            char[] sign={'+','-','*','/'};
            string str="5+5*6+8/4+6";
        
            List<string> list= new List<string>();
        
            int i=0;
            while (i<str.Length)
            {                
                if (char.IsDigit(str[i]))
                {
                    int j=i;
                    i++;
                    
                    while (i<str.Length && char.IsDigit( str[i])) i++;
                    
                    list.Add(str.Substring(j,i-j));                    
                }
                  
                if (i<str.Length && sign.Contains(str[i])) list.Add(str[i].ToString());
               
                i++;             
            }
            
            return list;
        }
        
        
        public static void Main(string[] args)
        {
            
            List<string> list=StringToList();
            
            int result=int.Parse(list[0]);
            
            
            
            Print(list);
            
            while(1<list.Count-1)
            {                
                Operation(list);
                
                Print(list);
                
            }
                        
            
        }
    }
}
1
6 / 4 / 2
Регистрация: 18.01.2019
Сообщений: 43
19.01.2019, 17:21  [ТС]
Спасибо, это работает. Однако мне нужно немного иное, так как я хочу, чтобы в одной строке были разные знаки, не только умножение. А ваш вариант работает, я его уже пробовал

Добавлено через 45 минут
Спасибо большое) Это как раз то, что нужно. Проверил, все работает. Я даже не подумал сначала делать это через case
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
19.01.2019, 17:35
danilamironov, мат анализатор нужен
Анализатор вводимой строки с целью вычислить введенное математическое выражение
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.01.2019, 17:35
Помогаю со студенческими работами здесь

Найти в строке определённую последовательность символов(подстроку) и заменить её другой. Строка вводится с клавиатуры
Проверка на ввод пустой строки. Помогите пж. Все в соответствии с синтаксисом Delphi

Как эффективно заменить подстроку в строке на другую подстроку?
И если у подстрок разная длина? есть проверенный готовый способ?

В заданной строке A заменить выделенную подстроку на подстроку B
Помогите с задачей !!! В заданной строке A заменить выделенную подстроку на подстроку B. Для поиска позиции , с которой надо произвести...

В тексте слова заменить подстрокой
Здравствуйте, помогите пожалуйста с заданием. Желательно максимально просто. При выполнении задания предусмотреть возможность ввода...

Слова заменить заданной подстрокой
Здравствуйте! Собственно никак не могу разобраться с тем, как сделать следующее: В строке найти слова, длина которых простое число и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru