C/C++

M

Mr.InF3ction

Гостин
Ако е факултетска задача тогаш на самата задача ти нагласува да "наследи" од некоја друга класа :)
 
Член од
7 август 2012
Мислења
57
Поени од реакции
3
Vo posledniot ispit po napreden razvoj na softver(c++/java) nemase naglaseno, zatoa i ve prasuvam :)
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
] на пример во следнава задача.
Да се испечати обратниот збор на даден збор.

Зошто кај void obr(char *c) (има ѕвездичка горе)
а кај покажувачот obr(copy); нема '&' ?

Не ми е јасно кога да ставам ѕвездички, кога да ставам '&' :S
Koга да не ставам '&' ..

може е просто и глупаво прашањево ама ептен се напнав, таман мислам дека сфатив пак ме буни зошто кај obr(copy) нема '&'.

Eве ја задачата
PHP:
#include<stdio.h>
#include<string.h>
  void obr(char *c)
    {
          int i,n;
          n=strlen(c);
          char pom;
          for(i=0;i<n/2;i++)
          {
                            pom=c[i];
                            c[i]=c[n-i-1];
                            c[n-i-1]=pom;
                            }
                            }
 
int main()
{
    int i=0,a;
    char zbor[100],copy[20];
    printf("vnesi go zborot : \n");
    while(i<20 && (a=getchar())!='\n')
    zbor[i++]=a;
    zbor[i]=0;
    strcpy(copy,zbor);
    obr(copy);
    printf("obratno zborot e : %s",copy);
    system("pause");
    return 0;
    }
 
Член од
10 јули 2012
Мислења
87
Поени од реакции
54
Кога ќе видиш ѕвезда како аргумент на функција, сметај дека во најголем дел, тоа ти е некаква низа. Ѕвездата нели значи покажувач, а покажувачот чува адреси. А во меин, веќе имаш некаква низа, во случајов - copy. Незнам дали знаеш, ама името на на низите е уствари покажувач, и покажува кон првиот бајт од низата. Еве на пример ќе ти пишам еден код безврска:

Код:
void print (char c)
{
      printf("%c  \n", c);
}
int main()
{
       char zbor[20] = " abcdefgh";
       print(*zbor);
}
Еве тука zbor е низа. Меѓу другото е и покажувач, кон првата буква од низата. Фактички во редот
print(*zbor);
Како аргумент се предава првата БУКВА од низата zbor.(Ако ја тргнеш ѕвездата ќе ја предадеш целата низа и ќе ти јави грешка, зашто функцијата прифаќа само една буква, а не низа од букви). Тоа исто можеш да го напишеш и како:
print( *(zbor+0) );
Ако напишеш
print( *(zbor+1) );
Одиш за едно место на десно, фактички втората буква од низата. И сега ако претераш со накачувањево ќе читаш некој си друг дел од меморијата што везе немаш што е. (Затоа се користи на крај од низа тој знак '\0', за да знаеш до каде е крајот - мада тоа не те интересира за сега, туку ајде кога веќе се распишував ).

И сега, ако веќе напишеш кај функцијава... Нели
print(zbor);
би ја предало како аргумент целата низа, и zbor е покажувач кон првата буква, ако пишеш и &,
print(&zbor);
тогаш ќе ја предадеш адресата на zbor, фактички ќе предадеш адреса на адреса. ( Иначе адреса од адреса се користи за матрици ).
Еве ти пак безвезе код колку за илустрација како би било со &:

PHP:
int main()
{
        char *zbor = "abcdefgh";
        print(&zbor);
}
void print (char **c)
{
        printf("%c   \n", *(*c+0) );
}
Ако го ставиш печатењето во циклус можеш да си направиш печатење на цела низа:

PHP:
void print (char **c)
{
       while( **c != '\0')
              printf("%c    \n", *(*c)++);
}
И правилата кога работиш со адреси ти се малку по различни и плус си е малку сложено, али сепак мислам дека со операторот &, не мора да се тормозиш. Да, тој подобрува читливост на код и е по едноставен, али сега за сега потполно се можеш да представиш само со покажувачите. & повеќе ќе ти треба за Ц++ кога ќе работиш со објекти.
 
Г

Грејвдигер

Гостин
Vo posledniot ispit po napreden razvoj na softver(c++/java) nemase naglaseno, zatoa i ve prasuvam :)
Сигурно имало во текстот што треба да се користи во одредена класа, па самиот ќе си видеш дали има наследување или не.
 
Член од
7 август 2012
Мислења
57
Поени од реакции
3
Nemase dadeno sigurno. I asistentite napomenaa deka na ispit treba sami da si doznaeme dali treba da ima nasleduvanje ili ne. :)
 
Г

Грејвдигер

Гостин
Nemase dadeno sigurno. I asistentite napomenaa deka na ispit treba sami da si doznaeme dali treba da ima nasleduvanje ili ne. :)
Друже, сигурно имало во текстот. Можеби малку пологички или збунувачки било напишано, да видат колку ви работи бојлерот... или во зависност од тоа што треба да го има како резултат, треба самите да видите која класа од која се наследува. :D

На колоквиуми ги имаше, а и во сите лабораториски, така да чисто сумњам де намало ништо :)
 
Член од
7 август 2012
Мислења
57
Поени од реакции
3
void najskapImot(Imot *x, int n)
{
float max = x[0].danok();
int poz = 0;
for (int i = 0; i < n; i++)
{
if (x(i).danok() > max)
{
max = x(i).danok;//linija 9
poz = i;
}
}

};

vo devetata linija mi dava greska od ovaa funkcija i vika argument of type 'float (Imot : : )()'does not match 'float'.
 
Член од
10 јули 2012
Мислења
87
Поени од реакции
54
vo devetata linija mi dava greska od ovaa funkcija i vika argument of type 'float (Imot : : )()'does not match 'float'.
Кодот ти е малку не јасен ама мислам дека на 9тата линија ти фалат на крајот загради.
Код:
max = x[i].danok();
Ако не пиши ја и класата па ќе видиме.
 
Член од
25 јануари 2009
Мислења
45
Поени од реакции
2
Ај ако знае некој датотеки нека помогне :sick:
"Дадена е датотека Operandi.txt од која што треба да се одделат само броевите и да се запишат во нова датотека Proizvod.txt и помеѓу нив да стои знакот *. Сите треба да бидат запишани во еден ред. "
Пр. Operandi.txt
woeiofihfg!$#%$^$ 2 jhfuyt 6.7 ufjuyfu @!$@#%098
Proizvod.txt
2*6.7*098
 
Член од
10 јули 2012
Мислења
87
Поени од реакции
54
Ова е прилично блиску до тоа што ти треба. На крајот ќе има проблем ако текстот ти завршува на букви; Ќе имаш уште една гратис ѕвезда после последната бројка. Али не е нешто сложено, имаш многу начини на кој што можеш да го средиш. Незнаев на кој јазик сакаш, но по моја предпоставка или на Ц или на Ц++. Така да еве ти ги и на двата:


На С:
PHP:
#include <stdio.h>
 
int main()
{
 
        FILE *read = new FILE;
        FILE *write = new FILE;
        read = fopen("C:\\Operandi.txt", "r");
        write = fopen("C:\\Result.txt", "w");
 
        int c, inNumb = 0;
        while( (c = fgetc(read)) != EOF)
        {
                if(c >= '0' && c <= '9' || c == '.')
                {
                        inNumb = 1;
                        fputc( c, write);
 
                }
                else
                {
                        if(inNumb)
                                fputc('*', write);
                        inNumb = 0;
                }
 
        }
 
        fclose(write);
        fclose(read);
}

На С++

PHP:
#include <iostream>
#include <fstream>
using namespace std;
 
 
int main()
{
        ifstream read("C:\\Operandi.txt");
        ofstream write("C:\\Result.txt"); 
 
        char ch;
        bool inNumFlag = false;
        do{
                read.get(ch);
                if(ch >= '0' && ch <= '9' || ch == '.')
                {
                        write.put(ch);
                        inNumFlag = true; 
                }
                else
                {
                        if(inNumFlag)
                                write.put('*');
                        inNumFlag = false;
                }
 
        }while( !read.eof() );
 
        read.close();
        write.close();
 
 
}
Ако нешто не е јасно кажувај.
 
Член од
25 јануари 2009
Мислења
45
Поени од реакции
2
Ова е прилично блиску до тоа што ти треба. На крајот ќе има проблем ако текстот ти завршува на букви; Ќе имаш уште една гратис ѕвезда после последната бројка. Али не е нешто сложено, имаш многу начини на кој што можеш да го средиш. Незнаев на кој јазик сакаш, но по моја предпоставка или на Ц или на Ц++. Така да еве ти ги и на двата:


На С:
PHP:
#include <stdio.h>
 
int main()
{
 
        FILE *read = new FILE;
        FILE *write = new FILE;
        read = fopen("C:\\Operandi.txt", "r");
        write = fopen("C:\\Result.txt", "w");
 
        int c, inNumb = 0;
        while( (c = fgetc(read)) != EOF)
        {
                if(c >= '0' && c <= '9' || c == '.')
                {
                        inNumb = 1;
                        fputc( c, write);
 
                }
                else
                {
                        if(inNumb)
                                fputc('*', write);
                        inNumb = 0;
                }
 
        }
 
        fclose(write);
        fclose(read);
}

На С++

PHP:
#include <iostream>
#include <fstream>
using namespace std;
 
 
int main()
{
        ifstream read("C:\\Operandi.txt");
        ofstream write("C:\\Result.txt");
 
        char ch;
        bool inNumFlag = false;
        do{
                read.get(ch);
                if(ch >= '0' && ch <= '9' || ch == '.')
                {
                        write.put(ch);
                        inNumFlag = true;
                }
                else
                {
                        if(inNumFlag)
                                write.put('*');
                        inNumFlag = false;
                }
 
        }while( !read.eof() );
 
        read.close();
        write.close();
 
 
}
Ако нешто не е јасно кажувај.
:cuc: tnx ej! :)
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
Недела дена ништо не пипнав програмирањево, но пак се враќам во акција.
Застанав кај покажувачи, отприлика сфатив како работат но не целосно.

Проблем ми е со матрициве, како можат да се внесат, бидејќи така како што замислував нешто не сака.

Ако има некој нерви убаво да ја разгледа и да ми каже каде грешам може да повели..

Задачата гласи вака.


6. Да се напише процедура којашто влезната матрица Am×n ќе ја преуреди така да
колоните и се во растечки редослед на максималниот елемент на колоната.
Пример:


1 2 3 4 1 4 2 1 1 3
8 6 6 3 3 >>>>> 3 6 3 8 6
0 3 9 2 7 >>>>> 2 3 7 0 9
8 6 9 4 7 4 6 7 8 9

Или да ја појаснам. Прво се наоѓа по еден маx вредност во секоја колона, и сите тие n елементи се сместуваат во низа.
Пример во прва колона тоа е 8, втора 6, трета 9 итн.

Потоа според нив, да се подредат цели колони според редоследот на нивните маx елементи.

Во скриптата ја имаат решено но без покажувачи.

вака :


- внеси матрица
- најди го макс вредност од секоја колона и смести ги во низа.
- подреди ја низата со макс елементи според растечки редослед а со таа вредност премести ја и цела нејзина колона. (мал додаток со simple sorting за да се подредат и колоните кој не го сфаќам баш).

И кодот изгледа вака.
(без покажувачи)

PHP:
#include<stdio.h>
int main()
{
    int i,j,n,m,a[100][100],t,max[100],k;
 
    printf("Vnesi ja dimenzijata na matricata : \n");
    printf("m = ");
    scanf("%d",&m);                    //def dimenzii na matrica
    printf("\n n = ");
    scanf("%d",&n);
 
  printf("\n Vnesi ja matriata : \n");
    for(i=0;i<m;i++)                      //vnesuvanje matrica
    for(j=0;j<n;j++)
    {printf("a[%d][%d]= ",i,j);
    scanf("%d",&a[i][j]);
    }
 
    for(j=0;j<n;j++)
    {
                    max[j]=a[0][j];    // niza so max vrednosti od kolonite
                    for(i=0;i<m;i++)
                    if(max[j]<a[i][j])
                      max[j]=a[i][j];
                      }
               
    for(i=0;i<n;i++)
    for(j=i+1;j<n;j++)
    if(max[i]>max[j])
        {
                      t=max[i]; max[i]=max[j]; max[j]=t;
                      for(k=0;k<m;k++)
                        {
                                        t=a[k][i];
                                        a[k][i]=a[k][j];
                                        a[k][j]=t;
                                        }
        }
 
    printf("Podredenata Niza so max elementi od sekoja kolona e : \n");
    for(j=0;j<n;j++)
    printf("max[%d]= %d\n",j,max[j]);
 
    printf("A podredenata matrica e : \n");
    for(i=0;i<m;i++)
    for(j=0;j<n;j++)
                    printf("a[%d,%d]=%d\n",i,j,a[i][j]);
             
                    system("pause");
                    return 0;
}

Е сега јас сакам да го направам со покажувачи за да ги извежбам.
прашање 1)
Дали како што се внесуваше низа така сега ќе се внесува и матрица ?
зошто на доле кодот ми јавува грешка,
- 8 C:\Dev-Cpp\Unsdfdftitled1.c invalid use of array with unspecified bounds.

односно.
PHP:
#include<stdio.h>
void vnesi(int a[][],int m,int n)
{
    int i,j;
    printf("vnesi ja matricata : \m");
    for(i=0;i<m;i++)
    for(j=0;j<n;j++)
    scanf("%d",&a[i][j]);
    }
int main()
{
    int a[100][100],n,m;
    printf("vnesi gi dimenziite : \n");
    scanf("%d",&m);
    scanf("%d",&n);
    vnesi(a,m,n);
    system("pause");
    return 0;
}
значи ли тоа дека не можам да ги пренесувам матриците?

Потоа во претходните задачи ЗА покажувачи имаше некои функции како на пример.

int linearno(int a[],int n,int vrednost)
и внатре на крај return t;

И се чини како најобична функција само што внесуваш низа внатре. И никаде не користиш ни * ни ништо.

PHP:
#include<stdio.h>
 
 
                void swap(int *a,int *b)
                {
                      int pom;
                      pom=*a;
                      *a=*b;
                      *b=pom;
                      }
void podredi(int a[],int n)
{
    int i,j;
    for(i=0;i<n;i++)
    for(j=0;j<n-i-1;j++)
    if(a[j]>a[j+1])
      {
                    swap(&a[j],&a[j+1]);
                    }
                    }
             
void vnesi(int a[],int n)
{
    int i;
    printf("Vnesi gi elementite na nizata : \n");
    for(i=0;i<n;i++)
    {
                    printf("a[%d]=",i);
                    scanf("%d",&a[i]);
                    }
                    }
             
int linearno(int a[],int n,int vrednost)
{
    int lb,i=0;
    lb=0;
    while(!lb && i<n)
    {
              if(a[i]==vrednost)
              lb=i;
              i++;
              }
              return lb;
              }
int linearno1(int a[],int n,int vrednost)
{
    int i;
    i=0;
    a[n]=vrednost;
    while(a[i]!=vrednost)
    i++;
    if(i==n)
    return 0;
    else return i;
    }
    int binarno(int a[],int n,int vrednost)
    {
        int i,poc,kraj,sred,najden;
        podredi(a,n);
        printf("podredeno nizata e : ");
        for(i=0;i<n;i++)
        printf("%d\n",a[i]);
        najden=0;
        poc=0;
        kraj=n-1;
        while(najden==0 && poc<=kraj)
        {
                        sred=(poc+kraj)/2;
                        if(vrednost<a[sred])
                        kraj=sred-1;
                        else if(vrednost>a[sred])
                        poc=sred+1;
                        else if(vrednost==a[sred])
                        najden=1;
                        }
                        if(najden)
                        return sred;
                        else return 0;
                        }
int main()
{
    int n,a[100],vrednost,preb,c;
    printf("vnesi kolku clenovi ima nizata : \n");
    scanf("%d",&n);
    vnesi(a,n);
    printf("vnesi koja vrednost ja barash : \n");
    scanf("%d",&vrednost);
    printf("vnesi na koj nacin da se odviva prebaruvanjeto \n Pritisni: \n -1)-lin. \n -2)lin2\n 3)binarno\n");
    scanf("%d",&preb);
    switch(preb)
    {
                case 1:
                      c=linearno(a,n,vrednost);
                      printf("Baranata vrednost se naoga na %d mesto vo nizata. \n",c);
               
                      break;
                      case 2:
                            c=linearno1(a,n,vrednost);
                            printf("Baranata vrednost se naoga na %d mesto vo nizata. \n",c);
                     
                            break;
                            case 3:
                      c=binarno(a,n,vrednost);
                      printf("Baranata vrednost se naoga na %d mesto vo nizata. \n",c);
               
                      break;
                      default:
                              printf("vnesovte pogresna vrednsot \n");
                              break;
                              }
                              system("pause");
                              return 0;
}
А разликата со другите кои имаа * пример :

PHP:
#include<stdio.h>
void vnesi(int a[],int n)
{
    int i;
    printf("vnesi ja nizata : \n");
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    }
int *promena(int a[],int n)
{
    int i=0,j,b[100];
    while(i<n)
    {    b[i]=a[i]+a[n-i-1];
              i++;
              }       
              return b;
              }
int main()
{
 
    int n,a[100],i;
    int *b;
    printf("vnesi kolku elementi : \n");
    scanf("%d",&n);
    vnesi(a,n);
    b=promena(a,n);
    printf("nizata e : \n");
    for(i=0;i<n;i++)
    printf("b[%d]=%d\n",i,*(b+i));
    system("pause");
    return 0;
}
се функции покажувачи зошто кај нив е дефинирана низата и од кај нив ја земаме?

Дали може така и со матрици ??? И како би се пренела матрицата од покажувачот најобично ?
Само претходно треба да го дефинраме со * ?
int *bp;

и после ја зема со bp=podredena_matrica(n.m);
printf("%d", b[k][j]); ???


ако ме разбра некој добро е :P
--- надополнето: 12 август 2012 во 16:00 ---
 

Kajgana Shop

На врв Bottom