天天看點

開發成長之路(2)-- C語言從入門到開發(函數與定制輸入輸出控制函數)

開發成長之路(2)-- C語言從入門到開發(函數與定制輸入輸出控制函數)

文章目錄

    • 函數
      • 傳值調用與引用調用
    • 作用域
    • 數組
      • 多元數組
      • 數組作為函數參數
    • 定制輸入輸出函數

函數

函數是一組一起執行一個任務的語句。每個 C 程式都至少有一個函數,即主函數 main() ,所有簡單的程式都可以定義其他額外的函數。

return_type function_name( parameter list )
{
   body of the function
}           

複制

在C語言中,一個函數的組成部分有如下:

傳回類型:return_type 是函數傳回的值的資料類型。有些函數執行所需的操作而不傳回值,在這種情況下,return_type 可以是關鍵字 void。

函數名稱:這是函數的實際名稱(function_name)。函數名和參數清單一起構成了函數簽名。

參數:當函數被調用時,有時候需要向參數傳遞一個值,這個值被稱為實際參數。參數清單包括函數參數的類型、順序、數量。參數是可選的,也就是說,函數可能不包含參數。
參數中也存在預設參數,預設參數即在函數簽名中賦予了某個參數預設值,如果在調用函數的時候不指定該參數值,則該參數取值為預設。
預設參數置于參數清單的最右端、
在給預設參數指派的時候,最好指定參數名對應資料。

函數主體:函數主體包含一組定義函數執行任務的語句。           

複制

實作一個比大小的函數:

/* 函數傳回兩個數中較大的那個數 */
int max(int num1, int num2) 
{
   /* 局部變量聲明 */
   int result;
 
   if (num1 > num2)
      result = num1;
   else
      result = num2;
 
   return result; 
}           

複制

調用這個函數:

int main ()
{
   /* 局部變量定義 */
   int a = 100;
   int b = 200;
   int ret;
 
   /* 調用函數來擷取最大值 */
   ret = max(a, b);
 
   printf( "Max value is : %d\n", ret );
 
   return 0;
}           

複制

傳值調用與引用調用

調用類型 描述
傳值調用 該方法把參數的實際值複制給函數的形式參數。在這種情況下,修改函數内的形式參數不會影響實際參數。
引用調用 通過指針傳遞方式,形參為指向實參位址的指針,當對形參的指向操作時,就相當于對實參本身進行的操作。

上面那就是傳值調用,至于引用調用,等我講指針了再說吧。現在講也捋不清楚啊。

作用域

這個其實應該再編碼規範的時候寫的,但是那會兒給忘了,現在補上。

全局變量:在所有函數外部的全局變量,通常是在程式的頂部。全局變量在整個程式生命周期内都是有效的。記住這點,我們以後會為這點做出重大舉措的!!!

局部變量:在函數或塊内部的局部變量(這裡的塊指的是:函數、結構體、分支、循環、異常等),局部變量在函數外部是不可知的。

數組

開發成長之路(2)-- C語言從入門到開發(函數與定制輸入輸出控制函數)

在 C 中要聲明一個數組,需要指定元素的類型和元素的數量:

type arrayName [ arraySize ]; //這裡的大小也可以不設定,能設定就設定           

複制

示例:

double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};           

複制

通路數組元素:下标通路法

#include <stdio.h>
 
int main ()
{
   int n[ 10 ]; /* n 是一個包含 10 個整數的數組 */
   int i,j;
 
   /* 初始化數組元素 */         
   for ( i = 0; i < 10; i++ )
   {
      n[ i ] = i + 100; /* 設定元素 i 為 i + 100 */
   }
   
   /* 輸出數組中每個元素的值 */
   for (j = 0; j < 10; j++ )
   {
      printf("Element[%d] = %d\n", j, n[j] );
   }
 
   return 0;
}           

複制

多元數組

一般就開到兩維,再高也少見。

type name[size1][size2]...[sizeN];           

複制

int threedim[5][4];	//第一個大小不能放空           

複制

初始化示例:

int a[3][4] = {  
 {0, 1, 2, 3} , 
 {4, 5, 6, 7} ,  
 {8, 9, 10, 11} 
};           

複制

也可以這樣:

int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};           

複制

通路二維數組依舊可以用下标取值法。

數組作為函數參數

void myFunction(int *param)	//不懂指針先不急
{
···	
}


void myFunction(int param[10])
{
···
}


void myFunction(int param[])
{
···
}           

複制

那具體使用該當如何呢?

#include <stdio.h>
 
double getAverage(int arr[], int size)
{
  int    i;
  double avg;
  double sum=0;
 
  for (i = 0; i < size; ++i)
  {
    sum += arr[i];
  }
 
  avg = sum / size;
 
  return avg;
}
 
int main ()
{
   /* 帶有 5 個元素的整型數組 */
   int balance[5] = {1000, 2, 3, 17, 50};
   double avg;
 
   /* 傳遞一個指向數組的指針作為參數 */
   avg = getAverage( balance, 5 ) ;
 
   /* 輸出傳回值 */
   printf( "平均值是: %f ", avg );
    
   return 0;
}           

複制

由于還沒有涉及到指針,有些操作也不太友善現在寫。

定制輸入輸出函數

我初學C語言的時候寫的代碼,獻醜了。

那時候還不知道寫文檔的重要性,現在這個函數怎麼用我還得看看

這個函數有什麼用呢?為什麼我要特地的放在這裡?

函數功能:

實作一個用于控制輸入輸出的函數,可控範圍包括:
注入長度、接收輸入類型、是否明文輸出等
支援回删,回車結束,esc退出           

複制

在我們後面用C語言寫項目的時候會經常用到這個函數,而不是取用預設的scanf,scanf時不時的還會暴雷!!!

是以希望各位小夥伴看完之後可以自行實作一遍,加深印象。

/輸入函數///
void getstr(char str[],int maxLen,int type,int isplainText)
/*
這是一個用于控制輸入輸出的函數,可控範圍包括:
注入長度、接收輸入類型、是否明文輸出
支援回删,回車結束,esc退出

參數釋義:
str[]:用于接收輸入
maxLen:最大輸入長度+1
type:接收輸入類型:0(無所謂)、1(僅數字)、2(僅英文)
isplainText:是否明文輸出:0是1否
*/
{
	char ch;
	int iLen = 0;
	while(1)
	{	
		ch = getch();
		
		if(ch == '\b')
		{
			if(iLen>0)
			{
				printf("\b \b");
				iLen--;
			}			
		}
		if(ch == '\r')
		{
			str[iLen] = '\0';
			break;	
		}

		if (ch == 27)
		{
			system("cls");
			printf("退出成功\n");
			exit(1);
		}
		
		if(iLen<maxLen-1)
		{
			switch(type)
			{
			case 0:
				{
					if(ch !='\b')
					{
						if(isplainText == 0)
						{
							putchar(ch);
						}
						else
						{
							putchar('*');
						}
						str[iLen] = ch;
						iLen++;
					}
				}
				break;
			case 1:
				{
					if(ch >= '0' && ch <= '9')
					{
						if(isplainText == 0)
						{
							putchar(ch);
						}
						else
						{
							putchar('*');
						}
						str[iLen] = ch;
						iLen++;
					}	
				}
				break;
			case 2:
				{
					if(ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z')
					{
						if(isplainText == 0)
						{
							putchar(ch);
						}
						else
						{
							putchar('*');
						}
						str[iLen] = ch;
						iLen++;
					}	
				}
				break;
			}
		}
	}
}           

複制

其實不難看懂,諸位就看文檔吧。