Задать вопрос

Как написать функцию в с++,чтоб та возвращала массив строк в программу?

spoiler
#include<iostream> 
#include <iomanip> 
#include <fstream> 
using namespace std;
struct book
{
	char name[100];
	unsigned year;
	unsigned circulation;
};
book* func(book*arr, int N);
int kolvo(book*arr, int N);
int main()
{
	int n;
	string kng = "TextFile1.txt";
	setlocale(LC_ALL, "Rus");
	int N;
	book *arr;
	int otkr;
	cout << "ВЫБЕРИТЕ СПОСОБ ВВОДА.0 - С КЛАВИАТУРЫ,1 - ИЗ ФАЙЛА  \n";
	cin >> otkr;
	if (otkr == 0)
	{
		cout << "введите размер массива \n";
		cin >> N;
		arr = new book[N];
		for (int i = 0; i < N; i++)
		{
			cout << "Введите название книги  \n";
			cin >> arr[i].name;
			cout << "Введите тираж \n";
			cin >> arr[i].circulation;
			cout << "Введите год издания \n";
			cin >> arr[i].year;
		};
		for (int i = 0; i < N; i++)
		{
			cout << arr[i].name << "  " << arr[i].circulation << "  " << arr[i].year << endl;
		};

	}
	else
	{
		fstream knigi;
		knigi.open("TextFile1.txt");
		knigi >> N;
		arr = new book[N];
		for (int i = 0; i < N; i++)
			knigi >> arr[i].name >> arr[i].circulation >> arr[i].year;

	};
	n = kolvo(arr, N);
	func(arr, N);
	for (int i = 0; i < n; i++)
	{
		cout << "НАЗВАНИЕ И ТИРАЖ КНИГ С ИЗДАННЫХ С 2000-2010 ГГ:" << arr[i].name << "  " << arr[i].circulation << endl;
	}

	system("pause");
}
book* func(book*arr, int N)
{
	int  schet = 0;
	book*array = new book[schet];
	for (int i = 0; i < N; i++)
	{
		if (arr[i].year > 1999 && arr[i].year < 2011)
		{
			strcpy(array[schet].name, arr[i].name);
			array[schet].circulation = arr[i].circulation;
			schet++;
		}
	};
	//book*array = new book[schet];
	//for (int i = 0; i < N; i++)
	//{
		//if ((arr[i].year > 1999) && (arr[i].year < 2011)) {
		//	strcpy(array[schet].name, arr[i].name);
			//strcpy(array[schet].circulation,arr[i].circulation );
			//*array[schet].name = *arr[i].name;
		//	array[schet].circulation = arr[i].circulation;
		//	schet++;
		//}
	//}
	return(array);
}
int kolvo(book*arr, int N)
{
	int schet = 0;
	for (int i = 0; i < N; i++)
	{
		if (arr[i].year > 1999 && arr[i].year < 2011)
		{
			schet++;
		}
		return(schet);
	}

}

Помогите пожалуйста написать код функции (fun.....она уже сто раз написана,переписана,закомментирована),которая получает на обработку динамический массив,состоящий из названия книги,тиража и года издательства,сортирует книги напечатанные с 2000 по 2010гг и выводит в мэйне их название и тираж
вроде бы уже все работает кроме главного-сортировки и вывода
(знаю,что прога корявая;))
заранее спасибо!!!)
  • Вопрос задан
  • 167 просмотров
Подписаться 2 Простой 8 комментариев
Решения вопроса 1
myjcom
@myjcom Куратор тега C++
знаю,что прога корявая;)

VS 2017 Windows 10
Квест пройдешь

#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include<algorithm>
#include<iterator>
#include<iomanip>
#include<sstream>
using namespace std;

struct Book
{
  string name;
  int year = 0;
  int circulation = 0;
};

istream& operator>>(istream& is, Book& book)
{
  string line;
  getline(is, line);

  istringstream head(line);
  getline(head, book.name, ':');
  head >> book.year >> book.circulation;
  return is;
}

vector<Book> getBooksList(istream& source)
{
  return{ istream_iterator<Book>{source}, {} };
}

// Пришел в библиотеку - дайте мне немного книг, любых.
// А тебе говорят - сам возьми, вон там две полки - нижняя и верхняя. 
// А да, забыли предупридить - ВЫХОД платный!
enum class input_type : int {Console, File, None};
input_type get_input()
{
  if(!cin)
  {
    system(" ");
    cout << "\n\x1b[1;31mА вот и не угадал! Играй по правилам!\x1b[0m\n\n"
            "Правило первое - никаких правил ;)\n\n";
    cin.clear();
  }
  
  cout << "Жми откуда брать: \n [0] -- (консоль)\n [1] -- (файл)\n\n" 
          "[Ctrl + Z] -- (Извините ошибся дверью)\n\n$: ";
  int inp = 0;
  if(cin >> inp && inp == 0)
  {
    system(" "); 
    cout <<  "Вводи \x1b[1;31m [ Название : Год Тираж ]\n\n"
         <<  "Пример:"
         <<  "\t\x1b[0;40;36mЗолотой ключик, или Приключения Буратино : 1936 50000\n\n"
         <<  "\x1b[0mНе забудь \x1b[1;33mCtrl + Z\x1b[0m означает конец ввода.\n\n";
  }
  return static_cast<input_type>(inp);
}

// Не Аквафор
vector<Book> filter(vector<Book> const& books, int from, int to)
{
  vector<Book> filtered;
  copy_if(books.cbegin(), books.cend(), back_inserter(filtered), [=](auto const& b){
    return b.year >= from && b.year <= to;
  });
  
  return filtered;
}

// Что я прочитал за это лето
void print_table(vector<Book> const& books)
{
  auto max_width_elm = max_element(books.cbegin(), books.cend(), [](auto const& a, auto const& b){
    return a.name.size() < b.name.size();
  });
  
  if(max_width_elm == books.cend())
  {
    cout << "Ничего, бывает...\n";
    return;
  }

  size_t max_width = max_width_elm->name.size();

  // А какая у вас машина? - Зеленая O_o
  system(" ");
  cout << "\x1b[1;32m"
       << setw(8 + max_width) 
       << left     << "Название"
       << setw(12) << "Год"
       << setw(12) << "Тираж" << "\n"
       << "\x1b[0m";
  
  for(auto[name, year, circul] : books)
  {
    cout << setw(8 + max_width) 
         << left     << name
         << setw(12) << year
         << setw(12) << circul << "\n";
  }
}

enum class sort_field { Name, Year, Circul };
auto sort_by = [](sort_field field, auto& container){
  sort(container.begin(), container.end(), [=](const auto& a, const auto& b){ 
    bool result = false;
    switch(field)
    {
    case sort_field::Year:
      result = a.year < b.year;
      break;
    case sort_field::Circul:
      result = a.circulation < b.circulation;
      break;
    default:
      result = a.name < b.name;
      break;
    }
    return result;
  });
};

int main()
{ 
  setlocale(LC_ALL, "");

  //типа файл
  const string test_data = "book10 : 2010 10000\n"
                           "book09 : 2009 9000\n" 
                           "book19 : 2019 19000\n"
                           "book03 : 2003 3000\n"
                           "book84 : 1984 84000\n"
                           "book42 : 2042 42000";
  istringstream is(test_data);

  vector<Book> books;

  input_type input = input_type::None;

  while(input == input_type::None)
  {
    input = get_input();
    switch(input)
    {
    case input_type::Console:
      books = getBooksList(cin);
      break;
    case input_type::File:
      books = getBooksList(is);
      break;
    default:
      system(" ");
      cout << "\n\x1b[1;33mВыбери 0 или 1 ЧеГо НеПоНяТнОгО?\x1b[0m \n";
      input = input_type::None;
      break;
    }
  }
  
  sort_by(sort_field::Year, books);
  
  print_table(filter(books, 2000, 2010));
 
  system("pause");
}


Помогите пожалуйста написать код функции (fun.....она уже сто раз написана,переписана,закомментирована)

помогу написать код функции.
заранее спасибо!!!)

Я постарался

#include<iostream> 
#include<iomanip> 
#include<fstream>
#include<string>
#include<Windows.h>
using namespace std;

struct book
{
  string name;
  unsigned year;
  unsigned circulation;
};

int count_if(book* b, int sz, int from, int to)
{
  int cn = 0;
  for(int i = 0; i < sz; ++i)
  {
    if(b[i].year >= from && b[i].year <= to)
    {
      ++cn;
    }
  }
  return cn;
}

book* get_books_list(book* arr, int n, int from, int to, int& out_sz)
{
  out_sz = count_if(arr, n, from, to);
  if(out_sz == 0)
  {
    return nullptr;
  }

  book* array = new book[out_sz];
  int idx = 0;

  for(int i = 0; i < n; ++i)
  {
    if(arr[i].year >= from && arr[i].year <= to)
    {
      array[idx].name = arr[i].name;
      array[idx].year = arr[i].year;
      array[idx].circulation = arr[i].circulation;
      ++idx;
    }
  }
  return array;
}

int main()
{
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  
  string kng = "TextFile1.txt";
  int N;
  book *arr;
  int otkr;
  cout << "ВЫБЕРИТЕ СПОСОБ ВВОДА. 0 - С КЛАВИАТУРЫ, 1 - ИЗ ФАЙЛА  \n";
  cin >> otkr;
  if(otkr == 0)
  {
    cout << "введите размер массива \n";
    cin >> N;
    arr = new book[N];
    for(int i = 0; i < N; ++i)
    {
      cout << "Введите название книги\n";
      cin >> arr[i].name;
      cout << "Введите тираж \n";
      cin >> arr[i].circulation;
      cout << "Введите год издания \n";
      cin >> arr[i].year;
    }

    for(int i = 0; i < N; ++i)
    {
      cout << arr[i].name << "  " << arr[i].circulation << "  " << arr[i].year << endl;
    }

  }
  else
  {
    fstream knigi;
    knigi.open("TextFile1.txt");
    knigi >> N;
    arr = new book[N];
    for(int i = 0; i < N; i++)
    {
      knigi >> arr[i].name >> arr[i].circulation >> arr[i].year;
    }
  }

  int sz = 0;

  book* books = get_books_list(arr, N, 2000, 2010, sz);

  delete[] arr;

  if(books)
  {
    cout << "НАЗВАНИЕ И ТИРАЖ КНИГ С ИЗДАННЫХ С 2000-2010 ГГ:\n";
    for(int i = 0; i < sz; ++i)
    {
       cout << books[i].name << "  " << books[i].circulation << "\n";
    }
    delete[] books;
  }
  else
  {
    cout << "ТАКИХ НЕТ.";
  }
  system("pause");
}

максимально сохранить твой авторский стиль, чтобы не вызывать подозрений и лишних вопросов. Тебе нужно только придумать (если это конечно нужно) как считывать название книги, если оно составное т.е. из нескольких слов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы