3 / 3 / 1
Регистрация: 21.03.2016
Сообщений: 97
1

Параметры функции main

13.04.2017, 10:39. Показов 1480. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Помогите пожалуйста.

Внизу дан код программы, у main есть аргументы argc и argv. Преподаватель сказал эти аргументы вынести в тело функции. первый аргумент - это имя программы. второй входной файл, третий выходной файл. Как их инициализировать?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include "geometry.h"
#include "search.h"
#include "file.h"
#include <iostream>
#include <locale.h>
 
using namespace std;
 
int main(int argc, char** argv)
{
    setlocale(LC_ALL, "Russian");
    //system("color 13");
 
    {
        cout << "Запуск: Triangles.exe inf.txt outf.txt" << endl;
        return -1;
    }
    const char* inFileName = argv[1]; //Имя входного файла
    const char* outFileName = argv[2]; //Имя выходного файла
    int pointNum = countPoints(inFileName);
    if (pointNum < 0)
    {
        cout << "Входной файл не существует" << endl;
        return -2;
    }
    else if (pointNum < 4)
    {
        cout << "Входной файл слишком мал" << endl;
        return -3;
    }
    Point* pointArray = new Point[pointNum];
    if (!readPoints(inFileName, pointArray, pointNum))
    {
        cout << "Неизвестная ошибка при вводе точек" << endl;
        return -3;
    }
    const int maxTrNum = 3;
    Triangle trArray[maxTrNum];
    searchLargestTriangles(pointArray, pointNum, trArray, maxTrNum);
    if (!writeTriangles(outFileName, trArray, maxTrNum))
    {
        cout << "Не удалось записать результат" << endl;
        return -3;
    }
    cout << "Программа успешно завершена" << endl;
 
    delete[] pointArray;
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.04.2017, 10:39
Ответы с готовыми решениями:

Параметры функции main
доброго времени суток! Не могу решить проблему с параметрами функции main. Есть код int _tmain(int...

Передача файлов через параметры функции main
Всем привет. Я студент первого курса. У меня возникла проблема при написании программы шифрования...

Как задать параметры запуска (аргументы командной строки) функции main?
Как их задать в процессе запуска? т.е. пользователь запускает приложение и указывает параметры...

Чтение из файла, название передано как параметры функции main argc & argv
Вообще дано задание - считать из файла чётные строки, название файла должно быть передано как...

14
Любитель чаепитий
3741 / 1798 / 565
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
13.04.2017, 10:47 2
Цитата Сообщение от Рома Эдуардович Посмотреть сообщение
C++
1
2
3
4
    {
        cout << "Запуск: Triangles.exe inf.txt outf.txt" << endl;
        return -1;
    }
что это? это всегда срабатывает, условие перед скоупом поставь.
0
3 / 3 / 1
Регистрация: 21.03.2016
Сообщений: 97
13.04.2017, 10:50  [ТС] 3
Цитата Сообщение от GbaLog- Посмотреть сообщение
что это? это всегда срабатывает, условие перед скоупом поставь.
удалил случайно. там if (argc < 3)

Цитата Сообщение от GbaLog- Посмотреть сообщение
my_super_puper_programm.exe input.txt output.txt
не, он сказал инициализировать так

C++
1
2
3
4
5
*****
int argc = 3;
char** argv[1] = входной файл;
char** argv[2] = выходной файл;
*****
но когда я так делаю, он мне всякие ошибки выдает и программа всячески не хочет строиться
0
Любитель чаепитий
3741 / 1798 / 565
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
13.04.2017, 10:51 4
Цитата Сообщение от Рома Эдуардович Посмотреть сообщение
не, он сказал инициализировать так
бред это.
ты его неправильно понял, скорее всего.
0
3 / 3 / 1
Регистрация: 21.03.2016
Сообщений: 97
13.04.2017, 10:52  [ТС] 5
Цитата Сообщение от GbaLog- Посмотреть сообщение
бред это.
ты его неправильно понял, скорее всего.
ну с его слов, как он сказал, программа не откомпилируется если писать это в аргументах функции. Поэтому надо указывать это в теле самой функции
0
Любитель чаепитий
3741 / 1798 / 565
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
13.04.2017, 10:53 6
если только ты не имеешь ввиду, что тебе надо не с помощью аргументов командной строки сделать, а с помощью обычных переменных, тогда пиши так:
C++
1
char * argv[] = { "input.txt", "output.txt" };
и у main убери аргументы.

Добавлено через 56 секунд
Цитата Сообщение от Рома Эдуардович Посмотреть сообщение
с его слов, как он сказал, программа не откомпилируется если писать это в аргументах функции.
ну скомпилировалась же до этого.
0
3 / 3 / 1
Регистрация: 21.03.2016
Сообщений: 97
13.04.2017, 10:53  [ТС] 7
Вот скрин ошибки.
Миниатюры
Параметры функции main  
0
Любитель чаепитий
3741 / 1798 / 565
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
13.04.2017, 10:55 8
Цитата Сообщение от Рома Эдуардович Посмотреть сообщение
Вот скрин ошибки.
вот эти файлы показывай.
C++
1
2
3
#include "geometry.h"
#include "search.h"
#include "file.h"
0
3 / 3 / 1
Регистрация: 21.03.2016
Сообщений: 97
13.04.2017, 10:59  [ТС] 9
file.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef _FILE_H
#define _FILE_H
 
//Подсчет числа точек во входном файле
int countPoints(const char* fileName);
 
//чтение точек из входного файла
bool readPoints(const char* fileName, Point* pointArray, int maxPointNum);
 
//Вывод треугольников в выходной файл
bool writeTriangles(const char* fileName, const Triangle* trArray, int trNum);
 
#endif
file.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "geometry.h"
#include "search.h"
#include "file.h"
#include <fstream>
 
using namespace std;
 
//Подсчет числа точек во входном файле
int countPoints(const char* fileName)
{
    ifstream in(fileName);
    if (!in.is_open())
        return -1;
    double x, y;
    int i;
    for (i = 0;; i++)
    {
        in >> x >> y;
        if (in.fail())
            break;
    }
    return i;
}
 
//чтение точек из входного файла
bool readPoints(const char* fileName, Point* pointArray, int maxPointNum)
{
    ifstream in(fileName);
    //Файл не открыт
    if (!in.is_open())
        return 0;
    for (int i = 0; i < maxPointNum; i++)
    {
        in >> pointArray[i].x >> pointArray[i].y;
        if (in.fail())
            return false;
    }
    return true;
}
 
//Вывод треугольников в выходной файл
bool writeTriangles(const char* fileName, Triangle* trArray, int trNum)
{
    ofstream out(fileName);
    if (!out.is_open())
        return false;
    for (int i = 0; i < trNum; i++)
    {
        out << "#" << i + 1 << ": " << trArray[i].vertexes[0].x << " " << trArray[i].vertexes[0].y << endl;
        out << "#" << i + 1 << ": " << trArray[i].vertexes[1].x << " " << trArray[i].vertexes[1].y << endl;
        out << "#" << i + 1 << ": " << trArray[i].vertexes[2].x << " " << trArray[i].vertexes[2].y << endl;
    }
    return true;
}
geometry.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#ifndef _GEOMETRY_H
#define _GEOMETRY_H
 
struct Point //Структура
{
    double x, y; //Поля (данные) структуры
};
 
struct Triangle
{
    Point vertexes[3]; //Три вершины треугольника
    double area; //Площадь треугольника
};
 
//Расстояние между двумя точками по их координатам 
double calcDistance(const Point& pa, const Point& pb);
 
//Площадь треугольника по координатам точек
double calcTriangleArea(Triangle& tr);
 
//Формула герона
double calcAreaBySides(double a, double b, double c);
 
#endif
geometry.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "geometry.h"
#include "search.h"
#include <cmath>
 
//Расстояние между двумя точками по их координатам 
double calcDistance(const Point& pa, const Point& pb)
{
    return sqrt((pb.x - pa.x)*(pb.x - pa.x) + (pb.y - pa.y)*(pb.y - pa.y));
}
 
//Площадь треугольника по координатам точек
double calcTriangleArea(Triangle& tr)
{
    Point* v = tr.vertexes;
    double a = calcDistance(v[0], v[1]);
    double b = calcDistance(v[1], v[2]);
    double c = calcDistance(v[2], v[0]);
    return tr.area = calcAreaBySides(a, b, c);
}
 
//Формула герона
double calcAreaBySides(double a, double b, double c)
{
    double p2 = (a + b + c) / 2.0;
    if (p2 <= 0.0 || p2 <= a || p2 <= b || p2 <= c)
        return 0.0;
    return sqrt(p2*(p2 - a)*(p2 - b)*(p2 - c));
}
search.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef _SEARCH_H
#define _SEARCH_H
 
//Поиск треугольников максимальной площади
void searchLargestTriangles(const Point* pointArray, int pointNum, Triangle* trarray, int maxTrNum);
 
//Вставка очередного треугольника
void findAndInsert(Triangle* trArray, int lenght, const Triangle& triangle);
 
//Вспомогательные функции очистки
void clearPoint(Point& p);
 
void clearTriangle(Triangle& tr);
 
#endif
search.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include "geometry.h"
#include "search.h"
 
//Вставка очередного треугольника
void findAndInsert(Triangle* trArray, int lenght, const Triangle& triangle)
{
    int pos;
    for (pos = lenght - 1; pos >= 0; pos--)
    {
        if (triangle.area <= trArray[pos].area)
            break;
    }
    pos++;
    if (pos == lenght)
        return;
    for (int m = lenght - 2; m >= pos; m--)
        trArray[m + 1] = trArray[m];
    trArray[pos] = triangle;
}
 
//Поиск треугольников максимальной площади
void searchLargestTriangles(const Point* pointArray, int pointNum, Triangle* trArray, int maxTrNum)
{
    if (maxTrNum <= 0)
        return;
    //Очистка треугольников
    for (int i = 0; i < maxTrNum; i++)
        clearTriangle(trArray[i]);
    Triangle triangle;
    //Перебор троек точек
    for (int i = 0; i < pointNum; i++)
    {
        triangle.vertexes[0] = pointArray[i];
        for (int j = i + 1; j < pointNum; j++)
        {
            triangle.vertexes[1] = pointArray[i];
            for (int k = j + 1; k < pointNum; k++)
            {
                triangle.vertexes[2] = pointArray[k];
                calcTriangleArea(triangle);
                findAndInsert(trArray, maxTrNum, triangle);
            }
        }
    }
}
 
//Вспомогательные функции очистки
void clearPoint(Point& p)
{
    p.x = p.y = 0.0;
}
 
void clearTriangle(Triangle& tr)
{
    for (int i = 0; i < 3; i++)
        clearPoint(tr.vertexes[i]);
    tr.area=0.0;
}
0
Модератор
Эксперт С++
13331 / 10633 / 6352
Регистрация: 18.12.2011
Сообщений: 28,393
13.04.2017, 10:59 10
Цитата Сообщение от Рома Эдуардович Посмотреть сообщение
writeTriangles(outFileName, trArray, maxTrNum)
компилятор не видит кода этой функции
file.cpp точно подключен к проекту?
0
3 / 3 / 1
Регистрация: 21.03.2016
Сообщений: 97
13.04.2017, 11:00  [ТС] 11
Цитата Сообщение от zss Посмотреть сообщение
у Вас нету кода этой функции
file.cpp
0
Любитель чаепитий
3741 / 1798 / 565
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
13.04.2017, 11:41 12
Рома Эдуардович, file.cpp в проекте подключен?
0
3 / 3 / 1
Регистрация: 21.03.2016
Сообщений: 97
13.04.2017, 11:45  [ТС] 13
Цитата Сообщение от GbaLog- Посмотреть сообщение
Рома Эдуардович, file.cpp в проекте подключен?
Конечно, а иначе функции бы не работали и был бы трехэтажный мат в виде ошибок!
0
Любитель чаепитий
3741 / 1798 / 565
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
13.04.2017, 11:52 14
Цитата Сообщение от Рома Эдуардович Посмотреть сообщение
C++
1
bool writeTriangles(const char* fileName, const Triangle* trArray, int trNum);
Цитата Сообщение от Рома Эдуардович Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
bool writeTriangles(const char* fileName, Triangle* trArray, int trNum)
{
    ofstream out(fileName);
    if (!out.is_open())
        return false;
    for (int i = 0; i < trNum; i++)
    {
        out << "#" << i + 1 << ": " << trArray[i].vertexes[0].x << " " << trArray[i].vertexes[0].y << endl;
        out << "#" << i + 1 << ": " << trArray[i].vertexes[1].x << " " << trArray[i].vertexes[1].y << endl;
        out << "#" << i + 1 << ": " << trArray[i].vertexes[2].x << " " << trArray[i].vertexes[2].y << endl;
    }
    return true;
}
сигнатуры функций не совпадают, const для второго аргумента в реализации добавь, либо в объявлении const убери.
1
3 / 3 / 1
Регистрация: 21.03.2016
Сообщений: 97
14.04.2017, 03:17  [ТС] 15
Цитата Сообщение от GbaLog- Посмотреть сообщение
сигнатуры функций не совпадают, const для второго аргумента в реализации добавь, либо в объявлении const убери.
Ехууу, спасибо огромнейшее. Такая глупая ошибка.

Добавлено через 26 минут
Беда, в выходном файле одни нули(
0
14.04.2017, 03:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2017, 03:17
Помогаю со студенческими работами здесь

Передать параметры в main
Нужно передать два параметра типа double в исполняемы файл ./Lab_10_2k Ни как не получается...

Как передать параметры в main ?
нужно передать параметры с командной строки в основную функцию. например я хочу найти cos(x). как...

Какие параметры принимает функция main?
Всем привет, какие параметры может принимать функция main() в c++, согласен, много статей на эту...

Параметры функции: параметры по умолчанию
помогите пожалуйста понять. void foo(int a, int b, int c=1){std::cout &lt;&lt; a &lt;&lt; &quot;\t&quot; &lt;&lt; b &lt;&lt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru