Прошу не судить строго, в с# новичёк. Проблема с выводом массива (или, возможно, консоли, или пониманием сути..).
Задача — для себя увидеть содержимое массива, любым способом (пока что это проблема)
В MS Visual Studio 2013 выбираю Файл->Создать проект->Приложение Windows Forms
Появляется форма, на неё вставляю кнопку, в которой пишу простейший код:
C# | ||
|
При запуске кода и нажатии на кнопку — ничего не происходит. Консоль не появляется.
(Справедливости ради скажу, что при создании проекта в формате «Консольное приложение» консоль всё же проявляется на долю секунды и исчезает)
Что я делаю не так. Где и как увидеть содержимое массива (или как отобразить) в режиме «Приложение Windows Forms» ?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
Лекция
15
22.0. Массивы в
Windows Forms Application
Массивы – это структура данных,
представляющая собой набор переменных
одинакового типа, имеющих общее имя.
Каждый
элемент массива однозначно определяется
именем и индексом (номером элемента в
массиве). Индексы массива принадлежат
целочисленному типу.
Все
элементы массива имеют одинаковый тип.
Используются
при работе с таблицами и списками.
Массив
может быть:
—
одномерным,
—
двумерным /многомерным.
Массивы
различают:
-
статические
и -
динамические.
В статическом массиве размеры
массива (верхний индекс элементов)
задаются при объявлении массива (размеры
известны до компиляции программы).
Формат
объявления одномерного массива в C#:
тип[
] ИмяМассива = new
тип [размер];
Формат
объявления двумерного массива в C#:
тип
[ , ] ИмяМассива = new
тип [количество строк, количество
столбцов];
Если массив объявлен с инициализацией
глобально в программе, то начальные
значения элементов массива будут
использоваться во всех процедурах и
обработчиках событий. Пример объявления
массива:
// using – раздел
объявления модулей;
using
System.Windows.Forms;
namespace
WindowsFormsApplication1 //пространство
имен приложения
{
public
partial class Form1 : Form // объявление
класса
{
public Form1()
// объявление формы1
{
InitializeComponent();
// объявление компонент на форме
}
// глобальное объявление массивов
int[] А = new int[5]; // одномерный массив
А из 5 целых чисел
double[,] M = new double[2, 3]; // двумерный массив
M[2х3]
string[ ] Team = {«Zenith»,
«Dynamo», «Sparta», «Rotor», «CSK»};
//строковый
double[] F = { 1.5, 2.1, 3.65, 4.7, 5.14, 6.36 }; // F[6]
из 6 вещественных чисел
int[,] D = { { 0, 2, 4, 6 }, { 2, 9, 6, 3 }, { 4, 7, 5, 8 }, { 1, 6,
5, 7 } }; // массив M [4х4]
}
}
// обработчики событий
Элементы
массива, объявленного глобально
можно инициализировать в процедуре
обработчика события, во время работы
программы, например, для массива A из 5
эл.:
private void
button1_Click(object sender, EventArgs e)
{
// инициализация элементов массива
A, объявленного глобально
A[1] = 5;
A[2] = 6; A[3] = 0; A[4] = -5; A[5]
= -10;
}
Локальный массив объявляется в
процедуре обработчика события, и тогда
его как правило инициализируют во время
исполнения этого события. Значения
элементов, как и сам массив известен
только в этой процедуре. При необходимости
работы с массивом его надо заново
объявлять в другом обработчике события
и производить его инициализацию.
Например:
private
void button2_Click(object sender, EventArgs e)
{
int[] B =
new int[10];
// массив B объявлен
локально
for (int k
= 0; k <= 4; k++)
// с инициализацией элементов
B[k] = k;
}
При обращении к элементам массива
заданного локально в другом обработчике
событий, будет выдано сообщение об
ошибке:
В динамическом массиве при объявлении
указывается имя массива, тип его
элементов, а размер массива определяется
при выполнении программы и задается
некой переменной. Значение переменной
можно ввести в процессе диалога программы
с пользователем или используя свойство
length, содержащее количество элементов,
которое может хранить массив. Например:
private void button1_Click(object sender, EventArgs e)
{
int size = int.Parse(textBox1.Text);
//Задание верхней
границы массива
int []
H = new int[size];
………
}
22.1 Операции с массивами в Windows-приложениях
Типовые операции:
-
вывод/ввод
массива; -
поиск
максимального или минимального элемента
массива; -
поиск
заданного элемента массива; -
сортировка
массива.
Ввод-Вывод
массивов в Windows-приложениях
Поскольку эти приложения позволяют
создать дружелюбный интерфейс
пользователя, то это облегчает работу
по вводу и выводу массивов.
Пример. Форма разделена условно на две
части – для ввода и вывода массива.
Пользователь в текстовое окно число
элементов массива и нажимает командную
кнопку «Создать массив», обработчик
которой создает массив заданной
размерности, если корректно задан
размер, в противном случае выдается
сообщение об ошибки.
Затем пользователь переходит к вводу
элементов массива. Элемент вводится в
текстовое окно, а командная кнопка
«Ввести элемент» обеспечивает передачу
значения в массив. Корректность ввода
контролируется и на этом этапе.
Для облегчения ввода пользователю
выводится подсказка, какой именно
элемент надо ввести. После ввода элементов
массива окно ввода становится недоступным
для ввода элементов.
В нижней части отображается введенный
массив в форме, удобной для восприятия
пользователя. Для этого пригодны
элементы: ListBox, CheckedListBox,
ComboBox. Как только вводится
очередной элемент, он немедленно
отображается во всех объектах.
ComboBox11
label1
label2
label3
label4
label5
label6
label7
listBox1-
список
checkedListBox1
comboBox1-
комбинированный список
textBox1
button1
textBox2
button2
panel1
panel2
Три объекта вывода элементов массива
приведены для демонстрации, реально их
всех отображать не нужно. Компонент
выбирается по желанию пользователя.
using System;
using
System.Collections.Generic;
using
System.ComponentModel;
using System.Data;
using System.Drawing;
using
System.Linq;
using System.Text;
using
System.Windows.Forms;
namespace
WindowsFormsApplication1
{
public partial
class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
double [] mas;
int i=0;
private void
button1_Click(object sender, EventArgs e)
{
try //охраняемый блок
{
int n = int.Parse(textBox1.Text);
mas =
new double[n];
label4.Text = «mas[ » + 0 + » ]»;
textBox2.ReadOnly = false;
listBox1.Items.Clear();
checkedListBox1.Items.Clear();
comboBox1.Items.Clear();
i = 0;
}
catch //перехватчик исключения и
формирование ошибки
{
MessageBox.Show(«Надо вводить цифры «,
«Ошибочный ввод данных»,
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void
button2_Click(object sender, EventArgs e)
{
int n =
int.Parse(textBox1.Text);
mas = new
double[n];
// задание размера массива
mas[i] = double.Parse(textBox2.Text);
label4.Text = «mas[ » + i + » ]»;
listBox1.Items.Add(mas[i]);
checkedListBox1.Items.Add(mas[i]);
comboBox1.Items.Add(mas[i]);
i++;
textBox2.Text = » «;
label6.Text = «ОК»;
if (i == n)
{
label3.Text = » «;
label4.Text = » «;
label6.Text = «Ввод
не доступен
«;
textBox2.Text = » «;
textBox2.ReadOnly = true;
}
}
}
}
Последовательность чисел удобно вводить
в строку таблицы с помощью компонента
DataGridView (данные строкового
вида).
DataGridView – это таблица,
ячейки которой содержат строки символов.
Столбец
Таблица
Строка
Ячейка
Свойства
DataGridView определяют:
Columns
колонки таблицы
Rows
строки таблицы
Cells ячейки
ColumnCount количество
столбцов таблицы
RowCount количество
строк таблицы
Rows[n].Cells[k]
ячейка, лежащая на пересечении n
— го ряда row и k-ой
столбца
Задача1, 2. Ввести
элементы одномерного
массива и вычислить:
Задача1: суммарное, среднеарифметическое,
Задача2: максимальное и минимальное
значения элементов этого массива.
using System;
using
System.Collections.Generic;
using
System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using
System.Windows.Forms;
namespace
WindowsFormsApplication1
{
public partial
class Form1 : Form
{
public Form1()
{
InitializeComponent();
// объявление компонентов на
Form1
}
double[] K =
new double[5]; // объявление
массива
private void
button1_Click(object sender, EventArgs e) // Задача1
{
double avr = 0;
//среднее значение
double summ = 0; //сумма элементов
int n
= 0;
// количество введенных
элементов
try //охраняемый блок
{
for
(int
i
= 0; i
< 5; i++)
//преобразование данных, вводимых в
1 строку
{
// с клавиатуры в цифровой
эквивалент
K[i]
= System.Convert.ToDouble(dataGridView1.Rows[0].Cells[i].Value);
summ
= summ + K[i];
n= n
+ 1;
}
avr =
summ / n;
label1.Text
= «Сумма
элементов:
» + String.Format(«{0,6:f}», summ);
label2.Text
= «Среднее
арифмет.
значение:
» + String.Format(«{0,6:f3}», avr);
}
catch //перехватчик исключения и
формирование ошибки
{
MessageBox.Show(«Надо вводить цифры «,
«Ошибочный ввод данных»,
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void
button2_Click(object sender, EventArgs e) // Задача2
{
double Kmax
= 0;
double Kmin
= 0;
int Nmx =
0;
int Nmn =
0;
try
//охраняемый
блок
{
for
(int
i
= 0; i
< 5; i++)
//преобразование данных, вводимых в
первую строку
{
//с клавиатуры в цифровой эквивалент
K[i]
= System.Convert.ToDouble(dataGridView1.Rows[0].Cells[i].Value);
}
Kmax =
K[0]; // предположение
Nmx =
0;
for
(int i = 1;
i < 5; i++)
{
if (K[i] > Kmax)
{
Kmax
= K[i]; // выявление
max
Nmx = i;
}
}
Kmin =
K[0]; // предположение
Nmn =
0;
for
(int i =1;
i < 5; i++)
{
if
(K[i] < Kmin)
{
Kmin
= K[i]; // выявление
min
Nmn = i;
}
}
label3.Text
= «Максимальное
значение:
» + String.Format(«{0,6:f1}», Kmax) + «, его
номер:
» + Nmx.ToString();
label4.Text
= «Минимальное
значение:
» + String.Format(«{0,6:f1}», Kmin) + «, его
номер:
» + Nmn.ToString();
}
catch //перехватчик исключения и
формирование ошибки
{
MessageBox.Show(«Надо вводить цифры «,
«Ошибочный ввод данных»,
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
0
1 2 3 4
Двумерную
таблицу можно представить как совокупность
одномерных массивов.
Задача
3. Обработать результаты спортивных
соревнований олимпиады.
Программа
должна вычислять общее количество
медалей каждой страны и соответствующее
количество баллов, по правилу:
— за
золотую медаль – 7 баллов,
— за
серебряную медаль – 6 баллов,
— за
бронзовую медаль – 5 баллов,
Устанавливаем на
форму объекты dataGridView1
и button1. Используя свойство
Colomns, создаем коллекцию
столбцов с полями: Страна, Золотых,
Серебряных, Бронзовых, Всего, Баллов
dataGridView
Изменив свойство Name,
переименуем dataGridView в
Tabl.
Количество строк в компоненте
по умолчанию dataGridView
= 1 и для увеличения их численности
необходимо при инициализации элементов
добавить нужное их число через метод
dataGridView.Rows.Add();
public
Form1()
{
InitializeComponent();
Tabl.Rows.Add(8);
//добавление
строк
в
таблицу
}
Заполнение ячеек организовано через
процедуру обработки события Activate,
которое происходит при активизации
формы.
Запуск приложения
При нажатии на кнопку «Итоги» происходит
расчет показателей:
using System;
using
System.Windows.Forms;
namespace
WindowsFormsApplication1
{
public partial
class Form1 : Form
{
public Form1()
{
InitializeComponent();
Tabl.Rows.Add(8);
//добавление
строк
в
таблицу
}
private void
Form1_Activated(object sender, EventArgs e) //при
активизации
формы
{
string[]
Ctrana
= new
string[8]
{ «Австрия», «Великобритания»,
«Германия», «Италия»,
«Россия», «США»,
«Франция», «Япония» };
int[]
Zoloto
= new
int[8]
{ 16, 11, 14, 13, 32, 39, 13, 5 };
int[]
Serebro = new int[8] { 25, 10, 17, 8, 28, 25, 14, 8 };
int[]
Bronza = new int[8] { 17, 7, 28, 13, 28, 33, 11, 5 };
for (int i
= 0; i < 8; i++)
{
Tabl.Rows[i].Cells[0].Value
= Ctrana[i]; // заполнение
элементами
0 столбца
Tabl.Rows[i].Cells[1].Value
= Zoloto[i]; // заполнение
элементами
1 столбца
Tabl.Rows[i].Cells[2].Value
= Serebro[i]; // заполнение
элементами
2 столбца
Tabl.Rows[i].Cells[3].Value
= Bronza[i]; // заполнение
элементами
3 столбца
}
}
private void
button1_Click(object sender, EventArgs e) //кнопка
Итоги
{
int c,r; //номер
колонки и строки Tabl
int s=0; //всего медалей у команды
int b=0; //всего баллов у команды
for (r = 0; r < 8; r++)
//цикл по строкам
{
//вычисление
общего количества медалей
for (c
= 1; c <= 3; c++)
s =
s + System.Convert.ToInt16(Tabl.Rows[r].Cells[c].Value);
//вычисление
общего
количества
баллов
b = 7 *
System.Convert.ToInt16(Tabl.Rows[r].Cells[1].Value) +
6
* System.Convert.ToInt16(Tabl.Rows[r].Cells[2].Value) +
5
* System.Convert.ToInt16(Tabl.Rows[r].Cells[3].Value);
Tabl.Rows[r].Cells[4].Value
= s.ToString(); // всего
медалей
для
каждой
страны
Tabl.Rows[r].Cells[5].Value
= b.ToString(); // всего
баллов
для
каждой
страны
}
}
}
}
Соседние файлы в папке ЛК
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Дата изменения: 7 сентября 2022
Лабораторные работы си шарп. Массивы»
Приложения для Windows forms
Лабораторная работа 10
Выполнить: Создайте проект для подсчета суммы и среднего арифметического значения элементов одномерного массива.
Пример выполнения:
Рис. Форма «Массивы»
[Название проекта: Lab10
, название файла Lab10.cs
]
Выполнение:
- Создайте новый проект. Расположите элементы управления на новой форме (см. рисунок).
- Задайте свойству Multiline для текстового окна txtArray значение равное true (для того, чтобы в текстовом окне можно было выводить текст в несколько строк).
- Далее необходимо запрограммировать кнопку Вычислить (btnCalc) так, чтобы в текстовое окно выводились элементы массива, их сумма, а затем их среднее арифметическое. Для этого в процедуре, описывающей событие щелчка мыши по кнопке Вычислить, опишем переменные, которые мы будем использовать при решении поставленной задачи:
- Для среднего арифметического специальную переменную описывать не надо, потому что оно вычисляется по формуле sum разделить на 10.
- Для того чтобы задать значения элементов массива, воспользуемся циклом. Для генерации случайных чисел будем использовать переменную — экземпляр объекта
Random
: - Добавьте в цикл вычисление суммы элементов массива:
- Теперь осталось вывести элементы массива, сумму и среднее арифметическое в текстовое окно.
- Сначала выведите слово Массив:
- Теперь в цикле необходимо вывести элементы массива:
- Самостоятельно добавьте вывод в текстовое окно среднего арифметического.
- Запустите и отладьте программу.
private void btnCalc_Click(object sender, EventArgs e) { int[] arr = new int[10]; int sum=0; }
Random rand = new Random(); for(int i=0;i<arr.Length;i++) { arr[i] = rand.Next(20); //... }
txtArray.Text = "Массив: ";
for (int i = 0; i < arr.Length; i++) { txtArray.Text += arr[i].ToString()+" "; }
Дополнительное задание:
Контрольное задание:
Вопросы для самоконтроля:
- Как объявляется массив в VC#?
- Сколько элементов будет содержать массив, который описан с помощью следующего оператора:
- С помощью какого ключевого слова можно описать массив, который будет доступен всем модулям приложения?
Есть функция task1()
которая возвращает массив, и передает кнопке, которая в свою очередь передает его textBox
.
Кнопка
#pragma once
#include <ctime>
#include <iomanip>
namespace Lab
{
using namespace std;
void initArr(int* arrPtr, const int size)
{
for (int* arrPtrCpy = arrPtr; arrPtrCpy < arrPtr + size; ++arrPtrCpy)
{
*arrPtrCpy = rand() % 51 - 25;
}
}
/*int printArr(int* arrPtr, const int size)
{
for (int* arrPtrCpy = arrPtr; arrPtrCpy < arrPtr + size; ++arrPtrCpy)
{
if (arrPtr + size == arrPtrCpy)
{
return *arrPtrCpy;
}
else
{
printArr(arrPtr, size);
}
}
}*/
bool isElementExists(const int* arrPtr, const int size, const int item)
{
bool isExists = false;
for (const int* arrPtrCpy = arrPtr; arrPtrCpy < arrPtr + size; ++arrPtrCpy)
{
if (*arrPtrCpy == item)
{
isExists = true;
break;
}
}
return isExists;
}
bool isElementExists(const int* arrPtr, const int* endArrPtr, const int item)
{
bool isExists = false;
for (const int* arrPtrCpy = arrPtr; arrPtrCpy < endArrPtr; ++arrPtrCpy)
{
if (*arrPtrCpy == item)
{
isExists = true;
break;
}
}
return isExists;
}
int conver(int arrPtr, const int size, int &mass)
{
for (int i=0;i<size;i++)
{
*mass[i] = *arrPtr[i]-48;
}
}
int task1()
{
int sizeA = 5;
int sizeB = 5;
int* arrAPtr = new int[sizeA];
initArr(arrAPtr, sizeA);
int* arrBPtr = new int[sizeB];
initArr(arrBPtr, sizeB);
//printArr(arrAPtr, sizeA);
//printArr(arrBPtr, sizeB);
int sizeC = 0;
for (int* arrAPtrCpy = arrAPtr; arrAPtrCpy < arrAPtr + sizeA; ++arrAPtrCpy)
{
if (!isElementExists(arrAPtr, arrAPtrCpy, *arrAPtrCpy) && !isElementExists(arrBPtr, sizeB, *arrAPtrCpy))
{
++sizeC;
}
}
int* arrCPtr = new int[sizeC];
for (int* arrAPtrCpy = arrAPtr, *arrCPtrCpy = arrCPtr; arrAPtrCpy < arrAPtr + sizeA; ++arrAPtrCpy)
{
if (!isElementExists(arrAPtr, arrAPtrCpy, *arrAPtrCpy) && !isElementExists(arrBPtr, sizeB, *arrAPtrCpy))
{
*arrCPtrCpy = *arrAPtrCpy;
++arrCPtrCpy;
}
}
char *mass= new char [sizeC];
delete[] arrAPtr;
delete[] arrBPtr;
return arrCPtr;
delete[] arrCPtr;
}
}
В данный момент у меня выводится первый элемент массива.
Вопрос: как мне вывести весь массив?
Так как на курсах нам еще не говорили что такое ООП и классы. Мне надо просто шаблон.
Хочу преподу домашку отправлять в нормальном виде, а не по 10 разных сорс файлов.
Есть структура:
struct birthday
{
int year;
int month;
int day;
};
struct baseProgr
{
char surname[30];
char name[30];
char sex[10];
birthday birth;
char mobile[20];
};
Дальше читаю с файла и т.д
private: auto ch_kol() {
baseProgr base[max];
return &base;
private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) {
auto *base = ch_kol();
textBox1->Text = gcnew String(base[ind]->surname);
textBox2->Text = gcnew String(base[ind]->name);
textBox3->Text = gcnew String(base[ind]->sex);
textBox5->Text = gcnew String(base[ind]->mobile);
cout << "Month = " << base[ind]->birth.month;
string year = to_string(base[ind]->birth.year);
string month = to_string(base[ind]->birth.month);
string day = to_string(base[ind]->birth.day);
string dat = year + '.' + month + '.' + day;
textBox4->Text = gcnew String(dat.c_str());
}
Всё выводит нормально кроме base[ind]->birth.month base[ind]->birth.day base[ind]->birth.year
Вместо этого выводит рандомные числа.
Как исправить?
-
Вопрос заданболее года назад
-
263 просмотра
base[ind].birth.month
Вообще и остальные поля нужно выводить через точку.
Кроме того, если приведенный код ch_kol() — это реально все что есть в функции, то это не верно. Вы в ch_kol возвращаете указатель на локальную переменную, как только отработает return этот указатель станет не действиетльным, т.к. массив base перестанет существовать после выхода из функции.
Подобное определение массива baseProgr base[max];
, если max не константа приводит к объявлению массива переменной длины (VLA). Строго говоря С++ не поддерживает VLA, т.к. это фишка Си. Но некоторые компиляторы (gcc) при включенных расширениях (по умолчанию включено) позволяют их использовать. Но этот код становится не переносимым, т.к. при других опциях компилятора или на другом компиляторе код может не собраться.
auto ch_kol() {
baseProgr base[max];
return &base;
Вы тут возвращаете адрес локальной переменной. Так делать нельзя. При выходе из функции локальная переменная перестает существовать и у вас указатель на фигню остается.
Переменная должна быть глобальная, частью класса или выделятся через new.
Пригласить эксперта
-
Показать ещё
Загружается…
05 февр. 2023, в 21:58
2000 руб./за проект
05 февр. 2023, в 21:43
2000 руб./за проект
05 февр. 2023, в 21:04
500000 руб./за проект