Пары Одинаковых Соседствующих Цифр И Двумерный Массив

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

Здравствуйте уважаемые мастера!
Возникла проблема при написании программ на языке C#.

1)Даны k значений целых натуральных n. Определить сколько пар одинаковых соседствующих цифр входит в запись этих чисел.
2)Дан двумерный массив. Рассматривая его построчно написать программу, удаляющую дубликаты строк (сделать так, чтобы строки не повторялись).

Код:
class Program
{
static void Main(string[] args)
{
int k;
Console.Write("Enter k: ");
k = int.Parse(Console.ReadLine());
int[] n = new int[k];
Console.Write("Enter the number: ");
for (int i=0;i<k;i++)
n = int.Parse(Console.ReadLine());

for (int i = 0; i < k; i++)
{
int ost1 = 0, ost2 = 0;

int count = 0;

while (n >= 10)
{
ost1 = n % 10;
n /= 10;
ost2 = n % 10;

if (ost1 != ost2) count++;
}

Console.WriteLine("Number # {0} -> Count = {1}\n",i+1, count.ToString());
}
}
}
это первая программа...что с ней не так? Правильно ли я двигаюсь?

Вторая программа как-то размыта для меня (с чего начать?)
Заранее СПАСИБО!
 
G

Guest

Ребята! Ну где Вы там? Мне очень нужна помощь.

первая программа не работает (правильно ли я вообще ее делаю, и как надо?) и гистограмму нужно построить. Вторую не понимаю.
 
L

LuMee

Честно говоря, условия сформулированы как-то очень невнятно.
1. можно пример исходных данных и ожидаемого результата выполнения программы?
2. двумерный массив чего? чисел, строк? правильно понимаю, что, скажем:
Код:
1 2 3
4 5 6
1 2 3
7 8 9
эта программа должна превратить в
Код:
1 2 3
4 5 6
7 8 9
?
 
G

Guest

Спрашивала у преподавателя о 2й задаче. Массив прямоугольный. Увы, о результатах и про данные он ничего не сообщил.
Сошлись на Вашей мысли
123
987
123 и тд.



Про гистограммы сказал, что их можно вывести с консоли...
*
**
**** что-то типо этого

Но я и с первой прогой затупила.
ВЫРУЧАЙТЕ!
 
G

Guest

using System;

namespace Test
{
class Test
{
static void Main()
{
Console.WriteLine("Enter array length:");
var arr = new int[int.Parse(Console.ReadLine())];
for (int i = 0; i < arr.Length; i++)
{
Console.WriteLine("Enter arr[{0}]", i);
arr = int.Parse(Console.ReadLine());
}

var counter = 0;
foreach (var number in arr)
{
var s = number.ToString();
for (int i = 1; i < s.Length; i++)
if (s[i - 1] == s) counter++;
}
Console.WriteLine("Number of pairs: {0}", counter);
}
}
}

вроде бы первая программа выглядит так?
Помогите с построением гистограммы.
 
L

LuMee

Я бы первую программу сделал примерно так:
Код:
int[] numbers = new[] { 2344456, 12234000, 998881111 };

int[] counts = new[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };			

foreach (int number in numbers)
{
int div, rem;

div = Math.DivRem(number, 10, out rem);
while (div > 0)
{
int previous = rem;
div = Math.DivRem(div, 10, out rem);

if (previous == rem)
counts[previous]++;
}
}

for(int i = 0; i < counts.Length; ++i)
{
if (counts[i] > 0)
Console.WriteLine("{0}: {1}", i, new String('@', counts[i]));
}

Здесь:
- numbers - массив чисел, подлежащих анализу (у вас он будет вводиться с консоли)
- counts - массив счетчиков повторений для всех десяти цифр; i-й элемент массива содержит обнаруженное количество пар для i-й цифры.

Каждое число мы последовательно делим на 10, полученное частное (если оно больше 0) потом анализируется дальше, а вот остаток - это очередная цифра, которую сравниваем с предыдущей.

Последний цикл выводит примитивную гистограмму.
 
G

Guest

Прекрасно! Спасибо!
не могли бы посмотреть вторую?

using System;
using System.Collections.Generic;
using System.Linq;

namespace Test
{
class Test : IEqualityComparer<int[]>
{
static void Main()
{
Console.WriteLine("Enter number of rows and columns in array (press enter between them):");
var arr = new int[int.Parse(Console.ReadLine()), int.Parse(Console.ReadLine())];
for (int i = 0; i < arr.GetLength(0); i++)
for (int j = 0; j < arr.GetLength(1); j++)
{
Console.WriteLine("Enter a[{0}, {1}]", i, j);
arr[i, j] = int.Parse(Console.ReadLine());
}

var list = new List<int[]>();
for (int i = 0; i < arr.GetLength(0); i++)
{
list.Add(new int[arr.GetLength(1)]);
for (int j = 0; j < arr.GetLength(1); j++)
list[j] = arr[i, j];
}

var arrNew = list.Distinct(new Test());
foreach (var a in arrNew)
{
for (int i = 0; i < a.Length; i++)
Console.Write(a + " ");
Console.WriteLine();
}
}

public bool Equals(int[] x, int[] y)
{
if (x.Length != y.Length) return false;
for(int i = 0; i<x.Length; i++)
{
if (x != y) return false;
}
return true;
}

public int GetHashCode(int[] obj)
{
return 0;
}
}
}
 
L

LuMee

Выглядит правдоподобно, если, конечно, преподавателем одобрено использование Linq (метод Distinct в вашем случае).
 
G

Guest

Это хорошо, что правдоподобно)

Не могли бы помочь сделать меню для второй программы?
 
G

Guest

как это...


типо

1) введите массив
2) показать результаты
3) тд и тп
4) выход
 
G

Guest

Уже разобралась!

using System;
using System.Collections.Generic;
using System.Linq;

namespace Test
{
class Test : EqualityComparer<int[]>
{
static int[,] _arr;

public static int Menu()
{
Console.WriteLine("Menu:");
Console.WriteLine("{0}. Input random array.\n" +
"{1}. Input array manually.\n" +
"{2}. Print current array.\n" +
"{3}. Delete identical rows.\n" +
"{4}. Exit.");
return int.Parse(Console.ReadLine());
}

public static void Input(bool random)
{
Console.WriteLine("Input number of rows and columns in array (press Enter between them):");
_arr = new int[int.Parse(Console.ReadLine()),int.Parse(Console.ReadLine())];
if (random)
{
var rand = new Random();
Console.WriteLine("Input inclusive lower and upper bounds for random (press Enter between them):");
int min = int.Parse(Console.ReadLine());
int max = int.Parse(Console.ReadLine());
for (int i = 0; i < _arr.GetLength(0); i++)
for (int j = 0; j < _arr.GetLength(1); j++)
_arr[i, j] = rand.Next(min, max + 1);
}
else
{
for (int i = 0; i < _arr.GetLength(0); i++)
for (int j = 0; j < _arr.GetLength(1); j++)
{
Console.WriteLine("Input arr[{0}, {1}]", i, j);
_arr[i, j] = int.Parse(Console.ReadLine());
}
}
}

public static bool Print()
{
if (_arr == null)
return false;
Console.WriteLine("Current array:");
for (int i = 0; i < _arr.GetLength(0); i++)
{
for (int j = 0; j < _arr.GetLength(1); j++)
Console.Write("{0}\t", _arr[i, j]);
Console.WriteLine();
}
return true;
}

public static bool Distinct()
{
if (_arr == null)
return false;
var list = new List<int[]>();
for (int i = 0; i < _arr.GetLength(0); i++)
{
list.Add(new int[_arr.GetLength(1)]);
for (int j = 0; j < _arr.GetLength(1); j++)
list[j] = _arr[i, j];
}
int[][] dList = list.Distinct(new Test()).ToArray();
_arr = new int[dList.Length,_arr.GetLength(1)];
for (int i = 0; i < _arr.GetLength(0); i++)
for (int j = 0; j < _arr.GetLength(1); j++)
_arr[i, j] = dList[j];
return true;
}

static void Main()
{
int m;
while (((m = Menu()) != 4))
{
switch (m)
{
case 0:
Input(true);
break;
case 1:
Input(false);
break;
case 2:
if (!Print()) Console.WriteLine("You need to input array first.");
break;
case 3:
if (!Distinct()) Console.WriteLine("You need to input array first.");
break;
default:
Console.WriteLine("Not supported command number.");
break;
}
}
}

public override bool Equals(int[] x, int[] y)
{
if (x.Length != y.Length) return false;
return !x.Where((t, i) => t != y).Any();
}

public override int GetHashCode(int[] obj)
{
return 0;
}
}
}

Вроде бы так!


Всплыла другая проблема....вооообще не пойму
Помогите ПОЖАЛУЙСТА!

Составить описание класса прямоугольников со сторонами, параллельными осям координат. Предусмотреть возможность перемещения прямоугольников на плоскости, изменение размеров, построение наименьшего прямоугольника, содержащего два заданных прямоугольника, и прямоугольника, являющегося общей частью (пересечением) двух прямоугольников.
Написать программу, демонстрирующую все разработанные элементы класса.
 
L

LuMee

Прямоугольник в данном случае можно описать двумя парами координат, соответствующими левому нижнему и правому верхнему углам.
Перемещение по некоторой оси будет означать увеличение/уменьшение соответствующей координаты (х или у) у обоих углов. Размеры меняются путем изменения координат только одного угла (или двух сразу, но в противоположных направлениях, чтобы сжать/растянуть прямоугольник).
Построение наименьшего прямоугольника будет примерно так: координата "х" левого нижнего угла будет минимумом из "х-ов" левых нижних углов прямоугольников, "у" - соот-но, из "у-ов". С правым верхним - аналогично, только ищем максимум вместо минимума. По аналогии можно и пересечение сообразить.
Остатется открытым вопрос, как все это демонстрировать: просто выводить координаты того, что получилось, или графика нужна.
 
P

polishuchka

Может уже не актуально, но вот удаление одинакових сток из массива обектов:
class Program
{
class compare
{
public static bool NumbCompare(object n1, object n2)//метод для порівняння чисел
{
int N1 = (Int32)n1;
int N2 = (Int32)n2;
return N1 != N2 ? true : false;
}
public static bool StrCompare(object n1, object n2)// метод для порівняння стрінгів
{
string str1 = (string)n1;
string str2 = (string)n2;
return str1 != str2 ? true : false;
}
}
// оголошуємо делегат для методу порівняння щоб передавати у ньому як параметр метод порівняння елементів масиву.
// функція, адреса якої буде передаватись у змінній-делегаті повинна повертати змінну типу bool і мати два параметри типу object.
public delegate bool DelegatToCompare(object n1, object n2);

// RowsDel - метод для вилучення однакових рядків із двовимірного масиву об'єктів довільного типу
// Параметри: n - кількість рядків, m - кількість стовпців, myObjects - двовимірний масив об'єктів, cmp - змінна типу делегат, яка задає метод для порівняння
// елементів масиву myObjects.
public static void RowsDel( ref object [,] myObjects,DelegatToCompare cmp )
{

int n; int m; // Поля для розмірностей масиву. n - кількість рядків, m - кількість стовпців
n = myObjects.GetUpperBound(0) + 1; // Вибираємо розмірності масиву у змінні n i m.
if (n < 2) return; // Якщо немаэ хоча б двоъ рядків, то нічого робити
m = myObjects.GetUpperBound(1) + 1;
int dimmyObjectsNew = 0;// кількість рядків масиву після вилучення однакових рядків
bool kliych ;
object[,] myObjNew;// оголошуємо масив для формування масиву - результату
myObjNew = new object[n, m];// створюємо місце для масиву після вилучення

for (int i = 0; i < n; i++)
{
kliych = true; //оголошуємо ключ true для кожного рядка у масиві
for (int ii = 0; ii < dimmyObjectsNew; ii = ii + 1) //цикл по рядках у новому масиві, який буде після вилучення
{
kliych = false;//вважаємо, що відповідні елементи у рядках співпадають
for (int jj = 0; jj < m; jj++) //цикл по стовпцях у новому масиві
{
object n1=myObjects[i, jj];
object n2 = myObjNew[ii, jj];
if (cmp(n1,n2)==true) //якщо елементи рівні, то встановлюємо значення клцюча у true
{
kliych = true;
break; // і виходимо з циклу по стовпцях.
}
}
if (!kliych) // якщо рядки співпадають, то переписувати не треба
{
break;
}
}
if (kliych) //якщо такого рядка нема у новому масиві
{
for (int j = 0; j < m; j++)
{
myObjNew[dimmyObjectsNew, j] = myObjects[i, j]; // то переписуємо цей рядок у масив - результат
}
dimmyObjectsNew = dimmyObjectsNew + 1; //і збільшуємо число кількості рядків у масиві - результаті
}
}
object[,] C = new object[dimmyObjectsNew, m]; //створюємо иасив object-ів з новою розмірністю
for (int i = 0; i < dimmyObjectsNew; i++)
{
for (int j = 0; j < m; j++)
{
C[i, j] = myObjNew[i, j]; //заповнюємо його елементами масиву - результату
}
}
myObjects = C; // присвоюємо початковому масиву значення масиву із зміненою розмірністю
}

static void Main(string[] args)
{
// Це приклад для тестування функції вилучення однакових рядків із двовимірного масиву
const int m=3;
const int n=5; //вказуємо розмірність масиву, з яким будемо працювати
Console.WriteLine("Enter N to work with numbers and S to work with strings:");
string input = Console.ReadLine(); //вводимо з клавіатури вибір тип елементів нашого масиву
// якщо будемо працювати з числами або S, якщо будемо працювати із словами
if (input == "N") // Далі тестуємо вилучення рядків із масиву цілих чисел
{
int[,] myInt = new int[n, m]; // Будемо вводити числа у масив myint
for (int i = 0; i < n; i++)
{
Console.WriteLine("Введіть, будь-ласка, три числа:");
for (int j = 0; j < m; j++)
{
myInt[i, j] = Convert.ToInt32(Console.ReadLine());//вводимо елементи вихідного масиву
}
Console.ReadKey();
}
DelegatToCompare delNumb = new DelegatToCompare(compare.NumbCompare);//створюємо екземпляр делегата для порівняння
object[,] D = new object[n, m];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
D[i, j] = (object)myInt[i, j]; // Запакуємо int y object
}
}
RowsDel(ref D , delNumb); //викликаємо метод для вилучення однакових рядків
// Розпаковуємо
int d1, d2;
d1 = D.GetUpperBound(0);
d2 = D.GetUpperBound(1); //витягуємо розмірності результуючого масиву
int[,] intResultat = new int[d1+1, d2+1];
for (int i = 0; i < d1+1; i++)
{
for (int j = 0; j < d2+1; j++)
intResultat[i, j] = (int)D[i, j];
}
myInt = intResultat; //записуємо результат у початковий масив
}
else
{
string[,] myStr = new string[n, m];
string[,] myStrNew = new string[n, m];
for (int i = 0; i < n; i++)
{
Console.WriteLine("Введіть, будь-ласка, три слова :");
for (int j = 0; j < m; j++)
{
myStr[i, j] = Console.ReadLine();
}
Console.ReadKey();
}
object[,] StrObj = new object[n, m]; // Запакуємо int y object
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
StrObj[i, j] = (object)myStr[i, j];
}
}
DelegatToCompare delStr = new DelegatToCompare(compare.StrCompare);
RowsDel(ref StrObj, delStr);
int d1, d2;
d1 = StrObj.GetUpperBound(0);
d2 = StrObj.GetUpperBound(1);
string[,] strResultat = new string[d1 + 1, d2 + 1];
for (int i = 0; i < d1 + 1; i++)
{
for (int j = 0; j < d2 + 1; j++)
strResultat[i, j] = (string)StrObj[i, j];
}
myStr = strResultat;
}
}
}
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!