Мне нужна помощь в следующей проблеме:
Учитывая массив arr
из structs
typedef struct
{
char name[20];
float amount,price;
}product;
Выведите самый длинный подмассив элементов из массива arr
такой, что элемент arr
имеет большее или равное price
, чем некоторое value
, которое читается.
Функция для проверки того, имеет ли элемент большее или равное price
, чем value
, задается в качестве аргумента функции void subarray(product *arr,int n,int (*check)(product * ,float ),
product *newArr,int *len_newArr,float value)
, где newArr
— выходной подмассив.
Вот мой код:
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
char name[20];
float amount,price;
}product;
void subarray(product *arr,int n,int (*check)(product * ,float ),
product *newArr,int *len_newArr,float value)
{
len_newArr=0;
int *current_len;
current_len=0;
int i;
for(i=0;i<n;i++)
{
//if condition is true, increment current length of newArr
//and store that element to newArr
if((*check)(arr+i,value))
{
current_len++;
newArr[i]=arr[i];
}
else
//begin with the next subarray
current_len=1;
//update newArr length
if(current_len > len_newArr)
len_newArr=current_len;
}
newArr=calloc(*len_newArr , sizeof(product));
//print the subarray
for(i=0;i<len_newArr;i++)
printf("%-19s %6.2f %6.2f\n",newArr[i].name,newArr[i].amount,newArr[i].price);
}
int check(product *pr,float value)
{
if(pr->price >= value)
return 1;
return 0;
}
void inputProduct(product *pr)
{
printf("name: ");
scanf("%s",pr->name);
printf("amount: ");
scanf("%f",&pr->amount);
printf("price: ");
scanf("%f",&pr->price);
}
int main()
{
int n,i;
product *arr,*newArr;
int len_newArr;
float value;
do
{
printf("n = ");
scanf("%d",&n);
}
while(n<1);
arr=malloc(n * sizeof(product));
newArr=calloc(n,sizeof(product));
for(i=0;i<n;i++)
{
printf("%d. product: \n",i+1);
inputProduct(arr+i);
}
printf("value: ");
scanf("%f",&value);
subarray(arr,n,&check,newArr,&len_newArr,value);
return 0;
}
Программа выдает предупреждения assignment makes pointer from integer without a cast
в строке
//begin with the next subarray
current_len=1;
и comparison between pointer and integer
в строке
//print the subarray
for(i=0;i<len_newArr;i++)
printf("%-19s %6.2f %6.2f\n",newArr[i].name,newArr[i].amount,newArr[i].price);
current_len
указателем? Как вы думаете, что делает инициализация этого указателя на0
? - person Some programmer dude   schedule 21.09.2016newArr
иlen_newArr
в качестве аргументов функции? Они не используются вне функцииsubarray
. И если вы используетеnewArr
вне функции, вам нужно передать указатель на указатель (т.е.product **
) в функцию. - person Some programmer dude   schedule 21.09.2016newArr
в функцииsubarray
, но никогда не инициализируете ее до того, как напечатаете ее содержимое. Много-много-много вещей, которые приводят (или могут) привести к неопределенному поведению. - person Some programmer dude   schedule 21.09.2016