10 лучших идей C++ проекта для начинающих

C++ - это язык программирования, основанный на ООП, очень подходящий для создания высокопроизводительных приложений. C++ является расширением языка C и находит свое применение в приложениях, которым требуется высокая скорость и точность, например, в операционных системах, играх, графическом интерфейсе пользователя (GUI) и встроенных системах.

Самая популярная IDE для C++, Visual Studio используется практических во всех проектах. Вы также можете писать свои программы и в текстовом редакторе, например в блокноте, и компилировать проект с помощью компилятора GCC.

Некоторые характерные особенности C++:

  • Объектно-ориентированный
  • Богатый набор библиотек
  • Эффективное управление памятью 
  • Мощный и быстрый

Как вам помогут эти проекты?

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

Для работы над этими проектами вам необходимо установить IDE. Вы можете скачать бесплатную версию Visual Studio с официального сайта Microsoft . Также можно использовать Code::Blocks скачав с их официального сайта.

1. Система входа и регистрации

Это один из самых простых проектов, с которого можно начать изучение файловых систем на C++. Проект включает в себя процесс регистрации пользователя путем запроса имени пользователя и пароля. После успешной регистрации создается пользовательский файл с учетными данными.

Если пользователя не существует, при входе в систему будет показана ошибка. Вы также узнаете, как использовать Visual Studio для создания простого проекта.

Посмотрите видео с кодом можно здесь.

2. Система аренды автомобилей

Это популярный проект, который очень полезен для изучения событий клавиатуры, функций даты и времени и реализации системы входа на C++. В программе есть отдельные меню для администратора и других пользователей.

Существуют также методы расчета стоимости проезда на основе времени и расстояния, включая отображение сведений об автомобиле, доступности и т.д.

Исходный код проекта на GitHub

Вы можете попробовать другие проекты, такие как управление музыкальным магазином, бронирование автобусов или система бронирования железнодорожных билетов, по тем же принципам, что и выше.

3. Система инвентаризации книжного магазина

Это простой проект, в котором система поддерживает хранение книг в книжном магазине. Если клиент покупает книгу, количество книг уменьшится; если добавляется книга, то же самое обновляется. Обратите внимание на использование указателей.

Вы можете изменить код, чтобы добавить идентификатор книги и выполнить поиск на основе идентификатора книги или выполнить поиск с использованием только одного параметра, дающего несколько результатов, и так далее.

Исходный код проекта  

4. Система управления отчетами студентов

Благодаря этому проекту мы можем многое узнать о потоках ввода / вывода и системе управления файлами C++. Программа собирает данные об учениках, такие как имя, номер списка, оценки по каждому предмету, и вычисляет их оценку. Это простое консольное приложение.

Обратите внимание, что в этом проекте мы фокусируемся только на правильных входных данных, и вы можете улучшить его для обработки неправильных входных данных.

Вот исходный код:

#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;

// the class that stores data
class student
{
int rollno;
char name[50];
int eng_marks, math_marks, sci_marks, lang2_marks, cs_marks;
double average;
char grade;

public:
void getdata();
void showdata() const;
void calculate();
int retrollno() const;
}; //class ends here

void student::calculate()
{
average=(eng_marks+math_marks+sci_marks+lang2_marks+cs_marks)/5.0;
if(average>=90)
grade='A';
else if(average>=75)
grade='B';
else if(average>=50)
grade='C';
else
grade='F';
}

void student::getdata()
{
cout<<"\nEnter student's roll number: ";
cin>>rollno;
cout<<"\n\nEnter student name: ";
cin.ignore();
cin.getline(name,50);
cout<<"\nAll marks should be out of 100";
cout<<"\nEnter marks in English: ";
cin>>eng_marks;
cout<<"\nEnter marks in Math:  ";
cin>>math_marks;
cout<<"\nEnter marks in Science:  ";
cin>>sci_marks;
cout<<"\nEnter marks in 2nd language:  ";
cin>>lang2_marks;
cout<<"\nEnter marks in Computer science:  ";
cin>>cs_marks;
calculate();
}
void student::showdata() const
{
cout<<"\nRoll number of student : "<<rollno;
cout<<"\nName of student : "<<name;
cout<<"\nEnglish : "<<eng_marks;
cout<<"\nMaths : "<<math_marks;
cout<<"\nScience : "<<sci_marks;
cout<<"\nLanguage2 : "<<lang2_marks;
cout<<"\nComputer Science :"<<cs_marks;
cout<<"\nAverage Marks :"<<average;
cout<<"\nGrade of student is :"<<grade;
}
int  student::retrollno() const
{
return rollno;
}
//function declaration
void create_student();
void display_sp(int);//display particular record
void display_all(); // display all records
void delete_student(int);//delete particular record
void change_student(int);//edit particular record
//MAIN
int main()
{
char ch;
cout<<setprecision(2); 
do
{
char ch;
int num;
system("cls");
cout<<"\n\n\n\tMENU";
cout<<"\n\n\t1.Create student record";
cout<<"\n\n\t2. Search student record";
cout<<"\n\n\t3. Display all students records ";
cout<<"\n\n\t4.Delete student record";
cout<<"\n\n\t5.Modify student record";
cout<<"\n\n\t6.Exit";
cout<<"\n\n\What is your Choice (1/2/3/4/5/6) ";
cin>>ch;
system("cls");
switch(ch)
{
case '1': create_student(); break;
case '2': cout<<"\n\n\tEnter The roll number "; 
cin>>num;
display_sp(num); break;
case '3': display_all(); break;
case '4': cout<<"\n\n\tEnter The roll number: "; 
cin>>num;
delete_student(num);break;
case '5': cout<<"\n\n\tEnter The roll number "; cin>>num;
change_student(num);break;
case '6': cout<<"Exiting, Thank you!";exit(0);
}
}while(ch!='6');
return 0;
}
//write student details to file
void create_student()
{
student stud;
ofstream oFile;
oFile.open("student.dat",ios::binary|ios::app);
stud.getdata();
oFile.write(reinterpret_cast<char *> (&stud), sizeof(student));
oFile.close();
     cout<<"\n\nStudent record Has Been Created ";
cin.ignore();
cin.get();
}
// read file records
void display_all()
{
student stud;
ifstream inFile;
inFile.open("student.dat",ios::binary);
if(!inFile)
{
cout<<"File could not be opened !! Press any Key to exit";
cin.ignore();
cin.get();
return;
}
cout<<"\n\n\n\t\tDISPLAYING ALL RECORDS\n\n";
while(inFile.read(reinterpret_cast<char *> (&stud), sizeof(student)))
{
st.showdata();
cout<<"\n\n====================================\n";
}
inFile.close();
cin.ignore();
cin.get();
}
//read specific record based on roll number
void display_sp(int n)
{
student stud;
ifstream iFile;
iFile.open("student.dat",ios::binary);
if(!iFile)
{
cout<<"File could not be opened... Press any Key to exit";
cin.ignore();
cin.get();
return;
}
bool flag=false;
while(iFile.read(reinterpret_cast<char *> (&stud), sizeof(student)))
{
if(stud.retrollno()==n)
{
  stud.showdata();
flag=true;
}
}
iFile.close();
if(flag==false)
cout<<"\n\nrecord does not exist";
cin.ignore();
cin.get();
}
// modify record for specified roll number
void change_student(int n)
{
bool found=false;
student stud;
fstream fl;
fl.open("student.dat",ios::binary|ios::in|ios::out);
if(!fl)
{
cout<<"File could not be opened. Press any Key to exit...";
cin.ignore();
cin.get();
return;
}
     while(!fl.eof() && found==false)
{
fl.read(reinterpret_cast<char *> (&stud), sizeof(student));
if(stud.retrollno()==n)
{
stud.showdata();
cout<<"\n\Enter new student details:"<<endl;
stud.getdata();
    int pos=(-1)*static_cast<int>(sizeof(stud));
    fl.seekp(pos,ios::cur);
    fl.write(reinterpret_cast<char *> (&stud), sizeof(student));
    cout<<"\n\n\t Record Updated";
    found=true;
}
}
File.close();
if(found==false)
cout<<"\n\n Record Not Found ";
cin.ignore();
cin.get();
}
//delete record with particular roll number
void delete_student(int n)
{
student stud;
ifstream iFile;
iFile.open("student.dat",ios::binary);
if(!iFile)
{
cout<<"File could not be opened... Press any Key to exit...";
cin.ignore();
cin.get();
return;
}
ofstream oFile;
oFile.open("Temp.dat",ios::out);
iFile.seekg(0,ios::beg);
while(iFile.read(reinterpret_cast<char *> (&stud), sizeof(student)))
{
if(stud.retrollno()!=n)
{
oFile.write(reinterpret_cast<char *> (&stud), sizeof(student));
}
}
oFile.close();
iFile.close();
remove("student.dat");
rename("Temp.dat","student.dat");
cout<<"\n\n\tRecord Deleted ..";
cin.ignore();
cin.get();
}

5. Игра в угадывание номеров. Казино

Это интересный проект, в котором мы узнаем о библиотеке, используемой для случайных чисел: cstdlib. Программа запрашивает сумму ставки, а затем предлагает пользователю угадать число при выпадении. Если сгенерированное случайное число совпадает с вводом пользователя, он выигрывает, в противном случае вычитаются деньги.

Пользователь может продолжать играть до тех пор, пока не проиграет всю сумму, которую вложил изначально.

Вот исходный код:

#include <iostream>
#include <string> // Needed to use strings
#include <cstdlib> // Needed to use random numbers
#include <ctime>
using namespace std;
void rules();
int main()
{
    string playerName;
    int balance; // stores player's balance
    int bettingAmount;
    int guess;
    int dice; // stores the random number
    char choice;
    srand(time(0)); // "Seed" the random generator
    cout << "\n\t\t========WELCOME TO CASINO WORLD=======\n\n";
    cout << "\n\nWhat's your Name : ";
    getline(cin, playerName);
    cout << "\n\nEnter the starting balance to play game : $";
    cin >> balance;
    do
    {
        system("cls");
        rules();
        cout << "\n\nYour current balance is $ " << balance << "\n";
// Get player's betting balance
        do
        {
            cout << "Hey, " << playerName<<", enter amount to bet : $";
            cin >> bettingAmount;
            if(bettingAmount > balance)
                cout << "Betting balance can't be more than current balance!\n"
                       <<"\nRe-enter balance\n ";
        }while(bettingAmount > balance);
// Get player's numbers
        do
        {
            cout << "Guess any betting number between 1 & 10 :";
            cin >> guess;
            if(guess <= 0 || guess > 10)
                cout << "\nNumber should be between 1 to 10\n"
                    <<"Re-enter number:\n ";
        }while(guess <= 0 || guess > 10);
        dice = rand()%10 + 1;
        if(dice == guess)
        {
            cout << "\n\nYou are in luck!! You have won Rs." << bettingAmount * 10;
            balance = balance + bettingAmount * 10;
        }
        else
        {
            cout << "Oops, better luck next time !! You lost $ "<< bettingAmount <<"\n";
            balance = balance - bettingAmount;
        }
        cout << "\nThe winning number was : " << dice <<"\n";
        cout << "\n"<<playerName<<", You have balance of $ " << balance << "\n";
        if(balance == 0)
        {
            cout << "You have no money to play ";
            break;
        }
        cout << "\n\n-->Do you want to play again (y/n)? ";
        cin >> choice;
    }while(choice =='Y'|| choice=='y');
    cout << "\n\n\n";
    cout << "\n\nThanks for playing the game. Your balance is $ " << balance << "\n\n";
    return 0;
}
void rules()
{
    system("cls");
    cout << "\t\t======CASINO NUMBER GUESSING RULES!======\n";
    cout << "\t1. Choose a number between 1 to 10\n";
    cout << "\t2. Winner gets 10 times of the money bet\n";
    cout << "\t3. Wrong bet, and you lose the amount you bet\n\n";
}

6. Судоку

Все мы знаем о популярной игре судоку, в которой нам нужно расположить числа от 1 до 9 так, чтобы они появлялись только один раз в строке и столбце сетки 9x9.

Программа использует концепцию поиска с возвратом. В этой программе мы жестко запрограммировали начальные значения, но вы также можете получить тот же ввод от пользователя.

Главное, что нужно понимать - это поиск с возвратом строк и столбцов, которым не присвоены никакие значения (равны нулю).

Взгляните на программу, выполните и увидите результаты:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
#define empty 0
#define N 9
bool isGridSafe(int grid[N][N], int row, int col, int num);
bool isEmptyLocation(int grid[N][N], int &row, int &col);
/* assign values to all the zero (not assigned) values for Sudoku solution
 */
bool SolveSudoku(int grid[N][N])
{
    int row, col;
    if (!isEmptyLocation(grid, row, col))
       return true;
    for (int num = 1; num <= 9; num++)
    {
        if (isGridSafe(grid, row, col, num))
        {
            grid[row][col] = num;
            if (SolveSudoku(grid))
                return true;
            grid[row][col] = empty;
        }
    }
    return false;
}
/* Check for entries that don't have a value. */
bool isEmptyLocation(int grid[N][N], int &row, int &col)
{
    for (row = 0; row < N; row++)
        for (col = 0; col < N; col++)
            if (grid[row][col] == empty)
                return true;
    return false;
}
/* Returns whether the assigned entry n in the particular row matches
   the given number num. */
bool UsedInRow(int grid[N][N], int prow, int number)
{
    for (int col = 0; col < N; col++)
        if (grid[prow][col] == number)
            return true;
    return false;
}
/* Returns true if the number num matches any number in the column */
bool UsedInCol(int grid[N][N], int pcol, int number)
{
    for (int row = 0; row < N; row++)
        if (grid[row][pcol] == number)
            return true;
  else 
     return false;
//Check if the entry used already in the grid box
bool UsedInBox(int grid[N][N], int boxBeginRow, int boxBeginCol, int number)

{
    bool tf = false;
    for (int row = 0; row < 3; row++)
        for (int col = 0; col < 3; col++)
            if (grid[row+boxBeginRow][col+boxBeginCol] == number)
                tf = true;
    return tf;
}
/* Checks if num can be assigned to a given prow,pcol location. */
bool isGridSafe(int grid[N][N], int prow, int pcol, int number)
{
    return !UsedInRow(grid, prow, number) && !UsedInCol(grid, pcol, number) &&
           !UsedInBox(grid, prow - prow % 3 , pcol - pcol % 3, number);
}
/* print result  */
void printResult(int finalgrid[N][N])
{
    for (int row = 0; row < N; row++)
    {
        for (int col = 0; col < N; col++)
            cout<< finalgrid[row][col]<<"  ";
        cout<<endl;
    }
}
/* Main */
int main()
{
    int grid[N][N] = {{0, 0, 0, 0, 0, 0, 0, 0, 0},
                      {0, 0, 0, 0, 0, 3, 0, 8, 5},
                      {0, 0, 1, 0, 2, 0, 0, 0, 0},
                      {0, 0, 0, 5, 0, 7, 0, 0, 0},
                      {0, 0, 4, 0, 0, 0, 1, 0, 0},
                      {0, 9, 0, 0, 0, 0, 0, 0, 0},
                      {5, 0, 0, 0, 0, 0, 0, 7, 3},
                      {0, 0, 2, 0, 1, 0, 0, 0, 0},
                      {0, 0, 0, 0, 4, 0, 0, 0, 9}}; 
if (SolveSudoku(grid) == true)
          printResult(grid);
    else
        cout<<"No solution found"<<endl;
    return 0;
}

7. Валидатор кредитных карт

Это простой проект, который использует алгоритм Луна (Luhn algorithm) для проверки кредитной карты пользователя. Программа работает со всеми популярными картами, такими как Visa, Amex, MasterCard и т.д.

Алгоритм Луна делает основные проверки; например, карта Visa должна начинаться с 4, а затем переходить к сложным вычислениям с помощью цифр. Это хорошая программа для изучения, потому что большинство транзакций электронной коммерции требуют проверки кредитной карты.

Исходный код на GitHub

8. Игра в "вертолетик"

Для всех детей 90-х это была одна из самых любимых игр, и ее очень легко было реализовать! В этом проекте мы будем использовать графику SDL.

Игра заключается в том, чтобы двигать вертолет вперед, не касаясь препятствий. Игрок должен управлять игрой с помощью клавиш, и, удерживая клавишу, вертолет перемещается, а при отпускании вертолет он сбивается.

Исходный код на GitHub

9. Использование графики для рисования и перемещения фигур

В этой графической программе вы научитесь делать машину, а затем заставлять ее двигаться с помощью графики. Это простая программа, написанная с использованием Turbo C ++; однако эта же программа будет работать и в других IDE, например в Dev C++, Code::Blocks и Visual Studios. Для работы программы вам необходимо подключить файл graphics.h.

Туториал на YouTube

10. Простая анимация для гонки "с пьяным человеком" от начала до конца.

Это интерактивное консольное приложение для анимации, в котором выбранный вами персонаж (любая буква от a до z) будет забавно перемещаться от начала до финиша. Если он завершает гонку в пределах указанного счетчика (в нашем случае 1000000), то мы печатаем конкретное сообщение.

#include<iostream>
#include<cmath>
#include<cstdlib>
#include<ctime>
using namespace std;
int main (){
  srand(time(0));
  const int size=60;
  cout << "Enter a letter to begin \n ";
  char x; cin>> x;
  int position = size /2;
  while (true) {
    cout << "|START|" ;
    for (int i=0; i<size;i++) {
      if (i == position) 
        cout << x;
      else cout << " ";}
    cout << "|FINISH|" << endl;
    int move= rand()%3 - 1;
    position = position + move; 
    if (position <1) {cout << "You could not finish the race!" <<endl; break;}
    if (position >size-1) {cout << "Yay! You finished the race" << endl; break;}
    for(int sleep=0; sleep< 1000000 ; ++ sleep);
  }   
  return 0; 
}

Заключение

В этой статье мы обсудили некоторые важные проекты начального и среднего уровня. Если вы правильно следовали коду, вы должны получить точные результаты.

Хотя Visual Studio предлагает множество функций, для ее загрузки требуется время.

Проекты будут работать на любой IDE. Сообщите нам, какие из проектов вы пробовали, в разделе комментариев!