Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
4uba4ok
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 11
#1

Проблемма при работе с массивами структур - C++

29.03.2013, 01:41. Просмотров 363. Ответов 6
Метки нет (Все метки)

Разработать программу , позволяющую добавлять данные структур с указанными полями в массив, просматривать массивы, а также выполнять дополнительную операцию в соответствии с индивидуальным заданием.
Поля структуры: тип компьютера, год выпуска, цена. Операция: удалить все компьютеры с заданным годом выпуска.
Проблема именно с операцией я походу чего-то не понимаю. До этого все сделал, проверил все работает, а удоляться компы из списка отказываются сперва он мне вместо удоления лепил утда какуюто гадость а тепеьр и вовсе последний кусок отказывается обрабатывать (как будто он просто обрабатывает но слишком уж это долго длится).
Кидаю весь код, то место где косяк выделено жирным.
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
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <Windows.h>
 
struct PC 
{ 
    char type[10];
    char year[5];
    float price;
};
 
void enterPC(PC *computer);
void printPC(PC computer [], int n);
 
int main()
{
    printf("Enter amount of computers you'd like to add: ");
    int n;
    scanf("%i",&n);
 
    PC* computer= new PC[n];
    
    getchar();
    for (int i=0; i<n; i++)
    {printf("\n-----Computer%i-----\n",(i+1));
    enterPC(&computer[i]);}
 
    printf("\n-----List of Computers:-----\n");
    printPC(computer,n);        
    
    char yr[5];
    printf("\nEnter what year computers remove from the list: ");
    gets(yr);
    PC* temp = new PC[255] ;
    for (int i=0; i<n; i++ )
    if(strcmp(computer[i].year,yr)) 
    {
    strcpy(temp[i].type,computer[i].type);
    strcpy(temp[i].year,computer[i].year);
    temp[i].price=computer[i].price;
    }
    
    ZeroMemory(computer,n);
    n=sizeof(temp);
    
    for (int i=0; i<n; i++)
    {
    strcpy(computer[i].type,temp[i].type);
    strcpy(computer[i].year,temp[i].year);
    computer[i].price=temp[i].price;
    }
 
    
    delete [] temp;
    printf("\n-----New List of Computers:-----\n");
    printPC(computer,n);
 
getch();
return 0;
}
 
void enterPC(PC *computer)
{
    printf("Enter type: ");
    gets(computer->type);
    printf("Enter year: ");
    gets(computer->year);
    printf("Enter price: ");
    scanf("%f",&(*computer).price);
    getchar();
}
 
void printPC(PC computer [], int n)
{
for (int i=0; i<n; i++)
        printf("%s %s %.2f\n",computer[i].type,computer[i].year,computer[i].price);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2013, 01:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблемма при работе с массивами структур (C++):

Ошибка при работе с массивами char - C++
Задание: написать функцию для сложения целых двоичных чисел. Слагаемые должны иметь тип unsigned char. Вот что получилось, но после...

Указатели при работе с одномерными и двумерными массивами - C++
Помогите Даны натуральное число n, целые числа а1,...,аn . Выяснить, имеется ли среди чисел а1,...,аn совпадающие.

Использование функций при работе с двумерными массивами - C++
Дана прямоугольная вещественная матрица . Обнулить все четные столбцы и нечетные строки. В полученной матрице отсортировать по возрастанию...

Ошибка с памятью при работе с двумерными массивами. - C++
{ int i, j, c, kol; n=StrToInt(Edit1-&gt;Text); m=StrToInt(Edit2-&gt;Text); for(i=0; i&lt;n; i++) { for(j=0; j&lt;m; j++)...

Не получается перегрузить оператор ++ при работе с массивами - C++
Текст: #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; class array { public: array(); ...

Как использовать указатели при работе с массивами? - C++
подскажите пожалуйста как правильно использовать указатели при работе с массивами. Как написать этк программу используя указатели? ...

6
sashadereh
3 / 3 / 1
Регистрация: 30.09.2012
Сообщений: 63
29.03.2013, 02:42 #2
Насколько я знаю, функция strcmp сравнивает длины строк, т.е. в любом случае у Вас всегда будет "да"в условии.
Поэтому это
C
1
2
3
4
5
6
if(strcmp(computer[i].year,yr)) 
{
strcpy(temp[i].type,computer[i].type);
strcpy(temp[i].year,computer[i].year);
temp[i].price=computer[i].price;
}
лучше заменить этим
C
1
2
if(strstr(computer[i].year,yr)) 
*(temp+i)=*(computer+i) //Можно копировать сразу все поля
И где у вас функция ZeroMemory(computer,n) - вы ее сами писали?
Может в ней ошибка
0
4uba4ok
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 11
29.03.2013, 14:32  [ТС] #3
я пробывал заменять strcmp на strstr насколько я помню результат не изменился. НУ я еще раз попробую) Насчет копирования всех элементов сразу большое спасибо) А zeromemory я где-то прочитал что это вроде готовая функция которая нулями масив забивает. Просто перед тем как перегонять из temp в computer мне же надо стереть содержимое computer и изменить его размер или я не прав?

Добавлено через 46 минут
Переписал.Теперь вроде как он делает то что должен но проблема в том что остается вместо той ячейки что нужно убрать не пустота а мусор.
Вот как переписал:
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
char yr[5];
    printf("\nEnter what year computers remove from the list: ");
    gets(yr);
    PC* temp = new PC[255];
    int j=0;
    for (int i=0; i<n; i++ )
    {
        if(!strstr(computer[i].year,yr)) 
        {*(temp+(i-j))=*(computer+i);
        j=0;}
        else j++;
    }
 
    ZeroMemory(computer,n);
    
    
    for (int i=0; i<n; i++)
    {
    *(computer+i)=*(temp+i);
    }
 
    
    delete [] temp;
    printf("\n-----New List of Computers:-----\n");
    printPC(computer,n);
Вот скрин работы
http://img713.imageshack.us/img713/8259/dafug.png

Вопрос такой откуда этот мусор? ОН в temp или он остался в computer т.к. я не изменил его размер (не знаю как, пробывал всякие sizeof и цикл до '\o' не выходит). И как это вылечить?

Добавлено через 2 часа 47 минут
Хм интересно почему вдруг тему перекинули в раздел С++ если написано на чистом Cи ? -_-"
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
29.03.2013, 16:40 #4
Цитата Сообщение от 4uba4ok Посмотреть сообщение
почему вдруг тему перекинули в раздел С++ если написано на чистом Cи ? -_-"
Цитата Сообщение от 4uba4ok Посмотреть сообщение
delete [] temp;
это уже С++
0
4uba4ok
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 11
29.03.2013, 17:38  [ТС] #5
Походу понял в чём проблема. Temp имеет размер равный computer и получается что после моего "удоления" компьютера с заданной датой количество иниализированных элементов в tempe меньше и все оставшиеся ячейки какраз и хранят мусор его он и выводит. Нужно как-то изменить размер temp. Кто может что предложить? Будь это тупо строка я бы уже сделал но т.к. это массив из структур то я уже голову сломал =( так ничего дельного и не вышло сплошные ошибки кампеляции)
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
29.03.2013, 17:47 #6
4uba4ok, приведите итоговый глючный код.

Не по теме:

Цитата Сообщение от 4uba4ok Посмотреть сообщение
ошибки кампеляции
почему не "ашыпки"?

0
4uba4ok
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 11
29.03.2013, 18:35  [ТС] #7
Я разобрался. Почитав еще форум. Сделал через malloc free и realloc и все заработало. Просто в с++ нет ничего похожего на realloc.
Кому интересно вот рабочий вариант:
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
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <Windows.h>
#include <stdlib.h>
 
struct PC 
{ 
    char type[10];
    char year[5];
    float price;
};
 
void enterPC(PC *computer);
void printPC(PC computer [], int n);
 
int main()
{
    printf("Enter amount of computers you'd like to add: ");
    int n;
    scanf("%i",&n);
 
    PC* computer= (PC *) malloc(n*sizeof(PC));
    
    getchar();
    for (int i=0; i<n; i++)
    {printf("\n-----Computer%i-----\n",(i+1));
    enterPC(&computer[i]);}
 
    printf("\n-----List of Computers:-----\n");
    printPC(computer,n);        
    
    
    char yr[5];
    printf("\nEnter what year computers remove from the list: ");
    gets(yr);
 
    PC* temp = (PC *) malloc(n*sizeof(PC));
    int j=0,i,k;
    for (i=0; i<n; i++ )
    {
        if(!strstr(computer[i].year,yr)) 
        {*(temp+i-j)=*(computer+i);
        j=0; k=i-j;}
        else j++;
    }
    
    ZeroMemory(computer,n);
    n=k;
    realloc(temp,n*sizeof(PC));
    realloc(computer,n*sizeof(PC));
 
    for (int i=0; i<n; i++)
    {
    *(computer+i)=*(temp+i);
    }
    
    free(temp);
    
    printf("\n-----New List of Computers:-----\n");
    printPC(computer,n);
 
    free(computer);
 
getch();
return 0;
}
 
void enterPC(PC *computer)
{
    printf("Enter type: ");
    gets(computer->type);
    printf("Enter year: ");
    gets(computer->year);
    printf("Enter price: ");
    scanf("%f",&(*computer).price);
    getchar();
}
 
void printPC(PC computer [], int n)
{
for (int i=0; i<n; i++)
        printf("%s %s %.2f\n",computer[i].type,computer[i].year,computer[i].price);
}
Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
4uba4ok, приведите итоговый глючный код.

Не по теме:


почему не "ашыпки"?

Итоговый глючный код был выше на пару постов)
0
29.03.2013, 18:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2013, 18:35
Привет! Вот еще темы с ответами:

Ошибка в перегрузке оператора - при работе с массивами - C++
Текст программы: #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; class array { public: array(); ...

Использование указателей при работе с одномерными массивами - C++
Реализовать на Си. Даны натуральное число n, действительные числа a1,...,an. Если последовательность a1,...,an упорядочена по...

Использование указателей при работе с одномерными и двумерными массивами. - C++
Кто может решить. Даны натуральное число n,действительные числа X1,...,Xn.Вычислить: (X1+X2+2Xn)(X2+X3+2Xn-1)...(Xn-1+Xn+X2) Язык...

Использование указателей при работе с одномерными и двумерными массивами - C++
Даны натуральное число n, действительные числа a1, ..., an. Преобразовать последова-тельность a1, ..., a2n, расположив вначале...


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

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

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