Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: C/C++
DF2 :: ФОРУМЫ > Основные форумы > Софт и железо > Программирование / Coding
Страницы: 1, 2, 3
Эроласт
Какой же лютый трындец. Неужели нельзя взять уже готовую высокоуровневую обертку? Не поверю, что для си++ нет такой.
t800
Цитата(Эроласт @ 10 Oct 2016, 14:17) *
Какой же лютый трындец. Неужели нельзя взять уже готовую высокоуровневую обертку? Не поверю, что для си++ нет такой.


Ну я нагуглил исходники программы которая может посылать e-mail и умеет работать с SDL_net
называется она SDLmail правда она только текст умеет посылать (как и curl) то есть для атачмента
надо еще base64 делать, вот он эта программа:

FBX
Цитата
Код
using namespace std;

Ну сколько можно…
t800
Цитата(FBX @ 11 Oct 2016, 06:45) *
Цитата
Код
using namespace std;

Ну сколько можно…


Ну я счас для интереса попробовал изменить на

Код
using namespace fbx;


g++ сильно заругался.
Код
danya@danya:~/hello$ g++ server.cc -w -lSDL_net -o server
server.cc:9:17: ошибка: «fbx» is not a namespace-name
server.cc:9:20: ошибка: expected namespace-name before «;» token
server.cc:17:7: ошибка: «string» не является именем типа
server.cc:18:7: ошибка: «string» не является именем типа
server.cc: В функции «int main(int, char**)»:
server.cc:37:9: ошибка: нет декларации «cout» в этой области видимости
server.cc:37:9: замечание: suggested alternative:
/usr/include/c++/4.6/iostream:62:18: замечание:   «std::cout»
server.cc:37:73: ошибка: нет декларации «endl» в этой области видимости
server.cc:37:73: замечание: suggested alternative:
/usr/include/c++/4.6/ostream:543:5: замечание:   «std::endl»
server.cc:45:9: ошибка: нет декларации «cout» в этой области видимости
server.cc:45:9: замечание: suggested alternative:
/usr/include/c++/4.6/iostream:62:18: замечание:   «std::cout»
server.cc:50:9: ошибка: нет декларации «cout» в этой области видимости
server.cc:50:9: замечание: suggested alternative:
/usr/include/c++/4.6/iostream:62:18: замечание:   «std::cout»
server.cc:50:143: ошибка: нет декларации «endl» в этой области видимости
server.cc:50:143: замечание: suggested alternative:
/usr/include/c++/4.6/ostream:543:5: замечание:   «std::endl»
server.cc:66:9: ошибка: нет декларации «cout» в этой области видимости
server.cc:66:9: замечание: suggested alternative:
/usr/include/c++/4.6/iostream:62:18: замечание:   «std::cout»
server.cc:66:79: ошибка: нет декларации «endl» в этой области видимости
server.cc:66:79: замечание: suggested alternative:
/usr/include/c++/4.6/ostream:543:5: замечание:   «std::endl»
server.cc:74:9: ошибка: нет декларации «cout» в этой области видимости
server.cc:74:9: замечание: suggested alternative:
/usr/include/c++/4.6/iostream:62:18: замечание:   «std::cout»
server.cc:75:62: ошибка: нет декларации «endl» в этой области видимости
server.cc:75:62: замечание: suggested alternative:
/usr/include/c++/4.6/ostream:543:5: замечание:   «std::endl»
server.cc:83:9: ошибка: нет декларации «cout» в этой области видимости
server.cc:66:9: замечание: suggested alternative:
/usr/include/c++/4.6/iostream:62:18: замечание:   «std::cout»
server.cc:66:79: ошибка: нет декларации «endl» в этой области видимости
server.cc:66:79: замечание: suggested alternative:
/usr/include/c++/4.6/ostream:543:5: замечание:   «std::endl»
server.cc:74:9: ошибка: нет декларации «cout» в этой области видимости
server.cc:74:9: замечание: suggested alternative:
/usr/include/c++/4.6/iostream:62:18: замечание:   «std::cout»
server.cc:75:62: ошибка: нет декларации «endl» в этой области видимости
server.cc:75:62: замечание: suggested alternative:
/usr/include/c++/4.6/ostream:543:5: замечание:   «std::endl»
server.cc:83:9: ошибка: нет декларации «cout» в этой области видимости
server.cc:83:9: замечание: suggested alternative:
/usr/include/c++/4.6/iostream:62:18: замечание:   «std::cout»
server.cc:88:9: ошибка: нет декларации «cout» в этой области видимости
server.cc:88:9: замечание: suggested alternative:
/usr/include/c++/4.6/iostream:62:18: замечание:   «std::cout»
server.cc:88:57: ошибка: нет декларации «endl» в этой области видимости
server.cc:88:57: замечание: suggested alternative:
/usr/include/c++/4.6/ostream:543:5: замечание:   «std::endl»
server.cc:94:5: ошибка: нет декларации «cout» в этой области видимости
server.cc:94:5: замечание: suggested alternative:
/usr/include/c++/4.6/iostream:62:18: замечание:   «std::cout»
server.cc:94:38: ошибка: нет декларации «endl» в этой области видимости
server.cc:94:38: замечание: suggested alternative:
/usr/include/c++/4.6/ostream:543:5: замечание:   «std::endl»
server.cc:143:33: ошибка: нет декларации «SERVER_NOT_FULL» в этой области видимости
server.cc:157:33: ошибка: нет декларации «SERVER_FULL» в этой области видимости
Эроласт

Вот к чему приводит бездумное копирование кода из гугла в блокнот. Чувак даже не знает, что значит та или иная строка. А ещё уроки пишет.
Хорошо хоть не по майнкрафту.
t800
Цитата(Эроласт @ 11 Oct 2016, 17:36) *

Вот к чему приводит бездумное копирование кода из гугла в блокнот. Чувак даже не знает, что значит та или иная строка. А ещё уроки пишет.
Хорошо хоть не по майнкрафту.


Почему бездумное? Я же копирую не любой код а который нахожу по нужным мне запросам. Например мне нужно оправить e-mail и я гугулю запрос "код C++ SDL_net отправить e-mail " а про строку что она значит по моему самый простой способ понять что она делает это вставить ее в программу и посмотреть что она делает. Вот я вставил строчку

Код
using namespace fbx;


И увидел что она делает. Она делает ошибки. Значит это строчка не правильная! А правильная строчка вот такая:

Код
using namespace std;


Потому что с ней программа работает.
AlexSpl
Цитата
И увидел что она делает. Она делает ошибки.

Если в коде ошибки, его лучше закомментировать от греха подальше:

Код
// using namespace fbx;


Потом запускаешь программу, которая генерит набор символов заданной длины в лексикографическом порядке (например, "usign namespcae fеr;", "singu spaceamen sdt;" и т.д.) и комментишь неудачные варианты. Спустя конечное время обязательно должен получиться вариант, который скомпилируется.
feanor
Срочно, срочно учебник.
Мне для сишки когда-то очень зашел полуучебник-полусправочник Шилдта (по нему и учился, когда K&R еще советского издания отдал владельцу). Он и для С++ писал - вот его не читал, не знаю, но думаю - тоже вполне годнота для начала.
Герберт Шилдт, "Полный справочник по С++".
AlexSpl
Как поётся в одной старой песне: "Поймём потом, поймём потом"

https://www.youtube.com/watch?v=2KW3roDj3RI
tolich
Также неплохо попробовать другие варианты:
Код
using deep space nine;
tossing whole place down;
mocking to face a clown;
Вариантов нереально много.
t800
Цитата(AlexSpl @ 12 Oct 2016, 01:18) *
Цитата
И увидел что она делает. Она делает ошибки.

Если в коде ошибки, его лучше закомментировать от греха подальше:

Код
// using namespace fbx;



Я так и делаю


Цитата
Потом запускаешь программу, которая генерит набор символов заданной длины в лексикографическом порядке (например, "usign namespcae fеr;", "singu spaceamen sdt;" и т.д.) и комментишь неудачные варианты. Спустя конечное время обязательно должен получиться вариант, который скомпилируется.


А вот это не правильно! Надо просто посмотреть в Google что за ошибка. И вставить тот код который написано что надо вставлять при таких ошибках. И тогда получается намного быстрее.

Кстат вот! Вот код исходника что делает base64 кодирование.

Код
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include "base64.h"
#include <cstring>


int main() {

//    char *FileBuf = NULL;
    FILE* hFile = NULL;
    unsigned long int FileSize,TotalSize;
//    char *SendBuf = NULL;
    unsigned int q, i,res;
        hFile = fopen("input.txt","rb");

        if(hFile == NULL)
          {
              fputs("Ошибка файла \n", stderr);
              exit(1);
              }

// Из примера


  // определяем размер файла
  fseek(hFile , 0 , SEEK_END);                          // устанавливаем позицию в конец файла
  long lSize = ftell(hFile);                            // получаем размер в байтах
  q = lSize/54+1;
  rewind (hFile);                                       // устанавливаем указатель в конец файла

  char * SendBuf = (char*) malloc(sizeof(char) * lSize);
  char * FileBuf = (char*) malloc(sizeof(char) * lSize); // выделить память для хранения содержимого файла
  if (FileBuf  == NULL)
  {
      fputs("Ошибка памяти", stderr);
      exit(2);
  }

/*  size_t result = fread(buffer, 1, lSize, hFile);       // считываем файл в буфер
//    fread(buffer,sizeof(char),54,hFile);
  if (result != lSize)
  {
      fputs("Ошибка чтения", stderr);
      exit (3);
  }

  //содержимое файла теперь находится в буфере
  puts(buffer);

  // завершение работы
  fclose (hFile);
  free (buffer);

// Конец  из примера

          
*/

// Проверяем размер:

// FileSize = 0;
//        while(!feof(hFile))
//            FileSize += fread(FileBuf,sizeof(char),54,hFile);
//        TotalSize += FileSize;
// sending the file:
//        if(TotalSize/1024 > MSG_SIZE_IN_MB*1024)
//            throw ECSmtp(ECSmtp::MSG_TOO_BIG);
//        else
//        {
//            fseek (hFile,0,SEEK_SET);
//            MsgPart = 0;
//            for(i=0;i<FileSize/54+1;i++)
//            {
//        res = fread(FileBuf,sizeof(char),54,hFile);
//
//MsgPart ? strcat(SendBuf,base64_encode(reinterpret_cast<const unsigned char*(FileBuf),res).c_str()):              : //strcpy(SendBuf,base64_encode(reinterpret_cast<const unsigned char*(FileBuf),res).c_str());
//                strcat(SendBuf,"\r\n");
//                MsgPart += res + 2;
//        if(MsgPart >= BUFFER_SIZE/2)
//        {
// sending part of the message
//                    MsgPart = 0;
//                    SendData(); // FileBuf, FileName, fclose(hFile);
//                }
//            }
//            if(MsgPart)
//            {
//                SendData(); // FileBuf, FileName, fclose(hFile);
//            }
// }
//    fclose(hFile);
//    }
//    delete[] FileBuf;
//    delete[] FileName;


        FileSize = 0;
        while(!feof(hFile))
        {
        FileSize = fread(FileBuf,sizeof(char),54,hFile);
//        std::cout << "FileSize равно="  << FileSize << "\r\n";
//         TotalSize += FileSize;
//              std::cout << "TotalSize равно=" << TotalSize << "\r\n";
        }
        // Делаем буфер:
        fseek (hFile,0,SEEK_SET);
//        std::cout << "TotalSize равно=" << TotalSize << "\r\n";
//        std::cout << "FileSize равно=" << FileSize << "\r\n";
//        std::cout << "lSize равно=" << lSize << "\r\n";
//        std::cout << "q равно=" << q << "\r\n";
            for(i=0;i<q;i++)
{        res = fread(FileBuf,sizeof(char),54,hFile);
//        std::cout << "i равно =" << i << "\r\n";
        strcat(SendBuf,base64_encode(reinterpret_cast<const unsigned char*>(FileBuf),54).c_str());
//        strcat(SendBuf,"ПРИВЕТ  ЭТО ДАНЯ!!!!!\r\n");
            strcpy(SendBuf,base64_encode(reinterpret_cast<const unsigned char*>(FileBuf),res).c_str());
        strcat(SendBuf,"\r");
//        puts(SendBuf);

//        std::cout << "RES равно=" << res << "\r\n";
            if(SendBuf)
        {
                puts(SendBuf);
//                FILE * ptrFile = fopen ( "output.txt" , "wb" );
//                fwrite(SendBuf, 1 , sizeof(SendBuf) , ptrFile ); // записать в файл содержимое буфера
//                fclose (ptrFile);
//                fclose(hFile);
            }
}
    return 0;
}



Собрал его из трех разных правда он еще в файл писать не может, приходится его вот так запускать

Код
./test > test.txt


Но кодирует уже правильно. barb_metal.gif barb_metal.gif barb_metal.gif
t800
Фух заработало! barb_metal.gif barb_metal.gif barb_metal.gif
И вот что у меня получилось:

Код
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include "base64.h"
#include <cstring>


int main() {

    FILE* hFile = NULL;
    unsigned int q, i,res;
        hFile = fopen("input.txt","rb");

        if(hFile == NULL)
          {
              fputs("Ошибка файла \n", stderr);
              exit(1);
              }

  // определяем размер файла
  fseek(hFile , 0 , SEEK_END);                          // устанавливаем позицию в конец файла
  long lSize = ftell(hFile);                            // получаем размер в байтах
  q = lSize/54+1;
  rewind (hFile);                                       // устанавливаем указатель в конец файла

  char * SendBuf = (char*) malloc(sizeof(char) * lSize);
  char * FileBuf = (char*) malloc(sizeof(char) * lSize); // выделить память для хранения содержимого файла
  if (FileBuf  == NULL)
     {
      fputs("Ошибка памяти", stderr);
      exit(2);
     }
    // Делаем буфер:
    fseek (hFile,0,SEEK_SET);
    FILE * ptrFile = fopen ( "output.txt" , "wb" );
    for(i=0;i<q;i++)
    {    res = fread(FileBuf,sizeof(char),54,hFile);
        strcat(SendBuf,base64_encode(reinterpret_cast<const unsigned char*>(FileBuf),res).c_str());
            strcpy(SendBuf,base64_encode(reinterpret_cast<const unsigned char*>(FileBuf),res).c_str());
        strcat(SendBuf,"\r");
            fputs(SendBuf, ptrFile);
    }
    fclose (ptrFile);
  return 0;
}


AlexSpl
Цитата
Фух заработало!

Ну и слава богу!
t800
Цитата(AlexSpl @ 13 Oct 2016, 05:05) *
Цитата
Фух заработало!

Ну и слава богу!



Да чуть не забыл! Чтобы код работал рядом с ним надо положить еще два файлика: base64.h и base64.cpp
и в них написать код из вот этого примера http://www.adp-gmbh.ch/cpp/common/base64.html
и собирать или камандой

Код
g++ *.cpp -o test


Или сделать вот такой make файл

Код
nano makefile


Написать в него вот такой код (я его взял от другой программы)

Код
# Automatyczny makefile

CC = g++
CFLAGS = -Wall -O2 -DLINUX
ONLYCOMPILE = $(CC) $(CFLAGS) -c -g
OBJFILES :=  $(patsubst %.cpp,%.o,$(wildcard *.cpp))
PROGNAME = test

all: $(PROGNAME)

$(PROGNAME) : $(OBJFILES)
        $(CC) -o $(PROGNAME) $(OBJFILES)

%.o: %.cpp
        ${ONLYCOMPILE} -o $@ $<

clean:
        rm *.o


И собирать камандой

Код
make
t800
Цитата(t800 @ 12 Oct 2016, 23:14) *
Фух заработало! barb_metal.gif barb_metal.gif barb_metal.gif
И вот что у меня получилось:

Код
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include "base64.h"
#include <cstring>


int main() {

    FILE* hFile = NULL;
    unsigned int q, i,res;
        hFile = fopen("input.txt","rb");

        if(hFile == NULL)
          {
              fputs("Ошибка файла \n", stderr);
              exit(1);
              }

  // определяем размер файла
  fseek(hFile , 0 , SEEK_END);                          // устанавливаем позицию в конец файла
  long lSize = ftell(hFile);                            // получаем размер в байтах
  q = lSize/54+1;
  rewind (hFile);                                       // устанавливаем указатель в конец файла

  char * SendBuf = (char*) malloc(sizeof(char) * lSize);
  char * FileBuf = (char*) malloc(sizeof(char) * lSize); // выделить память для хранения содержимого файла
  if (FileBuf  == NULL)
     {
      fputs("Ошибка памяти", stderr);
      exit(2);
     }
    // Делаем буфер:
    fseek (hFile,0,SEEK_SET);
    FILE * ptrFile = fopen ( "output.txt" , "wb" );
    for(i=0;i<q;i++)
    {    res = fread(FileBuf,sizeof(char),54,hFile);
        strcat(SendBuf,base64_encode(reinterpret_cast<const unsigned char*>(FileBuf),res).c_str());
            strcpy(SendBuf,base64_encode(reinterpret_cast<const unsigned char*>(FileBuf),res).c_str());
        strcat(SendBuf,"\r");
            fputs(SendBuf, ptrFile);
    }
    fclose (ptrFile);
  return 0;
}


Я вот думаю! Мне надо три файла по почте послать - autosave.sav, fheroes2.hgs и fheroes2.hgsс и получается что для кадого файла надо будет писать такой же код и он получится очень длинный. Я посмотрел как в других программах сделано, там сделано по другому делается void Send и что-то такое и потом просто в дпругой месте просто пишут это Send и именен файла который надо послать. И подумал может мне тоже так сделать? Только правильно надо этот void Send написать чтобы потому ему файлы можно было указывать?




feanor
СРОЧНО УЧЕБНИК
t800
Так ну я вроде сделал

Код
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include "base64.h"
#include <cstring>

int Send(const char *FileName)
{
unsigned int q, i,res;
FILE* hFile = NULL;    
hFile = fopen(FileName,"rb");    

        if(hFile == NULL)
          {
              fputs("Ошибка файла \n", stderr);
              exit(1);
              }

  // определяем размер файла
  fseek(hFile , 0 , SEEK_END);                          // устанавливаем позицию в конец файла
  long lSize = ftell(hFile);                            // получаем размер в байтах
  q = lSize/54+1;
  rewind (hFile);                                       // устанавливаем указатель в конец файла

  char * SendBuf = (char*) malloc(sizeof(char) * lSize);
  char * FileBuf = (char*) malloc(sizeof(char) * lSize); // выделить память для хранения содержимого файла
  char * TitleBuf = (char*) malloc(sizeof(char) * 1024);
  if (FileBuf  == NULL)
     {
      fputs("Ошибка памяти", stderr);
      exit(2);
     }
    // Делаем буфер:
    fseek (hFile,0,SEEK_SET);
    FILE * ptrFile = fopen ( "output.txt" , "ab" );
//Пишем заголовки
    strcat(TitleBuf,"\n");
    strcat(TitleBuf,"Subject: Turnir\n");
    strcat(TitleBuf,"Content-Type: multipart/mixed;\n");
    strcat(TitleBuf,"Content-Disposition: attachment;\n");
    strcat(TitleBuf,"\tfilename=autosave.sav\n");
    strcat(TitleBuf,"Content-Transfer-Encoding: base64\n");
    strcat(TitleBuf,"Content-Type: application/octet-stream;\n");
    strcat(TitleBuf,"\tname=autosave.sav\n\n");
    fputs(TitleBuf, ptrFile);
//Кодируем и пищем файл
    for(i=0;i<q;i++)
    {    
        res = fread(FileBuf,sizeof(char),54,hFile);
        strcat(SendBuf,base64_encode(reinterpret_cast<const unsigned char*>(FileBuf),res).c_str());
        strcpy(SendBuf,base64_encode(reinterpret_cast<const unsigned char*>(FileBuf),res).c_str());
        strcat(SendBuf,"\r\n");
        fputs(SendBuf, ptrFile);
        fflush (ptrFile);
    }
    //fclose (ptrFile);
  return(0);
}

int main() {
Send("autosave.sav");
Send("fheroes2.hgs");
Send("fheroes2.hgsc");
return 0;
}


И оно сейчас вроде работает но есть одна проблема.

Если в конце int Send написать как оно и полагается каманду fclose (ptrFile); то она пишет в конце в файл еще какие-то дурацкие значки. Я погуглил это называется мусор и вроде советуют вставить в код команду fflush
я ее в разные места на пробу повствалял. И оно вроде заработало нормально (мусор перестало писать) но только при условии если команда fclose (ptrFile); выключена (как это в коде сейчас), оно сейчас вроде работает но мне это нравится почему команда fclose (ptrFile); включена все равно пишет мусор.
t800
Фух вроде нашел правильную каманду

Код
memset(Buf, 0, sizeof(Buf));


И в результате получилось вот так

Код
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include "base64.h"

int Send(const char *FileName)
{
unsigned int q, i,res;
FILE* hFile = NULL;    
hFile = fopen(FileName,"rb");    

        if(hFile == NULL)
          {
              fputs("Ошибка файла \n", stderr);
              exit(1);
              }

  // определяем размер файла
  fseek(hFile , 0 , SEEK_END);                          // устанавливаем позицию в конец файла
  long lSize = ftell(hFile);                            // получаем размер в байтах
  q = lSize/54+1;
  rewind (hFile);                                       // устанавливаем указатель в конец файла

  char * SendBuf = (char*) malloc(sizeof(char) * lSize);
  char * FileBuf = (char*) malloc(sizeof(char) * lSize); // выделить память для хранения содержимого файла
  char * TitleBuf = (char*) malloc(sizeof(char) * 1024);
  if (FileBuf  == NULL)
     {
      fputs("Ошибка памяти", stderr);
      exit(2);
     }
    // Делаем буфер:
    fseek (hFile,0,SEEK_SET);
    FILE * ptrFile = fopen ( "output.txt" , "ab" );
//Пишем заголовки
    memset(SendBuf, 0, sizeof(SendBuf)); // чистим буфер от мусора
    memset(TitleBuf, 0, sizeof(TitleBuf)); // чистим буфер от мусора
    strcat(TitleBuf,"Subject: Turnir\n");
    strcat(TitleBuf,"Content-Type: multipart/mixed;\n");
    strcat(TitleBuf,"Content-Disposition: attachment;\n");
    strcat(TitleBuf,"\tfilename=autosave.sav\n");
    strcat(TitleBuf,"Content-Transfer-Encoding: base64\n");
    strcat(TitleBuf,"Content-Type: application/octet-stream;\n");
    strcat(TitleBuf,"\tname=autosave.sav\n\n");
    fputs(TitleBuf, ptrFile);
//Кодируем и пищем файл
    for(i=0;i<q;i++)
    {    
        res = fread(FileBuf,sizeof(char),54,hFile);
        strcat(SendBuf,base64_encode(reinterpret_cast<const unsigned char*>(FileBuf),res).c_str());
        strcpy(SendBuf,base64_encode(reinterpret_cast<const unsigned char*>(FileBuf),res).c_str());
        strcat(SendBuf,"\r\n");
        fputs(SendBuf, ptrFile);
    }
    memset(SendBuf, 0, sizeof(SendBuf));
    strcat(SendBuf,"\r\n");
    fputs(SendBuf, ptrFile);
    fclose (ptrFile);
    fclose (hFile);
  return(0);
}

int main() {
Send("autosave.sav");
Send("fheroes2.hgs");
Send("fheroes2.hgsc");
return 0;
}


А вот и новый урок:

t800
Сегодня почитал про классы и про ООП и решил попробовать сделать какой-нибудь урок про классы.
Нашел пример на английском про студентов и сделал из него пример для учеников по русски

Получилось вот так:


Код
/* ucheniki.h */
#include <string>

class Ucheniki {
    public:
        // Установка имени ученика
        void ustanovit_imya(std::string imya_uchenika)
        {
            imya = imya_uchenika;
        }
        // Получение имени ученика
        std::string poluchit_imya()
        {
            return imya;
        }
        // Установка фамилии ученика
        void ustanovit_familiya(std::string familiya_uchenika)
        {
            familiya = familiya_uchenika;
        }
        // Получение фамилии ученика
        std::string poluchit_familiya()
        {
            return familiya;
        }
        // Установка промежуточных оценок
        void ustanovit_ocenki(int ocenki_uchenika[])
        {
            for (int i = 0; i < 5; ++i) {
                ocenki[i] = ocenki_uchenika[i];
            }
        }
        // Установка среднего балла
        void ustanovit_sredniy_bal(float bal)
        {
            sredniy_bal = bal;
        }
        // Получение среднего балла
        float poluchit_sredniy_bal()
        {
            return sredniy_bal;
        }

    private:
        // Промежуточные оценки
        int ocenki[5];
        // Средний балл
        float sredniy_bal;
        // Имя
        std::string imya;
        // Фамилия
        std::string familiya;
};


И файл ucheniki.cpp

Код
/* ucheniki.cpp */
#include <iostream>
#include "ucheniki.h"

int main()
{
    // Создание объекта класса Uchеniki
    Ucheniki uchenik;

    std::string imya;
    std::string familiya;

    // Ввод имени с клавиатуры
    std::cout << "Имя: ";
    getline(std::cin, imya);

    // Ввод фамилии
    std::cout << "Фамилия: ";
    getline(std::cin, familiya);

    // Сохранение имени и фамилии в объект класса Ucheniki
    uchenik.ustanovit_imya(imya);
    uchenik.ustanovit_familiya(familiya);

    // Оценки
    int ocenki[5];
    // Сумма всех оценок
    int summa = 0;

    // Ввод промежуточных оценок
    for (int i = 0; i < 5; ++i) {
        std::cout << "Оценка " << i+1 << ": ";
        std::cin >> ocenki[i];
        // суммирование
        summa += ocenki[i];
    }

    // Сохраняем промежуточные оценки в объект класса Uchenik
    uchenik.ustanovit_ocenki(ocenki);
    // Считаем средний балл
    float sredniy_bal = summa / 5.0;
    // Сохраняем средний балл в объект класса Uchenik
    uchenik.ustanovit_sredniy_bal(sredniy_bal);
    // Выводим данные по ученику
    std::cout << "Средний бал для ученика " << uchenik.poluchit_imya() << " "
         << uchenik.poluchit_familiya() << " равен: "
         << uchenik.poluchit_sredniy_bal() << std::endl;

    return 0;
}


Потром собрал командой

Код
g++ ucheniki.cpp -o ucheniki


И все собралось нормально.

Тогда я решил попробовать, а что будет если имена функция и переменный писать не только по русски но и русскими буквами и написал вместо int summa = 0;

Код
   int сумма = 0;


и вместо summa += ocenki[i];

Код
  сумма += ocenki[i];


и

Код
float sredniy_bal = сумма / 5.0;


и попробовал собрать и получит такие ошибки

Код
danya@danya:~/class$ g++ ucheniki.cpp -o ucheniki
ucheniki.cpp:28:5: ошибка: в программе обнаружен некорректный символ «\321»
ucheniki.cpp:28:5: ошибка: в программе обнаружен некорректный символ «\201»
ucheniki.cpp:28:5: ошибка: в программе обнаружен некорректный символ «\321»
ucheniki.cpp:28:5: ошибка: в программе обнаружен некорректный символ «\203»
ucheniki.cpp:28:5: ошибка: в программе обнаружен некорректный символ «\320»
ucheniki.cpp:28:5: ошибка: в программе обнаружен некорректный символ «\274»
ucheniki.cpp:28:5: ошибка: в программе обнаружен некорректный символ «\320»
ucheniki.cpp:28:5: ошибка: в программе обнаружен некорректный символ «\274»
ucheniki.cpp:28:5: ошибка: в программе обнаружен некорректный символ «\320»
ucheniki.cpp:28:5: ошибка: в программе обнаружен некорректный символ «\260»
ucheniki.cpp:35:9: ошибка: в программе обнаружен некорректный символ «\321»
ucheniki.cpp:35:9: ошибка: в программе обнаружен некорректный символ «\201»
ucheniki.cpp:35:9: ошибка: в программе обнаружен некорректный символ «\321»
ucheniki.cpp:35:9: ошибка: в программе обнаружен некорректный символ «\203»
ucheniki.cpp:35:9: ошибка: в программе обнаружен некорректный символ «\320»
ucheniki.cpp:35:9: ошибка: в программе обнаружен некорректный символ «\274»
ucheniki.cpp:35:9: ошибка: в программе обнаружен некорректный символ «\320»
ucheniki.cpp:35:9: ошибка: в программе обнаружен некорректный символ «\274»
ucheniki.cpp:35:9: ошибка: в программе обнаружен некорректный символ «\320»
ucheniki.cpp:35:9: ошибка: в программе обнаружен некорректный символ «\260»
ucheniki.cpp:41:5: ошибка: в программе обнаружен некорректный символ «\321»
ucheniki.cpp:41:5: ошибка: в программе обнаружен некорректный символ «\201»
ucheniki.cpp:41:5: ошибка: в программе обнаружен некорректный символ «\321»
ucheniki.cpp:41:5: ошибка: в программе обнаружен некорректный символ «\203»
ucheniki.cpp:41:5: ошибка: в программе обнаружен некорректный символ «\320»
ucheniki.cpp:41:5: ошибка: в программе обнаружен некорректный символ «\274»
ucheniki.cpp:41:5: ошибка: в программе обнаружен некорректный символ «\320»
ucheniki.cpp:41:5: ошибка: в программе обнаружен некорректный символ «\274»
ucheniki.cpp:41:5: ошибка: в программе обнаружен некорректный символ «\320»
ucheniki.cpp:41:5: ошибка: в программе обнаружен некорректный символ «\260»
ucheniki.cpp: В функции «int main()»:
ucheniki.cpp:28:20: ошибка: expected unqualified-id before «=» token
ucheniki.cpp:35:20: ошибка: expected primary-expression before «+=» token
ucheniki.cpp:41:36: ошибка: expected primary-expression before «/» token


Почему то русскими буквами писать нельзя no.gif

А как сделать чтобы можно было?

Потому что если пишешь английскими буквами все время ошибки получаются, потому что то в одно месте напишешь familiya а в другом familya и потом не понимаешь почему оно не собирается, а если писать на английском языке иногда забываешь что слово значит и потому путаешься.
tolich
Цитата(t800 @ 17 Apr 2017, 17:51) *
Почему то русскими буквами писать нельзя?
Не положено. Вначале русскими, потом арабскими, потом еврейскими, и потом без толстого словаря программу не понять. Русскими транслитом тоже, собственно, нежелательно.
Эроласт
Цитата(tolich @ 17 Apr 2017, 22:24) *
Цитата(t800 @ 17 Apr 2017, 17:51) *
Почему то русскими буквами писать нельзя?
Не положено. Вначале русскими, потом арабскими, потом еврейскими, и потом без толстого словаря программу не понять. Русскими транслитом тоже, собственно, нежелательно.

Русским транслитом тоже не положено всё по тем же причинам.
К слову, в некоторых интерпретируемых языках, вроде javascript и ruby, в названиях переменных допускаются любые буквы из юникода, но этой фичей никто в здравом уме всё равно не пользуется)

Цитата
а если писать на английском языке иногда забываешь что слово значит и потому путаешься

Борись с трудностями! Я хорошенько так натаскал свой английский как раз за счёт программирования smile.gif
t800
Цитата(tolich @ 17 Apr 2017, 22:24) *
Цитата(t800 @ 17 Apr 2017, 17:51) *
Почему то русскими буквами писать нельзя?
Не положено. Вначале русскими, потом арабскими, потом еврейскими, и потом без толстого словаря программу не понять. Русскими транслитом тоже, собственно, нежелательно.


А по-моему очень даже здорово если писать на С++ по русски. Во-первых понятней (а то все время приходится каждую строчку в Google Переводчике проверять) а во-вторых ошибок меньше чем когда русские слова английскими буквами пишешь.

ЗЫ Да и я все такие нагуглил как сделать чтоб компилятор понимал русские буквы.

Для это надо сперва дать команду

Код
sudo apt-get install clang


а потом вместо

Код
g++ uchenik.cpp -o uchenik


компилировать командой

Код
clang++ uchenik.cpp -o uchenik


И тогда он на русские буквы не ругается!

Вот переписал код вот так

Код
/* ucheniki.h */
#include <string>

class Ученики {
     public:
         // Установка имени ученики
         void установить_имя(std::string имя_ученика)
         {
             имя = имя_ученика;
         }
         // Получение имени ученика
         std::string получить_имя()
         {
             return имя;
         }
         // Установка фамилии ученика
         void установить_фамилия(std::string фамилия_ученика)
         {
             фамилия = фамилия_ученика;
         }
         // Получение фамилии ученика
         std::string получить_фамилия()
         {
             return фамилия;
         }
         // Установка промежуточных оценок
         void установить_оценки(int оценки_ученика[])
         {
             for (int i = 0; i < 5; ++i) {
                 оценки[i] = оценки_ученика[i];
             }
         }
         // Установка среднего балла
         void установить_средний_балл(float балл)
         {
             средний_балл = балл;
         }
         // Получение среднего балла
         float получить_средний_балл()
         {
             return средний_балл;
         }

     private:
         // Промежуточные оценки
         int оценки[5];
         // Средний балл
         float средний_балл;
         // Имя
         std::string имя;
         // Фамилия
         std::string фамилия;
};



Код
/* ucheniki.cpp */
#include <iostream>
#include "ucheniki.h"

int main()
{
     // Создание объекта класса Uchnik
     Ученики ученик;

     std::string имя;
     std::string фамилия;

     // Ввод имени с клавиатуры
     std::cout << "Имя: ";
     getline(std::cin, имя);

     // Ввод фамилии
     std::cout << "Фамилия: ";
     getline(std::cin, фамилия);

     // Сохранение имени и фамилии в объект класса Ucheniki
     ученик.установить_имя(имя);
     ученик.установить_фамилия(фамилия);

     // Оценки
     int оценки[5];
     // Сумма всех оценок
     int сумма = 0;

     // Ввод промежуточных оценок
     for (int i = 0; i < 5; ++i) {
         std::cout << "Оценка " << i+1 << ": ";
         std::cin >> оценки[i];
         // суммирование
         сумма += оценки[i];
     }

     // Сохраняем промежуточные оценки в объект класса Uchenik
     ученик.установить_оценки(оценки);
     // Считаем средний балл
     float средний_балл = сумма / 5.0;
     // Сохраняем средний балл в объект класса Uchenik
     ученик.установить_средний_балл(средний_балл);
     // Выводим данные по ученику
     std::cout << "Средний бал для ученика " << ученик.получить_имя() << " "
          << ученик.получить_фамилия() << " равен: "
          << ученик.получить_средний_балл() << std::endl;

     return 0;
}


И все Работает!


tolich
Если компилятор воспринимает чёрт знает какие символы в качестве букв, это повод искать ему замену. Стандарт языка C++ чётко прописывает, какие символы считаются буквами. Всё остальное - нестандартное расширение и не сработает с другим компиляторе, лучше следующим стандарту.
t800
Цитата(tolich @ 18 Apr 2017, 11:16) *
Если компилятор воспринимает чёрт знает какие символы в качестве букв, это повод искать ему замену. Стандарт языка C++ чётко прописывает, какие символы считаются буквами. Всё остальное - нестандартное расширение и не сработает с другим компиляторе, лучше следующим стандарту.


Не знаю я сейчас нагулил что Google перешел на Clang, а поодерживать GCC отказался https://www.opennet.ru/opennews/art.shtml?num=43567

ЗЫ Уже два года как перешел.
IQUARE
Цитата
И все Работает!

Лучше бы ты писал все по-английски (и не транслитом, да), t800. Потому как такими уроками ты вряд ли кого-то обучишь.
t800
Цитата(IQUARE @ 18 Apr 2017, 13:16) *
Цитата
И все Работает!

Лучше бы ты писал все по-английски (и не транслитом, да), t800. Потому как такими уроками ты вряд ли кого-то обучишь.


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

А когда я переписал класс по русски все стало намного понятней и наглядней и я наконец понял почему в учебнике написано что ОПП для челока понятней потому, что человек думает объектами. Просто учебники писали американы и они думают на английском и поэтому когда в классе все объекты английские оно конечно им понятней. А я по английски думать не умею и мне стало понятней как "им понятней" только когда класс переписал по русски. И ИМХО любому новичку кто думает на русском тоже так будет.
tolich
Абстрактное мышление. Очень важный перк для программиста.
t800
Цитата(tolich @ 18 Apr 2017, 17:12) *
Абстрактное мышление. Очень важный перк для программиста.


Так ведь когда оно на русском то оно же много легче что-нибудь представить.
Вот я например вижу слово СТОЛ и у меня тут же в голове возникает образ стола, а если я вижу слово БИАО или ТЕБУРУ то никакого образа стола у меня в голове не возникает, потому что биао - это стол по китайски, а тебуру по японски, а я-то ведь думаю по русски. Поэтому если думаешь по русски то объекты ИМХО лучше писать тоже по русски, потому что так понятней и представить их тоже легче.
feanor
Не надо писать на русском по множеству причин (большинство из них надуманные и социальные, но тем не менее). Но на транслите в любом случае хуже, да.
Все равно надо знать английский для документации и стэковерфлоу

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

Цитата
К слову, в некоторых интерпретируемых языках, вроде javascript и ruby, в названиях переменных допускаются любые буквы из юникода, но этой фичей никто в здравом уме всё равно не пользуется)
В шарпе можно, в яве вроде тоже, потому что победа юникода над злом и мракобесием.

t800
Цитата(feanor @ 18 Apr 2017, 17:42) *
Не надо писать на русском по множеству причин (большинство из них надуманные и социальные, но тем не менее). Но на транслите в любом случае хуже, да.
Все равно надо знать английский для документации и стэковерфлоу


Фух ну я же вовсе не говорю что ВСЕМ НАДО писать по русски, я просто сказал что решил разобраться в классах. И взял из английский пример про студентов и начал его разбирать и в нем запутался. Тогда я взял и переименовал все английские объекты в русски и стало много понятней, а когда переписал все объекты и фунции по-русски стало вообще просто и я наконец то понял почему американы в книжках пишут что ООП для человека понятней потому что он думает объектами -просто американы думают английскими объектами поэтому им оно сразу понятней, а другим становится так же понятней только когда они как американы на английком языке думать научатся, а если думать по русски а названия через переводчик переводить, то оно вовсе не понятней.
tolich
Английский язык - айтишная лингва франка. К изучению обязательно.
t800
Цитата(tolich @ 18 Apr 2017, 18:05) *
Английский язык - айтишная лигва франка. К изучению обязательно.


Я разве против? Просто для того чтобы думать по английски как по русски надо английский выучить как русский, а когда думаешь про русски, а английский черех переводчик, то разобраться проще если писать объекты по русски.
t800
Kcтати, я тут занялся свои новым сайтом, и я тут подумал: а можно как нибудь сделать, чтобы можно было написать на сайте код, нажать на кнопку компилятора, и код после этого можно было на сайте запустить? Тогда я думаю, новичкам интересно было бы программировать, ибо не надо ставить никакие компиляторы, а можно просто писать код, собирать и выполнять прямо на сайте.
tolich
http://cpp.sh/
t800
Цитата(tolich @ 18 Apr 2017, 22:41) *


Класно!

ЗЫ Добавил его себе на сайт
tolich
Какая-то странная хрень с UDL-ами.
Код
std::cout << std::boolalpha << (5.+10.i) << " " << std::complex<double>(5.+10.i) << std::endl;
выводит
Код
true (5,10)
То есть, похоже, что complex<double> за каким-то хреном приводится к bool. То же самое, если результат записать в переменную выводимого типа (auto). Typeid переменной имеет имя "Cd". ???

Edit:
Цитата
The ISO C++14 library also defines the ‘i’ suffix, so C++14 code that includes the ‘<complex>’ header cannot use ‘i’ for the GNU extension. The ‘j’ suffix still has the GNU meaning.
Но срабатывает именно расширение GNU, результат _Complex double...

Edit: solved
Я забыл уточнить, что использовал qmake, надо было добавить в pro-файл:
Код
CONFIG += strict_c++
tolich
Код
template<class T> const T operator++(T&t, int)
{
    T temp(t);
    ++t;
    return temp;
}
tolich
Код
namespace concat_helpers
{
    auto size(const std::string &s) { return s.size(); }
    constexpr auto size(const char *p) { auto q = p; while (*q++); return q - p; }
    constexpr auto size(char) { return 1; }
    std::string append(std::string &d, const std::string &s) { return d.append(s); }
    std::string append(std::string &d, const char *p) { return d.append(p); }
    std::string append(std::string &d, char ch) { return d.append(1, ch); }

    template<class T> size_t size(T t) { return std::to_string(t).size(); }
    template<class T> std::string append(std::string &d, T t) { return d.append(std::to_string(t)); }
}

template<typename...T>
std::string concat(T...args)
{
    size_t size = (concat_helpers::size(args) + ...);
    std::string result;
    result.reserve(size);
    (concat_helpers::append(result, args), ...);
    return result;
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.