0 / 0 / 0
Регистрация: 24.12.2008
Сообщений: 4
1

Имя структуры

24.12.2008, 01:19. Показов 1575. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Надо ввести имя структуры, чтобы в ней присутствовали пробелы.

C
1
2
3
printf("\n%d. Student:\n", i+1);
printf("Name: ");
scanf("%s",aStudent[i].sName);
Что надо ввести вместо (или в дополнение) scanf?

Был бы очень признателен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.12.2008, 01:19
Ответы с готовыми решениями:

Структуры. Случайное имя и добавить нового студента
Подскажите как в функции Random сделать ввод случайным. Чтоб имя и фамилия студентов - был...

Структуры (вычислить самое распространенное женское имя)
Доброго времени суток! Не могу понять почему у меня строка не копируется. Решил заранее проверить...

Структуры. Определить имя самой высокой девочки в группе
С помощью структуры описать данные на группу из семи детей, указав их имя , пол и рост.Определить...

Что означает имя переменной в конце объявления структуры?
Всем привет. Что значит такая запись в конце структуры? }*head; И что было бы, если было бы...

11
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
24.12.2008, 01:45 2
Имя какой структуры ты тут вводишь? По-моему, просто атрибут объекта...
0
0 / 0 / 0
Регистрация: 24.12.2008
Сообщений: 4
24.12.2008, 03:11  [ТС] 3
Я не силен в программировании
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <iostream.h>
 
typedef struct {
    char sName[128];
    long int fGroup;
        int aMark[5];
} STUDENT;
 
void main(void) {
     int bFilledMassive = 0;
     int bEmptyList = 1;
     STUDENT aStudent[15];
     int i = 0;
     int j = 0;
     int option = 0;
     int iStudentCount = 10;
    while (1) {
                printf("\nMenu:\n");
        printf("1. Fill STUDENT massive.\n");
        printf("2. Show STUDENT list.\n");
        printf("0. Exit.\n");
 
        do {
            option = getch() - '0';
        } while (option > 3);
 
        if (option == 0) {
            break;
        }
 
        switch (option) {
        case 1:
                        if(bFilledMassive == 1)
                        {
                                printf("\n\nSTUDENT massive is already filled!");
                        }
                        else
                        {
                                for (i = 0; i < iStudentCount; i++)
                                {
                                        printf("\n%d. Student:\n", i+1);
                                        printf("Name: ");
                                        scanf("%s",aStudent[i].sName);
                                        printf("Group number: ");
                                        scanf("%D", &aStudent[i].fGroup);
                                        printf("Enter marks(delay by space, for example: 1 2 3 4 5):\n", i);
                                        scanf("%d %d %d %d %d", &aStudent[i].aMark[0], &aStudent[i].aMark[1], &aStudent[i].aMark[2], &aStudent[i].aMark[3], &aStudent[i].aMark[4]);
                                        printf("\n");
                                }
                        }
                        bFilledMassive = 1;
            break;
        case 2:
            if(bFilledMassive == 0)
                        {
                                printf("\n\nPlease Fill STUDENT massive!\n");
                        }
                        else
                        {
                             long int str;
                             char str1[128];
                             for (i = 0; i < iStudentCount; i++)
                             {
                                for (j = 0; j < iStudentCount - 1; j++)
                                {
                                        float iSum = (aStudent[j].aMark[0] + aStudent[j].aMark[1] + aStudent[j].aMark[2] + aStudent[j].aMark[3] + aStudent[j].aMark[4])/5;
                                        if(iSum >= 4)
                                        {
                                                if(aStudent[j].fGroup > aStudent[j+1].fGroup)
                                                {
                                                        str = aStudent[j].fGroup;
                                                        aStudent[j].fGroup = aStudent[j+1].fGroup;
                                                        aStudent[j+1].fGroup = str;
 
                                                        strcpy(str1, aStudent[j].sName);
                                                        strcpy(aStudent[j].sName, aStudent[j+1].sName);
                                                        strcpy(aStudent[j+1].sName, str1);
                                                }
                                        }
                                }
                             }
                             for (i = 0; i < iStudentCount; i++)
                             {
                                float iSum = (aStudent[i].aMark[0] + aStudent[i].aMark[1] + aStudent[i].aMark[2] + aStudent[i].aMark[3] + aStudent[i].aMark[4])/5;
                                if(iSum >= 4)
                                {
                                        bEmptyList = 0;
                                        cout << aStudent[i].fGroup;
                                        printf(" %s\n", aStudent[i].sName);
                                }
 
                             }
                             if (bEmptyList)
                             {
                                printf("\nNo students with total mark above 4.0!\n");
                             }
                        }
            break;
        }
    }
}
Вот текст всей программы. Не мог ли кто-нибудь оценить на наличие ошибок (по моему в сортировке есть минимум одна, т.к. выводит она не "тех" студентов, что надо )

Ну и работает также неправильно, если вводить имена студентов с пробелом. Это был изначальный вопрос.

Если кто-нибудь поможет буду благодарен.
0
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
24.12.2008, 04:36 4
Код
gets(aStudent[i].sName);
0
0 / 0 / 0
Регистрация: 24.12.2008
Сообщений: 4
24.12.2008, 04:44  [ТС] 5
Спасибо. Problem seems solved.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
24.12.2008, 05:15 6
gets нельзя юзать (эту функцию отрицают её авторы)

scanf("\t%[^\n]", aStudent[i].sName);

пользователь может ввести очень длинную строку, чтобы сломать программу, поэтому необходимо встраивать ограничитель на максимально допустимое число символов, которое пользователь может ввести
fgets имеет такой ограничитель, но на её основе можно написать более простую версию getline, которая принимает строку и ограничитель (получится типа gets'а) в C++ вроде уже есть такая в виде метода для потока ввода
0
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
24.12.2008, 05:42 7
accept, человеку,который "не силен в программировании " - можно. Сдаст зачеты в инсте и забудет про все это.
Тем,кто разбирается итак понятно, что и почему нельзя юзать. Кстати, уже не в первый раз замечаю,что высказывание типа "Линус Торвальдс сказал так не делать", "Бьерн Страуструп пишет,что это плохой стиль" и т д, бесполезны. Приводите аргументацию,а не ссылки на авторитетов. Готов поспорить, я могу найти противоречивые слова одного и того же человека, даже если он и программист мирового уровня. Это в природе людей.

Раз уж завели эту тему,объясню новичкам, что количество символов, которые будут записаны в буффер после вызова этой ф-ии, теоретически не ограничено(практически это значит,что для любого размера буффера,выделенного под ввод, можно ввести более длинную строку). Это создает идеальную почву для атак на переполнение буффера.

Извини,accept,когда отвечал не заметил правку.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
24.12.2008, 11:49 8
Код
typedef struct {
    char sName[128];
    long int fGroup;
        int aMark[5];
} STUDENT;
в его структуре достаточно послать строку 151 символ чтобы стереть её всю
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
25.12.2008, 01:11 9
Очень интересный и нужный вопрос!
Так как же всё-таки поставить ограничение?
Если попробовать
Код
scanf("\t%[^\n]", str);
то при объявлении str как char str [5] и при вводе более 4 символов, программа не работает.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.12.2008, 01:32 10
так они обе такие, просто у него там scanf везде

для ограничения fgets

вот getline от авторов, я не знаю от двух или на этот раз уже от одного
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <string.h>
 
/* getline:  считывает строку и возвращает её длину */
int getline(char *line, int max)
{
    if (fgets(line, max, stdin) == NULL)
        return 0;
    else
        return strlen(line);    
}
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
25.12.2008, 01:42 11
Спасибо!
Вспомнил про функцию cin.getline - у нею ствится ограничение для ввода.
0
0 / 0 / 0
Регистрация: 24.12.2008
Сообщений: 4
25.12.2008, 11:30  [ТС] 12
Код
printf("\n%d. Student:\n", i+1);
                                        printf("Name: ");
										if(i > 0){
											char govno[10];
											gets(govno);
										}
                                        gets(aStudent[i].sName);
Вот так решили проблему.
0
25.12.2008, 11:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.12.2008, 11:30
Помогаю со студенческими работами здесь

С помощью структуры определить группу из 7 человек, имя, пол и рост
С помощью структуры определить группу из 7 человек.имя пол и рост. вывести самую высокую девочку...

Структуры.Фамилия, Имя, Отчество Группа Домашний адрес, Телефон Электронная пошта
Структуры. Notebook:Фамилия, Имя, Отчество, Домашний адрес, Телефон Электронная пошта.

Структуры. Записать отдельно имя и фамилию и отдельно числа
Есть текстовый файл по типу : Ivanov Ivan 4 8 5 9 Petrov Petr 5 2 3 4 Ktoto Tam 5 4 1 2 ...

Помещение структуры в вектор, удаление структуры, изменение элементов структуры
Здравствуйте. Помогите разобраться с тем, как: 1 - находить элементы в векторе зная уникальный...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru