Подскажите ошибки в коде по теме одномерные массивы

Всем привет ! Возникли некоторые проблемы с задачами, которые написал сам по условию, поэтому прошу, пожалуйста помощи у вас, так сказать взгляд со стороны. Буду рад всем предложениям, идеям и исправлениям)

Задача 1: Указания к решению: Ввод элементов массива выполнить с помо-
щью датчика случайных чисел. Для всех вариантов N<=100.
Дан массив действительных чисел А(N), значения элементов которо-
го лежат в диапазоне [a,b]. =>
Отсортировать по неубыванию абсолютных величин элементы массива,
находящиеся между последним, дробная часть которого больше 0.5 и
первым, абсолютное значение которого больше 100. Использовать ал-
горитм сортировки вставкой.

Решение :почему то не выводиться массив и правильно ли вообще сортирую? :slight_smile:

 int a = Convert.ToInt32(textBox1.Text);
            int b = Convert.ToInt32(textBox2.Text);
            Random rnd = new Random();//создание объекта для генерации псевдослучайных чисел
            int[] mas = new int[100];//пустой массив для заполнения
            int n, j, buf;
            for (int i = 0; i < 100; i++) //цикл для заполнения массива
            {

                mas[i] = rnd.Next(a, b);//случайное число из диапазона              
                for (j = 1; j < i; j--)
                {
                    if (mas[i] % 10 > 0.5 && mas[i] > 100) // выполнение условий : ,больше 0.5 и больше 100
                    {
                        buf = mas[j];
                        mas[j] = mas[j + 1];
                        mas[j + 1] = buf;
                    }
                }
                
            }
            label3.Text = mas[i].ToString();
        }

Задача 2: Указания к решению. Для ввода чисел использовать генератор слу-
чайных чисел. Для всех вариантов N<=100.
Дан массив целых чисел А(N).

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

Решение: почему-то тоже не хочется выводить массив и объявлять переменную для последнего for и это вставка или все таки пузырек? И подскажите, пожалуйста как удалять похожие элементы уже в отсортированном массиве, есть какой-то метод у класса Array, например?

   static public int summa(int n)
        {
            int a, s;
            a = Math.Abs(n);
            s = 0;
            while(a > 0)
            {
            s = s + a % 10;
            a = a / 10;
            }
            return  s;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Random rnd = new Random();//создание объекта для генерации псевдослучайных чисел
            int n = rnd.Next(100);
            int[] mas = new int[n];
            int j, i, k;
            for (i = 0; i < n; n--)
            {
                for (j = 0; j < i; n--)
                {
                    if (summa(mas[j]) < summa(mas(j + 1)))
                    {
                        k = mas[j];
                        mas[j] = mas[j + 1];
                        mas[j + 1] = k;
                    }

                }
            }
                for (int i  = 0; i < n; i++)
                {
                    label1.Text = mas[i].ToString();
                }
            
        }

покажите фрагменты нахождения:

  • последнего числа, дробная часть которого больше 0.5
  • первого числа абсолютное значение которого больше 100
  • сортировка вставкой

Так вы его и не выводите.

Если это попытка вывести

то тут выведется только один элемент (перезапишется последним если это в цикле как в коде второй задачи) + это вообще не скомпилируется потому что это за пределами цикла и тут нет i

Превратить массив в строку можно так:

label.Text = String.Join(", ", mas);

Ну или += в цикле.

Удалять можно из List. В массиве только самому создавать новый массив и копировать в него нужные (Array.Copy, …).

Мое видение 1-й

public static void Main()
	{
		Random rnd = new Random();
		int a = rnd.Next(0,20);
		int b = rnd.Next(a,110);
		int N = rnd.Next(1,10);
		int LastFracAbove05Index = -1;
		int FirstAbsAbove100Index = -1;
		double[] A = new double[100];
		Console.WriteLine("Array Size : {0}",N);
		for(int i = 0; i<N; i++)
		{
			A[i] = rnd.NextDouble() * 300 - 100;
			Console.WriteLine("{0}: {1}",i, A[i]);
			if(A[i]-(int)A[i] > 0.5) LastFracAbove05Index = i;
			if(Math.Abs(A[i]) > 100 && FirstAbsAbove100Index == -1) FirstAbsAbove100Index = i;
		}
		if(LastFracAbove05Index == -1 || FirstAbsAbove100Index == -1)
		{
			Console.WriteLine("Fuckup");
			return;
		}
		else
			Console.WriteLine("\nLastFracAbove05Index {0} : {1};\nFirstAbsAbove100Index {2} : {3} ",LastFracAbove05Index, A[LastFracAbove05Index], 
							  																		FirstAbsAbove100Index, A[FirstAbsAbove100Index]);
		int startPos = Math.Min(LastFracAbove05Index,FirstAbsAbove100Index)+1;
		int endPos = Math.Max(LastFracAbove05Index,FirstAbsAbove100Index);
		Console.WriteLine("\nSort From {0} Element To {1}", startPos, endPos-1);
		
		for (int i = startPos; i < endPos; i++)
            {
                for (int j = endPos-1; j > startPos; j--)
                {
                    if (A[j - 1] > A[j])
                    {
                        double temp = A[j - 1];
                        A[j - 1] = A[j];
                        A[j] = temp;
                    }
                  }
            }
		for(int i = 0; i<N; i++)
		{
			Console.WriteLine("{0}: {1}",i, A[i]);
		}
	}
1 лайк

Слепил 2 из фрагментов



using System;
					
public class Program
{
	public static void Main()
	{
		Random rnd = new Random();
		int a = rnd.Next(0,20);
		int b = rnd.Next(a,110);
		int N = rnd.Next(1,10);
		int[] A = new int[N];
		int[] B ;//= new int[N];
		for(int i = 0; i < N ; i++) A[i] = rnd.Next(a,b);
		Console.WriteLine("\nInput Array");
		PrintArray (A);
		Console.WriteLine("\nSorted Array");
		SelectionSort(A);
		PrintArray (A);
		
		B = RemoveGroupes(A);
		Console.WriteLine("\nCleaned Array");
		PrintArray (B);
		
	}
	
	private static int[] RemoveGroupes(int[] Arr)
	{
		int[] bArr = new int[Arr.Length];
		int bi = 0;
		for(int i = 0; i < Arr.Length ; i++)
		{
			int Sum = SummOfDigits(Arr[i]);
			bool f = true;
			for(int j = i+1; j < Arr.Length; j++)
			{
				if(SummOfDigits(Arr[j]) == SummOfDigits(Arr[i]))
					f = false;
			}
			if (f) bArr[bi++] = Arr[i];
		}
		while(bi<bArr.Length)
		{
			bArr = RemoveIndices(bArr,bArr.Length-1)	;
		}
		return bArr;
	}
	
	private static int[] RemoveIndices(int[] IndicesArray, int RemoveAt)
	{
    	int[] newIndicesArray = new int[IndicesArray.Length - 1];

    	int i = 0;
    	int j = 0;
    	while (i < IndicesArray.Length)
    	{
    	    if (i != RemoveAt)
    	    {
    	        newIndicesArray[j] = IndicesArray[i];
    	        j++;
    	    }
			
  	      i++;
	    }

	    return newIndicesArray;
	}
	
	
	
	public static void PrintArray(int[] Arr)
	{
		//Console.WriteLine("\n");
		for(int i = 0; i < Arr.Length; i++)
		{
			Console.WriteLine("{0}: {1} : Sum = {2}",i, Arr[i], SummOfDigits(Arr[i]));
		}
	}
	public static int SummOfDigits(int Number)
	{
		int a, s;
            a = Math.Abs(Number);
            s = 0;
            while(a > 0)
            {
            s = s + a % 10;
            a = a / 10;
            }
            return  s;
	}
	
	public static void SelectionSort(int[] arr)
{
    int min, temp;
    int length = arr.Length;

    for (int i = 0; i < length - 1; i++)
    {
        min = i;

        for (int j = i + 1; j < length; j++)
        {
            if (SummOfDigits(arr[j]) < SummOfDigits(arr[min]))
            {
                min = j;
            }
        }
        
        if (min != i)
        {
            temp = arr[i];
            arr[i] = arr[min];
            arr[min] = temp;
        }
    }
} 
}

1 лайк

Александр , спасибо вам огромное ! Даже не знаю как отблагодарить ! Если есть номер карты ВТБ или Сбера киньте пожалуйста. Нет слов и я в шоке !!! У вас действительно тут адекватное сообщество , которое подскажет , поможет и объяснит! Ещё раз благодарю!

Не резидент российский банков, но если есть желание отблагодарить, то есть странный один способ. Media.project[at]ukr.net

1 лайк