C/C++

Член од
23 април 2010
Мислења
10
Поени од реакции
0
da, vaka znam. mislav da e dinamicen za da moze da se dodavaat neogranicen broj elementi, a ne kako gore na slikata kade so moze samo 5 bukvi ili namesto 5 da e 100 bukvi itn.
 
M

Mr.InF3ction

Гостин
Епа концептот е тоа само што ако е динамички ќе биде подобро да се работи со лсти место некоја низа, бидејќи на листите на крај можеѓ мн лесно да додадеш или избришеш елемент. Ај ќе напишам еден примет па ќе постирам тука.
 
M

Mr.InF3ction

Гостин
Преска ми излезе работа па не можев да постирам еве го кодот :
PHP:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
 
typedef int info;
typedef struct list{
    struct list *next;
    struct list *back;
    info data;
}list;
//Inicijalizira dvojno kruzna povrzna lista so vodac
void inic(list **l){
    (*l) = malloc(sizeof(list));
    (*l)->next = *l;
    (*l)->back = *l;
 
}
 
//Dodava element na krajot na listata
void add(list *l, info dat){
    list *t = malloc(sizeof(list));
    if(t == NULL){
        fprintf(stderr, "Nema mesto");
        exit(-1);
    }
    t->data = dat;
    t->next = l;
    t->back = l->back;
    l->back->next = t;
    l->back = t;
}
 
typedef struct stack{
list *sList;
}stack;
 
// Inicijalizira stek, tuka pr ako sakas da cuvas drugi informacii kako broj na elementi, itn gi stavas na pocetni vrednosti
void inicStack(stack *s){
  inic(s->sList);
}
//Dodoava element vo stekot
void push(stack *s, info dat){
    add(s->sList,dat);
}
 
// vraka podatokot vo posledniot element od listata i go brise
info pop(stack *s){
    if(s->sList->back == s->sList){
        fprintf(stderr, "Underflow");
        exit(-1);
    }
    info d = s->sList->back->data; // zacucuva podatokot sto treba da vrati
    list *tmp = s->sList->back; // privremena promenliva sto pokazuva do poslendiot element za posle da se izbrise
 
    s->sList->back->next = s; //Ova e da se napravi posledniot element da ne e "del" od listata, da ne moze da se pristapi
    s->sList->back = s->sList->back->back;
 
    free(tmp); // posledniot element se brise
    return d;
}
 
// Vraka podatok od posledniot element vo lsitata no ne  se brise
info peek(stack *s){
    if(s->sList->back == s->sList){
        fprintf(stderr, "Underflow");
        exit(-1);
    }
    return s->sList->back->data;
}
 
 
int main()
{
    stack *s = malloc(sizeof(stack));
    inicStack(&s);
    printf("Push 100 elementi\n");
    int i;
    for(i = 0; i < 100; i++)
        push(s,i);
 
    printf("\nPop 100 elementi\n");
    for(i = 0; i < 100; i++)
        printf("%d, ",pop(s));
 
    printf("\nStekote veke e prazen :\n");
    pop(s);
 
    }
Може има простор за поправање итн но тоа е, работи ок како што проверив доле во главната функција. Функцијата add() не мора да се напише посебно но намерно така ставив за да не те збуни а и нема баш везе со стек туку за листи е. И да, кога се работи со стек подобро е да се користи листа, посебно двојно поврзана кружна листа бидејќи до последниот елемент најбрзо се пристапува, брзо се додава и се брише елемент од крајот.
 
Член од
10 јули 2012
Мислења
87
Поени од реакции
54
ako ne e problem ke moze li nekoj da mi kaze nekoj nacin za naogaanje na determinanta na nxn matrica. pobarav na net ali ne gi svakam kkao sto treba.
Може да се реши по два начина. Со рекурзија и со пермутации. Во моментов сум зафатен, но утре би можел да ти ги куцнам и да ги објаснам и двата начина, се разбира, ако некој друг од форумов до тогаш не ти ги објасни. :)
 
Член од
5 јуни 2008
Мислења
3.632
Поени од реакции
5.724
ako ne e problem ke moze li nekoj da mi kaze nekoj nacin za naogaanje na determinanta na nxn matrica. pobarav na net ali ne gi svakam kkao sto treba.
За детерминанти од ред 2 и 3 постои готова формула и е многу едноставно да се пресмета. За детерминанта од ред n>3 мене прво што ми текна е според следнава слика:


Значи вака:
- Најпрво ќе напишеш функција за пресметка на детерминанта од трет ред. За внесена матрица
детерминантата е
=
Еве, оваа функција нека се вика Determinanta3 со влезни параметри (int matrix[MAX][MAX],. int red, int kol).
- Потоа би можел во нова функција да ја пресметаш детерминантата на внесената матрица. Да речеме функцијата дека е Determinanta со влезни параметри за ред, колона и самата матрица. Одбери ред или колона по која ќе се движиш. Да речеме ред 1 (a,b,c). Не знам колку си запознаен со математиката како се пресметува ова, ама еве вака: Најпрво ги покриваш ред 1 и колона 1 па ти останува детерминанта од ред 2 (според сликата горе) која може да се пресмета со готова формула. Елементот во кој се сечат ред 1 и колон 1 се множи со резултатот од добиената детерминанта. Потоа се поместуваме во колона 2. Елементот во ред 1 и колона 2 (b) се множи со резултатот од детерминантата која се добива кога ќе се покријат ред 1 и колона 2. Овој резултат се собира со предходниот (кога бевме кај колона 1). Потоа одиме во колона 3 и се повторува истото, па се собира со предходните резултати. Итн итн.... Доколку при покривање добиеме детерминанта кој нема да биде од ред 2 како во случајов, туку од ред >3, тогаш горнава процедура се повторува за малата детерминнта се додека истата не се доведе до ред 3 за која имаме готова функција Determinanta3.
Ако ја сфати логикава, не би требало да имаш проблем :pos:
Би се решила со рекурзивна функција бидејќи ако редот е поголем од 3 полесно е да имаш цело време повици кон истата функција за да ја цепкаш детерминантата...
 
Член од
23 април 2010
Мислења
10
Поени од реакции
0
da da. da presmetam determinanta mi e mnogu po lesno nego da go isprogramidram. ako moze nekojj samo funkcijata Determinanta da mi ja napisi ke sum mnogu blagodaren?
 
Член од
10 јули 2012
Мислења
87
Поени од реакции
54
ako ne e problem ke moze li nekoj da mi kaze nekoj nacin za naogaanje na determinanta na nxn matrica. pobarav na net ali ne gi svakam kkao sto treba.
Како што кажав, детерминанта може да се најде по 2 начина - со минори и со пермутации. Првиот начин е како што ти објасни Filmakedon. Тоа правило важи за секоја NxN матрица. Единствени работи што треба да ги знаеш се: од математика - минори, од програмирање - рекурзија.
Сеа односно кодот, јас го реализирав вака.
Функции:
-int** CreateSquareMatrix(int len) - создава матрица int [len][len] и го враќа покажувач до неа.
Код:
int** CreateSquareMatrix(int len)
{
    int **mat = new int*[len];
    for(int i = 0; i < len; i++)
        mat[i] = new int[len];
 
    return mat;
}
-int** Minor(int** Matrix, int row, int col, int len) - враќа матрица која представува минор на int** Matrix, со размер int len, со прешкртани индекси int row и int col.
Код:
int** Minor(int** Matrix, int row, int col, int len)
{
    int **Minor = CreateSquareMatrix(len - 1);
 
    for(int i = 0; i < len-1; i++)
    {
        for(int j = 0; j < len-1; j++)
        {
            Minor[i][j] = Matrix[i + (row <= i)][j + (col <= j)];
        }
    }
    return Minor;
}
-int Determinant(int **Matrix, int len) - пресметува и ја враќа детерминанта на int **Matrix со размер int len
Код:
int Determinant(int **Matrix, int len)
{
    int d = 0, t = 1;
    if(len < 2)
    {
        return Matrix[0][0];
    }
    if(len < 3)
    {
        return Matrix[0][0] * Matrix[1][1] - Matrix[1][0] * Matrix[0][1];
    }
    else
    {
 
        for(int j = 0; j < len; j++)
        {
            t = j % 2 == 0 ? 1 : -1;
            d += t*Matrix[0][j] * Determinant(Minor(Matrix,0,j,len),len-1);
        }
 
    }
    return d;
 
}
Функцијата Determinant... базата на рекурзијата се достигнува кога размерот на матрицата е 2. Може да се направи да е базата и за размер 3, но нема потреба да ги пишуваш сите тие множители, но како и да е, за матрица 2х2 мора да напишеш некаде формулата, па најдобро е од таму да почнеш.(За секој случај ја оставив и можноста ако е внесена матрица со размер 1, да се врати само тој елемент).

Кога размерот е поголем од 3, се движиме по редот со индекс 0 (затоа нема потреба од вложен for циклус).
Променливата t ја користиме за да видиме дали дадениот минор треба да го собереме или да го одземеме. По дефиниција треба да се работи со дигање на степен, но и вака се постигнува истиот ефект.( По деф. минорот се собира, кога збирот на индексите е позитивен, а се одзема кога е негативен. Го користиме фактот (-1)^n = 1 ако n = парен, и = -1 ако n е непарен. Во функцијата проверуваме само за ј бидејќи работиме по ред 0, нема логика да пишеме 0 + ј :) )

И елементот Matrix[0][j] е тој кој што се наоѓа каде што се пресекуваат редот и колоната кој што се прешкртуваат. По дефиницијата, минорот треба да се помножи по тој елемент, па да се собере или одземе со наредниот итн.
Третиот множител е детерминантата на минорот (детерминантата на помалата матрица е всушност минор, но сум се навикнал помалата матрица да ја викам минор.)
За оваа функција толку. Ако има нешто прашувај.

Функцијата Minor... Создава една матрица со размер за еден помала од дадената и почнува да ја полни со елементи. Кога ќе се дојде до внесените индекси row или col индексите i или j соодветно, се зголемува за еден, со што се постигнува прерипување(прешкртување) на редот или колоната.
Од кога ќе се исполни целата, и се враќа адресата.

За да ја користиш направи си функции за читање и печатење на матрица, и main() методот би требало да изгледа вака:

Код:
    int n;
    cout << "Vnesete Dolzhina na matricata: " << endl;
    cin >> n;
    int **Matrix = CreateSquareMatrix(n);
    ReadMatrix(Matrix, n);
 
    PrintMatrix(Matrix,n);
 
    cout << endl << endl;
 
    cout << Determinant(Matrix,n) << endl;
Вториот начин е поедноставен за пишување, но неможам сега, ќе го додадам за некое време.
 
Член од
2 јуни 2012
Мислења
43
Поени од реакции
7
Апсолутен почетник сум и затоа на повеќето преглупаво ќе ви свучи прашањево.
Како да го инсталирам C? :)
 
L

Luki Junior

Гостин
Требе ти Ц Компајлер. Инсталираш линукс, гцц, емакс, или некој друг текст едитор.

За виндоус,
Дев++ е добра платформа, опен соурс, бесплатна, базирана на гцц компајлер.
http://www.bloodshed.net/dev/devcpp.html

А ако ти се дават пари, Microsoft Visual Studio
 

POS-51

Infinity Driver
Член од
11 ноември 2008
Мислења
1.411
Поени од реакции
445
Добро шо е проблемов во задачава ? Зошто минутите не ми ги дава точно ? :mad: Ај помош...

Код:
#include <stdio.h>
 
const int HoursInDay = 24;
const int MinutesInHour = 60;
const int SecondsInMinute = 60;
 
int main () {
 
    int seconds;
    int minutes;
    int hours;
    int days;
    int InSeconds;
    scanf("%d", &InSeconds);
    seconds = InSeconds % SecondsInMinute;
    minutes = InSeconds / SecondsInMinute;
    hours = InSeconds / (SecondsInMinute * MinutesInHour);
    days = InSeconds / (SecondsInMinute * MinutesInHour * HoursInDay);
    printf("%d sekundi se %d casovi, %d minuti i %d sekundi", InSeconds, hours, minutes, seconds);
   
   
   
    return 0;
}
 
Член од
10 февруари 2008
Мислења
845
Поени од реакции
447
Добро шо е проблемов во задачава ? Зошто минутите не ми ги дава точно ? :mad: Ај помош...

Код:
#include <stdio.h>
 
const int HoursInDay = 24;
const int MinutesInHour = 60;
const int SecondsInMinute = 60;
 
int main () {
 
    int seconds;
    int minutes;
    int hours;
    int days;
    int InSeconds;
    scanf("%d", &InSeconds);
    seconds = InSeconds % SecondsInMinute;
    minutes = InSeconds / SecondsInMinute;
    hours = InSeconds / (SecondsInMinute * MinutesInHour);
    minutes %= 60;
    // days = InSeconds / (SecondsInMinute * MinutesInHour * HoursInDay);
    printf("%d sekundi se %d casovi, %d minuti i %d sekundi", InSeconds, hours, minutes, seconds);
 
 
 
    return 0;
}
Додади го ова
minutes %= 60;
и денови не ти требаат затоа што не печатиш денови....
 
Член од
29 август 2008
Мислења
56
Поени од реакции
4
Здраво! Ако може помош за оваа задача: Да се напише програма коjа за два знаци кои се читаат од стандарден влез (цифри од 0 - 9) ке го отпечати на екран производот на нивните вредности. Пример влез:
6 5
Излез:
30
Во "C" Програмски јазик.
Ви Благодарам однапред!
 

Kajgana Shop

На врв Bottom