Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Решение избыточной системы нелинейных и трансцендентных уравнений обобщенным методом Ньютона

нужна помощь в написании программы на СИ, тема "Решение избыточной системы нелинейных и трансцендентных уравнений обобщенным методом Ньютона", задание такое:В головной программе необходимо:
1. описать прототип функции решения системы уравнений:
int Newton(int n, int m, int *iter, float eps, float x[n], float y[m], float *s0);
2. ввести значение переменной n – количество неизвестных,
3. ввести значение переменной m (m>=n) – количество уравнений,
4. ввести значение переменной eps – погрешность вычислений,
5. ввести значение переменной count – заданное количество итераций,
6. описать массивы:
float x[n]; // вектор решения системы уравнений
float y[n]; // вектор невязок
7. описать систему уравнений в функции:
void pr_chasti(int n, float x[n], float b[n])
в виде b[i]=b(x[j]); i,j=0…n-1,
8. ввести массив x[n] – вектор начальных приближений неизвестных,
9. обратиться к программе решения системы уравнений:
Newton(n, m, &iter, eps, x, y, &s0);
10. вывести на экран терминала (в текстовый файл) вектор решения x[n], вектор невязок y[n], количество выполненных итераций iter и среднеквадратическую невязку s0.
Имеется пример кода, но он не полный
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
#include <stdio.h>
#include <math.h>
#include <conio.h>
 
int Newton(int n, int m, int *iter, float eps, float x[n], float y[m], float *s0);
 
int main(int argc, char **argv)
{
    int n;      // количество неизвестных
    int m;      //  количество уравнений (m>=n)
    int iter;       //  заданное количество итераций
    float eps;  //  заданная погрешность вычислений
    float s0;       //  среднеквадратическая невязка
    int i;      // рабочая переменная
    printf("\n Kol-vo neizvestn. n=");
    scanf("%d", &n);
    printf("\n Kol-vo uravnen. (m>=n) m=");
    scanf("%d", &m);
    float x[n]; //  вектор оценок неизвестных
    float y[m]; //  вектор невязок          
    printf("\n Kol-vo iteracij iter=");
    scanf("%d", &iter);
    printf("\n Pogreshn. vychislenij eps=");
    scanf("%e", &eps);
    printf("\n vvedite vektor nachaln. priblishenij (%d znachenij):\n", n);
    for (i=0; i<n; i++)
        scanf("%f", &x[i]);     
    printf("\n");
    Newton(n, m, &iter, eps, x, y, &s0);        
    printf("\nKol-vo iteracij: %d\n", iter);
    printf("\n Ocenki neizvestnyh:\n");
    for (i=0; i<n; i++)
        printf("%10.5f", x[i]); 
    printf("\n");
    printf("\n Vector nevjazok:\n");
    for (i=0; i<m; i++)
        printf("%e   ", y[i]);  
    printf("\n");
    printf("\nSrednekv. nevjazka: %e\n", s0);
    return 0;   }
пример такой
Ответ: steamangarsk, здравствуй, хотел узнать, решил ли ты ту задачу с избыточной системой нелинейных и трансцендентных уравнений обобщенным методом Ньютона. Если да, то какую функцию использовал. Буду очень признателен, если хоть что нибудь подскажешь.
Вопрос: Вызов обобщенного метода по переданному типу данных

Доброго времени суток

Возможно ли реализовать следующее:
void SomeMethod(string typename)
{
	var type = Type.GetType(typename);
	
	var test = new Test();
	test.Process<type>(() => {...});
}

public class Test
{
	public void Process<T>(Action<T> handler)
	{
		...
	}
}


Суть проблемы: возможно ли по переданному в обычный метод имени типа вызвать соответствующий обобщенный метод?
Ответ: ЕвгенийВ,
Ну и зачем ты у меня это спрашиваешь? спроси у та.
он спросил ему ответили - нет, я добавил можно если указать тип через аргумент и ффсё..
Вопрос: Как указать ограничения на тип данных что бы выполнялось условие ИЛИ

Подскажите как указать ограничения на тип данных что бы выполнялось условие ИЛИ. Например метод:
Код C#
1
2
3
4
        public static string m<T>(T t) where T: IA, IB
        {
            return t.ToString();
        }
Говорит что тип Т должен реализовать 2 интерфейса IA, IB. Как указать условие что бы типа Т реализовал либо IA либо IB ?
Ответ: Storm23, если метод является просто оберткой, который вызывает другие методы ?
Вопрос: Рихтер, обобщенный метод, требуется разжевать

Отрывок из книги:

C#
1
2
3
4
5
6
private static void Display(String s) {
  Console.WriteLine(s);
}
private static void Display<T>(T o) {
**Display(o.ToString());*//*Вызывает*Display(String)
}
Метод Display можно вызвать несколькими способами:

Display("Jeff");**********//*Вызывает*Display(String)
Display(123);*************//*Вызывает*Display<T>(T) - 2 cлучай
Display<String>("Aidan");*//*Вызывает*Display<T>(T)

В первом случае компилятор может вызвать либо метод Display, принимающий String, либо обобщенный метод Display заменяя T типом String). Но компилятор C# всегда выбирает явное, а не обобщенное соответствие, поэтому генерирует вызов необобщенного метода Display, получающего String.
Во втором случае компилятор не может вызвать необобщенный метод Display, получающий String, поэтому он вызывает обобщенный метод Display. Кстати, очень удачно, что компилятор всегда выбирает более явное соответствие. Ведь если бы компилятор выбрал обобщенный метод Display, тот вызвал бы метод ToString, возвращающий String, что привело бы к бесконечной рекурсии.


Здесь или недопечатка "НЕ", или я никак не могу разобраться как получится бесконечная рекурсия:
...не может вызвать необобщенный метод Display, поэтому вызывает обобщенный..... если бы компилятор выбрал обобщенный метод Display- тот вызвал бы метод ToString, возвращающий String, что привело бы к бесконечной рекурсии.
Ответ: minore, спасибо, дошло ))
Вопрос: Как передавать объект класса в методе main, чтобы конструктор не вызывался 2 раза?

Проблемы заключаются в следующем: есть класс для создания записи и класс для хранения массива этих записей. Так вот, как передавать объект класса Note в методе main, чтобы конструктор не вызывался 2 раза (Note *t, и потом в case 1: t = new Note() делать пробывала, но проблему с двумя вызовами конструктора так и не решилась). И проблема с gets_s, не даёт ввести с клавиатуры, пробовала использовать fflush перед этим делом, но всеравно игнорирует! Подскажите пожалуйста в чем дело и как это лучше исправить.

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
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
#include "stdafx.h"
#include <iostream>
using namespace std;
 
class Note {
private:
    char *FIO;
    int homeNumber;
    int workNumber;
    int mobNumber;
public:
    Note(char *str = "noName", int homeNumber = 0, int workNumber = 0, int mobNumber = 0) : homeNumber(homeNumber), workNumber(workNumber), mobNumber(mobNumber){
        fflush(stdin);
        char a[128];
        cout << "Enter name: ";
        gets_s(a,127);
        FIO = new char[strlen(a)+1];
        strcpy_s(FIO, strlen(a) + 1, a);
        cout << "Enter homeNumber: ";
        cin >> homeNumber;
        cout << "Enter workNumber: ";
        cin >> workNumber;
        cout << "Enter mobNumber: ";
        cin >> mobNumber;
    }
    ~Note() {
        delete[] FIO;
    }
    //Getters
    char *getName() {
        return FIO;
    }
    int getHomeNumber() {
        return homeNumber;
    }
    int getWorkNumber() {
        return workNumber;
    }
    int getMobNumber() {
        return mobNumber;
    }
};
 
class PhoneBook{
private:
    static int count;
    Note *mas = NULL;
public:
    void add(Note obj) {
        if (count==0)
        {
            mas = new Note[1];
            mas[0] = obj;
            count++;
        }
        else
        {
            count++;
            Note *tmp;
            tmp = new Note[count];
            for (int i = 0; i < count-1; i++)
            {
                tmp[i] = mas[i];
            }
            tmp[count - 1] = obj;
            delete[] mas;
            mas = tmp;
        }
    }
    void del() {
        if (count == 0)
        {
            cout << "No note!!!" << endl;
        }
        else
        {
            cout << "Enter FIO abonent for delete: ";
            char str[40];
            int index = -1;
            gets_s(str, strlen(str));
            for (int i = 0; i < count; i++)
            {
                if (strcmp(str,mas[i].getName())==0)
                {
                    index = i;
                }
            }
            if (index<0)
            {
                cout << "Not node for delete!!!" << endl;
            }
            else
            {
                count--;
                Note *tmp;
                tmp = new Note[count];
                for (int i = 0; i < index; i++)
                {
                    tmp[i] = mas[i];
                }
                for (int i = index+1; i < count+1; i++)
                {
                    tmp[i - 1] = mas[i];
                }
                delete[] mas;
                mas = tmp;
            }
        }
    }
    void show() {
        for (int i = 0; i < count; i++)
        {
            cout << "Name: " << mas[i].getName() << ", HomeNumber: " << mas[i].getHomeNumber()
                << ", WorkNumber: " << mas[i].getWorkNumber() << ", MobNumber: " << mas[i].getMobNumber() << endl;
        }
        cout << "================================" << endl;
    }
    void search() {
        cout << "Enter FIO abonent for search: ";
        char str[40];
        int index = -1;
        gets_s(str, strlen(str));
        for (int i = 0; i < count; i++)
        {
            if (strcmp(str, mas[i].getName()) == 0)
            {
                index = i;
            }
        }
        if (index<0)
        {
            cout << "Not node with your name!!!" << endl;
        }
        else
        {
            cout << "Name: " << mas[index].getName() << ", HomeNumber: " << mas[index].getHomeNumber()
                << ", WorkNumber: " << mas[index].getWorkNumber() << ", MobNumber: " << mas[index].getMobNumber() << endl;
        }
    }
};
 
int PhoneBook::count = 0;
 
int main()
{
    PhoneBook mas;
    int punkt = 0;
    do
    {
        cout << "Enter punkt menu (0 - exit): " << endl;
        cout << "1 - add note, 2 - delete not, 3 - search abonent,\n4 - show abonents, 5 - save to file, 6 - load out of file" << endl;
        cin >> punkt;
        switch (punkt)
        {
        case 0: exit(0); break;
        case 1: mas.add(new Note); break;
        case 2: mas.del(); break;
        case 3: mas.search(); break;
        case 4: mas.show();  break;
        case 5: break;
        case 6: break;
        default:
            cout << "Invalid punkt menu!!!" << endl;
            break;
        }
    } while (true);
 
    system("pause");
    return 0;
}
Ответ: С динамическим FIO такое к сожалению не прокатывает, а нужно именно в динамике хранить name.
Вопрос: Не работает обобщенная инициализирующая функция для конструкторов

Всем привет, делаю очередную программу по книжке Липманна, задание такое - есть класс String, который имеет 3 конструктора, первый является конструктором по-умолчанию, второй - конструктор иницализирующий строку класса встроенным массивом, третий является копирующим конструктором. В саму программу пользователем через поток передаются данные и инициализируются в строку, подсчитывается количество слов, гласных, негласных и т.п. Все работает нормально, но когда я по заданию пишу для конструкторов обощенную инициализирующую функцию, то компилятор мне не показывает никаких ошибок в коде, он просто не хочет компилировать. Посмотрите пожалуйста.

Кликните здесь для просмотра всего текста
Рабочий код:
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
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
#include <Class_String.h>
#include <iomanip>
#include <cstring>
#include <cstdlib>
#include <iostream>
 
void _init (const char *str, const String &rhs) {
if (!str && !rhs._string) {
    _size = 0;
    delete [] _string;
    _string = 0;
}
else {
    _size = strlen(str);
    _string = new char[_size+1];
    strcpy(_string, str);
}
else {
    _size = rhs._size;
    _string = new char[_size+1];
    strcpy(_string,rhs._string);
}
}
 
String::String() {
_size =0;
_string = 0;
}
 
inline String::String(const char *str) {
if (!str) {
    _size = 0;
    _string = 0;
}
else {
    _size = strlen(str);
    _string = new char[_size+1];
    strcpy(_string, str);
}
}
 
inline String::String(const String &rhs) {
    _size = rhs._size;
    if ( !rhs._string ) {
        _string = 0;
    }
    else {
        _string = new char[_size+1];
        strcpy(_string,rhs._string);
    }
}
 
inline String::~String() {delete [] _string;}
 
String& String::operator=( const String &rhs) {
    if ( this != &rhs) {
        delete [] _string;
        _size = rhs._size;
    }
    if ( !rhs._string) {
        _string = 0;
    }
    else {
        _string = new char[_size+1];
        strcpy(_string,rhs._string);
    }
    return *this;
};
 
String& String::operator=( const char* s) {
    if (!s) {
        _size = 0;
        delete [] _string;
        _string = 0;
    }
    else {
        _size = strlen(s);
        delete [] _string;
        _string = new char[_size+1];
        strcpy(_string,s);
    }
    return *this;
};
 
bool String::operator==( const String& rhs) {
    if ( _size != rhs._size ) {
        return false;
    }
    return strcmp(_string, rhs._string) ? false : true;
};
 
bool String::operator==( const char* s) {
    return strcmp(_string, s) ? false : true;
};
 
char& String::operator[]( int elem) {
    //assert(elem >= 0 && elem < _size);
    return _string[elem];
};
 
istream& operator>>( istream &io, String &s) {
    int limit_size = 4095;
    char zapas[limit_size];
 
    io >> setw(limit_size) >> zapas;
    s = zapas;
 
    return io;
};
ostream& operator<<( ostream &io,  String &s ) {
    return io << s.c_str();
};
 
int main () {
 
    setlocale(LC_ALL, "russian");
 
    int ix = 0;
 
    int aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0,
    theCnt = 0, itCnt = 0, wdCnt = 0, notVowel = 0;
 
    String Obj1, the("the"), it("it");
 
   while (cin >> Obj1) {
       ++wdCnt;
        cout << Obj1 << ' ';
 
      if (wdCnt % 12 == 0)
           cout << endl;
 
       if (Obj1 == the || Obj1 == "The")
            ++theCnt;
        else
       if (Obj1 == it || Obj1 == "It")
           ++itCnt;
 
           for (int ix = 0; ix < Obj1.s_size(); ix++ )  {
               switch (Obj1[ix])
                {
                   case 'a' : case 'A' : ++aCnt; break;
                   case 'e' : case 'E' : ++eCnt; break;
                   case 'i' : case 'I' : ++iCnt; break;
                   case 'o' : case 'O' : ++oCnt; break;
                   case 'u' : case 'U' : ++uCnt; break;
                   default : ++notVowel; break;
 
                }
            }
 
   }
 
 
 
    system("pause");
 
    return 0;
}


Обобщенная функция которую я написал, но она не проходит:
Кликните здесь для просмотра всего текста
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
void String::_init (const char *str, const String &rhs) 
{
  if (!str && !rhs._string) 
  {
    _size = 0;
    _string = 0;
  }
  else if (!rhs._string) 
  {
    _size = strlen(str);
    _string = new char[_size + 1];
    strcpy(_string, str);
  }
  else if (!str) 
  {
    _size = rhs._size;
    _string = new char[_size + 1];
    strcpy(_string,rhs._string);
  }
}
 
 
inline String::String() {_init(NULL,NULL); }
 
inline String::String(const char *str) { _init(str,NULL);  }
 
inline String::String(const String &rhs) { _init (NULL,rhs._string); }
Ответ:
Сообщение от FishZone
Рабочий код:
Сам класс где?

Добавлено через 21 минуту
Сообщение от FishZone
C++
1
char zapas[limit_size];
Нестандарт.
Сообщение от FishZone
C++
1
2
3
ostream& operator<<( ostream &io,  String &s ) {
    return io << s.c_str();
};
Откуда взялся метод c_str() в твоём классе? В выложенных реализациях нет. Class_String.h?
Вопрос: Обобщенный метод для двух разных типов

есть два класса - разные , которые ничем не отличаются, как мне сделать общий метод, который будет работать с ними обома ?
Ответ: Hamilton1996, если классы никак не связаны, то это нельзя сделать. Нужно чтобы был общий базовый класс или интерфейс которые задают общее поведение. В этом случае можно будет ввести where ограничение.
Вопрос: Обобщенный метод сортировки массива

Что-то не пойму, в чем проблема. Точнее, вижу, что мне пишет VS, но не пойму, что делаю не так. Нужно, чтобы метод сортировки принимал массив типа <T> и возвращал тоже типа <T>. Ошибку указал напротив той строчки, где она высвечивается. Вот код сортировки:

Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static T[] BubbleSort<T>(T[] a) 
        {
            for (int i = 0; i < a.Length; i++)
            {
                for (int j = i + 1; j < a.Length; j++)
                {
                    if (a[j] < a[i])  //Operator '<' cannot be applied to operands of type 'T' and 'T'
                    {
                        var temp = a[i]; 
                        a[i] = a[j];
                        a[j] = temp;
                    }
                }
            }
            return a;
        }
Можно ли как-то создать подобный метод?
Ответ: Разве что так:
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public static void BubbleSort<T>(T[] a) where T : IComparable<T>
        {
            for (int i = 0; i < a.Length; i++)
            {
                for (int j = i + 1; j < a.Length; j++)
                {
                    if (a[j].CompareTo(a[i]) < 0)
                    {
                        var temp = a[i];
                        a[i] = a[j];
                        a[j] = temp;
                    }
                }
            }
        }
Зачем возвращать этот же массив из метода, если массив это ссылочный тип?
Вопрос: Сравнение обобщенных переменных

Доброго времени суток форумчане. Есть класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public class A<T>
    {
        public T Inside { get; set; }
 
        /// <summary>
        /// Что то вставляем
        /// </summary>
        /// <param name="outside">Внешняя переменная</param>
        public void Insert(T outside)
        {
            // Внутреннюю переменную сравниваем с внешней
            if (Inside > outside)
            {
                // Что-то происходит
            }
        }
    }
В строке "if (Inside > outside)" происходит ошибка: Оператор ">" не возможно применить к операндам типа T и T.
Пытался реализовать интерфейс "IComparable<T>" с его методом "public int CompareTo(T other)", однако та же проблема.

Какие есть методы сравнения двух обобщенных методов? Заранее благодарен за ответы!
Ответ: Как вариант, можно не накладывать ограничение на тип Т, а передавать в конструктор класса А либо IComparer<T>, либо просто делегат Comparison<T>:
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
    public class A<T>
    {
        private readonly Comparison<T> compare;
        public T Inside { get; set; }
 
        public A() : this(Comparer<T>.Default) { }
 
        public A(IComparer<T> comparer) : this(comparer?.Compare) { }
 
        public A(Comparison<T> compare)
        {
            this.compare = compare ?? throw ArgumentNullException(nameof(compare));
        }
 
        /// <summary>
        /// Что то вставляем
        /// </summary>
        /// <param name="outside">Внешняя переменная</param>
        public void Insert(T outside)
        {
            // Внутреннюю переменную сравниваем с внешней
            if (compare(Inside, outside) > 0)
            {
                // Что-то происходит
            }
        }
    }
Использование:
C#
1
2
3
new A<int>();  // Использование сравнения по умолчанию, если такое определено для типа.
new A<int>(new MySuperComparer());  // Использование собственного класса, реализующего IComparer<int>
new A<int>((x, y) => -x.CompareTo(y)); // Использование лямбды. В данном случае — обратное сравнение.
Вопрос: Целочисленные структуры в качестве ограничения generic методов

Можно ли в ограничениях типа у generic методов указать только целочисленные структуры
Ответ: Нет.
Однако целочисленных структур не так уж и много, достаточно написать нужное количество перегрузок обычного метода.