Apa arti int main di c. Perbedaan antara int main() dan int main(void)? Parameter formal dan aktual

Fungsi utama.

Setiap program C dan C++ pasti mempunyai fungsi utama; dan terserah Anda di mana Anda meletakkannya. Beberapa programmer menempatkannya di awal file, beberapa di akhir. Namun, terlepas dari posisinya, Anda perlu mengingat hal berikut: Argumen untuk fungsi "utama". Prosedur awal Borland C++ mengirimkan tiga parameter (argumen) ke fungsi utama: argc, argv dan env. - argc, bilangan bulat, adalah jumlah argumen baris perintah yang dikirim ke fungsi utama, - argv adalah array pointer ke string (char *). Di bawah DOS 3.x dan yang lebih baru, argv didefinisikan sebagai jalur lengkap dari program yang akan diluncurkan. Saat dijalankan pada versi DOS sebelumnya, argv menunjuk ke string nol (""). argv menunjuk ke baris perintah pertama setelah nama program. argv menunjuk ke baris perintah kedua setelah nama program. argv menunjuk ke argumen terakhir yang dikirim ke main. argv berisi NULL. - env ​​​​juga merupakan array pointer ke string. Setiap elemen env berisi string dalam bentuk ENVVAR=nilai. ENVVAR adalah nama variabel lingkungan, seperti PATH atau 87.<значение>ini adalah nilai variabel lingkungan tertentu, misalnya C:\DOS;C:\TOOLS (untuk PATH) atau YES (untuk 87). Namun perlu diperhatikan bahwa jika Anda menentukan beberapa argumen ini, Anda harus menentukannya dalam urutan berikut: argc, argv, env. Misalnya, deklarasi argumen berikut ini valid: main() main(int argc) /* valid tetapi tidak terlalu bagus */ main(int argc, char *argv) main(int argc, char *argv, char *env) Main (int) deklarasi argc) sangat tidak nyaman karena mengetahui jumlah parameter, Anda sendiri tidak memiliki akses ke parameter tersebut. Argumen env selalu dapat diakses melalui variabel global lingkungan. Lihat variabel lingkungan (di Bab 3) dan fungsi putenv dan getenv (di Bab 2). Parameter argc dan argv juga tersedia melalui variabel _argc dan _argv. Contoh program menggunakan argc, argv dan env. Ini adalah contoh program, ARGS.EXE, yang menunjukkan cara paling sederhana untuk menggunakan argumen yang diteruskan ke fungsi utama. /* Program ARGS.C */ #include #termasuk void main(int argc, char *argv, char *env) ( int i; printf("Nilai dari argc adalah %d \n\n",argc); printf("Baris perintah berisi %d parameter \n\ n" ,argc); untuk (i=0; i<=argc; i++) printf(" argv[%d]: %s\n",i,argv[i]); printf("Среда содержит следующие строки:\n"); for (i=0; env[i] != NULL; i++) printf(" env[%d]: %s\n",i,env[i]); return 0; } Предположим, что вы запускаете программу ARGS.EXE со следующей командной строкой: C:> args first_arg "arg dengan kosong" 3 4 "terakhir kecuali satu" berhenti! Perhatikan bahwa Anda dapat mengirim argumen kosong dengan mengapitnya dalam tanda kutip ganda, seperti yang ditunjukkan dalam contoh "argumen kosong" dan "yang terakhir kecuali satu" dalam pemanggilan program. Hasil dari menjalankan program, Anda akan mendapatkan sesuatu seperti berikut: Nilai argc adalah 7 Baris perintah berisi 7 parameter argv: c:\turboc\testargs.exe argv: first_arg argv: arg dengan argv kosong: 3 argv : 4 argv: terakhir kecuali satu argv: berhenti! Lingkungan berisi baris berikut: env: COMSPEC=C:\COMMAND.COM env: PROMPT=$p $g env: PATH=C:\SPRINT;C:\DOS;C:\BC Panjang total maksimum baris perintah dikirim ke fungsi utama (termasuk spasi dan nama program itu sendiri), tidak boleh melebihi 128 karakter; Ini adalah batasan DOS. Karakter Escape Baris Perintah Argumen baris perintah dapat berisi karakter escape. Namun, mereka dapat memperluas semua nama file yang cocok dengan argumen dengan cara yang sama seperti yang dilakukan, misalnya, dengan perintah salin DOS. Untuk menggunakan simbol escape, saat menghubungkan program Anda dengan linker, Anda harus menyertakan file objek WILDARGS.OBJ yang disertakan dengan Borland C++. Jika file WILDARGS.OBJ dilampirkan ke program Anda, Anda dapat menggunakan argumen seperti "*.*" pada baris perintah. Dalam hal ini, nama semua file yang cocok dengan topeng ini dimasukkan ke dalam array argv. Ukuran maksimum array argv hanya bergantung pada ukuran area memori dinamis. Jika tidak ada file yang cocok ditemukan untuk topeng tertentu, maka argumen diteruskan dalam bentuk yang diketik pada baris perintah. (Artinya, fungsi utama meneruskan string yang berisi karakter escape). Argumen yang diapit tanda kutip ganda ("...") tidak diperluas. Contoh. Perintah berikut mengkompilasi file ARGS.C dan menghubungkannya ke modul WILDARGS.OBJ, dan kemudian menjalankan program ARGS.EXE yang dihasilkan: bcc args wildarg.obj args C:\BORLANDC\INCLUDE\*.H "*.C" Saat menjalankan ARGS.EXE, argumen pertama meluas ke nama semua file dengan ekstensi H di direktori Borland C++ INCLUDE. Perhatikan bahwa semua baris menyertakan rute lengkap (misalnya C:\TC\INCLUDE\ALLOC.H). Argumen *.C tidak diperluas karena itu diapit oleh tanda kutip. Jika Anda bekerja di Lingkungan Terpadu (BC.EXE), maka Anda hanya perlu menentukan di menu proyek nama file proyek, yang harus berisi baris berikut: ARGS WILDARGS.OBJ Kemudian, gunakan "Run/Arguments " perintah, Anda harus mengatur parameter baris perintah. Komentar. Jika Anda ingin pemrosesan karakter escape selalu terjadi, mis. Agar WILDARGS.OBJ dapat ditautkan secara otomatis oleh editor tautan, Anda harus memodifikasi pustaka C?.LIB standar Anda untuk menyertakan file WILDARGS.OBJ. Untuk melakukan ini, hapus SETARGV dari perpustakaan dan tambahkan WILDARGS. Hal ini dapat dilakukan dengan perintah berikut (kami berasumsi bahwa perpustakaan standar dan WILDARGS.OBJ terdapat dalam direktori saat ini): TLIB dijelaskan dalam Bab 7, Utilitas, dari Panduan Pengguna.tlib cs -setargv +wildargs tlib cc - setargv +wildargs tlib cm -setargv +wildargs tlib cl -setargv +wildargs tlib ch -setargv +wildargs Kompilasi menggunakan saklar -p (Konvensi pemanggilan Pascal) Jika Anda mengkompilasi program Anda menggunakan konvensi pemanggilan Pascal (dijelaskan secara rinci di Bab 9 " Berinteraksi dengan bahasa assembly", "Panduan Pemrogram"), Anda harus ingat bahwa fungsi utama harus dideklarasikan secara eksplisit sebagai fungsi C. Ini dapat dilakukan dengan menggunakan kata kunci cdecl kira-kira seperti ini: cdecl main(int argc, char *argv, char *env) Nilai yang dikembalikan oleh fungsi main. Fungsi utama mengembalikan nilai yang merupakan kode keluar program: ini adalah bilangan bulat. Namun, jika program Anda menggunakan fungsi keluar (atau _exit) untuk keluar, maka nilai yang dikembalikan akan menjadi argumen dari fungsi tersebut. Misalnya, jika program Anda berisi panggilan: exit(1) maka kode keluarnya adalah 1. Jika Anda menggunakan lingkungan terintegrasi Borland C++ (BC.EXE) untuk menjalankan program, maka Anda dapat melihat nilai kembalian dari main berfungsi dengan memilih "File | Dapatkan Info".

Halaman 53 dari 85

1.5.3. Melewati parameter ke fungsi utama

Fungsi utama, yang memulai eksekusi program C, dapat ditentukan dengan parameter yang diteruskan dari lingkungan eksternal, misalnya dari baris perintah. Lingkungan eksternal memiliki aturannya sendiri untuk representasi data, atau lebih tepatnya, semua data disajikan dalam bentuk string karakter. Untuk meneruskan string ini ke fungsi utama, dua parameter digunakan, parameter pertama digunakan untuk mengirimkan jumlah string yang akan ditransmisikan, parameter kedua digunakan untuk mengirimkan string itu sendiri. Nama umum (tetapi tidak wajib) untuk parameter ini adalah argc dan argv. Parameter argc bertipe int, nilainya dibentuk dari analisis baris perintah dan sama dengan jumlah kata pada baris perintah, termasuk nama program yang dipanggil (kata adalah teks apa pun yang tidak mengandung spasi karakter). Parameter argv adalah array pointer ke string, masing-masing berisi satu kata dari baris perintah. Jika sebuah kata harus mengandung karakter spasi, maka harus diapit tanda kutip saat menulisnya ke baris perintah.

Fungsi utama juga dapat memiliki parameter ketiga, yang biasa disebut argp, dan berfungsi untuk mentransfer ke fungsi utama parameter sistem operasi (lingkungan) di mana program dijalankan dalam bahasa pemrograman C.

Header fungsi utama terlihat seperti ini:

Jika misalnya baris perintah suatu program dalam bahasa pemrograman C terlihat seperti ini:

A:\>cprog menjalankan "program C" 1

kemudian argumen argc, argv, argp direpresentasikan dalam memori seperti yang ditunjukkan pada diagram pada Gambar 1.

Argc[4]
argv --> -->
-->
-->
-->
arg --> -->
-->
-->
-->
Gambar.1. Tata letak opsi baris perintah

Sistem operasi mendukung penerusan nilai untuk parameter argc, argv, argp, dan merupakan tanggung jawab pengguna untuk meneruskan dan menggunakan argumen aktual ke fungsi utama.

Contoh berikut adalah program yang mencetak argumen aktual yang diteruskan ke fungsi utama dari sistem operasi dan parameter sistem operasi.

Contoh:
ke dalam main (int argc, char *argv, char *argp)
( ke dalam saya=0;
printf("\nNama program %s",argv);
untuk (i=1; i>=argc; i++)
printf("\n argumen %d adalah %s", argv[i]);
printf("\nPengaturan sistem operasi :");
sementara (*argp)
( printf("\n %s",*argp);
arg++;
}
kembali(0);
}

Parameter sistem operasi juga dapat diakses menggunakan fungsi perpustakaan geteuv; prototipenya terlihat seperti ini:

char *geteuv (const char *namavar);

Argumen untuk fungsi ini menentukan nama parameter lingkungan, sebuah penunjuk ke nilai yang akan dikembalikan oleh fungsi geteuv. Jika parameter yang ditentukan saat ini tidak ditentukan di lingkungan, nilai yang dikembalikan adalah NULL.

Dengan menggunakan penunjuk yang diperoleh dari fungsi geteuv, Anda hanya dapat membaca nilai parameter sistem operasi, tetapi tidak dapat mengubahnya. Fungsi puteuv digunakan untuk mengubah nilai parameter sistem.

Kompiler bahasa pemrograman C membangun program C sedemikian rupa sehingga beberapa inisialisasi dilakukan di awal program, termasuk, antara lain, memproses argumen yang diteruskan ke fungsi utama dan meneruskan nilai parameter lingkungan ke dalamnya. Tindakan ini dilakukan oleh fungsi perpustakaan _setargv dan _seteuv, yang selalu ditempatkan sebelum fungsi utama oleh kompiler.

Jika suatu program dalam bahasa pemrograman C tidak menggunakan penerusan argumen dan nilai parameter sistem operasi, maka disarankan untuk melarang penggunaan fungsi perpustakaan _setargv dan _seteuv dengan menempatkannya di program C dalam bahasa pemrograman tersebut, sebelum fungsi utama, fungsi dengan nama yang sama, tetapi tidak melakukan tindakan apa pun (stub). Awal program dalam hal ini akan terlihat seperti:

setargv()
}
-setuv()
( kembali ; /* fungsi kosong */
}
ke dalam utama()
( /* fungsi utama tanpa argumen */
...
...
kembali(0);
}

Dalam program di atas, saat memanggil fungsi perpustakaan _setargv dan _seteuv, fungsi yang ditempatkan dalam program oleh pengguna akan digunakan dan tidak akan melakukan tindakan apa pun. Ini akan mengurangi ukuran file exe yang dihasilkan secara signifikan.

Borland C++ mendukung tiga argumen untuk main(). Dua yang pertama adalah argc dan argv tradisional. Ini adalah satu-satunya argumen main() yang ditentukan oleh standar ANSI C. Argumen ini memungkinkan argumen baris perintah diteruskan ke program. Argumen baris perintah adalah informasi yang mengikuti nama program pada baris perintah sistem operasi. Misalnya, ketika suatu program dikompilasi menggunakan kompiler baris Borland, biasanya program tersebut diketik bcc nama program

Di mana nama program adalah program yang perlu dikompilasi. Nama program diteruskan ke kompiler sebagai argumen.

Parameter argc berisi jumlah argumen baris perintah dan merupakan bilangan bulat. Itu selalu sama dengan setidaknya 1, karena nama program memenuhi syarat sebagai argumen pertama. Parameter argv adalah penunjuk ke array penunjuk karakter. Setiap elemen array ini menunjuk ke argumen baris perintah. Semua argumen baris perintah adalah string. Semua angka diubah oleh program ke dalam format internal. Program berikut akan mencetak "Halo" diikuti dengan nama pengguna ketika diketik langsung setelah nama program:

#termasuk

{
jika(argc!=2)
{
printf("Anda lupa mengetikkan nama Anda\n");
kembali 1;
}
printf("Halo %s",argv);
kembali 0;
}

Jika Anda memanggil program ini dengan nama dan nama penggunanya adalah Sergey, maka untuk memulai program Anda harus mengetik:
nama Sergei.
Hasil dari program ini akan muncul:
"Halo, Sergei."

Argumen baris perintah harus dipisahkan dengan spasi atau tab. Koma, titik koma, dan karakter serupa tidak dianggap sebagai pembatas. Misalnya:

Terdiri dari tiga baris, sedangkan

Ramuan, Rick, Fred

Ini satu baris - koma bukanlah pembatas.

Jika Anda perlu meneruskan string yang berisi spasi atau tab sebagai argumen tunggal, Anda harus mengapitnya dalam tanda kutip ganda. Misalnya, ini adalah salah satu argumen:

"ini adalah sebuah ujian"

Penting untuk mendeklarasikan argv dengan benar. Metode yang paling umum adalah:

Tanda kurung kosong menunjukkan bahwa array tidak memiliki panjang yang tetap. Anda dapat mengakses elemen individu menggunakan pengindeksan argv. Misalnya, argv menunjuk ke baris pertama, yang selalu berisi nama program. argv menunjuk ke baris berikutnya dan seterusnya.

Di bawah ini adalah contoh kecil penggunaan argumen baris perintah. Ini menghitung mundur dari nilai yang ditentukan pada baris perintah dan memancarkan sinyal ketika mencapai nol. Perhatikan bahwa argumen pertama berisi angka yang dikonversi menjadi bilangan bulat menggunakan fungsi atoi() standar. Jika string "display" hadir sebagai argumen kedua, maka penghitung itu sendiri akan ditampilkan di layar.

/* program penghitungan */

#termasuk
#termasuk
#termasuk
ke dalam main(ke dalam argc, karakter *argv)
{
int disp, hitung;
jika (argc<2)
{
printf("Anda harus memasukkan panjang hitungan\n");
printf("pada baris perintah. Coba lagi.\n");
kembali 1;
}
jika (argc==3 && !strcmp(argv,"display")) disp = 1;
jika tidak, tampilan = 0;
untuk(hitungan=atoi(argv); hitungan; -hitungan)
if (tampilan) printf("%d", hitung);
printf("%c", "\a"); /* di sebagian besar komputer ini adalah panggilan */
kembali 0;
}

Harap dicatat bahwa jika tidak ada argumen yang ditentukan, pesan kesalahan akan muncul. Hal ini paling umum terjadi pada program yang menggunakan argumen baris perintah untuk mengeluarkan instruksi jika ada upaya untuk menjalankan program tanpa informasi yang benar.

Untuk mengakses karakter baris perintah individual, tambahkan indeks kedua ke argv. Misalnya, program berikut mencetak semua argumen yang dipanggil, satu karakter dalam satu waktu:

#termasuk
ke dalam main(ke dalam argc, karakter *argv)
{
ke dalam, saya;
untuk(t=0; t {
saya = 0;
sementara(argv[t][i])
{
printf("%c", argv[t][i]);
}
printf(" ");
}
kembali 0;
}

Kita harus ingat bahwa indeks pertama untuk mengakses string, dan indeks kedua untuk mengakses karakter dalam string.

Biasanya argc dan argv digunakan untuk mendapatkan perintah sumber. Secara teoritis dimungkinkan untuk memiliki hingga 32767 argumen, tetapi sebagian besar sistem operasi bahkan tidak mengizinkan Anda mendekati jumlah tersebut. Biasanya argumen ini digunakan untuk menentukan nama file atau opsi. Menggunakan argumen baris perintah memberikan program tampilan profesional dan memungkinkan program digunakan dalam file batch.

Jika Anda menyertakan file WILDARGS.OBJ yang disertakan dengan Borland C++, Anda dapat menggunakan templat dalam argumen tipe *.EXE. (Borland C++ secara otomatis menangani wildcard dan menambah argc sesuai dengan itu.) Misalnya, jika Anda menghubungkan WILDARGS.OBJ ke program berikut, program ini akan memberi tahu Anda berapa banyak file yang cocok dengan nama file yang ditentukan pada baris perintah:

/* Tautkan program ini dengan WILDARGS.OBJ */

#termasuk
ke dalam main(ke dalam argc, karakter *argv)
{
daftar ke saya;
printf("%d file cocok dengan nama yang ditentukan\n",argc-1);
printf("Mereka adalah : ");
untuk(saya=1; saya printf("%s", argv[i]);
kembali 0;
}

Jika kita menyebut program ini WA, kemudian dijalankan sebagai berikut, kita akan mendapatkan jumlah file berekstensi EXE dan daftar nama file tersebut:

Selain argc dan argv, Borland C++ juga menyediakan argumen baris perintah ketiga -env. Parameter env memungkinkan program mengakses informasi tentang lingkungan sistem operasi. Parameter env harus mengikuti argc dan argv dan dideklarasikan sebagai berikut:

Seperti yang Anda lihat, env dideklarasikan dengan cara yang sama seperti argv. Sama seperti argv, ini adalah penunjuk ke array string. Setiap baris adalah string lingkungan yang ditentukan oleh sistem operasi. Parameter env tidak memiliki parameter argc setara yang menunjukkan berapa banyak baris lingkungan yang ada. Sebaliknya, baris terakhir dari lingkungan adalah null. Program berikut mencetak semua string lingkungan yang saat ini ditentukan dalam sistem operasi:

/* program ini menampilkan semua baris lingkungan */

#termasuk
ke dalam main(ke dalam argc, arang *argv, arang *env)
{
ke dalam;
untuk(t=0; env[t]/ t++)
printf("%s\n", env[t]);
kembali 0;
}

Harap dicatat bahwa meskipun argc dan argv tidak digunakan oleh program, keduanya harus ada dalam daftar parameter. C tidak mengetahui nama parameternya. Sebaliknya, penggunaannya ditentukan oleh urutan deklarasi parameter. Faktanya, Anda dapat memanggil parameter sesuka Anda. Karena argc, argv, dan env adalah nama tradisional, yang terbaik adalah terus menggunakannya sehingga siapa pun yang membaca program ini dapat langsung memahami bahwa ini adalah argumen untuk fungsi main().

Tugas umum program adalah mencari nilai yang ditentukan dalam string lingkungan. Misalnya, isi baris PATH memungkinkan program menggunakan jalur pencarian. Program berikut menunjukkan cara menemukan string yang mendeklarasikan jalur pencarian standar. Ia menggunakan fungsi perpustakaan standar strstr(), yang memiliki prototipe berikut:

Char *strstr(const char *str1, const char *str2);

Fungsi strstr() mencari string yang ditunjuk oleh str1 dalam string yang ditunjuk oleh str2. Jika string seperti itu ditemukan, penunjuk ke posisi pertama dikembalikan. Jika tidak ada kecocokan yang ditemukan, fungsi akan mengembalikan NULL.

/* program mencari di antara string lingkungan untuk baris yang berisi PATH */

#termasuk
#termasuk
ke dalam main (int argc, char *argv, char *env)
{
ke dalam;
untuk(t=0; env[t]; t++)
{
jika(strstr(env[t], "JALAN"))
printf("%s\n", env[t]);
}
kembali 0;
}

Setiap program C dimulai dengan panggilan ke fungsi main(). Fungsi ini harus ada di setiap program.

Seperti fungsi lainnya, fungsi main() dapat memiliki parameter. Terkadang saat memulai suatu program, ada gunanya menyampaikan beberapa informasi ke dalamnya. Informasi ini diteruskan ke main() menggunakan argumen baris perintah. Argumen Baris Perintah– ini adalah informasi yang dimasukkan pada baris perintah setelah nama program ketika program diluncurkan untuk dieksekusi di luar lingkungan pengembangan program. Misalnya, untuk mulai mengarsipkan file task.cpp, Anda perlu mengetikkan perintah berikut pada baris perintah:

winrar tugas utamatugas.cpp // winrar.exe tugas utamatugas.cpp

dimana winrar adalah nama program pengarsip, dan baris “ A», « Tugas Agung" Dan " tugas. cpp» mewakili argumen baris perintah yang memberitahu program untuk membuat arsip (" A") Dengan nama Tugas Agung dari satu file tugas. cpp.

Saat meneruskan parameter ke fungsi main(), parameter tersebut harus didefinisikan seperti ini:

int main(int argc, char *argv) ( ) // atau batal main(...)()

Parameter argc berisi jumlah argumen pada baris perintah dan merupakan bilangan bulat, dan selalu minimal 1, karena argumen pertama selalu berupa nama program (nama program dengan path lengkap ke program).

Parameter argv adalah penunjuk ke array penunjuk ke string. Dalam larik ini, setiap elemen menunjuk ke argumen baris perintah berikutnya. Tanda kurung siku kosong menunjukkan bahwa array mempunyai panjang yang tidak terbatas. Anda dapat mengakses argumen individual dengan mengindeks array argv. Misalnya, argv menunjuk ke string karakter pertama, yang selalu merupakan nama program; argv menunjuk ke argumen pertama dan seterusnya. Daftar argumen dibatasi hingga NULL, mis. argv == BATAL.

Untuk mengakses karakter individual dari salah satu argumen baris perintah, Anda harus menggunakan indeks kedua di argv. Artinya, indeks pertama argv menyediakan akses ke string, dan indeks kedua menyediakan akses ke karakter individualnya.

Semua argumen baris perintah adalah string, sehingga konversi parameter numerik ke format yang diinginkan harus disediakan dalam program saat dikembangkan.

Contoh program dengan berbagai cara untuk mengubah bilangan dalam format simbolik menjadi bilangan bulat dan bilangan real:

#termasuk

#termasuk

// saat startup kita menetapkan, misalnya, argumen berikut: 100 2.7

kekosongan utama(ke dalam a, karakter *b) (

k = strtol(b, &ptr, 10); // ptr = alamat kesalahan pada baris

f = strtod(b, &ptr);

pemindaianf(b, "%d", &k);

sscanf(b, "%lf", &f);

Nama argc dan argv bersifat tradisional, tetapi tidak wajib. Kedua parameter dalam fungsi main() ini dapat dipanggil sesuka Anda.

Contoh sederhana penggunaan argumen baris perintah:

ke dalam utama(ke dalam argc, karakter *argv) (

jika (argc != 4) (

printf("Parameter peluncuran program tidak valid!\n");

k = atoi(argv); // konversi parameter angka

printf("Halo, %s dari grup %s tahun %d",

Jika nama programnya adalah tugas, dan nama Anda adalah "Vasya", grup "PM-11" dari tahun pertama, maka untuk memulai program Anda harus memasukkan baris perintah:

tugas Vasya PM-11 1

Sebagai hasil dari pelaksanaan program, pesan berikut akan muncul di layar: “Halo, Vasya dari grup PM-11 tahun pertama.”

Harap dicatat bahwa jika tidak semua argumen baris perintah diberikan, pesan kesalahan akan ditampilkan. Program yang menggunakan argumen baris perintah sering kali melakukan hal berikut: Ketika pengguna menjalankan program ini tanpa memasukkan informasi yang diperlukan, program tersebut menampilkan instruksi tentang cara menentukan argumen dengan benar.

Argumen baris perintah harus dipisahkan dengan spasi. Jika terdapat spasi pada argumen itu sendiri, maka untuk mencegahnya membuat banyak argumen, argumen tersebut harus diapit tanda kutip ganda. Akibatnya, seluruh string yang dikutip akan dianggap sebagai satu argumen. Misalnya program dapat diluncurkan seperti ini: tugas “Vasya dan Petya” PM-21 2. Sebagai hasil dari pelaksanaan program, akan muncul pesan di layar: “Halo, Vasya dan Petya dari tahun ke-2 PM- 21 kelompok.”

Apa itu char *argv? Ini array yang elemennya berupa pointer, itu adalah array pointer. Artinya ketika meneruskan parameter ke main(), parameternya dapat didefinisikan seperti ini:

kekosongan utama(int argc, char **argv) (

Tugas. Tampilkan semua argumen baris perintah (tidak perlu menampilkan nama program).

#termasuk

batalkan main(int argc, char *argv)(

untuk (saya = 1; saya< argc; i++)

printf("%s\n",argv[i]);

Pilihan kedua ++

#termasuk

batalkan main(int argc, char **argv)(

while((p=*argv) != BATAL) (

printf("%s\n",p);

Biasanya, argumen baris perintah digunakan untuk menyediakan data awal yang diperlukan program saat dijalankan (misalnya, argumen baris perintah sering kali meneruskan data seperti nama file atau parameter peluncuran program).

Ketika suatu program tidak memerlukan parameter baris perintah, fungsi main() menggunakan kata kunci void dalam daftar parameternya (atau tidak menentukan apa pun).

Cara melakukan debug di SM program yang memerlukan argumen baris perintah. Di menu Jalankan→Argumen... Anda harus memasukkan argumen baris perintah. Tidak perlu menentukan nama program. Kemudian Anda cukup menjalankan dan men-debug program di lingkungan pengembangan seperti biasa.

Harap tangguhkan AdBlock di situs ini.

Jadi, mengapa kita memerlukan fungsi khusus? Fungsi yang ditentukan pengguna diperlukan untuk memudahkan pemrogram dalam menulis program.

Ingat, kita berbicara tentang paradigma pemrograman, lebih tepatnya tentang pemrograman terstruktur. Ide utamanya adalah bahwa program apa pun dapat ditulis hanya dengan menggunakan tiga konstruksi dasar: ikuti, kondisi, dan perulangan. Sekarang kita akan menambahkan satu lagi ke struktur ini - “subrutin” - dan mendapatkan paradigma baru pemrograman prosedural".

Satu-satunya perbedaan adalah kita akan menulis bagian individual dari program utama kita (khususnya, program berulang) dalam bentuk fungsi terpisah (subrutin, prosedur) dan memanggilnya sesuai kebutuhan. Intinya, program ini sekarang akan menjelaskan interaksi berbagai fungsi.

Jadi pada tutorial kali ini kita akan membahas secara detail bagaimana fungsi dibangun secara internal. Kita juga akan mempelajari cara membuat fungsi kustom kita sendiri.

Bagaimana fungsi-fungsinya bekerja

Mari kita ingat informasi dari pelajaran pertama. Semua fungsi, termasuk yang ditulis oleh pengguna, diatur dengan cara yang sama. Mereka memiliki dua bagian utama: header fungsi dan isi fungsi.

Daftar 1.

Int main(void)( // header fungsi // isi fungsi ditulis dalam kurung kurawal)

Semuanya jelas dengan isi fungsi: ini menjelaskan algoritma untuk fungsi tersebut. Mari kita lihat judulnya. Ini terdiri dari tiga bagian wajib:

  • tipe pengembalian;
  • nama fungsi;
  • argumen fungsi.

Pertama, tipe kembalian ditulis, misalnya int , seperti pada fungsi utama. Jika suatu fungsi tidak mengembalikan nilai apa pun ke program, maka kata kunci void ditulis di tempat ini. Tampaknya karena fungsinya tidak mengembalikan apa pun, maka tidak perlu menulis apa pun. Sebelumnya, ini dilakukan dalam bahasa C, tetapi kemudian ditambahkan untuk keseragaman. Saat ini, kompiler modern akan mengeluarkan peringatan/kesalahan jika Anda tidak menentukan tipe pengembalian.
Dalam beberapa bahasa pemrograman, fungsi yang tidak mengembalikan nilai apa pun disebut prosedur (misalnya Pascal). Selain itu, ada sintaks berbeda untuk membuat fungsi dan prosedur. Tidak ada diskriminasi seperti itu dalam bahasa C.

Nama fungsi ditulis setelah tipe kembalian. Nah, setelah namanya, jenis dan jumlah argumen yang diteruskan ke fungsi tersebut ditunjukkan.

Mari kita lihat judul fungsi yang sudah kita kenal.

Daftar 2.

// fungsi bernama srand yang menggunakan bilangan bulat tidak menghasilkan apa-apa void srand(int) // fungsi bernama sqrt yang menggunakan float asli mengembalikan float float sqrt(float) // fungsi bernama rand yang tidak memerlukan argumen, mengembalikan bilangan bulat int rand(void) //fungsi bernama pow yang mengambil dua argumen bertipe double, mengembalikan bilangan real bertipe double double pow(double, double)

Cara membuat fungsi Anda sendiri

Untuk membuat fungsi Anda sendiri, Anda perlu mendeskripsikannya secara lengkap. Aturan umum berlaku di sini: sebelum menggunakannya, nyatakan dan jelaskan cara kerjanya. Untuk melakukan ini, mari kita kembali ke diagram struktur program dalam bahasa C, yang kita miliki di pelajaran pertama. Mari kita tandai di atasnya tempat-tempat dimana fungsi-fungsi dapat dideskripsikan.

Gambar.1 Klarifikasi struktur program. Deklarasi fungsi.

Seperti yang Anda lihat, ada dua tempat di mana hal ini dapat dilakukan.

Mari kita lihat contoh yang mengilustrasikan pembuatan fungsi khusus untuk menghitung maksimal dua angka.

Daftar 3.

#termasuk // mendeklarasikan fungsi kustom bernama max_num // input: dua parameter bilangan bulat bernama a dan b // output: maksimum dari dua argumen int max_num(int a, int b)( int max = b; if (a > b) max = a; return max; ) //program utama int main(void) ( int x = 0, y = 0; int m = 0; scanf("%d %d", &x, &y); m = max_num( x ,y); printf("maks(%d,%d) = %d\n",x,y,m); kembali 0; )

Izinkan saya menjelaskan secara rinci bagaimana program ini akan bekerja. Badan fungsi utama dijalankan. Variabel integer x, y dan m dibuat. Variabel x dan y dibaca dari keyboard. Misalkan kita memasukkan 3 5, maka x = 3, y = 5. Ini semua harus jelas bagi Anda. Sekarang baris berikutnya

Daftar 4.

M = angka_maks(x,y);

Variabel m harus ditempatkan di sebelah kanan tanda =. Di sana kita memiliki nama fungsi yang kita buat sendiri. Komputer mencari deklarasi dan deskripsi fungsi ini. Letaknya di atas. Menurut deklarasi ini, fungsi ini harus menerima dua nilai integer. Dalam kasus kami, ini adalah nilai yang ditulis dalam variabel x dan y. Itu. nomor 3 dan 5. Harap dicatat bahwa bukan variabel x dan y itu sendiri yang diteruskan ke fungsi, tetapi hanya nilai (dua angka) yang disimpan di dalamnya. Apa yang sebenarnya diteruskan ke suatu fungsi ketika dipanggil dalam suatu program disebut parameter sebenarnya dari fungsi tersebut.

Sekarang fungsi max_num mulai dijalankan. Langkah pertama adalah membuat variabel sementara terpisah untuk setiap parameter yang dijelaskan dalam header fungsi. Dalam kasus kita, dua variabel integer dibuat dengan nama a dan b. Variabel-variabel ini diberi nilai parameter sebenarnya. Parameter itu sendiri, yang dijelaskan dalam header fungsi, disebut parameter formal. Jadi, parameter formal a dan b masing-masing diberi nilai parameter aktual 3 dan 5. Sekarang a = 3, b = 5. Lebih jauh lagi di dalam fungsi kita dapat bekerja dengan variabel-variabel ini seolah-olah mereka adalah variabel biasa.

Variabel integer bernama max dibuat dan diberi nilai b. Selanjutnya kondisi a > b dicentang. Jika benar, maka nilai pada variabel max harus diganti dengan a.

Berikutnya adalah pernyataan return, yang mengembalikan ke program pemanggil (fungsi utama) nilai yang ditulis dalam variabel max, yaitu. 5. Setelah itu variabel a, b dan max dihapus dari memori. Dan kami kembali ke barisan

Daftar 5.

M = angka_maks(x,y);

Fungsi max_num mengembalikan nilai 5 yang berarti sekarang ada 5 yang ditulis di sebelah kanan tanda =. Nilai ini ditulis ke variabel m. Kemudian garis tersebut ditampilkan di layar dan program berakhir.

Bacalah kembali 4 paragraf terakhir dengan cermat untuk memahami sepenuhnya cara kerja program.

Sementara itu, saya akan memberi tahu Anda mengapa blok deskripsi fungsi yang lebih rendah diperlukan. Bayangkan Anda telah menulis 20 fungsi kecil dalam program Anda. Dan semuanya dijelaskan sebelum fungsi utama. Sangat tidak nyaman untuk membuka program utama terlalu lama. Untuk mengatasi masalah ini, fungsi dapat dijelaskan di blok bawah.

Tetapi tidak mungkin untuk mentransfer seluruh kode fungsi ke sana begitu saja, karena maka aturannya akan dilanggar: sebelum Anda menggunakan sesuatu, Anda harus mendeklarasikannya. Untuk menghindari masalah ini, Anda perlu menggunakan prototipe fungsi.

Prototipe fungsi sepenuhnya mengulangi header fungsi, diikuti oleh ; . Setelah menentukan prototipe di blok atas, di blok bawah kita sudah dapat menjelaskan fungsinya secara lengkap. Untuk contoh di atas mungkin terlihat seperti ini:

Daftar 6.

#termasuk int angka_maks(int, int); int utama(batal) ( int x =0, y = 0; int m = 0; scanf("%d %d", &x, &y); m = max_num(x,y); printf("maks(%d ,%d) = %d\n",x,y,m); kembalikan 0; ) int max_num(int a, int b)( int max = b; jika (a > b) max = a; kembalikan maks; )

Semuanya sangat sederhana. Harap dicatat bahwa prototipe fungsi tidak harus menentukan nama parameter formal; cukup dengan menunjukkan tipenya saja. Pada contoh di atas, saya melakukan hal itu.