Pengenalan

Pengenalan

Perpustakaan Standard C menawarkan banyak fungsi untuk banyak tugas biasa. Juga terdapat banyak perpustakaan untuk fungsi tambahan, seperti reka bentuk GUI (GTK+) atau interfacing pangkalan data (LIBPQ). Walau bagaimanapun, semasa anda maju dalam dunia pengaturcaraan C, anda akan mendapati diri anda mengulangi arahan yang sama dalam susunan yang sama berulang kali dan itu akan menjadi masa yang memakan dan tidak cekap. Oleh itu, anda hanya boleh membungkus semua arahan tersebut dalam fungsi dan adil Panggilan Fungsi tersebut semasa anda memerlukannya. Inilah yang akan anda pelajari dengan membaca artikel ini, ditambah beberapa petua berguna yang akan memudahkan hidup anda.

Mewujudkan fungsi anda

Untuk permulaan yang mudah, katakan anda ingin menulis kalkulator. Kami tidak akan memberi tumpuan kepada antara muka (GUI vs CUTSS VS SLANG VS CLI) kerana kami berminat dengan dalaman. Ia akan menjadi kikuk tidak Buat fungsi untuk setiap operasi yang anda memutuskan untuk menyokong, kecuali ada yang sudah, seperti POW (), yang ditakrifkan dalam Matematik.H, yang mengembalikan hasil asas yang dibangkitkan kepada kuasa. Jadi, sebagai contoh, untuk penambahan anda akan mempunyai fungsi bernama tambah () yang memerlukan dua hujah, sekurang -kurangnya buat masa ini, dan pulangan keputusan. Oleh itu, apabila pengguna memilih untuk menambah nombor (s) yang diperkenalkannya, anda hanya Panggilan Fungsi dengan nombor pengguna dimasukkan dan anda tidak perlu bimbang tentang perkara lain. Ketiga istilah yang saya tulis dalam huruf miring adalah penting dalam memahami fungsi. Fungsi biasanya (tetapi tidak selalunya) mengambil sesuatu, adakah beberapa operasi pada sesuatu itu dan meludahkan hasilnya. "Tidak Selalu" kerana Main (), seperti yang anda lihat sebelum ini, boleh dipanggil tanpa hujah, dan ada contoh lain juga. Tetapi buat masa ini, mari fokus pada contoh kami. Nombor yang perlu ditambah bersama adalah hujah -hujah, bahawa "sesuatu" anda memberikan fungsi untuk pemprosesan. Bahagian pemprosesan berada di dalam badan fungsi, apabila anda memberitahu untuk menambah nombor bersama. Selepas itu, bahagian "meludah keluar" dipanggil mengembalikan nilai, iaitu, dalam kes kita, hasil penambahan.

Mari lihat apa yang kita bicarakan dalam contoh praktikal:

#include  /* Ini mengandungi definisi printf ()*/ Tambah dua (double x, double y); int main () float first, kedua; printf ("Sila masukkan nombor pertama.\ n "); scanf ("%f ", & pertama); printf (" Sila masukkan nombor kedua.\ n "); scanf ("%f ", & kedua); tambah berganda (double a, double b)  kembali A + B;  printf ("Hasil penambahan adalah %f \ n", tambah (pertama, kedua)); kembali 0; 

Kod di atas, walaupun sederhana, membantu kami menunjukkan dengan tepat apa yang kami bicarakan sebelumnya. Pertama kita mengisytiharkan fungsi, sebelumnya Utama (), dan tujuannya adalah untuk mengetahui nama, jenis argumen dan jenis fungsi kembali. Garis ini juga dipanggil menentukan prototaip fungsi. Seperti yang anda lihat, nama -nama argumen dari perisytiharan tidak perlu sama seperti yang digunakan dalam definisi, tetapi jika itu masalah anda, gunakan skema penamaan yang berterusan, itu baik -baik saja. Sebelum kita menggunakan fungsi ini, kita mesti menentukannya, seperti dalam memberitahu dunia apa sebenarnya yang berlaku. Walaupun badan fungsi adalah satu baris, seperti dalam contoh kami, sebaiknya anda menggunakan pendakap untuk kebolehbacaan dan untuk kebiasaan yang baik. Di sini, semua fungsi yang dilakukan adalah mengembalikan hasil penambahan antara dua nombor.

Kami mencadangkan anda menggunakan nama untuk fungsi, argumen dan pembolehubah biasa atau pemalar yang mencerminkan apa yang mereka lakukan, sekali lagi untuk kebiasaan yang baik dan untuk membiarkan pengaturcara membaca kod anda, percubaan untuk meneka apa yang berubah -ubah "xyzgth". Juga, Gunakan komen. Walaupun dalam komen kod di atas mungkin kelihatan berlebihan, mereka tidak. Apabila anda melihat kod itu dua bulan kemudian, anda tidak akan tahu apa yang ada dalam fikiran anda semasa anda menulis kod tersebut. Oleh itu, gunakan komen dan penyalahgunaan, mereka akan menyelamatkan anda, percayalah.

Senaman

Terdapat fungsi yang boleh menerima bilangan argumen yang berubah -ubah, seperti printf (). Anda dibenarkan menggunakan Google untuk melihat apa yang mereka lakukan dan cuba menulis semula fungsi tambahan () untuk menerima lebih daripada dua argumen, atau membuat fungsi lain. Anda juga boleh menggunakan "Man 3 Printf".


Kami memberitahu anda sebelum itu () boleh dipanggil tanpa hujah. Sudah tentu, ini bermakna ia boleh dipanggil dengan hujah juga. Bilakah ini berguna? Dalam program yang mudah seperti kita, kerana kita memanggil mereka tanpa hujah, tanda kurung utama () kosong. Tetapi apabila program anda akan berkembang dengan kerumitan, terutamanya jika mereka akan berorientasikan baris arahan, anda perlu menambah fungsi argumen, seperti bendera GCC -v yang mencetak versi tersebut. Apabila fungsi tersebut dikehendaki, utama () mesti mempunyai hujah, dua tepat. Fungsi utama menjadi

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

Sebelum anda mengalahkan nama -nama samar dan asterisk berganda, tunggu sehingga anda mendapat penjelasan, yang sebenarnya mudah. Hujah pertama adalah integer bernama Argc, dan namanya berasal dari "kiraan argumen". Sedikit lebih baik, betul? Mengenai hujah kedua ... dengan baik, namanya bermaksud "Vektor Argumen" secara rasmi dan ia adalah penunjuk kepada penunjuk kepada char. Sekarang, dalam bahasa Inggeris, sementara Argc menyimpan bilangan argumen, Argv menyimpan argumen sebagai satu siri rentetan. Bahagian "penunjuk ke ..." akan dijelaskan di bahagian seterusnya artikel, buat masa ini semua yang anda perlu tahu ialah jika, sebagai contoh, pengguna akan menaip tiga argumen ke program, indeks sifar argv akan menjadi nama program itu sendiri, indeks seseorang akan menyimpan hujah pertama ke program dan sebagainya. Inilah cara anda boleh menggunakan suis/kes untuk memeriksa argumen yang dihantar ke program anda. Sebelum kami memberi anda contoh yang singkat, kami merasa terpaksa memberitahu anda bahawa Main mempunyai dua hujah seperti yang ditakrifkan oleh piawaian, dan ini adalah bagaimana ia digunakan pada kebanyakan sistem Linux dan Unix. Walau bagaimanapun, jika anda (akan) bekerja di Windows atau Darwin, Main () akan mempunyai satu atau dua lagi argumen, tetapi mereka bergantung kepada sistem dan tidak ditakrifkan atau dikehendaki oleh standard. Juga, "char ** argv" mungkin juga ditulis sebagai "char *argv []". Anda akan melihat kedua -duanya, bergantung pada keutamaan pemaju.

Anda mungkin ingat kami memberitahu anda di bahagian pertama siri kami bagaimana kami akan menggunakan program Yest Kimball Hawkins untuk contoh. Sudah tiba masanya kita mulakan, jadi inilah caranya saya berurusan dengan sebahagian daripada input pengguna yang mungkin:

jika (strncmp (argv [i], "--help", 6) == 0 || strncmp (argv [i], "-?", 2) == 0 || strncmp (argv [i],"?", 1) == 0 || strncmp (argv [i]," bantuan ", 4) == 0) yest_help (); / * Bantuan diminta, paparkannya */ jika (strncmp (argv [i], "--version", 9) == 0 || strncmp (argv [i], "--license", 9) == 0) yest_version (); / * maklumat versi/lesen diminta */

Anda mungkin melihat dalam kod ini bagaimana Kimball mengulas kodnya, walaupun nama fungsi yang dia panggil - yest_help () dan yest_version () - cukup jelas. Fungsi strncmp () standard, boleh didapati dalam rentetan.H, membandingkan dua rentetan, dalam kes kami argv [i] dan "bantuan", sebagai contoh, tetapi hanya watak X pertama (4 dalam baris "bantuan") dan mengembalikan sifar jika rentetan pertama sepadan dengan yang kedua.

Senaman

Bagaimana anda menggunakan suis/kes untuk memeriksa sama ada hujah pertama adalah "-help" dan yang kedua adalah "-versi"? Bolehkah pilihan ini digunakan bersama? Bagaimana kodnya berbeza?

Perkara yang perlu diperhatikan

C tidak membenarkan anda menentukan fungsi di dalam yang lain, dengan pengecualian utama (), iaitu, seperti yang dapat kita lihat, istimewa. Juga sedar bahawa apa yang anda tentukan di dalam fungsi "hidup" di dalam fungsi sahaja. Oleh itu, anda boleh mempunyai pembolehubah yang dinamakan "A" yang ditakrifkan dalam tiga fungsi yang berbeza tanpa masalah sama sekali, tetapi itu mungkin membawa kepada isu -isu dalam program yang lebih besar, jadi kami tidak mengesyorkannya.

Fail header tersuai

Oleh kerana program anda akan bertambah besar dan lebih besar, anda akan mendapati keperluan untuk memisahkannya. Anda boleh mempunyai lebih daripada satu fail sumber, tetapi anda juga boleh menulis tajuk anda sendiri. Oleh itu, kembali ke program penambahan kami, anda boleh membuat operasi yang dinamakan header.H yang akan mempunyai garis "Tambah Double (Double X, Double Y);", jadi program anda hanya akan berurusan dengan definisi, bahagian di mana anda mengatakan bahawa tambah () akan mengembalikan a + b. Termasuk tajuk tersuai anda dilakukan seperti yang anda sertakan sistem yang dipasang dengan satu pengecualian penting: ingat untuk menggunakan petikan berganda dan bukannya kurungan sudut, seperti ini: "#termasuk operasi".h "". Tajuk ini boleh diletakkan di direktori di mana fail sumber lain disimpan atau di jalan lain, yang ditentukan sebagai hujah kepada GCC supaya ia tahu di mana untuk melihat. Fail header boleh mengandungi juga definisi pemalar (dengan #define) atau deklarasi lain, selagi anda tahu bahawa ia akan digunakan dalam setiap fail sumber program. Itu tidak wajib, itu hanya amalan yang baik. Jadi, bagaimana anda menulis kalkulator yang hanya berkaitan dengan operasi aritmetik asas dan menggunakan tajuk?

Fungsi rekursif

Seperti yang kita harapkan anda mempunyai latar belakang pengaturcaraan, kami yakin bahawa anda tahu apa fungsi rekursif dan bagaimana/bila menggunakannya. Inilah sebabnya mengapa subkumpulan ini lebih pendek daripada biasanya. Pendek kata, seseorang mengatakan tentang fungsi untuk menjadi rekursif apabila ia memanggilnya sendiri. Walaupun konsepnya mungkin menakutkan untuk pengaturcara baru, satu rekursi cara hidup yang lebih mudah dapat dijelaskan adalah: cuba duduk di antara dua cermin yang menghadap ke antara satu sama lain. Kesan yang anda lihat adalah perwakilan visual rekursi. Tetapi kami akan memberi anda contoh yang singkat, sehingga anda lebih memahami kapan dan cara menggunakannya. Anda mungkin ingat dari sekolah ketika anda diajar mengenai faktorial. Faktorial adalah produk dari semua bilangan bulat yang lebih kecil daripada itu atau sama, selagi ia lebih besar daripada sifar. Notasi untuk ini adalah tanda seru, jadi 6! = 6*5*4*3*2*1 = 720. Bagaimana kita boleh melakukan ini dalam c dengan cara yang paling berkesan? Sudah tentu, menggunakan rekursi.

int faktorial (nombor int)  jika(Nombor <= 1) kembali 1; lain kembali Nombor * Factorial (nombor-1)

Kesimpulan

Kami mengesyorkan anda menggunakan fungsi sesering mungkin, dan meletakkan prototaip mereka dalam fail header seberapa kerap, kerana kod anda akan lebih teratur dan kerja anda akan menjadi lebih mudah. Bercakap mengenai tajuk, kami meninggalkannya sebagai latihan terakhir untuk anda mula membaca fail header yang menentukan operasi matematik (matematik.h) untuk mendapatkan idea bagaimana rupanya dan apa yang terkandung di dalamnya. Kemudian gunakannya untuk meningkatkan kalkulator dengan beberapa fungsi yang lebih baik di luar asas.

Inilah yang boleh anda harapkan seterusnya:

  • I. C Pembangunan di Linux - Pengenalan
  • Ii. Perbandingan antara c dan bahasa pengaturcaraan lain
  • Iii. Jenis, pengendali, pembolehubah
  • Iv. Kawalan aliran
  • V. Fungsi
  • Vi. Petunjuk dan tatasusunan
  • VII. Struktur
  • Viii. Asas I/O
  • Ix. Gaya dan cadangan pengekodan
  • X. Membina program
  • Xi. Pembungkusan untuk Debian dan Fedora
  • Xii. Mendapatkan pakej di repositori debian rasmi

Tutorial Linux Berkaitan:

  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux
  • Menguasai Gelung Skrip Bash
  • Perkara yang perlu dipasang di Ubuntu 22.04
  • Ubuntu 20.04 Panduan
  • Tutorial SQLite Linux untuk pemula
  • Mint 20: Lebih baik daripada Ubuntu dan Microsoft Windows?
  • Perkara yang perlu dilakukan setelah memasang Ubuntu 22.04 Jur -ubur Jammy ..
  • Cara Dual Boot Kali Linux dan Windows 10