C/C++

Член од
10 јули 2012
Мислења
87
Поени од реакции
54
... ФИНТАТА Е ... функцијата од ДЕКАДЕН во БИНАРЕН што ми претвора на крај ИМА ГРАТИС нула.
Односно бинарниот број што се добива има една нула плус на десно.

може некој да ми каже што не е во ред со функцијата???

(за да не се замарате со целиот тој код.. погледнете ја само последната функција во нејзе мора да е проблемот - претворање од декаден во бинарен)

некој ?
Јас мислам дека грешката не ти е во "Декаден во Бинарен" туку во функцијата "Бинарен во Декаден":
broj(int x) и тоа смотана и елементарна грешка(ништо страшно). Целиот процес на множење го почнуваш со единица наместо со нула.
PHP:
int broj(int x)
{
    int broj,r,c;                   
broj=0;
r=1;
while(x>0)
{
          c=x%10;
          if(c!=0)
          broj+=stepen(2,r);
          r++;
          x/=10;
}
return broj;
}
Променливата r која ја користиш како индекс за позиција, треба да е инициализирана со нула. Вака , со единица, добиваш 2 пати по голем број од тој што го бараш.

Бај д веј, супер вака што пробуваш да се учиш сам. Мал совет, на фукнцииве и на променлививе давај им имиња што се во врска со операцијата што ја вршат. Вака не можат да се читаат убаво, без прво да се дешифрираат. :) И освен тоа, пробувај да ги правиш операциите со што по-малку ресурси и без непотребни променливи. Еве на пример, конкретно за функцијата broj(int x); (јас би го направил претварањето по друг начин, но колку за споредба по истиот)

PHP:
int BinarenVoDekaden(int bin)
{
int num = 0, count = 1;
for( ; bin > 0; bin/=10)
{
if(bin % 2 == 1)
num += count;
count *= 2;
}
return num;
}
Поздрав
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
До мене е, погрешно го знаев алгоритмот, мислев дека од 1 почнува:\

Ценам советот и ќе те послушам.
фала многу
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
Ме интересира зошто го користат овој алгоритам во скриптата

PHP:
 for(i=0;i<n-1;i++)
          for(j=i+1;j<n;j++)
                    if(a[i][j]!=a[j][i])
                    s=0;
         
                    if(s)
                    printf("matricata e simetricna\n");
                    else printf("matricata ne e simetricna\n\n");
за да се провери симетрична матрица.

кога може многу по прост алгоритам
PHP:
for(i=0;i<n;i++)
        for(j=0;j<n;j++)
                    if(a[i][j]!=a[j][i])
                    s=0;
           
                    if(s)
                    printf("matricata e simetricna\n");
                    else printf("matricata ne e simetricna\n\n");
само затоа што е побрз ?
или можеби во вториот има дупка негде
 
Член од
10 јули 2012
Мислења
87
Поени од реакции
54
Првиот алгоритам ти е двојно по ефикасен. Со вториот проверуваш прво дали елементите под диагоналата се еквивалентни со елементите над-диагоналата(секој со секој како што треба) и после пак истото, елементите над диагоналата се еквивалентни со елементите под диагоналата.
Пр: проверуваш дали а[0][5] == a[5][0] и после дали a[5][0] == a[0][5]. И самиот ќе се сложиш дека и двете проверки се идентични. И представи например, проверување на матрица од 10000+ елементи или матрица од матрици. Тогаш 5 проверки би значеле многу, а представи си двојно повеќе. А во овие елементарни задачи, нема разлика. Работата е дали сакаш прости алгоритми, или ефикасни. ;)
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
после впишана низа со знаци, односно букви, има една наредба str(i)='\0';

И после има циклус со while(i<20 && (str(i))!='\0')

Не ми е јасна таа наредба :\ s (заградите се големи, мали ги пишав зошто со големи италик ми го направи текстот -.-)
 
M

Mr.InF3ction

Гостин
Out Of Reality
Тоа ти е c-style string т.е низа од знаци. Тоа на крај '\0' се вика нул терминатор и означува дека е крај на низата.
Знаеш кога работиш со низи од цели броеви нели имаш една променлива што чува број на елементи на таа низа за да знаеш кога работиш со некој циклус кога е крајот на низата.. Во овој счучај крајот не низата е знакот \0. И секаде кога работиш со низи за да не ги поминеш границите на низата услов е str(i))!='\0')
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
Out Of Reality
Тоа ти е c-style string т.е низа од знаци. Тоа на крај '\0' се вика нул терминатор и означува дека е крај на низата.
Знаеш кога работиш со низи од цели броеви нели имаш една променлива што чува број на елементи на таа низа за да знаеш кога работиш со некој циклус кога е крајот на низата.. Во овој счучај крајот не низата е знакот \0. И секаде кога работиш со низи за да не ги поминеш границите на низата услов е str(i))!='\0')
во следната задача видов дека може и само со нула да го пишам str(i)=0 без тие наводниците горе и цртата:)
 
M

Mr.InF3ction

Гостин
Па не е исто. Бидејќи работиш со низа ако ставиш 0 ќе се запише ASCII кодот на 0 (48). '\0' е специјален знак што означува крај на низа. Ако во твојот пример работи не значи дека е ок да се користи така. за жал така е програмирањето мораш да почитуваш правила и стандарди :icon_lol:
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
Е сега, програмата е да се испечатат најмалите к - елементи од низата. (к-преку тастатура).

Во збиркава, прво прават дупликат низа на а(i), после пребарување у стилот ако претходниот е поголем со следниот да си ги заменат местата.

Тука е фрката со тоа што прво они користат алгоритам некој побрз што неможам да го сфатам(или ме мрзи да го мислам).
ме буни тоа ј<n-i-1.
PHP:
for(i=0;i<n;i++)
    for(j=0;j<n-i-1;j++)
    if(b[j]>b[j+1])
    {
                  pom=b[j];
                  b[j]=b[j+1];
                  b[j+1]=pom;
                  }
Ама ај нема везе, јас го направив вака.

PHP:
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    if(b[j]>b[j+1])
    {
                  pom=b[j];
                  b[j]=b[j+1];
                  b[j+1]=pom;
                  }
Со што пак го дава точниот резултат (подредени елементи од најмал па поголеми до к ).


Горниот for циклус, фрти, а внатре нема ни едно i !
И си викам штом нема внатре i ќе го извадам, џабе врти и ми остана само
PHP:
 for(j=0;j<n;j++)
    if(b[j]>b[j+1])
    {
                  pom=b[j];
                  b[j]=b[j+1];
                  b[j+1]=pom;
Е СЕГА, дава к броеви кој се помали ама не се од најмал па нагоре!

И .. прашањето ми е како тој for циклус прави да ги подредува броевите по големина кога нема i внатре во циклусот. Што улога има ??

инаку целиот код на задачата еве го.
PHP:
#include<stdio.h>
int main()
{
    int a[100],i,j,n,poz1,pom,b[100],k;
    printf("kolku elementi :D ?: ");
    scanf("%d",&n);
 
    printf("vnesi ja \n");
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
 
    printf("vnesi do koj element k :");
    scanf("%d",&k);
 
    for(i=0;i<n;i++)
    b[i]=a[i];
 
    for(i=0;i<n;i++)
    for(j=0;j<n-i-1;j++)
    if(b[j]>b[j+1])
    {
                  pom=b[j];
                  b[j]=b[j+1];
                  b[j+1]=pom;
                  }
                  printf("nizata do k element e :\n");
                  for(i=0;i<k;i++)
                  printf("%d, ",b[i]);
           
 
    system("pause");
    return 0;
}

А примерот за решението .

внеси елементи за низа : 7
внеси ја низата : 16 , 12, 5 , 49, 48, 47, 20.
Внеси колку најмали да се најдат. - 4
Програмата печати: 5 , 12, 16, 20.

пробајте со сите алгоритми горе ќе сфатите што зборувам.


Исто така не сфаќам зошто прават дупликат низа ???
некој помош?
 
M

Mr.InF3ction

Гостин
Ме мрзи да ги читам сите кодови сега но предоставувам ова го прават :
-Дупликат од низата за да не се вршат никакви промени на оргиналната.
-Дупликатот го сортираат на растечки редослед ( тоа што те буни со "i" во фор циклусот...а во условот нема "i'..нека не те буни алгоритам за сортирање е..гуглај bubble sort.
-И кога веќе ја имаш сортирана низата на растечки родеслед првите "К" елементи се најмали "K" елементи од низата.

Едит:
Ај малце да ти објаснам зошто одкако ќе смениш од ова :
PHP:
for(i=0;i<n;i++)
    for(j=0;j<n-i-1;j++)
    if(b[j]>b[j+1])
    {
                  pom=b[j];
                  b[j]=b[j+1];
                  b[j+1]=pom;
                  }
на ова:

PHP:
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    if(b[j]>b[j+1])
    {
                  pom=b[j];
                  b[j]=b[j+1];
                  b[j+1]=pom;
                  }
програмата пак работи.

Не секогаш е целта "само да работи". Имаш многу такви проблеми каде што кодот изгледа покомплицирано а работи подобро, побрзо. Тоа мораш да го сфатиш и не се обидувај секогаш да направиш кодот да изгледа просто.
Е сега и двете функции работат затоа што со buuble sort ( овој случај рестечки редоислед ) при секое вртење на вториот for циклус што е внатре најголемиот број иде на крај на низата.
Па вториот пат иде до предпоследниот, и така при секое вртење се намалува за еден бидејќи знаеме до предходниот пат сме ги ставиле сите најголеми броеви на крај и нема потреба што да бараме таму. И ова ти е оптимизацијата на bubble sort. A во твојот случај секогаш иде до крај и фактички на крајот правиш непотребни споредби барајки голем број да го ставиш на крај.
 
Член од
4 август 2011
Мислења
178
Поени од реакции
517
Ги молам поискусните за помош. Можеби подолу напишаното нема никаква врска едно со друго но немам никаква друга идеја.

Да се напише функција која на влез добива низа од знаци. Како резултат функцијата треба да врати колку зборови има во низата. Како збор се смета секоја низа од знаци која е одделена со празно место или со таб. Доколку се појават последователно повеќе празни места или табулари, да се остави првото празно место или таб, а сите останати да се отфрлат. Како резултат од фукнцијата исто така да се врати колку отфрлувања на празни места или табулари биле отфрлени.

#include <stdio.h>
#include <string.h>
#incude <ctype.h>

int zbor(char *niza)
{
int i, br=0, bukva=0;
char s;

for(i=0;i<strlen(niza);i++)
{
s=niza,

while(!(isspace(s)))
bukva++; //brojam bukvi duri ne stignam do prazno mesto,kako da brojam zbor?

while(bukva)
zbor++; // ??

if(isspace(s)) //uslov za da se otstranat poveke prazni mesta=??
.
.
.
.
br++;

}

}
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
денес се напнав со Покажувачиве.

Сеуште не можам да сфатам што е финтата со нив.
Мене ми се нешто слично на функции(барем така се пишуваат), но ми се како дел издвоен на страна кој се повикува на некое место со краток збор, и ги пишува сите информации претходно дефинирани кои треба да се пишат.

Е сега нешто што ме буни е некои покажувачи како на пример
swap(&a{i},&a[j]) имаат '&' a некои како на пример SimpleSort(a,n) немаат '&'.
Дали тие со & после мислам дека имаат * (integerot), дозволуваат да се менува променливата, а тие без само ги употребуваат истите за некои други работи ?

Aко може некој просто да ми ги објасни Покажувачиве..
 
M

Mr.InF3ction

Гостин
Jas.
Како прво функција не може да врати 2 вредоности т.е колку зборови има и колку табови-празни места избришал.
А алгоритмот за броње зборови е лесен..целата идеа е само да знаеш кога си во збор и кога не си...и моментот кога не си во некој збор а претходно си бил треба да зголемиш бројачот за зборови.. Сега немам време баш но покасно можам да ти помогнам,..се разбира ако некој друг не ти помогне меѓу време :)
 
Член од
10 јули 2012
Мислења
87
Поени од реакции
54
Да се напише функција која на влез добива низа од знаци. Како резултат функцијата треба да врати колку зборови има во низата. Како збор се смета секоја низа од знаци која е одделена со празно место или со таб. Доколку се појават последователно повеќе празни места или табулари, да се остави првото празно место или таб, а сите останати да се отфрлат. Како резултат од фукнцијата исто така да се врати колку отфрлувања на празни места или табулари биле отфрлени.
Малку ја искомплицирав ама мислам дека ќе можеш да се снајдеш. Сега незнам како би можело тоа, “како резулатат од функцијата исто така да се врати колку одфрлања има“. Направив да ги печати во самата функција, и за да видиш како работи е напишано и да си печати на секоја стапка. Главниот момент е: буквата од низата(реченицата) што ја проверуваш, дали се наоѓа во збор или надвор од збор. Затоа има и еден флаг кој ќе е дигнат кога буквата е во збор и спуштен кога е надвор од збор, а броиме колку зборови има кога флагот го менува знакот. Ама па вака е малку лошо зашто на крајот, на последниот збор( или не-збор :) , ако завршува реченицата со празни места) флагот нема да се смени, па затоа мора уште една проверка да правиш надвор од циклусот.

PHP:
#include <stdio.h>
#include <string.h>
 
int BrojNaZborovi(char *s)
{
      int count = 0, otfrlanja = 0;
      char *c = s;
      int InWordFlag = 0;
      for(int i = 0; i < strlen(s); i++)
      {
            if( *c != ' ' && *c != '\t')
            {
                  printf("zbor: %c\n", *c);
                  InWordFlag = 1;
                  c++;
            }
            else
            {
                  printf("ne  :\n");
                  if(InWordFlag)
                  count++; otfrlanja++; c++;
                  InWordFlag = 0;
            }
}
if(InWordFlag)
count++;
 
printf("OTFRLANJA:  %d",  otfrlanja);
return count;
}
Колку за проба еве ти и main фукнција

PHP:
int main()
{
    int n = BrojNaZborovi(" Ova e    nekakva    bezvezna  rechenica  ");
    printf("\n\n\nBroj na zborovi: %d \n", n);
}
Али како и да е, можеш на многу начини да проверуваш, пробај види си како ти е нај интересно. Можеш на пример да споредуваш две букви една до друга. Ако и двете се празни места, да ги прескокне, ако се различни, значи едната е збор, и накачуваш . . . инт инт.
--- надополнето: 6 август 2012 во 20:48 ---

Aко може некој просто да ми ги објасни Покажувачиве..
Нај едноставно: Покажувач кон адреса од меморијата.

strashna slika.jpg


Ете ти една опасна слика што ти кажува што се случува. На почеток се создаваат променлива од тип цел број, и покажувач кон цел број. Покажувачот може да зема вредност само од адреси, конкретно покажувачов adr, може да има вредност само од адреса на некаков цел број, зашто така е дефиниран. А кога создаваш една променлива од некаков тип, таа се создава во некој дел од меморијата и си има своја адреса. За да ја видиш таа адреса, се користи операторот &(незнам како се вика операторов на македонски - веројатно оператор за адреса o_O ). Ако сакаш баш да ја видиш адресата, пиши:
printf("%p", adr);
На таа третата слика ги врзуваш покажувачот и адресата на променливата одкако ќе ги врзеш arr и broj, пиши,
printf("%p", &broj );
и ќе видиш дека имаат иста адреса.
За да видиш кон каква вредност покажува еден покажувач, се користи операторот * ( пак незнам како е на мк). Дека arr и broj се врзани,ќе имаат иста вредност.
Пиши:
printf("%d", *adr);
printf("%d", broj );
и ќе имаат иста вредност.

А тоа за кога предаваш на функција аргумент по параметар или по адреса е нешто сосема друго. Меѓу другото тоа мислам дека го нема во Ц, туку во Ц++, и за вакви основни програмчниња нема да ти користат многу.
Ја би ти рекол, научи ги покажувачиве убаво, заедно со димамично алоцирање на меморија и почни да ги учиш тие структурите (struct). Нив кога ќе ги врзеш со покажувачите е интересно. И со тоа фактички основите на Ц ќе ти се готови.
Поздрав
 

Kajgana Shop

На врв Bottom