Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 15.04.2018
Сообщений: 5
1

Передача элементов структуры в функции

15.04.2018, 09:11. Показов 2120. Ответов 4
Метки нет (Все метки)

Нужна помощь в передаче элементов структуры в функции .Не могу понять как взаимодействовать с функциями,прочитал много тем на форумах.Понял что можно передавать с помощью указателей и по значению но ничего не выходит.

Вот программа которую написал,при компиляции выводит набор непонятных символов
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
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <windows.h>
#define M 2
 
 
    void  Vse_stranu(char Strana);
    void  Vse_nazvaniya(char Nazvanie_tovara);
    void  Objomu_partiy(int Objom_partii);
    void  Objom_rasfasovok (float Cena_tovara);
 
          struct TOVAR
            {
 
               char Strana[20];
               char Nazvanie_tovara[20];
               int  Objom_partii;
               int  Objom_rosfasovki;
               float  Cena_tovara;
            }
            mas[2];
 
int main()
{
                     setlocale ( LC_ALL, "Russian" );
                     SetConsoleCP(1251);
                     SetConsoleOutputCP(1251);
                  int i;
                 for(i=0;i<2;i++)
                 {
                      printf("Введите страну:\n ");
                      scanf("%s", &mas[i].Strana);
 
                      printf("Введите название товара:\n ");
                      scanf("%s", &mas[i].Nazvanie_tovara);
 
                      printf("Введите объем партии:\n ");
                      scanf("%d", &mas[i].Objom_partii);
 
                      printf("Введите объем расфасовки:\n ");
                      scanf("%d", &mas[i].Objom_rosfasovki);
 
                      printf("Введите цену товара:\n");
                      scanf("%f", &mas[i].Cena_tovara);
                }
 
                        for (i=0;i<2;i++)
                          {
                            printf ( " %s  %10s     %7d     %10d         %f       \n", mas[i].Strana, mas[i].Nazvanie_tovara,mas[i].Objom_partii, mas[i].Objom_rosfasovki,mas[i].Cena_tovara  );
                          }
 
 printf("Страна в которой экспорт товара наибольший %s :\n", Vse_stranu);
 
return 0 ;
}
                               void Vse_stranu(char Strana)
                                 {
                                     int i;
                                   for(i=0;i<2;i++)
                                     {
                                      if(mas[i].Cena_tovara > mas[i+1].Cena_tovara)
                                         {
                                            printf("Страна в которой экспорт товара наибольший %s :\n",mas[i].Strana );
                                     }
                                 }
                                 printf("\n");
 
                                 }
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.04.2018, 09:11
Ответы с готовыми решениями:

Передача динамической структуры аргументом функции
Помогите, пожалуйста, обнаружить и исправить ошибки. Точнее, компилятор-то их отыскивает, но в чем...

Передача по ссылке структуры в процедуры или функции
Правильно ли передавать структуру по ссылке так. typedef struct BigNum { int sign; // Знак...

Структуры и функции. Передача указателя на структуру в функцию
Всем привет, ребята! Вообще ничего не соображаю сейчас, так как ночь. А кофе нету. Короче, ближе к...

Передача в функцию элементов структуры
Всем доброго времени суток! Подскажите пожалуйста как передать элементы структуры в функцию.Задача...

4
287 / 219 / 101
Регистрация: 11.08.2016
Сообщений: 767
15.04.2018, 10:38 2
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
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <windows.h>
#define M 2
 
 
    void  Vse_stranu(char Strana);
    void  Vse_nazvaniya(char Nazvanie_tovara);
    void  Objomu_partiy(int Objom_partii);
    void  Objom_rasfasovok (float Cena_tovara);
 
          struct TOVAR
            {
 
               char Strana[20];
               char Nazvanie_tovara[20];
               int  Objom_partii;
               int  Objom_rosfasovki;
               float  Cena_tovara;
            }
            mas[2];
 
int main()
{
    struct TOVAR * p;
    p = mas;                    // указатель на структуру
                     setlocale ( LC_ALL, "Russian" );
                     SetConsoleCP(1251);
                    SetConsoleOutputCP(1251);
                  int i;
                 for(i=0;i<2;i++)
                 {
                      printf("Введите страну:\n ");
                      scanf("%s", p->Strana);
 
                      printf("Введите название товара:\n ");
                      scanf("%s", p->Nazvanie_tovara);
 
                      printf("Введите объем партии:\n ");
                      scanf("%d", &p->Objom_partii);
 
                      printf("Введите объем расфасовки:\n ");
                      scanf("%d", &p->Objom_rosfasovki);
 
                      printf("Введите цену товара:\n");
                      scanf("%f", &p->Cena_tovara);
                }
 
                        for (i=0;i<2;i++)
                          {
                            printf ( " %s  %10s     %7d     %10d         %f       \n", mas[i].Strana, mas[i].Nazvanie_tovara,mas[i].Objom_partii, mas[i].Objom_rosfasovki,mas[i].Cena_tovara  );
                          }
 
 //printf("Страна в которой экспорт товара наибольший: ");
                          Vse_stranu(0);    //не понял для чего аргумент . поэтому 0.
return 0 ;
}
                               void Vse_stranu(char Strana)
                                 {
                                     int i;
                                   for(i=0;i<2;i++)
                                     {
                                      if(mas[i].Cena_tovara > mas[i+1].Cena_tovara)
                                         {
                                            printf("Страна в которой экспорт товара наибольший %s :\n",mas[i].Strana );
                                     }
                                 }
                                 printf("\n");
 
                                 }
Добавлено через 10 минут
Работа с указателями на структуру производится аналогично стандартной ситуации с массивом. Единственное нужно помнить, что при работе с указателями на структуру используется не ".", а "->" .
При передаче адреса функции scanf , указывать адрес массива не нужно, так как фактически мы и так работаем с указателем. Поэтому при написании
C
1
scanf("%s", mas);
Указывать его адрес оператором "&" не нужно.

И для чего Вы передаёте в качестве аргумента переменную Strana?
C
57
 void Vse_stranu(char Strana)
Добавлено через 15 минут
ЗЫ и не нужно читать много тем на форуме.... Довольно прочесть одну главу из учебника Керниган и Ричи "Язык программирования Си"
0
0 / 0 / 0
Регистрация: 15.04.2018
Сообщений: 5
15.04.2018, 10:50  [ТС] 3
Ну для начала,я хотел указать список параметров функции,где то видел что так делают.
Во вторых я читаю на данный момент книгу "Программирование на языке Си" Шпак,но толковых примеров там так и не нашел.
И есть один вопрос,после добавления указателя на структуру,при компиляции теперь выводит данные только по одной введённой стране,не могу вдуплить в чем причина?
0
287 / 219 / 101
Регистрация: 11.08.2016
Сообщений: 767
15.04.2018, 11:20 4
Mr Zippo, прошу прощения, проглядел , что мы работаем с массивом.
Скоро перепишу, с телефона работаю

Добавлено через 8 минут
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
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <windows.h>
#define M 2
            struct TOVAR
            {
 
               char Strana[20];
               char Nazvanie_tovara[20];
               int  Objom_partii;
               int  Objom_rosfasovki;
               float  Cena_tovara;
            }
            mas[2];
 
    void  Vse_stranu(struct TOVAR *p);
    void  Vse_nazvaniya(char Nazvanie_tovara);
    void  Objomu_partiy(int Objom_partii);
    void  Objom_rasfasovok (float Cena_tovara);
 
          
 
int main(void)
{
    struct TOVAR * p;
    p = mas;                    // указатель на структуру
                  setlocale ( LC_ALL, "Russian" );
                  SetConsoleCP(1251);
                  SetConsoleOutputCP(1251);
                  int i;
                 for(i=0;i<2;i++)
                 {
                      printf("Введите страну:\n ");
                      scanf("%s", (*(p+i)).Strana);
 
                      printf("Введите название товара:\n ");
                      scanf("%s", (*(p+i)).Nazvanie_tovara);
 
                      printf("Введите объем партии:\n ");
                      scanf("%d", &(*(p+i)).Objom_partii);
 
                      printf("Введите объем расфасовки:\n ");
                      scanf("%d", &(*(p+i)).Objom_rosfasovki);
 
                      printf("Введите цену товара:\n");
                      scanf("%f", &(*(p+i)).Cena_tovara);
                }
 
                        for (i=0;i<2;i++)
                          {
                            printf ( " %s  %10s     %7d     %10d         %f       \n", (*(p+i)).Strana, (*(p+i)).Nazvanie_tovara,(*(p+i)).Objom_partii, (*(p+i)).Objom_rosfasovki,(*(p+i)).Cena_tovara  );
                          }
 
 //printf("Страна в которой экспорт товара наибольший: ");
                          Vse_stranu(p);  
return 0 ;
}
                               void Vse_stranu(struct TOVAR *p)
                                 {
                                     int i;
                                   for(i=0;i<2;i++)
                                     {
                                      if((*(p+i)).Cena_tovara > (*(p+i)).Cena_tovara)
                                         {
                                            printf("Страна в которой экспорт товара наибольший %s :\n",(*(p+i)).Strana);
                                     }
                                 }
                                 printf("\n");
 
                                 }
1
0 / 0 / 0
Регистрация: 15.04.2018
Сообщений: 5
27.04.2018, 20:04  [ТС] 5
Спасибо большое за помощь,удалось давненько закончить программу,решил сейчас скинуть её полностью,вдруг кому понадобится


#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
#include <windows.h>
#define M 3


void Vse_stranu(); // Прототип функции (страны)
void Vse_nazvaniya(); // Прототип функции (Названия товара)
void Objomu_partiy(); //Прототип функции (Объёмы партий)
void Cena (); // Прототип функции (Цены товаров)
// Объявление глобальной структуры
struct TOVAR
{
char Strana[20];
char Nazvanie_tovara[20];
int Objom_partii;
int Objom_rasfasovki;
int Cena_tovara;
}
mas[3];

int main()
{
setlocale ( LC_ALL, "Russian" ); //Сменя языка
SetConsoleCP(1251);
SetConsoleOutputCP(1251);


int i;
for(i=0;i<3;i++)
{
printf("Введите страну:\n ");
scanf("%s", &mas[i].Strana);

printf("Введите название товара:\n ");
scanf("%s", &mas[i].Nazvanie_tovara);

printf("Введите объем партии:\n ");
scanf("%d", &mas[i].Objom_partii);

printf("Введите объем расфасовки:\n ");
scanf("%d", &mas[i].Objom_rasfasovki);

printf("Введите цену товара:\n");
scanf("%d", &mas[i].Cena_tovara);
}
printf ( " Страна Товар Партия Расфасовка Цена\n ");

for (i=0;i<3;i++)
{

printf ( " %s %10s %7d %10d %8d\n", mas[i].Strana, mas[i].Nazvanie_tovara,mas[i].Objom_partii, mas[i].Objom_rasfasovki,mas[i].Cena_tovara);
}

Vse_stranu();
Vse_nazvaniya();
Objom_partii();
Cena ();
return 0 ;
}
void Vse_stranu()
{
int i;
int max = mas[0].Objom_rasfasovki;
for(i=0;i<2;i++){
if(max < mas[i+1].Objom_rasfasovki){
max = mas[i+1].Objom_rasfasovki;
}
}
for(i=0;i<3;i++) {
if(mas[i].Objom_rasfasovki == max){
printf("Страна с самым большим объемом расфасовки: %s \n", mas[i].Strana);
}
}
}
void Vse_nazvaniya() {
int i,j;
for (i = 0; i < 3; i++) {
for (j = i + 1; j < 3; j++) {
printf("Товар i %s \n", mas[i].Nazvanie_tovara);
printf("Товар j %s \n", mas[j].Nazvanie_tovara);
if (strcmp(mas[i].Nazvanie_tovara, mas[j].Nazvanie_tovara) == 0) {
printf("Страны в которые экспортируется один и тот же вид продукции: %s %s \n", mas[i].Strana,mas[j].Strana);
break;
}
}
}
}
void Objom_partii()
{
int i;
int min = mas[0].Objom_partii;
for(i=0;i<2;i++){
if(min > mas[i+1].Objom_partii){
min = mas[i+1].Objom_partii;
}
}
for(i=0;i<3;i++) {
if(mas[i].Objom_partii == min){
printf("Страна с самым меньшим объемом партии: %s \n", mas[i].Strana);
}
}
}
void Cena()
{
int i;
int max = mas[0].Cena_tovara;
for(i=0;i<2;i++){
if(max < mas[i+1].Cena_tovara){
max = mas[i+1].Cena_tovara;
}
}
for(i=0;i<3;i++) {
if(mas[i].Cena_tovara == max){
printf("Страна в которую экспортируется товар на максимальную сумму: %s \n", mas[i].Strana);
}
}
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.04.2018, 20:04

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Передача нескольких параметров в pthread_create (передача структуры)
Здравствуйте. Мне нужно передать последним параметром в функцию pthread_create следующую структуру...

Передача элементов с функции в функцию
Здравствуйте. Такая проблема, не могу правильно написать передачу массивов и их размерностей с...

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

Передача элементов массива из одной функции в другую
Подскажите пожалуйста, хочу написать тест проверки знаний, генерацию случайных элементов без...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.