Войти

Показать полную графическую версию : [решено] Помогите решить задачу по С++


Страниц : 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 15 16

Champ10n
27-01-2010, 14:01
Да, я понимаю чо это нагло с моей стороны, и сам бы наврное написал бы, харошь балдеть студенты, пора учиться, но у меня немного другая ситуация. Не буду вдаваться в подробности.
Я понимаю что возможно легче сделать в одной программе или еще как-нибудь, но просто задача поставлена имено так, если уж на то пошло, то хотя бы первое задание, а над остальным сам попытаюсь попыхтеть. Ну а если все 3, то вообще буду примного благодарен, можешь тогда и вмз кошелечек кинуть в личку, отблагодарю :)

Lisiy_egik
27-01-2010, 14:02
в общем сделал тебе 3 в одном, т.к. это хоть работать будет. то бишь можно проверить как оно работает.
Имена файлов указываются как аргументы командной строки, так же в каждом поле (чтоб не заморачиваться) я сделал так, чтоб ввод был примерно таким образом: все данные разделяются пробелом. то бишь фио вводится через подчеркивание вместо пробелов.

вот код:

main.cpp:
#include <iostream>
#include <cstdlib>
#include <fstream>
#include "rus8.h" //русификатор
#include "candidate.h"
using namespace std;

int main(int argc, char *argv[])
{
rus(); // ф-ия руссифицированного вывода

if(argc < 3)
{
cout << "Ошибка 0 : введите все 3 аргумента командной строки" << endl;
exit (0);
}

int size;

cout << "Введите кол-во кандидатов" << endl;
cin >> size;

if(size < 0)
{
cout << "Ошибка 1 : кол-во кандидатов должно быть целочисленным и положительным ( 1, 2, 5, и т.д." << endl;
exit (1);
}

cand *arr = new cand[size]; //выделение динамической памяти для массива структур

ifstream in(argv[1]);

if(!in)
{
cout << "Ошибка 2 : не могу открыть файл с исходными данными" << endl;
exit (2);
}

read_info(in, arr, size);

in.close();

ofstream out(argv[2]);

if(!out)
{
cout << "Ошибка 3 : не могу открыть файл для вывода" << endl;
exit (3);
}

write_info(out, arr, size);

out.close();

delete [] arr; // очистка динамической памяти от массива структур

return 0;

}

candidate.h
#include <iostream>
#include <string>
using namespace std;

struct cand
{
string name; // ФИО
int age; // Возраст
string prof; // Профессия
string set; // Наименование партии
int num; // Номер избирательного округа
string court; // Судимость
};

void read_info(istream &, cand *, const int &); //ф-ия заполнения массива

void write_info(ostream &, cand *, const int &); //ф-ия вывода данных в файл

candidate.cpp
#include "candidate.h"

void read_info(istream &in, cand *arr, const int &size)
{
for(int i = 0; i < size; i++)
{
in >> arr[i].name;
in >> arr[i].age;
in >> arr[i].prof;
in >> arr[i].set;
in >> arr[i].num;
in >> arr[i].court;
}
}

void write_info(ostream &out, cand *arr, const int &size)
{
out << "Кандидаты :" << endl << endl;
for(int i = 0; i < size; i++)
{
out << "Кандидат номер " << (i+1) << endl;
out << "И.Ф.О. : " << arr[i].name << endl;
out << "Возраст : " << arr[i].age << endl;
out << "Профессия : " << arr[i].prof << endl;
out << "Наименование партии : " << arr[i].set << endl;
out << "Номер изб. круга : " << arr[i].num << endl;
out << "Судимость : " << arr[i].court << endl;
out << endl << endl;
}
}

rus8.h
#ifndef _RUS_H
#define _RUS_H

#include <locale.h>

inline void rus( void )
{
setlocale( LC_CTYPE, ".1251" );
setlocale( LC_MONETARY, ".1251" );

return;
}

#endif

вот с такими данными проверял работоспособность:
Иванов_Петр_Васильевич
55
Историк
Единая_Росиия
5
Нет

Кузичкин_Иван_Григорьевис
32
Физик-ядерщик
ЛДПР
9
Нет

Васильев_Михаил_Эдуардовч
38
Экономист
КПРФ
7
Да

вот такой был вывод:
Кандидаты :

Кандидат номер 1
И.Ф.О. : Иванов_Петр_Васильевич
Возраст : 55
Профессия : Историк
Наименование партии : Единая_Росиия
Номер изб. круга : 5
Судимость : Нет


Кандидат номер 2
И.Ф.О. : Кузичкин_Иван_Григорьевис
Возраст : 32
Профессия : Физик-ядерщик
Наименование партии : ЛДПР
Номер изб. круга : 9
Судимость : Нет


Кандидат номер 3
И.Ф.О. : Васильев_Михаил_Эдуардовч
Возраст : 38
Профессия : Экономист
Наименование партии : КПРФ
Номер изб. круга : 7
Судимость : Да

по сути это твое третье задание - оно самое полное, если не очень представляешь как его разбить по кускам (на 1е и 2е) могу переделать - это не так долго

Champ10n
27-01-2010, 14:13
если не очень представляешь как его разбить по кускам (на 1е и 2е) могу переделать - это не так долго »
Вот это бы мне очень помогло.

Lisiy_egik
27-01-2010, 15:07
вот 1е задание (ввод имен с консоли, минус 1 - вводить только транслитом)

main.cpp
#include <iostream>
#include "rus8.h" //русификатор
#include "candidate.h"
using namespace std;

int main()
{
rus(); // ф-ия руссифицированного вывода

cand arr[size];

read_info(arr);

int ch;

cout << "Если вы хотите просмотерть введенную информацию, нажмите 1, если желаете закончить работы нажмите 2. ";
cin >> ch;

if(ch == 1)
write_info(arr);
if(ch == 2)
return 0;

return 0;

}


candidats.h
#include <iostream>
#include <string>
using namespace std;

const int size = 2; // кол-во кандидатов

struct cand
{
string name; // ФИО
int age; // Возраст
string prof; // Профессия
string set; // Наименование партии
int num; // Номер избирательного округа
string court; // Судимость
};

void read_info(cand *); //ф-ия заполнения массива

void write_info(cand *); //ф-ия вывода данных в файл


candidats.cpp
#include "candidate.h"

void read_info(cand *arr)
{
cout << "Программа регистрации кандидатов" << endl << endl;
for(int i = 0; i < size; i++)
{
cout << "Регистрация " << (i+1) << "-го кандидата";
cout << endl << "Введите имя (вместо пробелов используйте символ нижнего подчеркивания) ";
cin >> arr[i].name;
cout << endl << "Введите возраст :";
cin >> arr[i].age;
cout << endl << "Введите профессию :";
cin >> arr[i].prof;
cout << endl << "Введите название партии :";
cin >> arr[i].set;
cout << endl << "Введите номер изберательного округа :";
cin >> arr[i].num;
cout << endl << "Была ли судимость? ";
cin >> arr[i].court;
cout << endl << endl;
}
}

void write_info(cand *arr)
{
cout << "Зарегестрированные кандидаты :" << endl << endl;
for(int i = 0; i < size; i++)
{
cout << "Кандидат номер " << (i+1) << endl;
cout << "И.Ф.О. : " << arr[i].name << endl;
cout << "Возраст : " << arr[i].age << endl;
cout << "Профессия : " << arr[i].prof << endl;
cout << "Наименование партии : " << arr[i].set << endl;
cout << "Номер изб. круга : " << arr[i].num << endl;
cout << "Судимость : " << arr[i].court << endl;
cout << endl << endl;
}
}

rus8.h
#ifndef _RUS_H
#define _RUS_H

#include <locale.h>

inline void rus( void )
{
setlocale( LC_CTYPE, ".1251" );
setlocale( LC_MONETARY, ".1251" );

return;
}

#endif

Lisiy_egik
27-01-2010, 15:22
Второе задание (ввод так же с консоли транслитом) размещение массива структур в дп.

main.cpp

#include <iostream>
#include <cstdlib>
#include "rus8.h" //русификатор
#include "candidate.h"
using namespace std;

int main()
{
rus(); // ф-ия руссифицированного вывода

int size;
cout << "Введите кол-во регестрирующихся кандидатов: ";
cin >> size;
cout << endl;

if(size < 0)
{
cout << "Ошибка! Кол-во кандидатов должно быть целочисленным и положительным" << endl;
exit (0);
}

cand *arr = new cand[size];

read_info(arr, size);

int ch;

cout << "Если вы хотите просмотерть введенную информацию, нажмите 1, если желаете закончить работы нажмите 2. ";
cin >> ch;

if(ch == 1)
write_info(arr, size);
if(ch == 2)
{
delete [] arr;
return 0;
}

delete [] arr;

return 0;

}

candidats.h

#include <iostream>
#include <string>
using namespace std;


struct cand
{
string name; // ФИО
int age; // Возраст
string prof; // Профессия
string set; // Наименование партии
int num; // Номер избирательного округа
string court; // Судимость
};

void read_info(cand *, int &); //ф-ия заполнения массива

void write_info(cand *, int &); //ф-ия вывода данных в файл

candidats.cpp

#include "candidate.h"

void read_info(cand *arr, int &size)
{
cout << "Программа регистрации кандидатов" << endl << endl;
for(int i = 0; i < size; i++)
{
cout << "Регистрация " << (i+1) << "-го кандидата";
cout << endl << "Введите имя (вместо пробелов используйте символ нижнего подчеркивания) ";
cin >> arr[i].name;
cout << endl << "Введите возраст :";
cin >> arr[i].age;
cout << endl << "Введите профессию :";
cin >> arr[i].prof;
cout << endl << "Введите название партии :";
cin >> arr[i].set;
cout << endl << "Введите номер изберательного округа :";
cin >> arr[i].num;
cout << endl << "Была ли судимость? ";
cin >> arr[i].court;
cout << endl << endl;
}
}

void write_info(cand *arr, int &size)
{
cout << "Зарегестрированные кандидаты :" << endl << endl;
for(int i = 0; i < size; i++)
{
cout << "Кандидат номер " << (i+1) << endl;
cout << "И.Ф.О. : " << arr[i].name << endl;
cout << "Возраст : " << arr[i].age << endl;
cout << "Профессия : " << arr[i].prof << endl;
cout << "Наименование партии : " << arr[i].set << endl;
cout << "Номер изб. круга : " << arr[i].num << endl;
cout << "Судимость : " << arr[i].court << endl;
cout << endl << endl;
}
}

rus8.h

#ifndef _RUS_H
#define _RUS_H

#include <locale.h>

inline void rus( void )
{
setlocale( LC_CTYPE, ".1251" );
setlocale( LC_MONETARY, ".1251" );

return;
}

#endif

Champ10n
27-01-2010, 15:31
Ну что же, попробую теперь это все осилить сам.
Ну да ладно, все равно спасибо.
В чем делал-то хоть, в билдере 5ом заработает?

Это получается ты сделал, второе и третее, одно с дп, одно с файлами, а надо еще как бы просто без всего этого, если не затруднит.

Lisiy_egik
27-01-2010, 15:42
не, скажем так:

1-е: по-сути обычный массив структур, заполнение с консоли. вывод на экран.
2-е: размещение массива структур в динамической памяти. ввод с консоли. вывод на экран
3-е: самое полное(которое 3 в 1м): размещение массива в динамической памяти, ввод данных из файла, вывод в файл(имена файлов задаются аргументами командной строки). Если к 3-ему какие-то другие требования (например ввод с консоли вывод в файл) или размещать не в дп, то могу переделать - это пару минут займет, но если ты его покажешь преподу. то не думаю. что он скажет что тут все печально))

компилятор - Microsoft Visual Studio 2008, в билдере должно тоже скомпилиться - язык то один))
единственное что может стать проблемой - это то. что в 3ем имена файла можно задать прямо в коде, тогда не нужно будет прописывать аргументы, но с аргументами, на мой взгляд. лучше.

будут вопросы - спрашивай, в личку номер вмз скину, все таки ты время сэкономил и получил рабочие проекты, а мне приятно за потраченное время ;)

Champ10n
27-01-2010, 21:32
Ну да ввод как я уточнил нужен с консоли, если не сложно, переделаешь 3ее задание.

Lisiy_egik
28-01-2010, 01:20
3е ввод с консоли(условия ввода остались прежними), вывод в файл, имя файла указывается прямо в коде - для разнообразия уже ))))

main:

#include <iostream>
#include <cstdlib>
#include <fstream>
#include "rus8.h" //русификатор
#include "candidate.h"
using namespace std;

int main()
{
rus(); // ф-ия руссифицированного вывода

int size;
cout << "Введите кол-во регестрирующихся кандидатов: ";
cin >> size;
cout << endl;

if(size < 0)
{
cout << "Ошибка! Кол-во кандидатов должно быть целочисленным и положительным" << endl;
exit (0);
}

cand *arr = new cand[size];

read_info(arr, size);

ofstream out("out.txt");
if(!out)
{
cout << "Ошибка! Не могу создать файл для вывода данных" << endl;
exit (3);
}

write_info(out, arr, size);

out.close();

delete [] arr;

return 0;

}

candidats.h

#include <iostream>
#include <string>
using namespace std;


struct cand
{
string name; // ФИО
int age; // Возраст
string prof; // Профессия
string set; // Наименование партии
int num; // Номер избирательного округа
string court; // Судимость
};

void read_info(cand *, int &); //ф-ия заполнения массива

void write_info(ostream &, cand *, int &); //ф-ия вывода данных в файл


candidats.cpp
#include "candidate.h"

void read_info(cand *arr, int &size)
{
cout << "Программа регистрации кандидатов" << endl << endl;
for(int i = 0; i < size; i++)
{
cout << "Регистрация " << (i+1) << "-го кандидата";
cout << endl << "Введите имя (вместо пробелов используйте символ нижнего подчеркивания) ";
cin >> arr[i].name;
cout << endl << "Введите возраст :";
cin >> arr[i].age;
cout << endl << "Введите профессию :";
cin >> arr[i].prof;
cout << endl << "Введите название партии :";
cin >> arr[i].set;
cout << endl << "Введите номер изберательного округа :";
cin >> arr[i].num;
cout << endl << "Была ли судимость? ";
cin >> arr[i].court;
cout << endl << endl;
}
}

void write_info(ostream &out, cand *arr, int &size)
{
out << "Зарегестрированные кандидаты :" << endl << endl;
for(int i = 0; i < size; i++)
{
out << "Кандидат номер " << (i+1) << endl;
out << "И.Ф.О. : " << arr[i].name << endl;
out << "Возраст : " << arr[i].age << endl;
out << "Профессия : " << arr[i].prof << endl;
out << "Наименование партии : " << arr[i].set << endl;
out << "Номер изб. круга : " << arr[i].num << endl;
out << "Судимость : " << arr[i].court << endl;
out << endl << endl;
}
}

rus8.h

#ifndef _RUS_H
#define _RUS_H

#include <locale.h>

inline void rus( void )
{
setlocale( LC_CTYPE, ".1251" );
setlocale( LC_MONETARY, ".1251" );

return;
}

#endif

пример файла после записи данных:

Зарегестрированные кандидаты :

Зарегестрированные кандидаты :

Кандидат номер 1
И.Ф.О. : Ivan_Vasilevich_Kozlovsky
Возраст : 55
Профессия : teacher
Наименование партии : LDPR
Номер изб. круга : 5
Судимость : No


Кандидат номер 2
И.Ф.О. : Petr_Vasilevich_Tolstoy
Возраст : 37
Профессия : doc
Наименование партии : Edinaya_Russia
Номер изб. круга : 11
Судимость : No


Кандидат номер 3
И.Ф.О. : a-ta-ta
Возраст : 5
Профессия : no
Наименование партии : no
Номер изб. круга : 1
Судимость : yap

John Harlamov
05-02-2010, 10:47
Помогите по жалуйста..... На курсовую задали сделать примитивный графический редактор.
Подскажите с чего начать и как вообще его реализовать.

AlexTNT
05-02-2010, 18:03
Вроде здесь есть http://websprojects.ru/localcod.html

John Harlamov
07-02-2010, 00:40
спасибо огромное!

Slim Thug
10-02-2010, 20:10
Заполнить массив из 100 элементов случайными целыми числами из диапазона 0..10, вывести содержимое массива на экран. Запросить с клавиатуры целое неотрицательное значение, и найти количество вхождений данного значения в массиве. Например, для массива 1 2 3 2 2 10 0 количество вхождений значения 2 равно 3, количество вхождений значения 3 равно 1, а количество вхождений значения 11 равно 0. Вычислить значения, количество вхождений которых в элементы массива минимальное и максимальное. (КОГО НЕ ЗАТРУДНИТ, ТО ПОЖАЛУЙСТА С КОММЕНТАРИЯМИ)

Drongo
10-02-2010, 21:23
Slim Thug, Ровно настолько, насколько сам понял задачу. :)

// Заполнить массив из 100 элементов случайными целыми числами из диапазона 0..10,
// вывести содержимое массива на экран.
// Запросить с клавиатуры целое неотрицательное значение,
// и найти количество вхождений данного значения в массиве.
// Например, для массива 1 2 3 2 2 10 0
//количество вхождений значения 2 равно 3, количество вхождений значения 3 равно 1,
// а количество вхождений значения 11 равно 0.
// Вычислить значения, количество вхождений которых в элементы массива минимальное и максимальное.

#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <ctime>
#include <conio.h>

void main()
{
const int size = 100; // Размер первого массива
int *array = new int[size]; // Создание массива с размером 100 элементов
const int sizeSort = 11; // Размер второго массива
int index[sizeSort] = {0}; // Создание массива с размером в 10 элементов
int a, min = 10, max = 0;

srand(time(0));

for(int i = 0; i < size; i++){
array[i] = rand() % 11; // Инициализация массива некотороыми случайными значениями
cout<<setw(8)<<array[i]; // Вывод значений инициализированного массива для проверки...
}

cout<<" Enter Number = "; // Запрашиваем ввод числа
cin>>a; // Считываем число
while(a < 0){ // Пока не будет введено положительное число, предлагать ввод
cout<<" Enter Number = "; // Запрашиваем ввод числа
cin>>a; // Считываем число
}

// Расчитываем количество значений в массиве
for(int j = 0; j < size; j++)
if(array[j] == a) // Если значение в массиве равно введённому
++index[array[j]]; // , увеличить счётчик для этого числа

// Вывод результата для количества значений введённого числа
cout<<"Out Result\n"<<setw(6)<<"index"<<setw(17)<<"Value"<<endl;
for(int b = 0; b < sizeSort; b++)
cout<<setw(6)<<b<<setw(17)<<index[b]<<endl;

// Вычисляем максимальное и минимальное в массиве
for(int a = 0; a < size; a++){
if(array[a] > max)
max = array[a];
if(array[a] < min)
min = array[a];
}

cout<<endl<<endl;
cout<<"Minimal = "<<min<<endl; // Выводим минимальное
cout<<"Maximal = "<<max<<endl; // Выводим максимальное

delete [] array;

getch();
}

Slim Thug
10-02-2010, 21:30
Drongo, большое спасибо!!!

Desvi
29-04-2010, 17:25
Помогите пожалуйста написать программку на C с указателями и если можно еще с блок-схемой, заранее спасибо

В массиве A10 найти количество нечетных чисел расположенных после второго самого большего числа

lxa85
29-04-2010, 19:46
Desvi, с тебя устное решение задачи и без проблем.
Под устным решением понимается от 5 до 10 качественных вариантов решения заданного массива А10, нахождение (или сортировка) второго самого большого числа (с обязательным пояснением как ты его нашел), и так же нахождение всех нечетных чисел за ним.
А то мы можем найти не так (с задом наперед допустим), тебе потом придется искать по новой. Зачем лишние проблемы, правда?
Заодно будет видно, что же это за массив такой - А10.
Под "качественным вариантом" следует понимать массив не 1234567, и а нечто более сложное, заданное случайным образом. Вариант, который может раскрыть и поможет понять суть программы.

Desvi
29-04-2010, 20:19
К примеру
Массив 1: 1 8 11 12 4 8 15 5 3 7, макс1 - 15, макс2 - 12 после 12 начинаем находить нечетные числа это: 11 7 5 3 1, значит вывод: 5
Массив 2: 8 15 19 25 1 7 21 4 9 11, макс1 - 25, макс2 - 21, после 21 начинаем находить нечетные числа это: 19 15 11 9 7 1, вывод: 5
Массив 3: 11 12 5 9 6 0 2 8 10 20, макс1 - 20, макс2 - 12, после 12 начинаем находить нечетные числа это: 11 5 9, вывод: 3
Массив A10 имеется ввиду (может некорректно выразился) массив состоящий из 10 чисел

lxa85
29-04-2010, 21:31
Desvi, примеры Массив 1: 1 8 11 12 4 8 15 5 3 7, макс1 - 15, макс2 - 12 после 12 начинаем находить нечетные числа это: 11 7 5 3 1, значит вывод: 5
Массив 2: 8 15 19 25 1 7 21 4 9 11, макс1 - 25, макс2 - 21, после 21 начинаем находить нечетные числа это: 19 15 11 9 7 1, вывод: 5
Массив 3: 11 12 5 9 6 0 2 8 10 20, макс1 - 20, макс2 - 12, после 12 начинаем находить нечетные числа это: 11 5 9, вывод: 3 »
не соответствуют исходному заданию:В массиве A10 найти количество нечетных чисел расположенных после второго самого большего числа »
Верней не сами примеры, а выводы.
Несколько наводящих вопросов.
Как искались бОльшие числа? Какой элемент с каким сравнивался? Откуда и куда шло сравнение ("от начала до конца" или "с конца в перед") ?
Как мне проверить четное число, или нет? Да, да. Вопрос кажется примитивным, но и тут возможны варианты.
нечетные числа после второго... После - это в какую сторону? По уменьшению индекса или все подряд?

Desvi
29-04-2010, 22:08
Большие числа это те у которых порядковый номер наибольший
Четные числа это те которые делятся на 2 (2,4,6,8,10)
Все подряд, местоположение не играет роли

P.S. Я понимаю как вы рассуждаете, я когда только получил задание, так же думал, сделал прогу, преподнес её преподавателю, а он говорит, что я его не правильно понял и объяснил на примерах, как я вам. Сам понимаю что задание какое-то жидкое, но что поделаешь...

Сам алгоритм программы должен быть такой: (к примеру дан масссив 1 9 8 2 6 4 11 14 12 3)
1. Нахождение наибольшего числа (т.е. тот который имеет наибольший порядковый номер в нашем случае это 14)
2. Нахождение второго наибольшего числа (т.е тот который имеет порядковый номер больше оставшихся чисел но меньше первого наибольшего числа в нашем случае это 12)
3. Из оставшихся 8 чисел исключаются четные числа (т.е. делящийся на 2 в нашем случае исключаем 8 2 6 4 )
4. Подсчитываем оставшиеся числа это 1 9 11 3, т.е нечетных чисел расположенных после второго самого большего числа - 4 т.е. программа должна вывести ответ: 4




© OSzone.net 2001-2012