#arrays #c #loops #for-loop #struct
#массивы #c #циклы #for-loop #struct
Вопрос:
Задача: Нам нужно создать 7 структурных объектов, называемых parent[1-7], используя циклы. Затем введите имя пользователя, возраст, имя ребенка. После этого 1) выведите имя родительского элемента, который имеет самое большое семейство. 2) выведите самое длинное дочернее имя для родителей с самым коротким именем (по сравнению с другими) Я знаю, звучит уже запутанно. И 3) Распечатайте всю предоставленную информацию о родителях (имя, возраст, имя / имена детей), которые старше среднего возраста 7 родителей.
Проблема: я столкнулся с проблемой, что я даже не могу правильно настроить программу для сканирования пользовательского ввода. Я добавил новый struct
объект, и scanf
пользователь может вставить, сколько у него дочерних элементов, для облегчения доступа позже, но он продолжает сбой, когда я ввожу это число, например, 2 или 3 дочерних элемента. Честно говоря, я понятия не имею, как выполнять другие части этой задачи.
Так выглядит программа на данный момент (я учусь на первом курсе университета, поэтому я ожидаю, что допустил некоторые ошибки):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int max=3;
int j=0;
struct parents
{
char name[30];
int age;
int kid_count;
char kid_name[30];
};
int main()
{
for(j=0; j<max; j )
{
struct parents parent[7];
parent[j].name;
parent[j].age;
parent[j].kid_count;
parent[j].kid_name;
printf("Parent %d Enter parent name n",j 1);
scanf(" %s", amp;parent[j].name);
printf("Parent %d Enter parent age n",j 1);
scanf(" %d", amp;parent[j].age);
printf("Parent %d Enter how many kids he has n",j 1);
scanf(" %d", amp;parent[j].kid_count);
printf("Parent %d child name n",j 1);
scanf(" %s", amp;parent[j].kid_name);
}
return 0;
}
Комментарии:
1. Удалите
amp;
при чтении строк. Компилятор тоже должен был предупредить вас об этом.2. Измените его на массив фиксированной длины
struct parents parent[j];
=>struct parents parent[7];
. Вы создаете массив переменной длины размером j на каждой итерации. Вы не можете получить доступ к элементу[j]
в массивеj
размером a.j-1
является последним элементом.3.
struct parents parent[j];
— что должна делать эта строка? Это определение массиваparent
длиныj
. Уверен, что вы хотите определить его вне цикла.
Ответ №1:
for(j=0; j<max; j )
{
struct parents parent[7];
Здесь вы объявляете массив из 7 структур каждый раз в цикле. Поскольку он объявлен в стеке в области тела цикла, этот массив также будет удаляться каждый раз в цикле. Но вы используете только одну из структур, то есть ту, которая находится в индексе j
, на каждой итерации.
Вместо этого вы, вероятно, хотите объявить массив вне области действия цикла, чтобы он сохранялся после завершения цикла.
parent[j].name;
parent[j].age;
parent[j].kid_count;
parent[j].kid_name;
Эти строки, похоже, ничего не делают. Вы имели в виду присвоить значение каждому полю здесь? Следующее, что вы делаете, это записываете значения в эти поля, используя scanf()
, чтобы любое значение, которое вы могли бы установить здесь, было перезаписано. Вероятно, лучше просто удалить эти строки.
return 0;
}
После завершения цикла больше ничего не происходит. Даже если вы переместите массив parent
структур за пределы цикла, на этом этапе он выйдет за рамки, с ним ничего не будет сделано. Чтобы сделать этот массив полезным, вам нужно его использовать. Может быть, вы просто еще не добрались до этой части?
Комментарии:
1. Можете ли вы рассказать мне больше об этой последней части? Как мне на самом деле сохранить эти переменные, чтобы я не потерял их после завершения цикла? Извините за глупые вопросы.
2. @mediocrevegetable1 Действительно, внес коррективы и изменил max на 3 в целях тестирования, чтобы тратить меньше времени на написание всех символов. Прямо сейчас я переместил struct перед циклом и столкнулся с другой проблемой: теперь мне нужно сравнить длины имен и после цикла распечатать родительский элемент с самым длинным и самым коротким именем, но понятия не имею, как это сделать
3. @RichardTheProgrammingNewb Если вы переместите массив
parent
структур за пределы цикла, он все равно будет доступен для использования, когда цикл будет завершен. Если вы оставите его внутри цикла, то он не только не будет доступен по завершении цикла, но и весь массив также будет уничтожен и воссоздан каждый раз в цикле . Как правило, переменная, объявленная внутри набора фигурных скобок ({...}
), исчезает после закрывающей фигурной скобки.