C/C++

Член од
8 октомври 2011
Мислења
65
Поени од реакции
48
Само оваа неможев да ја решам...
Да се пополни квадратна матрица на зададениот начин. На пример, за внесена димензија 4 треба да се формира и испечати матрица во обликот:

1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3
 
M

Mr.InF3ction

Гостин
naturebum Како што видов нема наследување. А пристап до другата класа имаш со set и get методите. Затоа и ги бара во задачата затоа што без нив не може да работи програмата. Обична композиција е, нема наследување.

Прогнози на натпревари (низа од максимум 16 објекти од класата Match)
Match m[16];
Број на прогнози – големина на низата со прогнози
int brPrognozi; :icon_lol:

Било кога вика низа "од некој објект" иде на овој начин:
ImeNaKlasa promenliva [broj na objekti];

Не знам дали прашањето се однесуваше само за овие 2 или чекаш некој да ти ја реши цела? Почни од почеток чекор по чекор, ако закочиш некаде прашувај ќе помогнеме тука :)
--- надополнето: 16 август 2012 во 17:20 ---
Despod
PHP:
int n, broj;
    cin >> n;
    int matrica[n][n];
 
    for(int i = 0; i < n; i++){
        broj = i+1;
        for(int j = 0; j < n; j++){
            if(broj>n)
              broj =1;
            matrica[i][j] = broj++;
        }
    }
Ваљда е јасно како се прави тоа, финтата е бројачот да пуштиш и при секое вртење на првиот циклус да се иницијализира на редот кај што се наоѓа и нормално да направиш да почне од 1 ако е поголем од N.
 
Член од
10 јули 2012
Мислења
87
Поени од реакции
54
Класа во класа не можеш да дефинираш, но можеш да декларираш објект од некоја класа во друга класа. Пример:
Код:
class A
{
. . .  
public:
        int x;
};
 
class B
{
        A obA;
}
Еве тука имаш класа А со некаква променлива, и класа В со објект од класа А. Достап до х преку објект од В:
Код:
B ob_B;
obB.obA.x;
Во задачата ти се бара нешто слично, само што немаш декларирано класичен објект, туку низа од објекти:
A obА[16];
Достапот ти е потполно ист, освен што имаш индекс.
obB.obA[0].x;
 
Член од
4 август 2011
Мислења
178
Поени од реакции
517
Да се напише фукнција која како аргумент прима низа од знаци. Функцијата треба да го врати бројот на зборови во низата кои започнуваат на буквата “а” или “А”. Зборовите во низата се составени од алфанумерички знаци и меѓусебно се одделени со едно или повеќе празни места и (или) интерпункциски знаци.

#include<stdio.h>
#nclude<ctype.h>
#include<string.h>
int bukvaA(char niza[])
{
int i,brojac=0;
char ch=niza;
for(i=0;i<strlen(ch);i++)
{
if ((isspace(ch)) || (ispunct(ch)))
{
if((niza[i+1]!=’a’) || (niza[i+1]!=’A’)])
brojac++;
}
}
return brojac;
}



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

Ако може мала помош за овие задачи, дали првата е во ред(и зошто не е :)), и барем идеја за втората.
 
M

Mr.InF3ction

Гостин
Jas.

PHP:
int zboroviA(char *niza){
    int flag=0,brojac=0;
    for(int i = 0; i < strlen(niza); i++)
    {
        if(isalnum(niza[i])) // ако знакот е алфанум
        {
            if(flag == 0){ // и предходно не сме биле во збор
                if(niza[i] == 'a' || niza[i] == 'A') //значи ова е првата  буква и проверуваме дали е 'a' или 'A"
                    brojac++;
                flag = 1;//постави дека сме во збор.
            }
        }
        else // ако знако што го читаме не е алфанум
            flag = 0; //значи не сме во збор.
    }
    return brojac;
}
Било кога имаш нешто со зборови во реченица итн се користи овој алгоритам да знаеш кгоа си во збор, кога не си после се е лесно.

Втората е исто така лесна.
-Пушташ 2 циклуси да вртат се додека не дојдат до крајот на низата.

PHP:
for(int i = 0; i < strlen(niza1); i++)
 
    for(int j = 0; j < strlen(niza2); j++)
 
            if(niza1 == niza2[j])
Сега внатре е уствари целата работа што се случува, а тоа е дека треба niza1 од i до крајот да шифташ за еден знак за лево пр ако niza1 е kajgana (да речеме дека 'a' се наоѓа во втората низа ) да биде kjgana.
И одкако ќе направиш ова на крајот ставаш '\0' знакот за кога ќе се врати на првиот for да се ажурира должината на низата за еден знам помалку.
Шифтањето го правиш со уште еден циклус внатре ако се исполни условот.
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
Почнав со датотеките.

Е сега јасно ми е се во задачава само не ми е јасно како дефинирана инт променилива i , зема чар, печати.

Задачата е ваква.. (основната).

Програма за креирање на датотека, внесување текст во неа и затворање на датотеката, па повторно отворање за читање на внесен текст

Кодот.
PHP:
#include<stdio.h>
#include<stdlib.h>
int main()
{
    char tekst[100],c,*p=tekst;
    FILE *pokfile;
    int i=0;
 
    printf("vnesi tekst vo datotekata:\n");
    while((c=getchar())!='\n')
      {
                              tekst[i]=c;
                              i++;
                              }
      tekst[i]='\0';
                           
    if((pokfile=fopen("Datoteka","w"))==NULL)
    {
                                            printf("Greska pri otvoranjeto na datotekata \n");
    exit(1);
}
while(*p)
{
        if(fputc(*p,pokfile)==EOF)
        {
                                    printf("Greska pri vnesuvanje na datotekata\n");
        exit(1);
        }
        p++;
        }
fclose(pokfile);
printf("Tekstot koj go vnesovte vo datotekata e :\n");
if((pokfile=fopen("Datoteka","r"))==NULL)
{
                                      printf("Greska pri otvoranjeto na datotekata \n");
exit(1);
}
while(1)
{
        if((i=fgetc(pokfile))==EOF)
        break;
      putchar(i);
        }
        fclose(pokfile);
        system("pause");
        return 0;
        }
znaci i e int , a не ми е јасен делот кај ..

PHP:
while(1)
{
        if((i=fgetc(pokfile))==EOF)
        break;
      putchar(i);
        }
Кога сме веќе тука не ми е јасно зошто ја пишуваме библиотеката stdlib.h ?
 
Член од
10 јули 2012
Мислења
87
Поени од реакции
54
Тоа stdlib.h ти е за паузата на крај, таму е дефинирана функцијата. Иначе тоа со знаците... секој знак си има свое претсавување со цел број (int). Тебе сега за сега те интересираат првите 255 знаци или што би се рекло ASCII. Можеш да си ги провериш на нет (пиши ascii table - на гугл, и како слики барај ги). Или па еве ти кодче, имплементирај ќе видиш кој char има каква int вредност:

Код:
for(int i = 0; i < 256; i++)
{
        printf("%d: %c\n",i, i);
}
 

acermk

лавот во сенка
Член од
18 јуни 2009
Мислења
1.938
Поени од реакции
900
Можеби веќе некаде го имате одговорено прашањево ама ќе ви се помешам тука, сакам да прашам некој од искусните која е добра книга за C++ за почетници ?
 
B

Black Guard

Гостин
E-mail Енкриптор,подолго време се замарам ама ај,каде има проблем мора да има решение:D
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
Не ми е јасно кај датотекиве ова со "задавање на името со командна линија" или "проверување на името е зададено преку командна линија".


Колку што гледам од задачиве, на пример оваа.
Да се копира содржината на една датотека во друга. Имињата на датотеките се внесуваат преку командна линија.

Разликата од досегашните датотеки е само во (според мене) .. Дефинирањето на main.

PHP:
int main(int argc, char *argv[])
Зошто вака ? Што значи argc ? Што значи *argv[ ] ?

Потоа.

Има уште нешто што се разликува односно
PHP:
if (argc!=3)
{
    printf("gresno povikuvanje na aplikacijata\n");
return (-1);
}
тоа зошто argc!=3 ? А на пример во следната задача argc!=2 ?

па потоа одат со отворање на датотеката пак со if

PHP:
if((filepok=(argv[1],"w+"))==NULL)
{
    bla bla ..
}
Тоа значи дека argv[1] e првото име, argv[2] e второто име.. итн.. ?

Дали има некоја разлика зошто негде е return (-1) а негде exit(1) и каква врска има тоа?


Во друга задача пак е со If i еlse ...

if (argc==1) {
printf("Ne e zadadeno imeto na datotekata\n");
return(-1);
}

}
else
{
if((dat=fopen(argv[1],"r"))==NULL)
{ printf("Ne mozam da ja otvoram datotekata %s\n",argv[1]);

отприлика имам престава ама ако може некој попросто да ми ги објасни овие работи.
 
Член од
5 јануари 2008
Мислења
2.806
Поени од реакции
3.062
Имам проблем.

Задачата во збирката гласи.

Да се напише програма за копирање на содржината од една датотека во друга. Имињата на датотеките да се внесуваат од командната линија.

И вака е решена. (освен ако не сум пропуштил нешто негде иако неколку пати проверив.)

PHP:
#include<stdio.h>
void kopiranje(FILE *fpok1,FILE *fpok2)
{
    int i;
    for(;;)
    {
            if((i=getc(fpok1))==EOF)
            break;
            fputc(i,fpok2);
            }}
void pecati(FILE *fpok)
{
    int i;
    for(;;)
    {
            if((i=getc(fpok))==EOF)
              break;
              putchar(i);
              }}
           
 
int main(int argc,char *argv[])
{
    FILE *filepok1,*filepok2;
    if(argc!=3)
    {
              printf("Gresno povikuvanje na aplikacijata. \n");
              return (-1);
}
 
if((filepok1=fopen(argv[1],"r"))==NULL)
{
                          printf("Greshka pri citanjeto na datotekata:\n");
                          exit(1);
}
 
if((filepok2=fopen(argv[2],"w+"))==NULL)
{
                                  printf("greska pri kreiranjeto na datotekata. \n");
exit(1);
}
printf("\n vo datotekata e zacuvan tekstot :\n");
pecati(filepok1);
rewind(filepok1);
kopiranje(filepok1,filepok2);
rewind(filepok2);
printf("\n\n Iskopiraniot tekst vo novata datotekata e :\n");
pecati(filepok2);
fclose(filepok1);
fclose(filepok2);
system("pause");
return 0;
}
Која што не се уклучува..
Каде што мислам дека за да ја прочита таа датотека... прво треба да се напише а во задачите не е пишана за да не зафаќа место ?
Така?

Е сега за да ми работи програмата јас сакам прво да ја напишам едната датотека за да има што да се копира.

и нешто вака направив.

PHP:
#include<stdio.h>
void vnesi(char *p,FILE *pd)
{
    while(*p)
    {
              if(fputc(*p,pd)==EOF)
              {
                                  printf("Greska pri zapisuvanjeto vo datotekata. \n");
              exit(1);
              }
    p++;
    }
    }
void kopiraj(FILE *pd,FILE *pd1)
{
    int i;
    for(;;)
    {
            if((i=fgetc(pd))==EOF)
            break;
            fputc(i,pd1);
            }}
     
 
void pecati(FILE *pd)
{
    int i;
    for(;;)
    {
            if((i=fgetc(pd))==EOF)
              break;
              putchar(i);
              }}
       
 
 
int main(int argc,char *argv[])
{
    char string[100],*p=string,ime[100],*t=ime;
    FILE *pd,*pd1;
    if(argc!=3)
    {
              printf("Gresno povikuvanje na aplikacijata. \n");
              return (-1);
}
if((pd=fopen(argv[1],"w"))==NULL)
{
                                printf("Greska pri kreiranjeto na datotekata.\n");
exit(1);
}
printf("Vnesi tekst vo datotekata \n");
gets(string);
vnesi(string,pd);
fclose(pd);
 
 
if((pd=fopen(argv[1],"r"))==NULL)
{
                          printf("Greshka pri citanjeto na datotekata:\n");
                          exit(1);
}
 
if((pd1=fopen(argv[2],"w+"))==NULL)
{
                                  printf("greska pri kreiranjeto na datotekata. \n");
exit(1);
}
printf("vo datotekata e zacuvan tekstot :\n");
pecati(pd);
rewind(pd);
kopiraj(pd,pd1);
rewind(pd1);
printf("Iskopiraniot tekst vo datotekata e :\n");
pecati(pd1);
fclose(pd);
fclose(pd1);
system("pause");
return 0;
}
Прво ја испишував едната датотека ја затворив па ги отворив двете..
И .. пак не ми го отвара програмот.

може да ми каже некој каде грешам ?

:S
 
M

Mr.InF3ction

Гостин
Се е ок со задачата, само што ако пушташ од некoe IDE тогаш треба да ставиш со кои параметри-аргументи да почне програмата, то е целта со argc, argv.
Ако користиш code::blocks , иди Project>Set programs arguments и во полето Program Arguments внеси иминњата на дадотеките,, пр > text.txt text2.txt и ќе ти работи.
Ако користиш друга програма како visual studio за тоа гледај барај на гугл како да направиш тоа.
Ако не ти успее никако прво комапјлирај ја програмата и после преку CMD повикуваш вака : imeNaPrograma ImeNaDadoteka.txt ImeDrugaDadodteka.txt
 

Kajgana Shop

На врв Bottom