Комментарии:
Всем привет! Надеюсь, что кто-нибудь ответит xD
Проверьте плиз мое решение, оно вроде бы работает, но че-то я сомневаюсь
static void delete(ref int[] array, int index)
{
int[] newArr = new int[array.Length - 1];
for (int i = 0; i < index; i++)
{
newArr[i] = array[i];
}
for (int i = index; i < newArr.Length; i++)
{
newArr[i] = array[i + 1];
}
array = newArr;
}
Благодарю за урок.
Ответитьможно ещё вот так сделать
for (int i = index; i < newArray.Length; i++)
newArray[i] = array[i+1];
Сначала выполнил задание, затем посмотрел урок для самопроверки.
Во втором цикле "for" сделал немного по другому, чем у автора. Вроде бы тоже всё правильно работает.
static void DeleteIndex (ref int[] array, int index) // Удаление элемента по указанному индексу
{
int[] newArray = new int[array.Length - 1]; // Создаём новый массив с -1 кол-м элементов
for (int i = 0; i < index; i++) // Перебираем элементы до удаляемого индекса
newArray[i] = array[i];
for (int i = index; i < newArray.Length; i++)
newArray[i] = array[i+1]; // Пропускаем элемент с индексом, который нужно было удалить, и заполняем новый массив далее
array = newArray; // Присваиваем новому массиву имя старого, принимаемого в метод
}
Первый раз сделал всё как в видео, но потом нашёл замечательный метод Copy, и обошелся без циклов
static void DeleteAnyElement<T>(ref T[] OldArray, uint Index)
{
if ( Index < OldArray.Length)
{
T[] NewArray = new T[OldArray.Length - 1];
Array.Copy(OldArray, 0, NewArray, 0, Index);
Array.Copy(OldArray, Index + 1, NewArray, Index, NewArray.Length - Index);
OldArray = NewArray;
}
else
Console.WriteLine("Неверный индекс");
Я так сделал. Плюс добавил, чтобы удалялся элемент не по индексу а по значению. Единственный нюанс, что работает только в том случае, если все значения в массиве разные.
void Resize(ref int[] arr, int id)
{
int[] myArray = new int[arr.Length - 1];
for (int i = 0; i < id; i++)
{
myArray[i] = arr[i];
}
for (int i = id; i < myArray.Length; i++)
{
myArray[i] = arr[i + 1];
}
arr = myArray;
}
int[] myArray = { 4, 7, 10, 9, 6, 13, 19, 5 };
int Value = 5;
int id = 0;
for (int i = 0; i < myArray.Length; i++)
{
if (myArray[i] == Value )
id = i + id;
}
Resize(ref myArray, id);
мне 14 лет, решил изучить c# спасибо вам за уроки Сергей!
Ответитьмоё решение:
static void arrayremove(ref int[] arr, int index)
{
int[] ss = new int[arr.Length - 1];
for(int i = 0; i < index; i++)
{
ss[i] = arr[i ];
}
for(int i = index ; i < ss.Length; i++)
{
ss[i] = arr[i + 1];
}
arr = ss;
}
У меня так получилось :)
internal class Program
{
static void Main(string[] args)
{
int[] myArray = { 5, 15, 25, 100, 805, 205 };
DeleteTheBegin(ref myArray);
Delete(ref myArray, 2);
DeleteTheEnd(ref myArray);
for (int i = 0; i < myArray.Length; i++)
{
Console.Write(myArray[i] + " | ");
}
}
static void DeleteTheBegin(ref int[] array)
{
Delete(ref array, 0);
}
static void Delete(ref int[] array, int index)
{
int[] tempArray = new int[array.Length - 1];
for (int i = 0; i < index; i++)
{
tempArray[i] = array[i];
}
for (int i = index; i < tempArray.Length; i++)
{
tempArray[i] = array[i + 1];
}
array = tempArray;
}
static void DeleteTheEnd(ref int[] array)
{
Delete(ref array, array.Length - 1);
}
}
2 цикл писал немного по другому:
for (int i = index; i < ArrayNew.Length; i++)
ArrayNew[i] = Array[i+1];
Но по сути роли это "вроде" не играет.
Очень интересно и доступно объясняете, особенно хорошо что в дебаге показываете "логику".
Спасибо
Ответитьstatic void Delete(ref int[] arr, int value)
{
if (arr == null)
{
return;
}
int index = 0;
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] == value)
{
index = i;
break;
}
}
int[] arr2 = new int[arr.Length - 1];
int j = 0;
for (int i = 0; i < arr2.Length; i++, j++)
{
if (index != i)
{
arr2[i] = arr[j];
}
else
{
j++;
arr2[i] = arr[j];
}
}
arr = arr2;
}
Delete element in Array
Тут уже елемент удаляется
А я поставил только плюс к индексу в старом масиве и получилось тоже самое
ОтветитьПриветствую всех, у меня есть еще вот такой варинат для людей которые как я ъотели сделать удаление например за числом а не за индексом:
static void deleteNumber (ref int[] arr, int chosenNumber)
{
int[] newArray = new int[arr.Length - 1];
int index = Array.FindIndex(arr,i=>i == chosenNumber);
for (int i = 0; i < (index+1); i++)
newArray[i] = arr[i];
for (int i = (index+1); i < arr.Length; i++)
newArray[i - 1] = arr[i];
arr = newArray;
}
static void Main(string[] args)
{
int[] arr = new int[10];
Random rand = new Random();
for (int i = 0; i < arr.Length; i++)
{
arr[i] = rand.Next(100);
Console.Write(" " + arr[i]);
}
Console.Write("\n\nWhat number would you like to delete?: ");
int chosenNumber = int.Parse(Console.ReadLine());
deleteNumber(ref arr, chosenNumber);
Console.WriteLine();
for (int i = 0; i < arr.Length; i++)
{
Console.Write(" " + arr[i]);
}
Console.WriteLine("\n\nFor EXIT press ENTER!");
Console.ReadLine();
Буду рад любой критике
Интересно обнаружить что при повторной отладке во вновь созданном массиве newArray ты видишь данные из прошлой отладки - добавляет понимание что такое ref и куча : )
ОтветитьSpasibo!
Ответитьusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Щас_напишу_контетнт
{
internal class Program
{
static void Main(string[] args)
{
int[] aray = { 1, 18, 161, 325, 13, 1255, 33341, 41, 3, 5 };
aray = Deleter(ref aray, 5, 10);
}
static int[] Deleter(ref int[] arr, int index, int num)
{
int[] newArr = new int[arr.Length - 1];
for (int i = 0; i < (arr.Length - 1); i++)
{
if (i == index) {
newArr[i] = arr[i + 1];
index = i + 1;
}
else { newArr[i] = arr[i]; }
}
return newArr;
}
}
}
У меня такая история получилась . По-моему даже проще. Или шляпа?
T[] vs = new T[arr.Length - 1];
for (int i = 0, j = 0; j < vs.Length; i++, j++)
{
if (i == arrindex)
i++;
vs[j] = arr[i];
}
arr = vs;
Нет проверки на неправильный индекс
ОтветитьЯ сделал немного по другому) посмотрите, оцените
static void DecArrayInIndex(ref int[] arr)
{
int[] arr1 = arr;
arr = new int[arr.Length - 1];
Console.WriteLine("Укажите индекс");
uint index = uint.Parse(Console.ReadLine());
for (int i = 0; i < index; i++)
arr[i] = arr1[i];
for (; index < arr.Length; index++)
arr[index] = arr1[index + 1];
}
А как сделать функцию, чтобы модно было работать с массивами произвольного типа?
ОтветитьЯ выполнил д/з чутка иначе
-------------------------------------------------------------------------------------
using System;
namespace Up
{
internal class Program
{
static void func(ref byte[] arr, byte index)
{
byte[] newarr = new byte[arr.Length-1];
for (byte i = 0; i < newarr.Length; i++)
{
if (newarr[i] == arr[index]) continue;
newarr[i] = arr[i];
}
arr = newarr;
}
static void Main(string[] args)
{
byte[] arr = { 5, 4, 6, 3 };
func(ref arr, 3);
arr = null;
}
}
}
class Program
{
static int[] RandArray()
{
Random rand = new Random();
int[] myArray = new int[rand.Next(5, 10)];
for (int i = 0; i < myArray.Length; i++)
myArray[i] = rand.Next(10, 100);
return myArray;
}
static void DelElem(ref int[] myArray, int a)
{
int[] newArray = new int[myArray.Length - 1];
for (int i = 0; i < a; i++)
newArray[i] = myArray[i];
for (int i = a; i < newArray.Length; i++)
newArray[i] = myArray[i+1];
myArray = newArray;
Console.WriteLine();
}
static void DelFirst(ref int[] myArray)
{
DelElem(ref myArray, 0);
}
static void DelLast(ref int[] myArray)
{
DelElem(ref myArray, myArray.Length-1);
}
static void Main(string[] args)
{
int[] myArray = RandArray();
foreach (var item in myArray)
Console.WriteLine(item);
Console.Write("Введите индекс элемента которого вы хотите удалить: ");
int c = int.Parse(Console.ReadLine());
DelLast(ref myArray);
foreach (var item in myArray)
Console.WriteLine(item);
}
}
Без двух циклов,проскакиваем ненужный индекс,это у меня как домашка была в универе по теме циклы))
for(int i=0,j=0; i<arr1.Length; j++,i++)
{
arr1[i]=arr[j];
if(j==index) { j++; arr1[i]=arr[j]; }
}
Спасибо огромное, очень помог!
ОтветитьСпасибо! Такой формат и качество уроков позволяет идти к своей мечте! Я не студент, был студентом , который учил с++ двадцать лет назад. А сейчас решил поменять сферу деятельности и вернуться в мир программирования, что оказалось очень не просто. Мне активно помогают любимая жена, трое деток, трое котов и песик))))). Благодаря невероятному качеству роликов, а не теряю веру в свои силы и шаг за шагом познаю с #. Получаю огромное удовольствие от процесса обучения!!! Да. Мне 36 лет. Я помню время , когда учил делфи по книжкам , изучал интербейз и SQL. Мой диплом - это программа склад написанная на делфи и базе oracle. Я торжественно обещаю, как только устроюсь на работу мечты - за мной не заржавеет!!!
Ответитьfor (int i = value; i < newArray.Length; i++)
{
newArray[i] = mass[i + 1];
}
Так попроще.
если массиву стринговый ? string [] array ?
Как у него удалить первый и последний, и по индексу ?
Не понимаю зачем использовать два цикла если можно просто поставить условие с continue в одном.
ОтветитьА мне стыдно признаться, что ни одного урока я сам не сделал.
ОтветитьЯ чёт затупил и не захотел думать, какое условие должно быть в цикле. В итоге обернул первый цикл в IF else и проверял на несоответствие с index, а если соответствие, то break (выход из цикла). а второй цикл такой же). Не знаю, почему именно в этом дз так решил сделать, но хоть ключевое слово break вспомнил :D
ОтветитьСергей спасибо большое за Ваши уроки.
Не уверен что я прав, но удаление элемента массива можно произвести используя один цикл ( добавив одну локальную переменную).
Простите, что код без комментариев :
static void Mymass(ref int[] array, int size)
{
int [] NewMass = new int[array.Length-1];
int temp = 0;
for (int i = 0; i < array.Length; i++)
{
if (i == size)
{
continue;
}
NewMass[temp] = array[i];
temp++;
}
array = NewMass;
}
А на каком языке написан Visual Studio?…
ОтветитьПолезный урок!
ОтветитьСпасибо за то что делаешь ,мужик! Моя первая зп будет твоя))
ОтветитьВсе 3 дз сделал своей логикой (она скорее всего менее правильная), но радует хоть то , что сделал правильно работающие методы )
ОтветитьЯ не так понял ДЗ опять. Я заменял элемент на 0 а не удалял ячейку))
ОтветитьСпасибо за отличные ДЗ и их решение!
ОтветитьСпасибо за прекрасные уроки и задачи, но есть маленькая ремарочка:
Использую 1 массив и для удаления и для добавления, можно же просто по индексу работать
for (int i = 0; i < arr1.Length && i < arr.Length; i++)
{
if (i >= index)
{
arr[i] = arr1[i+1];
continue;
}
arr[i] = arr1[i];
}
на выходе получается все верно, но при этом на 1 цикл меньше нагрузки
Скажите пожалуйста, какую версию Visual studio вы используете
ОтветитьСпасибо!
ОтветитьХм... А зачем вы сделали i = index + 1? Можно было сделать i = index; newArray[i] = array[i + 1]... Или это для читаемости кода?
ОтветитьСделал немного по-другому
static void DeleteIndex(ref int[] array, int indexNumber)
{
int[] newArray = new int[array.Length - 1];
for (int i = 0; i < indexNumber; i++)
{
newArray[i] = array[i];
}
for (int i = indexNumber; i < newArray.Length; i++)
{
newArray[i] = array[i+1];
}
array = newArray;
}
static void DeleteFirstIndex(ref int[] array)
{
DeleteIndex(ref array, 0);
}
static void DeleteLastIndex(ref int[] array)
{
DeleteIndex(ref array, array.Length-1);
}
Почему нельзя создать всего лишь один цикл и когда индекс равен индексу вставляемого элемента писать continue?
ОтветитьПоддерживающий комментарий для дальнейшего развития канала
Ответитьдля любителей грязи
static void RemoveFirst(ref int[] mainArray)
{
int[] advanceArray = new int[mainArray.Length - 1];
for (int i = 1; i < mainArray.Length; i++)
advanceArray[i - 1] = mainArray[i];
mainArray = advanceArray;
}
static void RemoveLast(ref int[] mainArray)
{
int[] advanceArray = new int[mainArray.Length - 1];
for (int i = 0; i < mainArray.Length - 1; i++)
advanceArray[i] = mainArray[i];
mainArray = advanceArray;
}
Спасибо !!!
ОтветитьБлагодарю!!!
ОтветитьЯ сделал так ,чтобы не пришлось писать дополнительные методы на удаление 1го и последнего индекса массива, и тоже работает =)):
static void DeleteIndex(ref int[] MyArray, int index)
{
int[] newArray = new int[MyArray.Length - 1];
for (int i = 0; i < index; i++)
newArray[i] = MyArray[i];
for (int i = index; i < MyArray.Length && i < MyArray.Length-1; i++)
newArray[i] = MyArray[i+1];
MyArray = newArray;
}