powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / массивы в с++
47 сообщений из 47, показаны все 2 страниц
массивы в с++
    #38456413
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
подскажите, в чем ошибка?
...
Рейтинг: 0 / 0
массивы в с++
    #38456501
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unker,

Ошибка - в файле хз.doc.
...
Рейтинг: 0 / 0
массивы в с++
    #38456525
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,
логично)
Код: plaintext
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.
#include "stdafx.h"
#include "math.h"
#include "conio.h"
#include "cmath"
#include "stdlib.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int i,j,p;
    float a[4][4],max,min,e,b[4],c[4],d[4];
    printf("vvedite =");
    scanf("%f",&e);
    for(i=0;i<4;i++)
    for(j=0;j<4;j++)
    {
        printf("a[%d][%d]=",i+1,j+1);
        scanf("%f",&a[i][j]);
    }
    
    for(i=0;i<4;i++);
    {
        b[i]=a[i][0]; c[i]=a[i][0];
        for j=(0;j<4;j++)
        {
            if(a[i][j]<b[i]) b[i]=a[i][j];
            if(a[i][j]>b[i]) c[i]=a[i][j];
        }
    }
    
    for(i=0;i<4;i++)
    d[i]=e*c[i]+(1-e)*b[i];
    max=d[0];
    for(i=0;i<4;i++)
    if(d[i]>max)
    {
        max=d[i];
        p=i;
    }
    printf("\t max %d",p);
    system("PAUSE");
    return 0;
}
...
Рейтинг: 0 / 0
массивы в с++
    #38456541
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unker,

А почему вы решили что вообще есть ошибка?

Правда я у вас в коде вижу переменные max,min.
Под виндой возможен конфликт имен с макросами объявленными в winapi.
Поэтому для начала переименуйте их.

Ну и если не поможет то приведите описание проблемы и текст ошибки, и выводится ли она при компиляции или исполнении.
Гадать никто не будет.
...
Рейтинг: 0 / 0
массивы в с++
    #38456599
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,
дела в том, что он считает неправильно. Вот пример e=o,5 и массив
4 1 5 -1
8 2 -3 6
10 -1 8 4
4 5 -1 9.
По идеи он должен вывести 2, так как в третий строчке получится максимальное значение, а он выводит 1. и с другими массивами проверял, считает не так почему-то
...
Рейтинг: 0 / 0
массивы в с++
    #38456637
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
unker, ну наверное в этой строчке
if(a[i][j]>b[i]) c[i]=a[i][j];
...
Рейтинг: 0 / 0
массивы в с++
    #38456644
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unkero,5
В вот так и вводите число? Буква О, запятая, 5 ? Серьезно?
Или все-таки в правильном формате: 0.5
...
Рейтинг: 0 / 0
массивы в с++
    #38456649
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,
нет, конечно 0,5
а как исправить ту строку нужно? не подскажите?
...
Рейтинг: 0 / 0
массивы в с++
    #38456730
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unker0,5
с запятой или точкой?

Потому что если - с запятой, то введется 0, и ваш алгоритм выведет что-то другое, а не то что вы планировали :)
...
Рейтинг: 0 / 0
массивы в с++
    #38456764
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я ввожу через точку: 0.5
...
Рейтинг: 0 / 0
массивы в с++
    #38457135
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyunker,

А почему вы решили что вообще есть ошибка?

Правда я у вас в коде вижу переменные max,min.
Под виндой возможен конфликт имен с макросами объявленными в winapi.
Поэтому для начала переименуйте их.

Ну и если не поможет то приведите описание проблемы и текст ошибки, и выводится ли она при компиляции или исполнении.
Гадать никто не будет.

NO_MINMAX можно определить, и не будет конфликта.
...
Рейтинг: 0 / 0
массивы в с++
    #38457489
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

а можете это в самой проге подделать?
...
Рейтинг: 0 / 0
массивы в с++
    #38457617
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unker,
100 к 0, что сможет.
А вы можете спросить у поисковика строку
"NO_MINMAX" c++ ?
заодно узнаете, что такое директива препроцессора дефайн
...
Рейтинг: 0 / 0
массивы в с++
    #38458528
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕСЛИ ПРОСТО ПЕРЕИМЕНОВАТЬ MAX И MIN, НИЧЕГО НЕ ИЗМЕНИЛОСЬ, ВСЕ ТАКЖЕ НЕ ВЕРНО СЧИТАЕТ(
...
Рейтинг: 0 / 0
массивы в с++
    #38458537
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unker,

Может быть ответа нет, потому что вы до сих пор нам не рассказали, что должна делать программа.
"должен вывести 2" - это не описание алгоритма.

Правда я вот счас глянул еще раз на код и бросилось в глаза

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
    for(i=0;i<4;i++); // это явный баг
    {
        b[i]=a[i][0]; c[i]=a[i][0];
        for j=(0;j<4;j++)
        {
            if(a[i][j]<b[i]) b[i]=a[i][j];
            if(a[i][j]>b[i]) c[i]=a[i][j];
        }
    }


Хотя может это модератор когда форматировал за ваc ваш текст случайно вставил (как и & lt; вместо <)
...
Рейтинг: 0 / 0
массивы в с++
    #38458550
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выбрать из каждой строчки максимальный и минимальный элементы, потом e*max+(1-е)*min. Из полученных значений выбрать максимальное (ну и чтоб он выводил номер строчки)
...
Рейтинг: 0 / 0
массивы в с++
    #38458618
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unker,

Код: plaintext
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.
#include <stdio.h>
#include <limits.h>

#define N 4

int main() {
	float a[N][N], b[N], c[N], d[N], e, max;
	int i, j, p;
	printf("e = ");
	scanf("%f", &e);
	max = FLT_MIN;
	for (i = 0; i < N; i++) {
		b[i] = FLT_MAX;
		c[i] = FLT_MIN;
		for (j = 0; j < N; j++) {
			printf("a[%d][%d] = ", i + 1, j + 1);
			scanf("%f", &a[i][j]);
			if (a[i][j] > c[i]) {
				c[i] = a[i][j];
			}
			if (a[i][j] < b[i]) {
				b[i] = a[i][j];
			}
			d[i] = e * c[i] + (1-e) * b[i];
			if (d[i] > max) {
				max = d[i];
				p = i;
			}
		}
	}
	printf("Maximum is D[%d] = %f\n", p, max);
	return 0;
}
...
Рейтинг: 0 / 0
массивы в с++
    #38459423
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FLT_MIN: необъявленный идентификатор
error C2065: FLT_MAX: необъявленный идентификатор
error C2065: FLT_MIN: необъявленный идентификатор
...
Рейтинг: 0 / 0
массивы в с++
    #38459431
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unker,

Код: plaintext
1.
2.
#define FLT_MAX         3.402823466e+38F
#define FLT_MIN         1.175494351e-38F
...
Рейтинг: 0 / 0
массивы в с++
    #38459436
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

а что это означает, мне это нужно в прогу добавить?
...
Рейтинг: 0 / 0
массивы в с++
    #38459438
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unkerа что это означаетОпределение констант. Минимальное и максимальное вещественные числа.
unkerмне это нужно в прогу добавить?Да.
Развернуть
Код: plaintext
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.
#include <stdio.h>
#include <limits.h>

#define N 		4
#define FLT_MAX         3.402823466e+38F
#define FLT_MIN         1.175494351e-38F

int main() {
	float a[N][N], b[N], c[N], d[N], e, max;
	int i, j, p;
	printf("e = ");
	scanf("%f", &e);
	max = FLT_MIN;
	for (i = 0; i < N; i++) {
		b[i] = FLT_MAX;
		c[i] = FLT_MIN;
		for (j = 0; j < N; j++) {
			printf("a[%d][%d] = ", i + 1, j + 1);
			scanf("%f", &a[i][j]);
			if (a[i][j] > c[i]) {
				c[i] = a[i][j];
			}
			if (a[i][j] < b[i]) {
				b[i] = a[i][j];
			}
			d[i] = e * c[i] + (1-e) * b[i];
			if (d[i] > max) {
				max = d[i];
				p = i;
			}
		}
	}
	printf("Maximum is D[%d] = %f\n", p, max);
	return 0;
}


...
Рейтинг: 0 / 0
массивы в с++
    #38459444
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

а это программа так считает?
есть массив
9 6 -3 5
16 -7 4 9
8 -3 9 15
13 10 -2 -5, при этом е=0.5
она считает как
9*0.5-3*0.5=3
16*0.5=5-7*0.5=4.5
15*0.5-3*0.5=6
13*0.5-5*0.5=4
и выводит 6?
...
Рейтинг: 0 / 0
массивы в с++
    #38459445
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman, а она наверное просто выводит номер строки и максимальный элемент?
...
Рейтинг: 0 / 0
массивы в с++
    #38459459
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unker,

У меня результат получился такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 
e = 0.5
a[1][1] = 9
a[1][2] = 6
a[1][3] = -3
a[1][4] = 5
a[2][1] = 16
a[2][2] = -7
a[2][3] = 4
a[2][4] = 9
a[3][1] = 8
a[3][2] = -3
a[3][3] = 9
a[3][4] = 15
a[4][1] = 13
a[4][2] = 10
a[4][3] = -2
a[4][4] = -5
Maximum is D[1] = 16.000000
 
...
Рейтинг: 0 / 0
массивы в с++
    #38459468
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

у меня также, только по заданию он должен вывести не 16, а максимальный элемент из тех, которые вычисляются по формуле e*max+0,5*min, а там получается не 16, а 6 в третей строке
...
Рейтинг: 0 / 0
массивы в с++
    #38459474
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

он считает верно только тогда, когда элементы по строке вводишь в порядке возрастания, из-за чего это может быть?
...
Рейтинг: 0 / 0
массивы в с++
    #38459505
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unker,

После некоторых исправлений получил след. результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 
09 06 -3 05   [9.00, -3.00]
16 -7 04 09   [16.00, -7.00]
08 03 09 15   [15.00, 3.00]
13 10 -2 -5   [13.00, -5.00]
d[0] = 0.50 * 9.00 + (1-0.50) * -3.00 = 3.00
d[1] = 0.50 * 16.00 + (1-0.50) * -7.00 = 4.50
d[2] = 0.50 * 15.00 + (1-0.50) * 3.00 = 9.00
d[3] = 0.50 * 13.00 + (1-0.50) * -5.00 = 4.00
Maximum is D[2] = 9.000000
 

В ответе получается не 6.
...
Рейтинг: 0 / 0
массивы в с++
    #38459509
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,
а можно исправленный вариант программы?
так все верно получилось, там просто -3 на 3 исправлено. Буду очень благодарен?
...
Рейтинг: 0 / 0
массивы в с++
    #38459517
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unker,

Код: plaintext
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.
#include <iostream>
using namespace std;

#define N 4
#define FLT_MAX         3.402823466e+38F
#define FLT_MIN         1.175494351e-38F

int main() {
	float a[N][N], b[N], c[N], d[N], e, max;
	int i, j, p;
	cout << "e = ";
	cin >> e;
	max = FLT_MIN;
	for (i = 0; i < N; i++) {
		b[i] = FLT_MAX;
		c[i] = FLT_MIN;
		for (j = 0; j < N; j++) {
			cout << "a[" << i + 1 << "][" << j + 1 << "] = ";
			cin >> a[i][j];
			if (a[i][j] > c[i]) {
				c[i] = a[i][j];
			}
			if (a[i][j] < b[i]) {
				b[i] = a[i][j];
			}
		}
	}
	for (int i = 0; i < N; i++) {
		d[i] = e * c[i] + (1 - e) * b[i];
		if (d[i] > max) {
			max = d[i];
			p = i;
		}
	}
	cout << "Maximum is D[" << p << "] = " << max << endl;
	return 0;
}
...
Рейтинг: 0 / 0
массивы в с++
    #38459533
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

огромное спасибо))))
...
Рейтинг: 0 / 0
массивы в с++
    #38467806
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в связи с чем возникает ошибка Программа "C:\Users\SA\Desktop\4 семестр\х\х\obj\x86\Debug\х.exe" не содержит статического метода "Main", подходящего для точки входа((
как исправить?
вот текст программы:
Код: 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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class TreeCompare : IComparer<KeyValuePair<string, int>>
{
    public int Compare(KeyValuePair<string, int> kvp1, KeyValuePair<string, int> kvp2)
    {
        return kvp1.Value.CompareTo(kvp2.Value);
    }
}

class HaffmanTree
{
    private List<KeyValuePair<string, int>> tree;
    private List<KeyValuePair<string, bool>> listOfFreeNodes;
    public HaffmanTree(char[] arraOfFrequency, int[] countOfFrequency)
    {
        string[] strArrayOfFrequency = new string[arraOfFrequency.Length];
        for (int i = 0; i < strArrayOfFrequency.Length; i++)
        {
            strArrayOfFrequency[i] = Convert.ToString(arraOfFrequency[i]);
        }

        tree = new List<KeyValuePair<string, int>>();
        for (int i = 0; i < arraOfFrequency.Length; i++)
        {
            tree.Insert(i, new KeyValuePair<string, int>(strArrayOfFrequency[i], countOfFrequency[i]));
        }

        listOfFreeNodes = new List<KeyValuePair<string, bool>>();
    }

    private void BuildListOfFreeNodes()
    {
        foreach (KeyValuePair<string, int> node in tree)
        {
            listOfFreeNodes.Add(new KeyValuePair<string, bool>(node.Key, true));
        }
    }

    private bool IsFreeElement(string key)
    {
        return listOfFreeNodes.Any(node => key == node.Key && node.Value == true);
    }

    public void BuildTree()
    {
        IComparer<KeyValuePair<string, int>> comparer = new TreeCompare();
        tree.Sort(comparer);
        BuildListOfFreeNodes();
        int countTrueValue = 0;
        while (countTrueValue != 1)
        {
            int indMin1 = 0, indMin2 = 0;
            int min1 = int.MaxValue, min2 = int.MaxValue;
            string keyMin1 = string.Empty;
            string keyMin2 = string.Empty;
            foreach (KeyValuePair<string, int> kvp in tree.Where(kvp => kvp.Value < min1 && IsFreeElement(kvp.Key)))
            {
                keyMin1 = kvp.Key;
                indMin1 = tree.IndexOf(kvp);
                min1 = kvp.Value;
                listOfFreeNodes[indMin1] = new KeyValuePair<string, bool>(keyMin1, false);
                foreach (KeyValuePair<string, int> kvp2 in tree.Where(kvp2 => kvp2.Value < min2 && (kvp2.Value == min1 || kvp2.Value > min1) && kvp2.Key != keyMin1 && IsFreeElement(kvp2.Key)))
                {
                    indMin2 = tree.IndexOf(kvp2);
                    min2 = kvp2.Value;
                    keyMin2 = kvp2.Key;
                }
                listOfFreeNodes[indMin2] = new KeyValuePair<string, bool>(keyMin2, false);
            }
            string result = keyMin1 + keyMin2;
            tree.Add(new KeyValuePair<string, int>(result, min1 + min2));
            listOfFreeNodes.Add(new KeyValuePair<string, bool>(result, true));
            countTrueValue = listOfFreeNodes.Count(kvp => kvp.Value == true);
        }
    }

    public void ShowHaffmanTree()
    {
        Console.WriteLine("Tree");
        foreach (KeyValuePair<string, int> node in tree)
        {
            Console.WriteLine("{0} {1}", node.Key, node.Value);
        }
        Console.WriteLine();
        Console.WriteLine("List of free nodes");
        foreach (KeyValuePair<string, bool> node in listOfFreeNodes)
        {
            Console.WriteLine("{0} {1}", node.Key, node.Value);
        }
    }
}
...
Рейтинг: 0 / 0
массивы в с++
    #38467826
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unkerкак исправить?
Код: plaintext
1.
2.
3.
void main() {
...
}
...
Рейтинг: 0 / 0
массивы в с++
    #38467842
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

а где это добавить перед class TreeCompare : IComparer<KeyValuePair<string, int>>
...
Рейтинг: 0 / 0
массивы в с++
    #38467846
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unker,

Эт ж C#-код! тынц
...
Рейтинг: 0 / 0
массивы в с++
    #38467849
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

да я знаю что это С шарп, можешь помочь исправить программу эту? очень нужно(
...
Рейтинг: 0 / 0
массивы в с++
    #38467862
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unker,

Код: plaintext
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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
//.h file code:

#include <string>
#include <vector>
#include <iostream>
#include "stringconverter.h"

//C# TO C++ CONVERTER TODO TASK: The .NET System namespace is not available from native C++:
//using namespace System;
//C# TO C++ CONVERTER TODO TASK: The .NET System namespace is not available from native C++:
//using namespace System::Collections::Generic;
//C# TO C++ CONVERTER TODO TASK: The .NET System namespace is not available from native C++:
//using namespace System::Linq;
//C# TO C++ CONVERTER TODO TASK: The .NET System namespace is not available from native C++:
//using namespace System::Text;
class TreeCompare : public IComparer<KeyValuePair<std::wstring, int>*>
{
public:
int Compare(KeyValuePair<std::wstring, int> kvp1, KeyValuePair<std::wstring, int> kvp2);
};

class HaffmanTree
{
private:
std::vector<KeyValuePair<std::wstring, int>*> tree;
std::vector<KeyValuePair<std::wstring, bool>*> listOfFreeNodes;
public:
HaffmanTree(wchar_t arraOfFrequency[], int countOfFrequency[]);

private:
void BuildListOfFreeNodes();

bool IsFreeElement(const std::wstring &key);

public:
void BuildTree();

void ShowHaffmanTree();
};

//----------------------------------------------------------------------------------------
//	Copyright © 2004 - 2013 Tangible Software Solutions Inc.
//	This class can be used by anyone provided that the copyright notice remains intact.
//
//	This class is used to replace some conversions to or from strings.
//----------------------------------------------------------------------------------------
#include <sstream>

class StringConverterHelper
{
public:
	template<typename T>
	static std::wstring toString(const T &subject)
	{
		std::wostringstream ss;
		ss << subject;
		return ss.str();
	}

	template<typename T>
	static T fromString(const std::wstring &subject)
	{
		std::wistringstream ss(subject);
		T target;
		ss >> target;
		return target;
	}
};

//.cpp file code:

//C# TO C++ CONVERTER TODO TASK: The .NET System namespace is not available from native C++:
//using namespace System;
//C# TO C++ CONVERTER TODO TASK: The .NET System namespace is not available from native C++:
//using namespace System::Collections::Generic;
//C# TO C++ CONVERTER TODO TASK: The .NET System namespace is not available from native C++:
//using namespace System::Linq;
//C# TO C++ CONVERTER TODO TASK: The .NET System namespace is not available from native C++:
//using namespace System::Text;

int TreeCompare::Compare(KeyValuePair<std::wstring, int> kvp1, KeyValuePair<std::wstring, int> kvp2)
{
return kvp1.Value->compare(kvp2.Value);
}

HaffmanTree::HaffmanTree(wchar_t arraOfFrequency[], int countOfFrequency[])
{
std::wstring strArrayOfFrequency[sizeof(arraOfFrequency) / sizeof(arraOfFrequency[0])];
for (int i = 0; i < sizeof(strArrayOfFrequency) / sizeof(strArrayOfFrequency[0]); i++)
{
strArrayOfFrequency[i] = StringConverterHelper::toString(arraOfFrequency[i]);
}

tree = std::vector<KeyValuePair<std::wstring, int>*>();
for (int i = 0; i < sizeof(arraOfFrequency) / sizeof(arraOfFrequency[0]); i++)
{
tree.Insert(i, KeyValuePair<std::wstring, int>(strArrayOfFrequency[i], countOfFrequency[i]));
}

listOfFreeNodes = std::vector<KeyValuePair<std::wstring, bool>*>();
}

void HaffmanTree::BuildListOfFreeNodes()
{
for (auto node : tree)
{
listOfFreeNodes.push_back(KeyValuePair<std::wstring, bool>(node.first, true));
}
}

bool HaffmanTree::IsFreeElement(const std::wstring &key)
{
return listOfFreeNodes.Any([&] (void *node)
{
	key == node::Key && node->Value == true;
});
}

void HaffmanTree::BuildTree()
{
IComparer<KeyValuePair<std::wstring, int>*> *comparer = new TreeCompare();
tree.Sort(comparer);
BuildListOfFreeNodes();
int countTrueValue = 0;
while (countTrueValue != 1)
{
int indMin1 = 0, indMin2 = 0;
int min1 = int::MaxValue, min2 = int::MaxValue;
std::wstring keyMin1 = L"";
std::wstring keyMin2 = L"";
//C# TO C++ CONVERTER TODO TASK: The following line could not be converted:
foreach (KeyValuePair<string, int> kvp in tree.Where([&] (void *kvp)
{
	kvp->Value < min1 && IsFreeElement(kvp::Key);
}))
{
keyMin1 = kvp::Key;
indMin1 = tree.find(kvp);
min1 = kvp->Value;
listOfFreeNodes[indMin1] = KeyValuePair<std::wstring, bool>(keyMin1, false);
//C# TO C++ CONVERTER TODO TASK: The following line could not be converted:
foreach (KeyValuePair<string, int> kvp2 in tree.Where([&] (void *kvp2)
{
	kvp2->Value < min2 && (kvp2->Value == min1 || kvp2->Value > min1) && kvp2::Key != keyMin1 && IsFreeElement(kvp2::Key);
}))
{
indMin2 = tree.find(kvp2);
min2 = kvp2->Value;
keyMin2 = kvp2::Key;
}
listOfFreeNodes[indMin2] = KeyValuePair<std::wstring, bool>(keyMin2, false);
}
std::wstring result = keyMin1 + keyMin2;
tree.push_back(KeyValuePair<std::wstring, int>(result, min1 + min2));
listOfFreeNodes.push_back(KeyValuePair<std::wstring, bool>(result, true));
countTrueValue = listOfFreeNodes.size()([&] (void *kvp)
{
	kvp->Value == true;
});
}
}

void HaffmanTree::ShowHaffmanTree()
{
std::cout << std::wstring(L"Tree") << std::endl;
for (auto node : tree)
{
std::cout << node.first << std::wstring(L" ") << node.second << std::endl;
}
std::cout << std::endl;
std::cout << std::wstring(L"List of free nodes") << std::endl;
for (auto node : listOfFreeNodes)
{
std::cout << node.first << std::wstring(L" ") << node.second << std::endl;
}
}

P.S.
За правильность кода не ручаюсь, т.к. преобразовал при помощи этой утилиты

P.P.S.
Правильнее будет, если задать этот вопрос в этом форуме
...
Рейтинг: 0 / 0
массивы в с++
    #38467871
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо) а вот этот код на с++, он должен работать?
...
Рейтинг: 0 / 0
массивы в с++
    #38467885
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unker,

По-идее - да.
...
Рейтинг: 0 / 0
массивы в с++
    #38467887
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

fatal error C1083: Не удается открыть файл включение: stringconverter.h: No such file or directory
как от этого избавится не подскажешь?
...
Рейтинг: 0 / 0
массивы в с++
    #38467897
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unker,

Код: plaintext
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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
//.h file code:

#include <string>
#include <vector>
#include <iostream>
#include <sstream>

using namespace System;
using namespace System::Collections::Generic;
using namespace System::Linq;
using namespace System::Text;

class TreeCompare : public IComparer<KeyValuePair<std::wstring, int>*>
{
public:
int Compare(KeyValuePair<std::wstring, int> kvp1, KeyValuePair<std::wstring, int> kvp2);
};

class HaffmanTree
{
private:
std::vector<KeyValuePair<std::wstring, int>*> tree;
std::vector<KeyValuePair<std::wstring, bool>*> listOfFreeNodes;
public:
HaffmanTree(wchar_t arraOfFrequency[], int countOfFrequency[]);

private:
void BuildListOfFreeNodes();

bool IsFreeElement(const std::wstring &key);

public:
void BuildTree();

void ShowHaffmanTree();
};

class StringConverterHelper
{
public:
	template<typename T>
	static std::wstring toString(const T &subject)
	{
		std::wostringstream ss;
		ss << subject;
		return ss.str();
	}

	template<typename T>
	static T fromString(const std::wstring &subject)
	{
		std::wistringstream ss(subject);
		T target;
		ss >> target;
		return target;
	}
};

int TreeCompare::Compare(KeyValuePair<std::wstring, int> kvp1, KeyValuePair<std::wstring, int> kvp2)
{
return kvp1.Value->compare(kvp2.Value);
}

HaffmanTree::HaffmanTree(wchar_t arraOfFrequency[], int countOfFrequency[])
{
std::wstring strArrayOfFrequency[sizeof(arraOfFrequency) / sizeof(arraOfFrequency[0])];
for (int i = 0; i < sizeof(strArrayOfFrequency) / sizeof(strArrayOfFrequency[0]); i++)
{
strArrayOfFrequency[i] = StringConverterHelper::toString(arraOfFrequency[i]);
}

tree = std::vector<KeyValuePair<std::wstring, int>*>();
for (int i = 0; i < sizeof(arraOfFrequency) / sizeof(arraOfFrequency[0]); i++)
{
tree.Insert(i, KeyValuePair<std::wstring, int>(strArrayOfFrequency[i], countOfFrequency[i]));
}

listOfFreeNodes = std::vector<KeyValuePair<std::wstring, bool>*>();
}

void HaffmanTree::BuildListOfFreeNodes()
{
for (auto node : tree)
{
listOfFreeNodes.push_back(KeyValuePair<std::wstring, bool>(node.first, true));
}
}

bool HaffmanTree::IsFreeElement(const std::wstring &key)
{
return listOfFreeNodes.Any([&] (void *node)
{
	key == node::Key && node->Value == true;
});
}

void HaffmanTree::BuildTree()
{
IComparer<KeyValuePair<std::wstring, int>*> *comparer = new TreeCompare();
tree.Sort(comparer);
BuildListOfFreeNodes();
int countTrueValue = 0;
while (countTrueValue != 1)
{
int indMin1 = 0, indMin2 = 0;
int min1 = int::MaxValue, min2 = int::MaxValue;
std::wstring keyMin1 = L"";
std::wstring keyMin2 = L"";
//C# TO C++ CONVERTER TODO TASK: The following line could not be converted:
foreach (KeyValuePair<string, int> kvp in tree.Where([&] (void *kvp)
{
	kvp->Value < min1 && IsFreeElement(kvp::Key);
}))
{
keyMin1 = kvp::Key;
indMin1 = tree.find(kvp);
min1 = kvp->Value;
listOfFreeNodes[indMin1] = KeyValuePair<std::wstring, bool>(keyMin1, false);
//C# TO C++ CONVERTER TODO TASK: The following line could not be converted:
foreach (KeyValuePair<string, int> kvp2 in tree.Where([&] (void *kvp2)
{
	kvp2->Value < min2 && (kvp2->Value == min1 || kvp2->Value > min1) && kvp2::Key != keyMin1 && IsFreeElement(kvp2::Key);
}))
{
indMin2 = tree.find(kvp2);
min2 = kvp2->Value;
keyMin2 = kvp2::Key;
}
listOfFreeNodes[indMin2] = KeyValuePair<std::wstring, bool>(keyMin2, false);
}
std::wstring result = keyMin1 + keyMin2;
tree.push_back(KeyValuePair<std::wstring, int>(result, min1 + min2));
listOfFreeNodes.push_back(KeyValuePair<std::wstring, bool>(result, true));
countTrueValue = listOfFreeNodes.size()([&] (void *kvp)
{
	kvp->Value == true;
});
}
}

void HaffmanTree::ShowHaffmanTree()
{
std::cout << std::wstring(L"Tree") << std::endl;
for (auto node : tree)
{
std::cout << node.first << std::wstring(L" ") << node.second << std::endl;
}
std::cout << std::endl;
std::cout << std::wstring(L"List of free nodes") << std::endl;
for (auto node : listOfFreeNodes)
{
std::cout << node.first << std::wstring(L" ") << node.second << std::endl;
}
}

void main() {
}

...
Рейтинг: 0 / 0
массивы в с++
    #38467898
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,
так ему не нравится(
System не нравится,
уйма ошибок подобного рода
...
Рейтинг: 0 / 0
массивы в с++
    #38467910
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unker,

Криво сконвертировалось (((
...
Рейтинг: 0 / 0
массивы в с++
    #38467911
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman,

Код: plaintext
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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
using namespace System;
using namespace System::Collections::Generic;
using namespace System::Linq;
using namespace System::Text;

private ref class TreeCompare : IComparer<KeyValuePair<String^, int>^>
{
public:
	virtual int Compare(KeyValuePair<String^, int> kvp1, KeyValuePair<String^, int> kvp2) sealed;
};

private ref class HaffmanTree
{
private:
	List<KeyValuePair<String^, int>^> ^tree;
	List<KeyValuePair<String^, bool>^> ^listOfFreeNodes;
public:
	HaffmanTree(array<Char> ^arraOfFrequency, array<int> ^countOfFrequency);

private:
	void BuildListOfFreeNodes();

	bool IsFreeElement(String ^key);

public:
	void BuildTree();

private:
void AnonymousMethod1(Object ^kvp);

public:
	void ShowHaffmanTree();
};

int TreeCompare::Compare(KeyValuePair<String^, int> kvp1, KeyValuePair<String^, int> kvp2)
{
	return kvp1.Value->CompareTo(kvp2.Value);
}

HaffmanTree::HaffmanTree(array<Char> ^arraOfFrequency, array<int> ^countOfFrequency)
{
	array<String^> ^strArrayOfFrequency = gcnew array<String^>(arraOfFrequency->Length);
	for (int i = 0; i < strArrayOfFrequency->Length; i++)
	{
		strArrayOfFrequency[i] = Convert::ToString(arraOfFrequency[i]);
	}

	tree = gcnew List<KeyValuePair<String^, int>^>();
	for (int i = 0; i < arraOfFrequency->Length; i++)
	{
		tree->Insert(i, KeyValuePair<String^, int>(strArrayOfFrequency[i], countOfFrequency[i]));
	}

	listOfFreeNodes = gcnew List<KeyValuePair<String^, bool>^>();
}

void HaffmanTree::BuildListOfFreeNodes()
{
	for each (KeyValuePair<String^, int> ^node in tree)
	{
		listOfFreeNodes->Add(KeyValuePair<String^, bool>(node.Key, true));
	}
}

bool HaffmanTree::IsFreeElement(String ^key)
{
	return listOfFreeNodes->Any(delegate(Object^ node));
	{
		key == node::Key && node->Value == true;
	}
}

void HaffmanTree::BuildTree()
{
	IComparer<KeyValuePair<String^, int>^> ^comparer = gcnew TreeCompare();
	tree->Sort(comparer);
	BuildListOfFreeNodes();
	int countTrueValue = 0;
	while (countTrueValue != 1)
	{
		int indMin1 = 0, indMin2 = 0;
		int min1 = int::MaxValue, min2 = int::MaxValue;
		String ^keyMin1 = String::Empty;
		String ^keyMin2 = String::Empty;
		for each (KeyValuePair<String^, int> ^kvp in tree->Where(delegate(Object^ kvp)))
		{
			kvp.Value < min1 && IsFreeElement(kvp.Key);
		}
		{
			keyMin1 = kvp::Key;
			indMin1 = tree->IndexOf(kvp);
			min1 = kvp->Value;
			listOfFreeNodes[indMin1] = KeyValuePair<String^, bool>(keyMin1, false);
			for each (KeyValuePair<String^, int> ^kvp2 in tree->Where(delegate(Object^ kvp2)))
			{
				kvp2.Value < min2 && (kvp2.Value == min1 || kvp2.Value > min1) && kvp2.Key != keyMin1 && IsFreeElement(kvp2.Key);
			}
			{
				indMin2 = tree->IndexOf(kvp2);
				min2 = kvp2->Value;
				keyMin2 = kvp2::Key;
			}
			listOfFreeNodes[indMin2] = KeyValuePair<String^, bool>(keyMin2, false);
		}
		String ^result = keyMin1 + keyMin2;
		tree->Add(KeyValuePair<String^, int>(result, min1 + min2));
		listOfFreeNodes->Add(KeyValuePair<String^, bool>(result, true));
		countTrueValue = listOfFreeNodes->Count(AnonymousMethod1);
	}
}

void HaffmanTree::AnonymousMethod1(Object ^kvp)
{
		kvp->Value == true;
}

void HaffmanTree::ShowHaffmanTree()
{
	Console::WriteLine("Tree");
	for each (KeyValuePair<String^, int> ^node in tree)
	{
		Console::WriteLine("{0} {1}", node.Key, node.Value);
	}
	Console::WriteLine();
	Console::WriteLine("List of free nodes");
	for each (KeyValuePair<String^, bool> ^node in listOfFreeNodes)
	{
		Console::WriteLine("{0} {1}", node.Key, node.Value);
	}
}

int main(array<System::String ^> ^args)
{
	Console::WriteLine(L"Hello World");
	return 0;
}

...
Рейтинг: 0 / 0
массивы в с++
    #38467914
unker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

а можешь в ворде кинуть, просто может там косяки из-за того что меняет что-то этот форум
...
Рейтинг: 0 / 0
массивы в с++
    #38467922
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего - ошибка в компиляторе.
Программа-то 100% без ошибок
...
Рейтинг: 0 / 0
массивы в с++
    #38468079
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyСкорее всего - ошибка в компиляторе.+1000


unker,

Здесь нужна как минимум 2008-я студия (.NET 3/3.5), где присутствует System.Linq
...
Рейтинг: 0 / 0
массивы в с++
    #38468080
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unker,
...
Рейтинг: 0 / 0
47 сообщений из 47, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / массивы в с++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]