Документ взят из кэша поисковой машины. Адрес оригинального документа : http://wasp.phys.msu.ru/forum/lofiversion/index.php?t6652.html
Дата изменения: Unknown
Дата индексирования: Mon Apr 11 10:06:59 2016
Кодировка: Windows-1251
Студенческий форум Физфака МГУ > Практикум по ЭВМ
Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Практикум по ЭВМ
Студенческий форум Физфака МГУ > Физфак и учеба > Форумы групп > 304 группа 2006 года рождения
Игрок
Народ, мож кто перечислить задачи + их суть! плиз...(можн оначиная с "суммы рядов")... umnik.gif
Rdk
------------------------------------------------------
Сумма ряда:
------------------------------------------------------
надо найти S=1+x+x^2/2+x^3/6+....+x^n/n!
(если n->бесконечности, то S=e^x, ряд Тейлора, есть в учебнике Шишкина)

S(x,n=0)=1;
S(x,n=1)=S(0)+x/1!
........
S(x,n=2)+=S(x,n=(n-1))+x^n/n!

=>
заводишь две переменные P(0)=1,F(0)=1, P=x^k, F=k!, тогда
в теле цикла:

for(k=1;k<=n+1;k++)
{
.........
P*=x;
F*=k;
S+=P/F;
.........
}
выводишь S
перед этим надо ввести (x) и (n)
вычисления дожны быть в виде отдельной функции, которой ты передаешь x и n,
а возвращать она должна S
ВОЗМОЖНЫ И ДРУГИЕ РЕАЛИЗАЦИИ ПРОГРАММЫ!!!
Rdk
------------------------------------------------------
Нахождение корней уравнения:
------------------------------------------------------

Цель программы соответсвует названию

->создаешь функцию f(x), корни которой нужно найти.

->создаешь функцию, которая находит корень методом деления отрезка пополам

для этого нужно передавать указатель на функцию f(x), начальную и конечную точку отрезка (double) и кол-во итераций.
{
проверяем значение на концах отрезка f(a) и f(cool.gif
проверяем не являются ли концы отрезка корнями
если они разных знаков (f(a)>0 && f(cool.gif<0) || (f(a)<0) && f(cool.gif>0), то продолжаем
вычисляем значение от середины отрезка (a+cool.gif/2.0
смотрим на каком промежутке меняется знак [a,x] или [x,b], обозначаем x=b или x=a соответственно
и так далее повторяем действия....
после n-операций возвращаем значение x.
}

->создаешь функцию, которая находит решения методом касательных
для этого надо передавать опять указатель на функцию, значение начальной точки, точность вычисления delta_x - передается для вычисления производной, кол-во шагов

f`(x)=(f(x+delta_x)-f(x))/delta_x
находишь новую точку, как x=x+f(x)/f`(x)
все в цикле.....
потом возвращаешь x

Откуда взялся этот метод я не знаю!

СИГНАТУРЫ (функций) ПЕРВОГО И ВТОРОГО МЕТОДА ДОЛЖНЫ СОВПАДАТЬ!!!!

в main сначала ссылаешься на одну функцию, через указатель, а потом на другую...
Rdk
------------------------------------------------------
Умножение матриц:
------------------------------------------------------

пусть дана матрица A (n*m) и вектор-столбец B (m*1)

Тогда:

Нужно ввести: Нужно вывести:

Код
a_11 a_12 ..... a_1m           b_1             a_11*b_1+a_12*b_2+.....+a_1m*b_m
a_21 a_22 ..... a_2m           b_2             a_12*b_2+.....................+a_2m*b_m
.....................     *   .....     =                    .........................
a_n1 a_n2 ..... a_nm           b_m             a_n1*b_1+....................+a_nm*b_m



1.объявляем динамический двумерный массив ( как на семинаре, но где нужно double, вместо int) размера n*m, вводим его элементы (scanf!!)
2 объявляем динамический одномерный массив размера m, вводим его элементы
3 перемножаем в цикле их элементы, как показано выше
4 выводим элементы получившегося вектор-столбца
5 не забываем освободить память!
ivandasch
Препод, значит, ни разу не делал руками вычислительные задачи. Потому что еще с времен фортрана это прописная истина. Любому программисту со стажем(особенно поработавшему на машинах 70-80-х годов) от такого плохо станет. А вообще-то сделать это несложно. Например так:
Код
int main(int* argc, char** argv)
{
     double** matrix = new double*[N];
     for(int i=0; i < N; i++)
     {
          matrix[i] = new double[M];
     }
     //.....//
    for(int i = 0; i < N; i++)
    {
         delete[] matrix[i];
    }
    delete[] matrix;
    return 0;
}
или (вспоминая С)
Код
#include <cstdlib>
using namespace std;
int main(int* argc, char** argv)
{
     double** matrix = (double**)malloc(N*sizeof(double*));
     for(int i=0; i < N; i++)
     {
          matrix[i] = (double*)malloc(M*sizeof(double));
     }
     //.....//
    for(int i = 0; i < N; i++)
    {
         free(matrix[i]);
    }
    free(matrix);
    return 0;
}
Joe Satriani
2 ivandasch: О, Нашел и даже осилил довольно интересную перебранку дискуссию на эту тему .)
Don
давайте по теме,проги писать и скидывать,а то только все просят и ни кто не скидывает ничего
SkyWinder
а я вчера научился с фаилами работать! просто ради интереса! так здорово! матрица намного легче задается! Си намного хуже учиться чем дельфа.. ацццкий язык..
Цитата(Don @ 8.12.2006, 19:37)
давайте по теме,проги писать и скидывать,а то только все просят и ни кто не скидывает ничего
*

все в комп классе. открою тебе мааааленький секрет - заходишь под пользователем a604koro и копируешь ту прогу, которая тебе нужна)) . дома у меня даж сишника нет.))
AgReS2or
Петя, чиркини тут суть метода Ньютона, я дома попробую заботать
SkyWinder
2 AgReS2or:
берем монотонно возрастающюю ф-ию. определяем начальную точку, откуда будем находить 0 ф-ии.
находим в этой точке касательную. вида kx+b
k=(f(x+e)-f(x-e))/2h
b находишь из вормулы. потом смотришь в какой точке касательная пересекает 0.
теперь иксу присваиваешь новое полученное значение и повторяешь ту же операцию, пока f(x)>e
где е - какое-то маленькое число. т.е. точность, с которой мы хотим определить 0 ф-ии.
AgReS2or
спс
ivandasch
2 SkyWinder: Фигасе!!!! За три месяца только с файлами научиться работать...... Жесть!
AgReS2or
Что, мало?
Domovoy
Мда. Интересно, чему же вас вообще он учит, этот "МЕГАУМНЫЙ ВСЕ ПОНИМАЮЩИЙ препод (сокр. госу)".

IMHO, группа должна в среднем иметь возможность все-таки это самое "программирование" сдать.
Типичные ошибки "госу":
1) Поднимаем уровень - надо - научатся.
Не научатся. Будут бегать, просить: "напиши мне", и т.д.

2) Уровень держим более менее средний, а вот тех, кто делает свыше уровня - грузим по полной программе.
Я сюда, кажется, пришел заниматься все-таки фундаментальной наукой, а не считать всякую абстрактную херню. И занимать мое ЛИЧНОЕ время, чтобы потом сказать - да, вы нам подходите , не хотите ли поработать в нашем институте в жопе Москвы (с) (ах да, туда еще ездить надо, на семинары группы, на кластер тоже бы приехать надо, бумажку подписать и т.д.). Да, денег мы вам особо не заплатим, может года через три дадим на время ноут попользоваться и т.д.

3) "А вот Задков подписал бумагу в которой написано Win32 !!! Ниначем больше мы писать не будем!!! Пусть переписывают учебный план !!!"
Угу. Только вот сам он считает что можно хоть свой ноут принести, если на чем-то экзатическом писать.
Ради теста передал преподу сию генеральную линию партии - ответ - "вот пусть Задков зачет Вам и ставит тогда ! ". Ну Win32, так Win32. Напишем очередную стандартную библиотеку и под эту платформу...

Мое мнение, что программированию методами наших преподов научить нельзя.

P.S.: Сразу отвечаю сам себе - да, мое время не "ЛИЧНОЕ", в это время по расписанию у меня программирование и доп. времени все это у меня не требует. Но все-равно как-то оно мне не нравится. Практикум - когда сделал задачу, тогда и свободен. А в расписании все-таки написано "Практикум по ЭВМ", а не "Слежение за полетом мысли препода в течение всего семестра".
ivandasch
2 SkyWinder: То, что мы изучали, такая параша.... Пришлось все самому учить.....
P.S. А строки вроде этого?
Код
char s[100];
scanf("%s",s);
..... Мда, когда же вам про stl то говорить будут.... Я, конечно, понимаю, неметодично, но заставлять работать с С-строками - садизм.
AgReS2or
Илья, перенеси все лишние сообщения в отдельную тему
Buzzard
Цитата(ivandasch @ 10.12.2006, 12:23) *
2 SkyWinder: Фигасе!!!! За три месяца только с файлами научиться работать...... Жесть!


Три месяца - это 12 занятий в компьютерном классе, или 24 часа практики. Не думаю, что за одни сутки можно очень легко освоить файлы smile.gif А кроме файлов и весь C. Кроме того, не надо забывать, что в школе у многих программирования не было sad.gif

Способность усваивать новое тоже у всех разная. На последнем зачете 5 ! человек не смогли написать функцию, возводящую целое число в квадрат smile.gif
AgReS2or
Ура, хоть кто то заянлял мою сторону
Don
Санек,луше б Ире помог,чем выпендриваться.у нее проблемы с инфой.
AgReS2or
Да, Ире не помешает помощь, зато у нее Орлов по истории есть smile.gif, и мне помоги с инфой
Don
чем?возьми книгу давай ссылку дам,говорят ничего

а у меня Шилдт
AgReS2or
Что то Ире ты книгу не советовал! Мне лучше усваивается, когда объясняют, ну если Сане не в лом будет
ivandasch
А че конкретно не понятно?
P.S.Зарегистрируйтесь на форумах _education.aspu.ru и _vingrad.ru. Там много книг. И купите, наконец, Шилдта, он стоит рулей 300-400, а потом пригодится еще не раз.
AgReS2or
ну когда дают прогу, не ясно как бы ее записать в си
ivandasch
Может все-таки RTFM? Не может быть, что все не понятно.
AgReS2or
что есть RTFM? Нет, что то простенькое могу написать, но не думаю, что на зачете простые проги будут!
dvboy
Цитата(ivandasch @ 11.12.2006, 8:37)
P.S. А строки вроде этого?
Код
char s[100];
scanf("%s",s);

..... Мда, когда же вам про stl то говорить будут.... Я, конечно, понимаю, неметодично, но заставлять работать с С-строками - садизм.
*

Хм. Нашей группе и этого не преподали.... У нас вообще все на практикумах сидят как в тумане..
Спасибо хоть моему лицею, научили программировать.... Иначе тут бы я точно ничему не научился
AgReS2or
а ты из какой
Rdk
Умножение матрицы на вектор-столбец:
Вариант через new/delete:

Код
#include <stdio.h>
#include <conio.h>

int main()
{
    int i, j;

    printf("Input i:");
    scanf("%d",&i);
    printf("Input j:");
    scanf("%d",&j);
    
    if(i<1 || j<1)
    {
        printf("Invalid input");
        return 0;
    }

    double **a = new double*[i*j];
    for(int b=0;b<i;b++)
    {
        a[b]= new double[j];
    }

    printf("Input Matrix-Element I*J... \n");
    for(int d=0;d<j;d++)
        for(int c=0;c<i;c++)
        {
            printf("Input a[%d,%d]:",c,d);
            scanf("%lf",&a[c][d]);
        }
    
    
    double *v = new double[j];

    printf("Input Vector-Element J*1... \n");
        
    for(int c=0;c<j;c++)
        {
            printf("Input c[%d]:",c);
            scanf("%lf",&v[c]);

        }

    double *o = new double[i];

    printf("Ouput Vector I*1... \n");

    for(int y=0;y<i;y++)
    {
        o[y]=0;
        for(int t=0;t<j;t++)
            o[y]+=a[y][t]*v[t];
    }

    for(int h=0;h<i;h++)
        printf("Output o[%d]=%lf \n",h,o[h]);

    for (int e = 0; e < i; e++)
        delete[] a[e];
    delete[]a;
    delete[]v;
    delete[]o;

    getch();
    return 0;
}


Переделал на скорую руку.
Здесь инициализация вынесена в отдельную функцию и все через malloc/free

Код
#include <stdio.h>
#include <conio.h>
#include <malloc.h>

double** Init_Matrix(int i,int j)
{
    double **a = (double**)malloc(i*sizeof(double*));
    for(int b=0;b<i;b++)
    {
        a[b]=(double*)malloc(j*sizeof(double));
    }

    return a;
}
void Input_Matrix(double** a, int i, int j)
{
    printf("Input Matrix-Element I*J... \n");
    for(int d=0;d<j;d++)
        for(int c=0;c<i;c++)
        {
            printf("Input a[%d,%d]:",c,d);
            scanf("%lf",&a[c][d]);
        }
}

double* Init_Vector(int j)
{
    return (double*)malloc(sizeof(double)*j);
}

void Input_Vector(double* v,int j)
{
    printf("Input Vector-Element J*1... \n");
        
    for(int c=0;c<j;c++)
        {
            printf("Input c[%d]:",c);
            scanf("%lf",&v[c]);
        }
}

void Multiplication(double** a,double* v,double* o,int i,int j)
{
    for(int y=0;y<i;y++)
    {
        o[y]=0;
        for(int t=0;t<j;t++)
            o[y]+=a[y][t]*v[t];
    }
}

void Output_Vector(double* o,int i)
{
    printf("Ouput Vector I*1... \n");
    for(int h=0;h<i;h++)
        printf("Output o[%d]=%lf \n",h,o[h]);
}


int main()
{
    int i, j;

    printf("Input i:");
    scanf("%d",&i);
    printf("Input j:");
    scanf("%d",&j);
    
    if(i<1 || j<1)
    {
        printf("Invalid input");
        return 0;
    }

    double** a=Init_Matrix(i,j);

    Input_Matrix(a,i,j);
    
    double* v=Init_Vector(j);
    
    Input_Vector(v,j);

    double* o=Init_Vector(i);

    Multiplication(a,v,o,i,j);

    Output_Vector(o,i);

    for (int e = 0; e < i; e++)
        free((void*)a[e]);
    free((void*)a);
    free((void*)v);
    free((void*)o);

    getch();
    return 0;
}
AgReS2or
Спс
Rdk
Чтение файла
Жду критически настроенных прогрммистов, которые осудят мою программу. plus.gif
Надо бы еще проверки делать... 197.gif

Код
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <malloc.h>

FILE* Open(char* file)
{
    return fopen(file,"r");
}

int Size(FILE* a)
{
    char c;
    int i=1;
    while(!feof(a))
    {
        fscanf(a,"%c",&c);
        if(c=='\n')i++;
    }
    rewind(a);
    return i;
}

double* Read(FILE* m, int i)
{
    double* a=(double*)malloc(sizeof(double)*i);
    double* p=a;

    while(!feof(m))
    {
        fscanf(m,"%lf \n",p++);
    }
    return a;
}

void Bubble(double* a,int size)
{
    double temp;
    for(int i=0;i<size;i++)
    for(int j=size-1;j>i;j--)
    if(a[j]>a[j-1])
    {
    temp=a[j-1];
    a[j-1]=a[j];
    a[j]=temp;
                }
}

int main()
{
    FILE* stream;
    char c;

    stream = Open("s:\\changer\\io.i"); // "Ваш файл"

    int i = Size(stream);
    double* arr=Read(stream,i);

    Bubble(arr,i);

    for(int j=0;j<i;j++)
        printf("%lf \n",arr[j]);
    getch();

    fclose(stream);
    free((void*)arr);
}
AgReS2or
Это последнее, что нам дали?
Rdk
да mr47_06.gif
Don
молодец,сделай еще ченить со стоой простое
AgReS2or
это все что у него есть дома
Don
у меня вопрос: как используя цикл for можно добиться чтобы на экран выводилось с итого по катый элемент массива(номера элементов вводим тоже с клавы) вот начало,а как продолжить?:
#include<iostream.h>

int main()
{
char arr[20];
cout<<"vvedite stroku 1:";
cin>>arr;
cout<<"\n";
cout<<"ento vascha 1 stroka:";
cout<<arr;
cout<<"\n";
int i,k;
cout<<"vvedite i :";
cin>>i;
cout<<"znach: "<<arr[i];
cout<<"\n";
cout<<"vvedite k :";
cin>>k;
cout<<"znach :"<<arr[k];
cout<<"\n";
for(а что тут писать?)
{
и тут что писать
}

return 0;
}


194.gif
AgReS2or
ну не знаю я с твоими, но с принтф это примерно так
for (k=1; k<i-1; k=k+1) i кол-во элементов, к номер
printf (%d, &arr[k]);

Могу ошибаться, поправьте, если не так

А с итого соответственно не с 1 а с нужного номера
ivandasch
2 Don:
Код
for(j = element_i; j <= element_k; j++)
{
     .....
     cout<<arr[j]<<"\n";
}
AgReS2or
Вот, Илья, можешь выпендриваться дальше smile.gifsmile.gifsmile.gif
Don
спасибо!
AgReS2or
блин, народ, не по теме сказано будет, но че то аватар не меняется, удаляю, ставлю новый с компа, а появляется старый
AgReS2or
Все, отбой, все ОК
SkyWinder
а-а-а)) народ, скиньте сюда 3-ю задачку плиз) я ООП нифига не понимаю)
AgReS2or
напомни условия, просто то, что третье у И.И., у меня второе и наоборот
Buzzard
Цитата(SkyWinder @ 25.3.2007, 1:43) *
а-а-а)) народ, скиньте сюда 3-ю задачку плиз) я ООП нифига не понимаю)


Ваша задача заботать все до зачета, а не спрашивать готовую программу. Неужели Вы считаете себя обделенным умом настолько, что сами не в состоянии разобраться с простейшим предметом? wink.gif И не надо говорить, что программирование Вам не понадобится. Вам много еще чего из Вашего обучения не понадобится - воспринимайте это как тренировку головы.
DELIRIUM
2 Buzzard:
ну вообще говоря, ООП не всем нужно =) Я например не использую, хоть и программер =)
Воспринимать, как тренировку головы правильно =)
AgReS2or
Честно говоря, в том семестре было полегче, я во всяком случае понимал, что делаю, делал сам, а тут уже приходится все время спрашивать, в этот раз зачет страшнее, да еще и коллоквиум.
SkyWinder
2 Buzzard:
Ну спасибо тебе большое за бесценнейший совет! wink.gif
Но я не такой безнадежный раздолбай, как это могло показаться)
на Дельфи я эти проги бы написал за один урок.. а тут мне нужно хотя бы одна программа, что бы с синтаксисом разобраться..

2 DELIRIUM:
ООП нужно для больших проектов только.. или если составляешь базу данных например.. там без него никак..
Don
КЛАССНАЯ КНИГА ПО С++ а главное коротко и ясно))))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2016 IPS, Inc.