Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/41: Рейтинг темы: голосов - 41, средняя оценка - 4.73
(-_(-_(o_O)_-)_-)
 Аватар для S1nner
46 / 21 / 4
Регистрация: 19.08.2010
Сообщений: 243
.NET 3.x

Сайт-Тестирование на C#/VS

21.08.2010, 14:49. Показов 8336. Ответов 58
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток уважаемые гуру программирование. Мне в очередной раз нужна ваша помощь. Скорее даже не помощь а совет(ы).
И так, ближе к делу. Встала перед мной такая задача (Задача не с фриланса - я не приследую никаких корыстных целей. В плане продажи данного проекта и получения финансовой выгоды. Задача несёт исключительно личностный характер. Цель задачи "самообразование" ).

Сделать Сайт-Тестирование (Что-то вроде анкеты).

Проведение тестирование пользователей и отсылка результатов на почтовый адрес.

Основные задачи:
- хранение и чтение списка вопросов из файла;
- получение сведений о пользователе;
- проведение тестирования;
- подсчет результатов;
- отправка результатов на почту.

Дополнительные задачи:
- возможность вставлять картинки в вопросы и ответы.

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

Формат файла для хранения вопросов:
- первая строка - наименование теста;
- все вопросы начинаются со знака "?";
- все ответы начинаются со знаков "-" и "+";
- правильный ответ начинается со знака "+";
- вопрос и ответ может состоять из нескольких строк;
- текст вопроса считается весь текст со знака "@" и до знаков "-", "+", "@" или конца файла;
- текст ответа считается весь текст со знаков "+" или "-" и до знаков "-", "+", "@" или конца файла;
- картинки хранятся в отедельной папке;
- картинки можно вставлять с помощью квадратных скобок "[" и "]", между которым указывается название файла из папки с картинками;
- при показе квадратные скобки должны заменяться на изображение картинки.


Пример файла с вопросами:
------начало файла--------
название теста
?Вопрос 1
-ответ 1
+ответ 2
-ответ 3
?Длинный вопрос
на несколько строчек
-ответ 1
-длинный ответ
на несколько строк
+ответ 3
?Сложный вопрос с картинкой [image.jpg]
-ответ 1
+ответ 2
-ответ 3
------конец файла--------

Вопрос в том как всё это лучьше реализовать ? Так как начинать методом тыка, обычно ни к чему хорошему не приводит. Вот и решил спросить совета у вас. Может быть присоветуйте летературу которую стоит прочитать. Желательно касающуюся моего вопроса. Может быть дадите ссылки на какой нибудь исходник, который можно поковырять и посмотреть как там всё устроено.

P.S. Я в C# новичок, так что сильно не пинайте

Заранее всем огромное спасибо !!!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.08.2010, 14:49
Ответы с готовыми решениями:

Создать сайт, тестирование студентов
Здравствуйте, нужно создать сайт, тестирование студентов, с разграниечением доступа, то есть если авторизуется администратор, он видит...

Сайт-тестирование на поступление в вуз
Здраствуйте. В свободное время начал верстать сайт-тестирование на поступление в вуз. Вопросы и ответы у меня есть, в формате doc. ...

Удаленное тестирование приложение/Пересылка на тестирование
Если кто-то написал приложение под андроид и захочет показать другому человеку, то достаточно отослать apk. А как обстоит с этим дело в...

58
4 / 4 / 0
Регистрация: 25.08.2010
Сообщений: 11
25.08.2010, 16:48
Студворк — интернет-сервис помощи студентам
Да дело тут в алгоритме. Проблема не в том как написать код, а в том как придумать как это реализовать, а в этом нам поможет продуманный алгоритм. Далее останеться найти по алгоритму необходимые методы и свойства из msdn и написать код.
0
 Аватар для Бельфегор
688 / 601 / 139
Регистрация: 08.05.2009
Сообщений: 1,098
25.08.2010, 16:52
S1nner сделай paste тут одного из файлов с вопросами, не шаблон а именно с вопросами, код протестить нужно
1
(-_(-_(o_O)_-)_-)
 Аватар для S1nner
46 / 21 / 4
Регистрация: 19.08.2010
Сообщений: 243
25.08.2010, 17:08  [ТС]
Ок, вот.
Пример простого теста на C#.
?Сколько будет 274+331-15*3...?
-Не знаю !
+Где то 7-8...
-Я умею пользоваться колькулятором ! Ответ: 1770
?В каком году Александр I взошёл на
титул правления государством?
-А кто это?
-Александр I это первый сын моего дяди Андрея.
И на титул он не входил ! Он слесарь !
+В 1801 году !
?Сколько ног у слона [img1.jpg]
-Это не слон !
+4!
-7-8!
В последнем вопросе будет картинка.
0
 Аватар для Бельфегор
688 / 601 / 139
Регистрация: 08.05.2009
Сообщений: 1,098
25.08.2010, 17:17
перепиши метод takeQuest() следующем образом, он должен учесть и длинные ответы
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
private void takeQuest(int number)
        {
 
            if (number<quest.Length)
            {
                
                string[] res = quest[number].Split('\n');
                Label2.Text = res[0];
 
                string temp = "";
            int rbn = 1,k;
            for (int i = 1; i < res.Length; i++)
            { 
            if(res[i].ToCharArray()[0]=='-'||res[i].ToCharArray()[0]=='+')
            {
                temp += res[i].Remove(0,1);
                k=i+1;
               while(k<res.Length&&res[k].ToCharArray()[0]!='-'&&res[k].ToCharArray()[0]!='+')
               {
                   temp+="\n"+res[k];
               k++;
               }
                this.Controls["radio"+rbn.ToString()].Text=temp;
                temp="";
                rbn++;
               
            }
            }
            }
 
            else
            {
 
                Label1.Text = "Tест закончен.";
                Label2.Visible = false;
                radio1.Visible = false;
                radio2.Visible = false;
                radio3.Visible = false;
                Button1.Visible = false;
 
            }
        }
Добавлено через 26 секунд
будут ошибки исправим

Добавлено через 1 минуту
далее мы не учли картинки в вопросах, для этого нам нужно будет обработать вопрос т.е. res[0] у нас, мы этого до сех пор не сделали,
1
(-_(-_(o_O)_-)_-)
 Аватар для S1nner
46 / 21 / 4
Регистрация: 19.08.2010
Сообщений: 243
25.08.2010, 17:24  [ТС]
this.Controls["radio" + rbn.ToString()].Text = temp;
Преобразование типа из "string" в "int" невозможно.
0
 Аватар для Бельфегор
688 / 601 / 139
Регистрация: 08.05.2009
Сообщений: 1,098
25.08.2010, 17:35
поставь на сайт image контрол, назови скажем image1
нам нужно изучить вопрос (res[0]) на предмет наличия в нем такого текста " [img.name]"
для этого разделим res[0] через пробел и проверим его последний элемент (если конечно после [img.name] не будет другого текста) на первый символ '['

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if(res[0].Split(' ')[res[0].Split(' ').Length-1].ToCharArray()[0]=='[')
{
label2.Text="";
for(int h=0;h<res[0].Split(' ').Length-2;h++)
{
labe2.Text+=res[0].Split(' ')[h];
string url=res[0].Split(' ')[res[0].Split(' ').Length-1];
url=url.Remove(0,1);//убрали символ [
url=url.Remove(url.Length,1);//убрали символ ]
image1.ImageURL=url;//приписали картинке имя файл картинки
}
}
else
{
//если же в вопросе не содержится строка типа [img.name]
//просто делаем 
label2.Text=res[0];
}
Добавлено через 2 минуты
итого метод takeQuest() у нас станет таким

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
private void takeQuest(int number)
        {
 
            if (number<quest.Length)
            {
                
                string[] res = quest[number].Split('\n');
               if(res[0].Split(' ')[res[0].Split(' ').Length-1].ToCharArray()[0]=='[')
{
label2.Text="";
for(int h=0;h<res[0].Split(' ').Length-2;h++)
{
labe2.Text+=res[0].Split(' ')[h];
string url=res[0].Split(' ')[res[0].Split(' ').Length-1];
url=url.Remove(0,1);//убрали символ [
url=url.Remove(url.Length,1);//убрали символ ]
image1.ImageURL=url;//приписали картинке имя файл картинки
}
}
else
{
//если же в вопросе не содержится строка типа [img.name]
//просто делаем 
label2.Text=res[0];
}
 
                string temp = "";
            int rbn = 1,k;
            for (int i = 1; i < res.Length; i++)
            { 
            if(res[i].ToCharArray()[0]=='-'||res[i].ToCharArray()[0]=='+')
            {
                temp += res[i].Remove(0,1);
                k=i+1;
               while(k<res.Length&&res[k].ToCharArray()[0]!='-'&&res[k].ToCharArray()[0]!='+')
               {
                   temp+="\n"+res[k];
               k++;
               }
                this.Controls["radio"+rbn.ToString()].Text=temp;
                temp="";
                rbn++;
               
            }
            }
            }
 
            else
            {
 
                Label1.Text = "Tест закончен.";
                Label2.Visible = false;
                radio1.Visible = false;
                radio2.Visible = false;
                radio3.Visible = false;
                Button1.Visible = false;
 
            }
        }
Добавлено через 2 минуты
не сочту лишним еще раз повторить, если в далнейшем будешь писать приложения где нужно будет анализировать текст, то нужно изучить регулярны выражения
код станет намного короче и проще
1
(-_(-_(o_O)_-)_-)
 Аватар для S1nner
46 / 21 / 4
Регистрация: 19.08.2010
Сообщений: 243
25.08.2010, 17:39  [ТС]
Ок, сделал, спасибо. Но вылезло вот что:

Image1.ImageURL = url;
"System.Web.UI.WebControls.Image" не содержит определения для "ImageURL" и не был найден метод расширения "ImageURL", принимающий тип "System.Web.UI.WebControls.Image" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)
Исправил. Ошибка синтаксиса. Url.

this.Controls["radio" + rbn.ToString()].Text = temp;
Наиболее подходящий перегруженный метод для "System.Web.UI.ControlCollection.thi s[int]" имеет несколько недопустимых аргументов.

А вот тут хз...

P.S. Я уже за книжку взялся
0
 Аватар для Бельфегор
688 / 601 / 139
Регистрация: 08.05.2009
Сообщений: 1,098
25.08.2010, 17:50
Цитата Сообщение от S1nner Посмотреть сообщение
Преобразование типа из "string" в "int" невозможно.
да в Asp.Net в контроле нельзя поискать контрол по имени, не знал, посмотрим что можно придумать

Добавлено через 1 минуту
Цитата Сообщение от S1nner Посмотреть сообщение
Ок, сделал, спасибо. Но вылезло вот что:


"System.Web.UI.WebControls.Image" не содержит определения для "ImageURL" и не был найден метод расширения "ImageURL", принимающий тип "System.Web.UI.WebControls.Image" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)
Исправил. Ошибка синтаксиса. Url.


Наиболее подходящий перегруженный метод для "System.Web.UI.ControlCollection.thi s[int]" имеет несколько недопустимых аргументов.

А вот тут хз...

P.S. Я уже за книжку взялся
напиши вместо ImageURL ImageUrl
я по памяти тут пишу, поэтому иногда синтаксис путаю

Добавлено через 5 минут
нашел как сделать

вместо this.Controls["radio"+rbn.ToString()].Text=temp;
пиши
C#
1
2
RadioButton rb = (RadioButton)FindControl("radio"+rbn.ToString());
               rb.Text = temp;
1
(-_(-_(o_O)_-)_-)
 Аватар для S1nner
46 / 21 / 4
Регистрация: 19.08.2010
Сообщений: 243
25.08.2010, 17:50  [ТС]
Url я уже исправил. Остался только...

this.Controls["radio" + rbn.ToString()].Text = temp;
Наиболее подходящий перегруженный метод для "System.Web.UI.ControlCollection.thi s[int]" имеет несколько недопустимых аргументов.

+ Потом придётся что то делать с кодом. Он читает фаил не с начала. Выдаёт вопросы в произвольном порядке. Иногда вообще выдаёт : "Тест закончен".
0
 Аватар для Бельфегор
688 / 601 / 139
Регистрация: 08.05.2009
Сообщений: 1,098
25.08.2010, 17:57
Цитата Сообщение от S1nner Посмотреть сообщение
+ Потом придётся что то делать с кодом. Он читает фаил не с начала. Выдаёт вопросы в произвольном порядке. Иногда вообще выдаёт : "Тест закончен".
в произвольном порядке не может быть
а вто на счет тест закончен могут быть дефекты файла с вопросами
0
(-_(-_(o_O)_-)_-)
 Аватар для S1nner
46 / 21 / 4
Регистрация: 19.08.2010
Сообщений: 243
25.08.2010, 18:02  [ТС]
Хмм...вроде обычный txt фаил...
0
 Аватар для Бельфегор
688 / 601 / 139
Регистрация: 08.05.2009
Сообщений: 1,098
25.08.2010, 18:10
Цитата Сообщение от S1nner Посмотреть сообщение
Хмм...вроде обычный txt фаил...
имеется в виду не повреждение файла, а лишние переносы строки, пробелы, и т.д.
1
(-_(-_(o_O)_-)_-)
 Аватар для S1nner
46 / 21 / 4
Регистрация: 19.08.2010
Сообщений: 243
25.08.2010, 18:13  [ТС]
По поводу документа. Документ без лишних пробелов...вот такой или такой.
название теста
?Вопрос 1
-ответ 1
+ответ 2
-ответ 3
?Длинный вопрос
на несколько строчек
-ответ 1
-длинный ответ
на несколько строк
+ответ 3
?Сложный вопрос с картинкой [image.jpg]
-ответ 1
+ответ 2
-ответ 3
Пример простого теста на C#.
?Сколько будет 274+331-15*3...?
-Не знаю !
+Где то 7-8...
-Я умею пользоваться колькулятором ! Ответ: 1770
?В каком году Александр I взошёл на
титул правления государством?
-А кто это?
-Александр I это первый сын моего дяди Андрея.
И на титул он не входил !
+В 1801 году !
?Сколько ног у слона [img1.jpg]
-Это не слон !
+4!
-7-8!
По поводу:
RadioButton rb = (RadioButton)FindControl("radio" + rbn.ToString());
rb.Text = temp;
После замены при запуске программы браузер выплёвывает вот такое сообщение.

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

Сведения об исключении: System.IndexOutOfRangeException: Индекс находился вне границ массива.

Ошибка источника:

Строка 62: temp += res[i].Remove(0, 1);
Строка 63: k = i + 1;
Строка 64: while (k < res.Length && res[k].ToCharArray()[0] != '-' && res[k].ToCharArray()[0] != '+')
Строка 65: {
Строка 66: temp += "\n" + res[k];


Исходный файл: C:\Users\Sinner\Desktop\Test\Test\Test\T est.aspx.cs Строка: 64

Трассировка стека:

[IndexOutOfRangeException: Индекс находился вне границ массива.]
Test.WebForm1.takeQuest(Int32 number) in C:\Users\Sinner\Desktop\Test\Test\Test\T est.aspx.cs:64
Test.WebForm1.Page_Load(Object sender, EventArgs e) in C:\Users\Sinner\Desktop\Test\Test\Test\T est.aspx.cs:27
System.Web.Util.CalliHelper.EventArgFunc tionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
System.Web.Util.CalliEventHandlerDelegat eProxy.Callback(Object sender, EventArgs e) +35
System.Web.UI.Control.OnLoad(EventArgs e) +99
System.Web.UI.Control.LoadRecursive() +50
System.Web.UI.Page.ProcessRequestMain(Bo olean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627


Информация о версии: Платформа Microsoft .NET Framework, версия:2.0.50727.4952; ASP.NET, версия:2.0.50727.4927
0
 Аватар для Бельфегор
688 / 601 / 139
Регистрация: 08.05.2009
Сообщений: 1,098
25.08.2010, 18:18
правильно

в while( -е пиши k-1<res.Length
1
(-_(-_(o_O)_-)_-)
 Аватар для S1nner
46 / 21 / 4
Регистрация: 19.08.2010
Сообщений: 243
25.08.2010, 18:22  [ТС]
То же самое.

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

Сведения об исключении: System.IndexOutOfRangeException: Индекс находился вне границ массива.

Ошибка источника:

Строка 62: temp += res[i].Remove(0, 1);
Строка 63: k = i + 1;
Строка 64: while(k-1<res.Length && res[k].ToCharArray()[0] != '-' && res[k].ToCharArray()[0] != '+')
Строка 65: {
Строка 66: temp += "\n" + res[k];


Исходный файл: C:\Users\Sinner\Desktop\Test\Test\Test\T est.aspx.cs Строка: 64

Трассировка стека:

[IndexOutOfRangeException: Индекс находился вне границ массива.]
Test.WebForm1.takeQuest(Int32 number) in C:\Users\Sinner\Desktop\Test\Test\Test\T est.aspx.cs:64
Test.WebForm1.Page_Load(Object sender, EventArgs e) in C:\Users\Sinner\Desktop\Test\Test\Test\T est.aspx.cs:27
System.Web.Util.CalliHelper.EventArgFunc tionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
System.Web.Util.CalliEventHandlerDelegat eProxy.Callback(Object sender, EventArgs e) +35
System.Web.UI.Control.OnLoad(EventArgs e) +99
System.Web.UI.Control.LoadRecursive() +50
System.Web.UI.Page.ProcessRequestMain(Bo olean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627


Информация о версии: Платформа Microsoft .NET Framework, версия:2.0.50727.4952; ASP.NET, версия:2.0.50727.4927
0
5 / 5 / 0
Регистрация: 19.09.2008
Сообщений: 71
26.08.2010, 00:20
я вот только что читал эту тему и все думал "На сколько вопросов еще хватит Бельфегора"?

S1nner тебе уже и так все, что можно разжевали. Дальше логика. Если не логическое у тебя мышление - то программирование это явно не твое.
1
(-_(-_(o_O)_-)_-)
 Аватар для S1nner
46 / 21 / 4
Регистрация: 19.08.2010
Сообщений: 243
26.08.2010, 01:53  [ТС]
То что я в чём то не разобрался, в силу пробелов в знаниях, ещё ничего не значит. Web-Калькулятор на C# то я написал. Уважаемый rwety если вы разобрались в этом задании, я искренне за вас рад. У всех людей уровень знаний разный. Кто-то только начал, а кто-то этим занимается не один год. Как я считаю к новичкам можно и нужно относится с пониманием.
Книга мне в помощь ! В 37 посте мне посоветовали литературу. Вот и сижу штудирую. А Бельфегор вообще мировой парень !!! За что ему огромный респект.
0
 Аватар для Бельфегор
688 / 601 / 139
Регистрация: 08.05.2009
Сообщений: 1,098
26.08.2010, 12:01
S1nner я полностью переписал твой сайт, буду приводить по кусочкам с объяснениями, это займет некоторое время, может до завтрашнего вечера.

и так, у нас была ошибка с самого начала, помните когда говорили вы что вопросы идут произвольно, а то и программа останавливается типа тест закончился, так вот проблема была в том , что мы делили прочитанны файл через знак '?', но строка вопроса начинается с этого символа, и кончается им, же, логично же поставить вопросительный знак в конце вопроса
так вот теперь я написал функцию которая возвращает массив строк с вопросами
сейчас приведу код

Добавлено через 9 минут
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
private string[] returnQuestions(string filename)//даем методу имя файла с вопросами он читает файл и возврощает массив строк каждый из элементов которого содержит вопрос и варианты ответа
        {
            StreamReader sr = new StreamReader(filename);
            string temp = sr.ReadToEnd();
            sr.Close();//до этого понятно
            int q = 0;//эта переменная количества вопросов она нам нужна чтоб создать массив строк именно по количеству вопросов
            string[] all = temp.Split('\n');//мы разделили прочитанный текст через символ '\n' т.е. перевод строки
            foreach (string s in all)//для каждой строки в all
            {
                if (s.ToCharArray()[0] == '?')//проверяем если первый символ строки '?'
                {
                    q++;// то количество вопросов увеличеваем на один поскольку оин нашли
                }
            }
// и так количество нам известно, создадим массив строк с таким количеством
            string[] result = new string[q];
            int pos=0;// это переменная позиции в массиве result
            for (int i = 0; i < all.Length; i++)
            {
                if (all[i].ToCharArray()[0] == '?')//проверяем если первый символ строки '?'
                {
                    result[pos] = all[i].Remove(0,1)+"\n";result[pos] который чвляется очередной строкой в массиве вопросов приписали сам вопрос без знака '?' и еще перевод строки плюс
                    for (int k = i + 1; k < all.Length; k++) //далее через k который уже равен i пройдемся до конца текста, пока еще раз не встретим символ '?' есть взяли и длинный вопрос и ответы и длинные ответь, короче все до знака '?'
                    {
                        if (all[k].ToCharArray()[0] != '?')
                        {
                            result[pos] += all[k]+"\n";//если пока первый символ строки не равен '?' очередному элементу из result плюсовали all[k] те будь то вопроса продолжение, или же ответ 
                        }
                        else
                        {
//как только уравнялось, все вопрос готов с ответами! прерываем цикл, и увеличиваем pos на один, чтоб пройти к следующему элементу массива с вопросами                            
pos++;
                            break;
                        }
                    }
                }
            }
            return result;
        }
Добавлено через 5 минут
теперь нам нужна функция, которая из вопроса с ответами припишет вопрос к labe2, а варианты ответа радио кнопкам.
КСТАТИ ЧУТЬ НЕ ЗАБЫЛ!!
когда в методе returnQuestions мы в самом начале делим прочитанный файл через перевод строки, т.е. делаем так
C#
1
string[] all = temp.Split('\n');
то если в файле с вопросами будет лишний перевод строки, у нас вот тут
C#
1
 if (s.ToCharArray()[0] == '?')
вылетит exception
так что будь внимательнее с файлами вопрсов! КСТАТИ они у тебя с лишними как раз в самом конце файла после последних ответов есть лишние переводы строки, убери их
но вернемся к методу раздела самого вопроса

Добавлено через 1 час 6 минут
и так вот метод splitQuestion

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
private void splitQuestion(string input)//даем ему не разделенный вопрос
        {
            string[] all = input.Split('\n');//разделяем через перевод строки
            string quest, answer1, answer2, answer3;//это соответственно вопрос, ответы 1, 2 и 3
            quest=all[0];//сразу приписали, поскольку первый элемент точно вопроса состовляющая
            int pos=0;//это позиция поиска в массиве all чтоб не крутить по всем элементам
            for (int i = 1; i < all.Length; i++)//начали с 1, потому что 0 это уже кака говорилось состовляющая вопроса
            {
                if (all[i]!=""&&all[i].ToCharArray()[0] != '-' && all[i].ToCharArray()[0] != '+')//проверили на нуль(потому что последний элемент всегда нуль из за перевода строки) на символ - и на символ +
                {
                    quest += all[i] + " "; //если не равен то добавляем в вопрос, то есть вопрос длинный с переводом строки:-)
                }
                else 
                {
//как только уравняется, pos-у приписываем значение i то есть последнее и прерываем цикл                    
pos = i;
                    break;
                }
            }
            Label2.Text = quest//так как с вопросом покончено сразу приписали label2.Text вопрос
//кстати вот здесь уже строки прибавляются друг к другу не через перевод строки а через пробел, чтоб красиво было, если места не хватит браузер сам переведет строку
//далее ищем первый вопрос            
if (all[pos].ToCharArray()[0] == '+')//если первый элемент строки + то есть правильный ответ
            {
                rightButton = "radio1";//приписываем переменной типа string значение radio1 то есть правильный ответ у нас на radio1
//переменная rightButton заменила прежнею int n, и стала типа string для легкости проверки
            }
            answer1 = all[pos].Remove(0, 1) + " ";//сразу приписали первую строку без первого символа(так как первый символ либо - либо +) а первую так сразу потому что она точно часть вопроса
            for (int j = pos + 1; j < all.Length; j++)//прокатимся по остальным строкам
            {
                if (all[j] != ""&&all[j].ToCharArray()[0] != '-' && all[j].ToCharArray()[0] != '+')//проверили на нуль(потому что последний элемент всегда нуль из за перевода строки) на символ - и на символ +
                {
                    answer1 += all[j] + " ";//добавили в answer1
                    }
                else
                {
//прервали цикл и дали pos=j;                    
pos = j;
                    break;
                }
            }
            radio1.Text = answer1;//приписали кнопке radio1 первый вопрос
//по остальным 3 вопросам логика та же, поэтому далее объяснения не привожу
            if (all[pos].ToCharArray()[0] == '+')
            {
                rightButton = "radio2";
            }
            answer2 = all[pos].Remove(0, 1) + " ";
            for (int k = pos + 1; k < all.Length; k++)
            {
                if (all[k] != ""&&all[k].ToCharArray()[0] != '-' && all[k].ToCharArray()[0] != '+')
                {
                    answer2 += all[k] + " ";
                    }
                else
                {
                    pos = k;
                    break;
                }
            }
            radio2.Text = answer2;
            if (all[pos].ToCharArray()[0] == '+')
            {
                rightButton = "radio3";
            }
            answer3 = all[pos].Remove(0, 1) + " ";
            for (int l= pos + 1; l < all.Length;l++)
            {
                if (all[l] != "" && all[l].ToCharArray()[0] != '-' && all[l].ToCharArray()[0] != '+')
                {
                    answer3 += all[l] + " ";
                }
                else
                {
                    pos = l;
                    break;
                }
            }
            radio3.Text = answer3;
        }
Добавлено через 16 минут
далее
это метод который будет посылать майл с данными ему параметрами
для наглядности приведу пример на аккаунте gmail

скажем у тебя есть аккаун на gmail
твой адрес - S1nner@gmail.com
username - sinner
password - mypassword

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
private void sendMail(string smtpServer,int portNumber,bool enableSSL,string username,string password,string sender,string subject,string mailbody,string address )
        {
// и так по порядку о переменных
//smtpServer-адрес сервера SMTP (через него посылаются майлы)
//portNumber - номер порта сервера SMTP
//enableSSL - включить или выключить защиту, т.е. логиммся или нет
//username -ясно
//password- ясно
//sender - адрес электронной почты отправителья
//subject  - тема письма
//      mailbody - состав письма
// address - адрес получателья
  
SmtpClient Smtp=new SmtpClient(smtpServer, portNumber);    //создали сервер         
            Smtp.UseDefaultCredentials = false;//сбросили дефолтные настройки
            Smtp.DeliveryMethod = SmtpDeliveryMethod.Network;//способ доставки
            Smtp.EnableSsl = enableSSL;//секюрити
            Smtp.Credentials = new NetworkCredential(username,password);//логимся если enableSSL=true
            MailMessage email= new MailMessage();//майл
            email.From = new MailAddress(sender);
            email.Subject = subject;
            email.Body =mailbody;
            email.To.Add(new MailAddress(address));
            Smtp.Send(email);//послали
        }
Добавлено через 3 минуты
и того пример отправки почты для аккаунта gmail будет таким

C#
1
sendMail("smtp.gmail.com",587,true,"sinner","mypassword","S1nner@gmail.com","Hello World!","I'm glad to say you hello!","belfegor@gmail.com");
Добавлено через 7 часов 34 минуты
для метода sendMail понадобятся директивы
C#
1
2
3
using System.Net;
using System.Net.Mail;
using System.Net.Mime;
Добавлено через 19 минут
я забыл что в вопросе нужно обрабатывать и присутствие картинки
в методе splitQuestion вместо Label2.Text = quest; пишем этот код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (quest.ToCharArray()[quest.Length - 2] == ']')
            {
                Label2.Text = "";
                for (int h = 0; h < quest.Split(' ').Length - 1; h++)
                {
                    Label2.Text += quest.Split(' ')[h]+" ";
                    string url = quest.Split(' ')[quest.Split(' ').Length - 1];
                    url = url.Remove(0, 1);//убрали символ [
                    url = url.Remove(url.Length-1, 1);//убрали символ ]
                    Image1.ImageUrl = url;//приписали картинке имя файл картинки
                }
            }
            else
            {
                Label2.Text = quest;
            }
Добавлено через 20 минут
теперь рзберемся с кнопкой далее

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
protected void Button1_Click(object sender, EventArgs e)
        {
            if (k < questions.Length)//если тест не закончен, т.е. позиция в массиве вопросов еще не равна длине массива
            {
                splitQuestion(questions[k]);//переходим к следующему вопросу
                foreach (RadioButton rB in this.Controls.OfType<RadioButton>())//проверяем правильность ответа
                {
                    if (rB.Checked == true)
                    {
                        if (rB.ID == rightButton)
                        {
                            rightwrong[k] = true;
                        }
                        else
                        {
                            rightwrong[k] = false;
                        }
                        break;
                    }
                }
                k++;//добавляем к k 1, переходим т.е. к следующему вопросу
            }
            else//если же вопросы закончились
            {
                Label1.Text = "Тест завершен!";
                radio1.Visible = false;
                radio2.Visible = false;
                radio3.Visible = false;
                Button1.Visible = false;
                int q=0;
                foreach (bool tf in rightwrong)//идет подсчет результатов
                {
                    if (tf)
                    {
                        q++;
                    }
                }
                Label2.Text = "Вы ответили правильно на " + ((int)((100 * q) / rightwrong.Length)).ToString()+"%";//тут мы и проценты рассчитали
                //ДЕЛАЕМ sendMail С НУЖНЫМИ ПАРАМЕТРАМИ
            }
        }
Добавлено через 6 минут
ура, вот сайт закончен, привожу весь код!! но прежде
ВНИМАНИЕ!!!!
в приведенном коде не будет указываться путь к файлу вопросов, подразумевается что с первоначальной страницы будет передан этот путь к тексту
так же не использован метод sendMail, поскольку также подразумевается передача из начальной станицы передача параметров адресата. т.е. его электронный адрес
твой данные майла ты должен тоже вводить

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Net;
using System.Net.Mail;
using System.Net.Mime;
namespace Test
{
 
    public partial class WebForm1 : System.Web.UI.Page
    {
        static string[] questions;
        static bool[] rightwrong;
        static int k = 0;
        string rightButton="";
        protected void Page_Load(object sender, EventArgs e)
        {
            questions = returnQuestions("ПУТЬ К ФАЙЛУ");
            rightwrong = new bool[questions.Length];
        }
        private string[] returnQuestions(string filename)
        {
            StreamReader sr = new StreamReader(filename);
            string temp = sr.ReadToEnd();
            sr.Close();
            int q = 0;
            string[] all = temp.Split('\n');
            foreach (string s in all)
            {
                if (s.ToCharArray()[0] == '?')
                {
                    q++;
                }
            }
            string[] result = new string[q];
            int pos=0;
            for (int i = 0; i < all.Length; i++)
            {
                if (all[i].ToCharArray()[0] == '?')
                {
                    result[pos] = all[i].Remove(0,1)+"\n";
                    for (int k = i + 1; k < all.Length; k++)
                    {
                        if (all[k].ToCharArray()[0] != '?')
                        {
                            result[pos] += all[k]+"\n";
                        }
                        else
                        {
                            pos++;
                            break;
                        }
                    }
                }
            }
            return result;
        }
        private void splitQuestion(string input)
        {
            string[] all = input.Split('\n');
            string quest, answer1, answer2, answer3;
            quest=all[0];
            int pos=0;
            for (int i = 1; i < all.Length; i++)
            {
                if (all[i]!=""&&all[i].ToCharArray()[0] != '-' && all[i].ToCharArray()[0] != '+')
                {
                    quest += all[i] + " ";
                }
                else 
                {
                    pos = i;
                    break;
                }
            }
            if (quest.ToCharArray()[quest.Length - 2] == ']')
            {
                Label2.Text = "";
                for (int h = 0; h < quest.Split(' ').Length - 1; h++)
                {
                    Label2.Text += quest.Split(' ')[h]+" ";
                    string url = quest.Split(' ')[quest.Split(' ').Length - 1];
                    url = url.Remove(0, 1);
                    url = url.Remove(url.Length-1, 1);
                    Image1.ImageUrl = url;
                }
            }
            else
            {
                Label2.Text = quest;
            }
            if (all[pos].ToCharArray()[0] == '+')
            {
                rightButton = "radio1";
            }
            answer1 = all[pos].Remove(0, 1) + " ";
            for (int j = pos + 1; j < all.Length; j++)
            {
                if (all[j] != ""&&all[j].ToCharArray()[0] != '-' && all[j].ToCharArray()[0] != '+')
                {
                    answer1 += all[j] + " ";
                    }
                else
                {
                    pos = j;
                    break;
                }
            }
            radio1.Text = answer1;
            if (all[pos].ToCharArray()[0] == '+')
            {
                rightButton = "radio2";
            }
            answer2 = all[pos].Remove(0, 1) + " ";
            for (int k = pos + 1; k < all.Length; k++)
            {
                if (all[k] != ""&&all[k].ToCharArray()[0] != '-' && all[k].ToCharArray()[0] != '+')
                {
                    answer2 += all[k] + " ";
                    }
                else
                {
                    pos = k;
                    break;
                }
            }
            radio2.Text = answer2;
            if (all[pos].ToCharArray()[0] == '+')
            {
                rightButton = "radio3";
            }
            answer3 = all[pos].Remove(0, 1) + " ";
            for (int l= pos + 1; l < all.Length;l++)
            {
                if (all[l] != "" && all[l].ToCharArray()[0] != '-' && all[l].ToCharArray()[0] != '+')
                {
                    answer3 += all[l] + " ";
                }
                else
                {
                    pos = l;
                    break;
                }
            }
            radio3.Text = answer3;
        }
        private void sendMail(string smtpServer, int portNumber, bool enableSSL, string username, string password, string sender, string subject, string mailbody, string address)
        {
            SmtpClient Smtp = new SmtpClient(smtpServer, portNumber);
            Smtp.UseDefaultCredentials = false;
            Smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
            Smtp.EnableSsl = enableSSL;
            Smtp.Credentials = new NetworkCredential(username, password);
            MailMessage email = new MailMessage();
            email.From = new MailAddress(sender);
            email.Subject = subject;
            email.Body = mailbody;
            email.To.Add(new MailAddress(address));
            Smtp.Send(email);
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            if (k < questions.Length)
            {
                splitQuestion(questions[k]);
                foreach (RadioButton rB in this.Controls.OfType<RadioButton>())
                {
                    if (rB.Checked == true)
                    {
                        if (rB.ID == rightButton)
                        {
                            rightwrong[k] = true;
                        }
                        else
                        {
                            rightwrong[k] = false;
                        }
                        break;
                    }
                }
                k++;
            }
            else
            {
                Label1.Text = "Тест завершен!";
                radio1.Visible = false;
                radio2.Visible = false;
                radio3.Visible = false;
                Button1.Visible = false;
                int q=0;
                foreach (bool tf in rightwrong)
                {
                    if (tf)
                    {
                        q++;
                    }
                }
                Label2.Text = "Вы ответили правильно на " + ((int)((100 * q) / rightwrong.Length)).ToString()+"%";
                //ДЕЛАЕМ sendMail С НУЖНЫМИ ПАРАМЕТРАМИ
            }
        }
    }
}
все, более подробного описания и объяснения привести уже не возможно
твой сайт практически готов
дерзай
МАВР СДЕЛАЛ СВОЕ ДЕЛО МАВР МОЖЕТ УЙТИ
1
(-_(-_(o_O)_-)_-)
 Аватар для S1nner
46 / 21 / 4
Регистрация: 19.08.2010
Сообщений: 243
26.08.2010, 12:50  [ТС]
Вааа класс!!! Бельфегор, спасибо тебе огромное, ты не представляеш как ты мне помог !!! Спасибо !!! Сейчас разберёмся, протестируем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.08.2010, 12:50

Unit -тестирование или автоматизированное тестирование
Доброго времени суток. Я программирую «для себя» второй год, на выходе получаются разного рода приложения от постоянно подающих с...

Тестирование (или Юнит тестирование)
Доброго времени суток, возник такой вопрос, раньше встречался на фронтенде с js тестированием, сейчас задался вопросом по поводу...

Тести́рование програ́ммного обеспе́чения(Модульное тестирование, или юнит-тестирование)
Извиняюсь перед администрацией что разместил тему в несоответствующем разделе, не мог найти про тестирование ПО. На днях встал вопрос о...

При попытка зайти на любой сайт антишпионом перехватывается сайт partner-pop.men. Как убрать этот сайт?
При попытка зайти на любой сайт через Гугл Хром антишпионом Антимальварэ-байтс перехватывается сайт partner-pop.men. Как убрать этот сайт?...

Сайт после 5 секунд заходит на другой сайт (взломали сайт)
Когда я открою свое сайт он после 5 секунд заходит на другой сайт (взломали сайт) там написано что взломали турецкие хакеры.. Как лечить...


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

Или воспользуйтесь поиском по форуму:
59
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru