C/C++

  • Креатор на темата Креатор на темата Драган
  • Време на започнување Време на започнување
Би требало да е исто како за Code::Blocks дека се многу слични
 
Го снимив Code blocks 10.05, и не му направив ништо во settings таква работа, го испробав дали ќе ми уклучи "hello world" , ми компајлираше.
После го ископирав кодот на задачата, и ми дава "gresno povikuvanje na alikacijata" process returned -1.

Отидов во project set programs arguments, и не ми отвара ништо.

Дали треба нешто да прилагодам на code blocks освен hilight mode > c/c++ ..?

И што е проблемот?

--- надополнето: 18 август 2012 во 16:22 ---



Уф го направив, фала многу! Ми работи програмата!
--- надополнето: 18 август 2012 во 16:37 ---
И сега како што гледам внатре во програмата нигде нема внесување на име на датотека?

Тоа значи дека внесување од "командна линија" , е преку Project>Set programs arguments ?

А во програмата воопшто не се внесуваат?
 
Не знам дали си користел некогаш програми преку cmd...али еве најпрост пример ;
ping 192.168.0.1 -t
Името на програмата се вика ping а 192.168.0.1 и -t се аргументи што ги внесуваш за програмата. Е сега можело истото да се направи и во самата програма одкако ќе се пушти да пишува: внеси ип, внеси тоа...
Ама ете твојот пример ако имаш 2 дадотеки и сакаш да копираш содржина, за да завршиш побрзо работа одма при пуштање на програмата ги внесуваш и имињата на дадотеките..дека нели ти сега го правиш ова со IDE али некој би го користел програма преку CMD/terminal и полесно е во ист ред да куцаш да се пушти програмата и некои параметри да внесеше од старт..

Инаку внесување преку командна линија за во IDE е преку тоа set program arguments..а реално програма би го пуштил од CMD како што пишав горе:
imeNaprograma arguemtn1 argument2..
 
Не, нема што да внесуваш во програмата. Името на датотеката всушност ќе ти се наоѓа во argv[] кога ќе ја повикаш програмата преку командна линија.
Ова најчесто се прави преку command prompt, одиш до директориумот каде ти се наоѓа програмата, ја повикуваш, пишуваш име на датотека...
 
Да се напише програма која дадена текстуална датотека ќе ја промени на начин што секоја мала буква ќе ја промени во голема и обратно, додека останатите знаци од датотеката ќе останат непроменети. Изменетата содржина да се отпечати во друга датотека. Името на влезната и излезната датотека се задаваат од командна линија, а доколку не се зададени да се испечати начин на употреба на програмата.
#include<stdio.h>
int main(int argc, char *argv)
{
char c;
FILE *vlezna,*izlezna;
if(argc!=3)
{
printf(“Upotreba: %s ime_na_vlezna_datoteka\n”,argv[0]);
return (-1);
}
if((vlezna=fopen(argv[1],”r”))==NULL)
{
printf(“Ne mozam da ja otvoram datotekata %s\n”,argv[1]);
return(-1);
}
if((izlezna=fopen(argv[2],”w”))==NULL)
{
printf(“Ne mozam da ja otvoram datotekata %s\n”,argv[2]);
return(-1);
}
while((c=fgetc(vlezna))!=EOF)
{
if(isalpha(c))
{
if (isupper(c))
c==tolower(c);
else if(islower(c))
c==toupper(c);
}
}
fprintf(izlezna,”%c”,c) // ??? kako da se pecatat vo izleznata datoteka?
return 0;
}


Да се напише програма која ќе прочита датотека со име vlez.txt. Програмата треба да го испечати бројот на реченици во датотеката. Речениците завршуваат на некој од следниве знаци: “.” , “!”, “?”. Исто така програмата треба да го испечати бројот на знаци во најдолгата реченица.

За оваа задача, дали е мошно решение да ги избројам само знаците, и според нивниот збир да знам колку реченици има? Пример, да избројам три точки и два прашалника и да ми врати дека има пет реченици?

 
За оваа задача, дали е мошно решение да ги избројам само знаците, и според нивниот збир да знам колку реченици има? Пример, да избројам три точки и два прашалника и да ми врати дека има пет реченици?

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

А за втората ќе ти треба променлива за број на знаци во реченица, една променлива што ќе чува макс знаци во реченица и една променлива за број на реченици.
И сега одкако ќе почнеш да читаш знак по знак цело време зголемуваш бројачот на знаци...кога ке прочиташ една од тие 3 знаци што се за крај на реченица тогаш зголемуваш број на реченици, проверуваш дали број на знаци во реченица е поголем од макс број на знаци, ако е тогаш правиш макс да е еднакво на тоа и ресетираш бројачот на знаци на 0. ..толку е
 
Во задачиве за испит што ми се, сегде пишува да се зададе името на датотеката преку командна линија..
Е јас не знам тоа да го правам, некое другарче мислам дека ми спомна нешо преку command promp. .. Ако може некој да ми каже како се прави тоа ?

Потоа исто не ми е јасно како програмата да провери дали на командна линија се зададени сите потребни аргументи?

После како и зошто да се печати начин на употреба на програмата?

Ако може некој најпросто да ми објасни што треба да напишам кога ќе ми ги пишува секој од овие работи, без многу навлегување.
 
fprintf(izlezna,”%c”,c) // ??? kako da se pecatat vo izleznata datoteka?

fprintf и fscanf нај-често ти се користат за читање и запишување цели стрингови во фајл. За запишување само на еден карактер, како што сакаш во случајов, си има посебна функција fputc.
Дефинирана ти е како: int fputc(int c, FILE *stream);

Фактички тој ред горе, како прво, треба да се наоѓа во самиот циклус, зошто вака ти зимаш еден карактер, ги правиш тие проверки и трансформации врз него и не го запишуваш никаде, се дури не стигнеш до end of file (EOF) и тогаш променливата “с“ ќе ја има вредноста на последната буква, и неа ја запишуваш во “izlezna“.
- Како второ, операторот == што ги користиш, е оператор за еквивалентност ( проверува дали две работи се исти ) и со него не присвојуваш ниту присвојуваш ниту подесуваш вредност на нешто.
Од редот: с == tolower(c) ти добиваш како одговор дали “с“ е мала буква и целиот фрагмент:

Код:
if( isupper(c) )              -ако 'с' е голема
        c == tolower(c);   -провери дали 'с' е мала

- И како трето, би ти рекол да користиш fputc. Кодот од горе, само за запишувањето би требало да биде:

Код:
while( (c = fgetc(vlezna) )!= EOF)
{
        if( isalpha(c) )
        {
                if( isupper(c) )
                {
                       c = tolower(c);
                }
                else
                {
                      c = toupper(c);
                }
                fputc(c,izlezna);
        }
}
 
Како што сфатив јас секогаш кога ќе ми рече..

"ако не е испечатено имете преку командна линија испечати упатство за употреба."

ако нема име значи argc==1;

и тогаш..

PHP:
 if(argc==1)    //nema zadadeno ime?
(  printf("Upotreba : %s ime_na_datoteka.", argv[]);
return (-1);
  )

А кога ..
" Името се задава преку командна линија,ако не е зададено се чита од стандарден влез. ."

пак проверка дали има име..

PHP:
FILE *pd;
if(argc==1)
{
    pd=stdin;
}
else {
              bla bla bla..}

ако нема =stdin?" тоа е читање преку стандарден влез?

Точно е ова?

Проверување дали се зададени сите потребни аргументи?
тоа е
if(argc!=2) ???

што се смета за аргумент?

После во една задача пишува името на датотеката и бараниот збор се задаваат како аргументи од командната линја..
 
Во задачиве за испит што ми се, сегде пишува да се зададе името на датотеката преку командна линија..

Како што прочитав од поранешниве постови, разбрав дека користиш Dev - Cpp. Од скоро го немам пипнато, али ајде. Таму мислам дека имаш опција од менито, (File->Save As или како и да е) да зададеш локација кај да ти се сними ЕХЕ-то од кога ќе го билднеш проектот. За да ти е по лесно сатави го во С:\ . Одкога ќе го направиш тоа, ако програмата ти се вика test, во С: треба да имаш фајл test.ехе .
И сега тој фајл(апликација - сеедно) можеш да го пуштиш од command prompt. Просто отвараш command prompt и пишуваш С:\test.ехе и штракаш ентер. И сега ако во кодот на test.ехе, во main функцијата ги имаш зададено тие параметри argc, argv, освен што (кога ќе сакаш да ја пуштиш програмата од command prompt) ќе напишеш С:\test.ехе можеш да додадеш и некакви други аргументи, на пример ти ќе ја зададеш локацијата на датотека, име на човек( ако програмата ти чува имиња итн...).

Ако на пример и датотеката ти се наоѓа на пример во С: и се вика prostiBroevi.txt. ти кога ќе ја извикаш од command prompt, за да ја зададеш локацијата на датотеката можеш да напишеш вака:
С:\test.ехе С:\prostiBroevi.txt (се во еден ред и одвоено со место - ако не се лажам).

И сега, тој аргумент, во случајов С:\prostiBroevi.txt, ќе биде зачуван во argv[ ], и зошто е прв параметар предаден преку command prompt, ќе биде зачуван во argv[ 1 ]. ( argv[ 0 ] e аргумент предназначен за локацијата на ехе-то на програмата или во случајов ќе ти биде С:\test.ехе )

И сега ти во кодот можеш да си го користиш argv[ 1 ] како нормален стринг( пример за да отвориш фајл )

Код:
FILE *fp;
fp = fopen( argv[ 1 ], "r" );

Иначе тој другиот аргумен, argc е цел број кој има вредност, бројот на аргументите што си ги дал преку cmd.

Еве ти проста програма, сними ја во С: и пушти ја преку cmd, али дај некакви аргументи, без врска нека се, одвоени со празно место и ќе видиш, би требало да ти се разјасни. Еве вака:

Код:
#include <stdio.h>
 
int main ( int argc, char *argv[ ] )
{
        for(int i = 0; i < argc; i++)
                printf("%s\n", argv[ i ] );

пуштија преку cmd на пример вака
C:\test.exe asdf afg sdth sdhg ae thsyt s4 6tsdfg6 s6uy 7fs :)
 
Задачата е лесна но ме интересира дали така се бројат редовите.
Програма што треба да го испечати бројот на редови, знаци (без празни места) и бројот на празни места.


PHP:
#include<stdio.h>
#include<ctype.h>
void pecati(FILE *pd)
{
    int i;
    for(;;)
    {
        if((i=fgetc(pd))==EOF)
        break;
        putchar(i);
    }
}
 
int main()
{
    int red=0,znak=0,praz=0,i=0;
    char s[80],c;
    FILE *pd;
    if((pd=fopen("text.txt","r"))==NULL)
    {
        printf("\n Neuspesno citanje na datotekata. \n");
        exit(1);
    }
    pecati(pd);
    rewind(pd);
    while((fgets(s,80,pd))!=NULL)
          {
              i=0; c=s[0];
              while(c!='\n')
              {
                  if(isalpha(c))
                  znak++;
                  else if(isspace(c))
                  praz++;
                  i++; c=s[i];
              }
              red++;
          }
          printf("\n Vo datotekata ima vkupno %d znaci, %d prazni mesta i %d redovi.\n",znak,praz,red);
 
 
          }

Oдносно дали е правилно
i=0; c=s[0];
while(c!='\n')
{
i++; c=s[i];
}

дас Треба да го имаме зададено до колку знаци од ред да зема така?
 
А зошто правиш дупло работа земајки ред од дадотека во низа, па после во низата броиш знаци итн. Нема потреба од тоа од самиот текст фајл читај знак по знак брои што треба..само ќе ставиш и ако знакот е еднаков на нов ред да зголеми број на редови и тоа е.
Инаку кодот што прашуваш дали е правилно, ок е али ако направиш како што реков нема да имаш потреба од тоа.
 
Kje moze li nekoj da mi kaze kako kje bide main funkcijata na ovaa zadaca:
Da se napise rekurzivna funkcija sto kako vlezen argument prima cel broj.Funkcijata ja presmetuva sumata na cifrite na eden broj koi se naogjaat na neparnite pozicii gledano oddesno na levo.
pr: 35987594=4+5+8+5=22
Fala :)
 

Kajgana Shop

Back
На врв Bottom