CC++Qt « Как передать указатель на структуру (в моем случае)?
Начал недавно изучать структуры.
Часть задания.
Формирование, печать, добавление и удаление элементов оформить в виде функций.
Как только начал оформлять в виде функции стал понимать, что ничего не знаю.
Вот мои наработки, и весь код.
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .cpp.geshi_code {font-family:monospace;} .cpp.geshi_code .imp {font-weight: bold; color: red;} .cpp.geshi_code .kw1 {color: #0000ff;} .cpp.geshi_code .kw2 {color: #0000ff;} .cpp.geshi_code .kw3 {color: #0000dd;} .cpp.geshi_code .kw4 {color: #0000ff;} .cpp.geshi_code .co1 {color: #666666;} .cpp.geshi_code .co2 {color: #339900;} .cpp.geshi_code .coMULTI {color: #ff0000; font-style: italic;} .cpp.geshi_code .es0 {color: #000099; font-weight: bold;} .cpp.geshi_code .es1 {color: #000099; font-weight: bold;} .cpp.geshi_code .es2 {color: #660099; font-weight: bold;} .cpp.geshi_code .es3 {color: #660099; font-weight: bold;} .cpp.geshi_code .es4 {color: #660099; font-weight: bold;} .cpp.geshi_code .es5 {color: #006699; font-weight: bold;} .cpp.geshi_code .br0 {color: #008000;} .cpp.geshi_code .sy0 {color: #008000;} .cpp.geshi_code .sy1 {color: #000080;} .cpp.geshi_code .sy2 {color: #000040;} .cpp.geshi_code .sy3 {color: #000040;} .cpp.geshi_code .sy4 {color: #008080;} .cpp.geshi_code .st0 {color: #FF0000;} .cpp.geshi_code .nu0 {color: #0000dd;} .cpp.geshi_code .nu6 {color: #208080;} .cpp.geshi_code .nu8 {color: #208080;} .cpp.geshi_code .nu12 {color: #208080;} .cpp.geshi_code .nu16 {color:#800080;} .cpp.geshi_code .nu17 {color:#800080;} .cpp.geshi_code .nu18 {color:#800080;} .cpp.geshi_code .nu19 {color:#800080;} .cpp.geshi_code .me1 {color: #007788;} .cpp.geshi_code .me2 {color: #007788;} .cpp.geshi_code span.xtra { display:block; }
#include <iostream>
#include <fstream>
using namespace std;
typedef struct disk
{
char name[30];
char autor[30];
float duration[30];
int cost;
};
void addElements(struct disk, int);
int main()
{
ofstream fwrite("ofile.txt");
ifstream fread("ofile.txt");
int i, n;
cout<<"How many disks do you wish to catalog?"<< endl;
cin>>n;
fread >> n;
cin.ignore(1,'n');
disk *pDisk = new disk[n];
disk *ppDisk = pDisk;
void addElements(&pDisk, n);
pDisk = ppDisk;
cout << "--------------------------------" << endl;
cout << "Here is your collection: " << endl;;
for (i = 0; i < n; i++)
{
cout << "--------------------------------" << endl;
fread >> pDisk->autor;
fread >> pDisk->name;
fread >> pDisk->cost;
cout << pDisk->autor << " " << pDisk->name << " "<< pDisk->cost << "$" << endl;
for(int l=0; l<3; l++)
{
fread >> pDisk->duration[l];
cout << "Duration of " << l+1 << " track is ";
cout << pDisk->duration[l] << endl;
}
pDisk++;
}
delete [] ppDisk;
return 0;
}
void addElements(struct disk, int n)
{
for (int i = 0; i < n; i++)
{
cout << "Disk #"<< i+1 <<':'<< endl;
cout << "Please enter the name of disk: ";
cin.get(pDisk->name,30);
fwrite << pDisk->name << endl;
cout << "Please enter the year autor: ";
cin >> pDisk->autor;
fwrite << pDisk->autor << endl;
cout << "Please enter the cost of disk: ";
cin >> pDisk->cost;
fwrite << pDisk->cost << endl;
cin.ignore(1,'n');
for (int k=0; k<3; k++)
{
cout << " Please enter the duration: " << k+1 << ": ";
cin >> pDisk->duration[k];
fwrite << pDisk->duration[k] << endl;
}
pDisk++;
}
}
Как мне правильно написать функцию void addElements()
Гуглил, но void addElements(&pDisk, n); не работает, может я что-то не понимаю, помогите пожалуйста.
Часть задания.
Формирование, печать, добавление и удаление элементов оформить в виде функций.
Как только начал оформлять в виде функции стал понимать, что ничего не знаю.
Вот мои наработки, и весь код.
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .cpp.geshi_code {font-family:monospace;} .cpp.geshi_code .imp {font-weight: bold; color: red;} .cpp.geshi_code .kw1 {color: #0000ff;} .cpp.geshi_code .kw2 {color: #0000ff;} .cpp.geshi_code .kw3 {color: #0000dd;} .cpp.geshi_code .kw4 {color: #0000ff;} .cpp.geshi_code .co1 {color: #666666;} .cpp.geshi_code .co2 {color: #339900;} .cpp.geshi_code .coMULTI {color: #ff0000; font-style: italic;} .cpp.geshi_code .es0 {color: #000099; font-weight: bold;} .cpp.geshi_code .es1 {color: #000099; font-weight: bold;} .cpp.geshi_code .es2 {color: #660099; font-weight: bold;} .cpp.geshi_code .es3 {color: #660099; font-weight: bold;} .cpp.geshi_code .es4 {color: #660099; font-weight: bold;} .cpp.geshi_code .es5 {color: #006699; font-weight: bold;} .cpp.geshi_code .br0 {color: #008000;} .cpp.geshi_code .sy0 {color: #008000;} .cpp.geshi_code .sy1 {color: #000080;} .cpp.geshi_code .sy2 {color: #000040;} .cpp.geshi_code .sy3 {color: #000040;} .cpp.geshi_code .sy4 {color: #008080;} .cpp.geshi_code .st0 {color: #FF0000;} .cpp.geshi_code .nu0 {color: #0000dd;} .cpp.geshi_code .nu6 {color: #208080;} .cpp.geshi_code .nu8 {color: #208080;} .cpp.geshi_code .nu12 {color: #208080;} .cpp.geshi_code .nu16 {color:#800080;} .cpp.geshi_code .nu17 {color:#800080;} .cpp.geshi_code .nu18 {color:#800080;} .cpp.geshi_code .nu19 {color:#800080;} .cpp.geshi_code .me1 {color: #007788;} .cpp.geshi_code .me2 {color: #007788;} .cpp.geshi_code span.xtra { display:block; }
#include <iostream>
#include <fstream>
using namespace std;
typedef struct disk
{
char name[30];
char autor[30];
float duration[30];
int cost;
};
void addElements(struct disk, int);
int main()
{
ofstream fwrite("ofile.txt");
ifstream fread("ofile.txt");
int i, n;
cout<<"How many disks do you wish to catalog?"<< endl;
cin>>n;
fread >> n;
cin.ignore(1,'n');
disk *pDisk = new disk[n];
disk *ppDisk = pDisk;
void addElements(&pDisk, n);
pDisk = ppDisk;
cout << "--------------------------------" << endl;
cout << "Here is your collection: " << endl;;
for (i = 0; i < n; i++)
{
cout << "--------------------------------" << endl;
fread >> pDisk->autor;
fread >> pDisk->name;
fread >> pDisk->cost;
cout << pDisk->autor << " " << pDisk->name << " "<< pDisk->cost << "$" << endl;
for(int l=0; l<3; l++)
{
fread >> pDisk->duration[l];
cout << "Duration of " << l+1 << " track is ";
cout << pDisk->duration[l] << endl;
}
pDisk++;
}
delete [] ppDisk;
return 0;
}
void addElements(struct disk, int n)
{
for (int i = 0; i < n; i++)
{
cout << "Disk #"<< i+1 <<':'<< endl;
cout << "Please enter the name of disk: ";
cin.get(pDisk->name,30);
fwrite << pDisk->name << endl;
cout << "Please enter the year autor: ";
cin >> pDisk->autor;
fwrite << pDisk->autor << endl;
cout << "Please enter the cost of disk: ";
cin >> pDisk->cost;
fwrite << pDisk->cost << endl;
cin.ignore(1,'n');
for (int k=0; k<3; k++)
{
cout << " Please enter the duration: " << k+1 << ": ";
cin >> pDisk->duration[k];
fwrite << pDisk->duration[k] << endl;
}
pDisk++;
}
}
Как мне правильно написать функцию void addElements()
Гуглил, но void addElements(&pDisk, n); не работает, может я что-то не понимаю, помогите пожалуйста.
1 ответов
Я покромсал ваш код, чтобы показать как это работает :
#include <iostream>
#include <stdio.h>
using namespace std;
struct disk
{
char name[30];
char autor[30];
float duration[5];
int cost;
};
void addElements(disk**, int);
int main()
{
int n;
cout<<"How many disks do you wish to catalog?"<< endl;
cin>>n;
disk** pDisk = new disk* [n];
for (int i=0;i<n;i++)
pDisk[i] = new disk;
addElements (pDisk,n);
printf ("Your collection:\n");
for (int i=0;i<n;i++)
{
printf("%-30s %-30s %-3d\n",pDisk[i]->autor,pDisk[i]->name,pDisk[i]->cost);
for (int j=0;j<3;j++)
printf (" %-8.2f\n",pDisk[i]->duration[j]);
}
for(int i=0;i<n;i++)
delete pDisk[i];
delete [] pDisk;
return 0;
}
void addElements(disk** pDisk, int n)
{
for (int i = 0; i < n; i++)
{
cout << "Disk #"<< i+1 <<':'<<'\n';
printf( "Please enter the name of disk: ");
scanf("%s",&pDisk[i]->name);
cout << "Please enter the year autor: ";
scanf("%s",&pDisk[i]->autor);
cout << "Please enter the cost of disk: ";
cin >> pDisk[i]->cost;
for (int k=0; k<3; k++)
{
cout << " Please enter the duration: " << k+1 << ": ";
cin >> pDisk[i]->duration[k+1];
}
}
}
Вообще я бы на вашем месте не спешил со структурами, а разобрался в следующих темах :
- Глобальные и локальные переменные, область жизни переменных
- Типы данных
- Указатели, работа с памятью
- Функции в с++
- Потоки
- Ввод-вывод средствами библиотеки stdio.h
И только потом бы разбирался со структурами и пользовательскими типами данных.
Углубляясь в ваш код, хватаешься за голову. Такое ощущение что вы совсем не понимаете что делаете.
Попробуйте исправить следующее :
- Вместо
typedef struct disk
{
char name[30];
char autor[30];
float duration[30];
int cost;
};
struct disk // для объявления структуры не нужен typedef
{
char name[30];
char autor[30];
float duration[30];
int cost;
};
- Вместо
void addElements(struct disk, int);
void addElements(disk* pDisk, int); // в сигнатуре нужно указывать имя
//объявленного типа, struct здесь не нужно
// disk* pDisk - указатель на структуру disk
- Обращение к i-ому элементу :
pDisk[i]->duration
pDisk[i]->name
И так далее.- Вызов
addElements(pDisk, n);
- Вместо