1. 程式人生 > 實用技巧 >初見程式設計--對網路工程專業的看法及程式設計學習的記錄

初見程式設計--對網路工程專業的看法及程式設計學習的記錄

這個作業屬於哪個班級C語言--網路2011/2012
這個作業的地址 C部落格作業00--我的第一篇部落格
這個作業的目標 學習Makdown語法,對本專業及C語言課程有個簡單瞭解,記錄自學慕課視訊的筆記。教師可以對學生有個初步的認識。


1.對網路工程的理解

網路工程專業主要講授電腦科學基礎理論、計算機軟硬體系統及應用知識、網路工程的專業知識及應用知識。網路工程專業旨在培養具有創新意識,具有本專業領域分析問題和解決問題的能力,具備一定的實踐技能,並具有良好的外語應用能力的高階研究應用型專門人才。--百度百科

我最初對於網路工程的理解並不是非常深刻,只是知道這是計算機類專業,且單純地憑藉字面意思認為這個專業是學習研究網路的生成,構建,維護。在這個高度資料化、電子化的時代,計算機總是對人有種莫名的吸引力。
小說、電視劇裡對黑客的描寫,與在我當時看來仿若天文的程式碼,都增添了它在我心中的神祕感,也激發了我對它的探索欲。


以下是當時查閱的資料[1]

主幹學科

高等數學、線性代數、概率與統計、離散數學、電路與電子學、數字邏輯電路、資料結構、編譯原理、作業系統、資料庫系統、組合語言程式設計、計算機組成原理、微機系統與介面技術、通訊原理、通訊系統、計算機網路、現代交換原理、TCP/IP原理與技術、計算機網路安全、計算機網路組網原理、網路程式設計技術、計算機網路管理、網路作業系統、Internet技術及應用、軟體工程與方法學、數字訊號處理、網格計算技術、計算機系統結構等。--百度百科

從上述資料,我大致瞭解了未來會在大學中學習到的課程。雖然我對這些只有名字的書本的內容沒有具體的概念,但籠罩在網路工程這個我並不非常熟悉的名字上方的迷霧總算是消退了些許,我對它學習的大致方向有了一些瞭解,而不至於盲目。雖然第一眼看著感覺令人窒息

我瞭解到它學習的主要課程是數學和程式設計

當然為了錢途前途著想,我也同樣查詢了網路工程的就業方向

就業方向

該專業學生畢業後可在國家機關、科研機構、學校、工廠等企事業單位從事計算機應用軟體及網路技術的研究、設計、製造、運營、開發及系統維護和教學、科研等工作。--百度百科

同時經由多方資料,我瞭解到網路工程未來的發展有兩個比較熱門的方向:網路運維[2]和網路安全[3]

由於對網路運維知識的缺乏,在此我僅談談對網路安全的認知。

  • 在我看來,網路安全對於個人與國家都是非常重要的。在高度資訊化的時代,資訊的保護是必不可少的。
    對個人而言,資訊關乎公民本身的隱私權,網路安全未做好而導致的資訊洩露不僅侵犯了公民權益,同時也容易影響到其日常的生活;而對國家而言,沒有資訊保安就沒有國家安全,國家的資訊機密庫是任何人都不能侵犯的,需要強力的保護。所以我認為,網路安全不僅會是現在的熱點,在未來其熱度也必將長盛不衰。


雖然現在我還並不清楚自己未來的發展方向,但我會努力順應時代,重點考慮這兩個方面的學習與發展,爭取早日成為一個優秀的網路工程師



2.對C語言的理解?

C語言是一門面向過程的、抽象化的通用程式設計語言,廣泛應用於底層開發。C語言能以簡易的方式編譯、處理低階儲存器。C語言是僅產生少量的機器語言以及不需要任何執行環境支援便能執行的高效率程式設計語言。--百度百科

c語言是一種程式設計使用的程式語言,在程式設計領域中運用廣泛,且其運算子多,運算範圍大,這些都使其能夠適應多種不同的程式設計要求,成了執行率最高、質量最高的程式語言。

由圖可見,c語言的被使用頻率及熱度常年都是穩居高位的。
當然,c語言的安全性與變數的型別約束也是它的缺點。但瑕不掩瑜,c語言的廣泛適用性,使團隊的合作配合更加的方便易懂。且c語言是其他語言的基礎,學會了c語言就對其他程式語言有了大概的框架,更便於後續的學習與提升。



所以我認為,在學習程式碼的最初,學好c語言是十分重要的。

3.希望在這個專業學到哪些內容?大學學習生活時間要怎麼安排?(1分)

希望學到的內容

首先,作為大一新生,我希望在未來,通過大量的練習與學習,能熟練的掌握c語言,並能夠對java,c++,python等程式語言有所涉入。
其次,我希望自己能對網路運維網路安全這兩個高熱度的未來發展方面有所瞭解,並能掌握相關知識,便於畢業後找工作或繼續深造。
最後,我希望還能學習更多計算機專業的知識,如網頁設計,軟體設計等,拓展自身視野,提升自身價值。

時間安排

  • 課餘時間至少花費兩小時寫程式碼,提升自身打程式碼能力。
  • 在每節c語言課前做到預習,並找出疑難點,課後或課中解決。
  • 週末權衡社團與學習的關係,儘量使週末每天學習程式設計時間不少於4小時。
  • 多利用部落格來記錄程式設計過程中的重難點與錯題。

4.我目前自學的內容

浙大C語言程式設計

4.0 關於C的變數名

  • 駝峰命名法

駱駝式命名法(Camel-Case)又稱駝峰式命名法,是電腦程式編寫時的一套命名規則(慣例)。正如它的名稱CamelCase所表示的那樣,是指混合使用大小寫字母來構成變數和函式的名字。--百度百科

tip:第一個單詞要以小寫字母開始,從第二個單詞開始以後的每個單詞的首字母都採用大寫字母,例如:myFirstName、myLastName。



下方是近期寫的一段程式

#include<stdio.h>
double pow(int x, int y);
int main()
{
	int n, units;
	scanf("%d", &n);//輸入
	for (int i = pow(10, n - 1); i < pow(10, n); i++)
	{
		int sum = 0, count = 0;//重新定義變數,防止對迴圈產生影響
		for (int x = i; x > 0;)
		{
			units = x % 10;//儲存個位數
			sum += pow(units, n);//計算各個數次上數的n次冪和
			x = x / 10;
			count++;//累計次數
			if (count == n)//該數各個數位的n次冪和已計算完成
			{
				if (i == sum)//滿足條件,該數為水仙花數
					printf("%d\n", i);
			}
		}
	}
	return 0;
}

double pow(int x, int y)
{
	double product = 1;
	for (int i = 1; i <= y; i++)
	{
		product *= x;
	}
	return product;
}

4.1 c語言基礎注意事項

在整個的程式碼編譯過程中需注意或記憶的小細節



4.2 分支結構

對於要先做判斷再選擇的問題需要使用分支結構。分支結構的執行是依據一定的條件選擇執行路徑,而不是嚴格按照語句出現的物理順序。

⭐語法

  • 單一分支體
if(條件)
{
      分支體
}
  • 雙分支體
if(條件)
{分支1}
else
{分支2}
  • 巢狀分支語句
if(條件1) 
{分支1}
else if(條件2) 
{分支2}
else if(條件3) 
{分支3}
......
else if(條件n) 
{分支n}
else 
{分支n+1}
  • switch語句
switch(變數)
{
      case 1:分支1;
      break;
      case 2:分支2;
      break;
      ......
      case n:分支n;
      break;
      default:分支n+1;
}


⭐疑難點

  • if-else語句是依據不同的條件來選擇執行路徑,若已滿足其中一個條件,其他就不再進入。

  • switch語句使用時case後要先加再加數字。

  • switch語句每個分支後要加break



⭐pta程式碼的實現

  • if-else語句
#include <stdio.h>
int main()
{
    int a,b;
    double pay;//應付金額
    char c;
    scanf("%d %d %c",&a,&b,&c);//輸入加油量a,汽油品種b,服務型別c
    if(b==90)
    {
        if(c=='m')
        {pay=a*6.95*(1-0.05);}
        else if(c=='e')
        {pay=a*6.95*(1-0.03);}
    }
    else if(b==93)
    {
        if(c=='m')
        {pay=a*7.44*(1-0.05);}
        else if(c=='e')
        {pay=a*7.44*(1-0.03);}
    }
    else if(b==97)
    {
        if(c=='m')
        {pay=a*7.93*(1-0.05);}
        else if(c=='e')
        {pay=a*7.93*(1-0.03);}
    }
    
    printf("%.2lf",pay);
    
    return 0;
}
  • switch語句
#include <stdio.h>
int main()
{
    printf("[1] apple\n[2] pear\n[3] orange\n[4] grape\n[0] exit\n");
    int n,i;
    for(i=1;i<6;i++)
    {
        scanf("%d",&n);
        if(n==0) break;
        switch(n)
        {
            case 1:printf("price = 3.00\n");
            break;
            case 2:printf("price = 2.50\n");
            break;
            case 3:printf("price = 4.10\n");
            break;
            case 4:printf("price = 10.20\n");
            break;
            default:printf("price = 0.00\n");
        }
    }
    return 0;
}

4.3 迴圈結構

在程式中需要反覆執行某個功能而設定的一種程式結構叫做迴圈結構。它通過迴圈體中的條件,判斷繼續執行某個功能還是退出迴圈。

⭐語法

  • while迴圈
while(條件)
{
      迴圈體
}
  • do-while迴圈
do
{
      迴圈體
}
while(條件)
  • for迴圈
for(條件1;條件2;條件3)
{
      迴圈體
}


⭐疑難點

  • while迴圈和do-while迴圈的區別:前者是先判斷再迴圈;後者是先進行一次迴圈後再判斷。

  • for迴圈括號內的條件可省略,但不能省。

  • 對於巢狀迴圈,需注意迴圈內部引數的重新賦值,以免影響下次迴圈。



⭐pta程式碼的實現

  • while迴圈
    -while後的條件括號內可以寫表示式,例:
#include <stdio.h>
int main()
{
	int a, b;
	char c;
	scanf("%d", &a);
	while (scanf("%c", &c))
	{
		switch (c)
		{
		   case'+': {scanf("%d", &b);a+=b; break; }
		   case'-': {scanf("%d", &b); a -= b; break; }
		   case'*': {scanf("%d", &b); a *= b; break; }
		   case'/': 
		   {
			   scanf("%d", &b); 
			   if (b == 0) { printf("ERROR"); return 0; }
			   else a /= b;
				   break;
		   }
		   case'=': {printf("%d", a); return 0; }
		   default: {printf("ERROR"); return 0; }


		}
	}
	return 0;
}
  • do-while迴圈
#include <stdio.h>
#include <math.h>
int main()
{
	int i=1;
	double eps,sum=0,t=1,n=1;
	scanf("%lf", &eps);

	do 
	{
		t = n * (1 / ((3.0 * i) - 2));
		sum += t;
		i++;
		n = -n;
	} while (fabs(t) > eps);

	printf("sum = %.6lf", sum);
	return 0;
}
  • for迴圈
    - 巢狀迴圈要注意引數重新賦值,例:
#include <stdio.h>
int main()
{
	int n, digit, figure, t, product;
	scanf("%d", &n);
	if (n == 0)
		printf("0 ");
	else
	{
		int number = n;//防止判斷位數時n改變,影響輸出
		for (digit = 0; number > 0; digit++)//判斷位數
		{
			number = number / 10;
		}
		for (int i = digit; i > 0; i--)//輸出各位次的數
		{
			product = 1;//**對product重新賦值,防止對下次迴圈產生影響**
			for (t = 1; t < i; t++)//計算pow(10,i-1)
			{
				product *= 10;
			}
			figure = n / product;
			printf("%d ", figure);
			n = n % product;
		}
	}
	return 0;
}

4.4 函式

函式是一段可以重複使用的程式碼,用來獨立地完成某個功能。

⭐疑難點

  • 函式不能巢狀定義,必須在所有函式之外定義另外一個函式main也是一個函式定義,所以要將定義函式放在main大括號的外面。
  • 函式必須先定義後使用,所以要在開頭寫出函式的定義(即標頭檔案)。
  • 如果函式不接收使用者傳遞的資料,那麼定義時可以不帶引數,例:
int answer()
{
      int answer=0;
      for(int i=0;i<10;i++)
      {
            answer*=i;
      }
  return answer;
}
    tip:
          ①int是返回型別,可以是int、double、char等;
          ②answer是函式名,後面的`()`一定要有;
  • 在開頭處定義函式時不用寫大括號,引數間用隔開,例:
#int sum(int a,int b,int c);


⭐pta程式碼的實現

  • 遞迴求Fabonacci數列
int f(int n)
{
	int sum1=0, sum2=1, sum;
	if (n == 0) sum = 0;
	if (n == 1) sum = 1;
	else if(n >= 2)
	{
		for (int i = 2; i <= n; i++)//注意,i=2,而不是3,因為f(2)=f(1)+f(0),其中f(2)為第二項,而不是第三項;
                                     //f(0)不能算作第一項
		{
			sum = sum1 + sum2;
			sum1 = sum2;
			sum2 = sum;
		}
	}
	return sum;
}
  • 用函式輸出水仙花數
int narcissistic(int number)
{
	int n = number;
	int k,x,t,sum=0;
	int ret;

	for (k = 0;n>0; k++)//判斷位數
	{
		n = n / 10;
	}
        n = number;
	while (n != 0)
	{
		x = n % 10;
                t=1;
		for (int i = 1; i <= k; i++)//計算每位數的次冪
		{
			t *= x;
		}
		sum += t;//計算各位次數次冪的和
		n = n / 10;
	}
        n = number;
	if (sum == n)
		ret = 1;
	else
		ret = 0;

	return ret;

}


void PrintN(int m, int n)
{
	for (int i = m+1; i <n; i++)
	{
		if (narcissistic(i))
			printf("%d\n", i);
	}
}

4.5陣列

陣列是用於儲存多個相同型別資料的集合。--百度百科

⭐語法

  • 一維陣列
int number[max];//max為陣列內的最大元素數
  • 二維陣列
int number[m][n]//m為行數,n為列數


⭐疑難點

  • []內的數值為陣列內元素的最大上限,不能超出
  • 陣列下標一般從0開始
  • 陣列中的各元素的儲存是有先後順序的,它們在記憶體中按照這個先後順序連續存放在一起。
  • 必須是整數(如果是小數將四捨五入為整數)。
  • 可用迴圈語句來遍歷陣列
  • 未初始化的陣列元素均預設為0。
  • 可用a[]={1,2,3}來初始化陣列內的元素,即a[0]=1,a[1]=2;a[2]=3;a[3]=a[4]=······a[n]=0。


⭐pta程式碼的實現

  • 一維陣列
#include <stdio.h>
int main()
{
	int n,i,t,min,max,digit = 0;
	int arr[10];
	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}

	//找出最小值
	min = arr[0];
	for (i = 1; i < n; i++)
	{
		if (arr[i] < min)
		{
			min = arr[i];
			digit = i;
		}
	}
	t = arr[0];
	arr[0] = arr[digit];
	arr[digit] = t;

	//找出最大值
	max = arr[0];
	for (i = 1; i < n; i++)
	{
		if (arr[i] > max)
		{
			max = arr[i];
			digit = i;
		}
	}
	t = arr[n-1];
	arr[n-1] = arr[digit];
	arr[digit] = t;

	for (i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}
  • 二維陣列

找鞍點

#include <stdio.h>
int main()
{
	int n, i, j,flag,max,maxj,cnt=0;
	int arr[6][6];//定義二維陣列
	//int max[6];//定義陣列儲存各行最大值所對應的列數
	//int min[6];//定義陣列儲存各列最小值所對應的行數
	scanf("%d", &n);
	for (i = 0; i < n; i++)//輸入二維陣列元素
	{
		for (j = 0; j < n; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
	for (i = 0; i < n; i++)
	{
		max= arr[i][0],maxj=0;
		for (j = 1; j < n; j++)//尋找每行最大值
		{
			if (arr[i][j] >= max)
			{
				max= arr[i][j];
				maxj= j;

			}
		}
		flag = 1;
		for (j = 0; j < n; j++)//判斷maxj列上,max是否為最小值,讓maxj列上的每一個數與max比較
		{
			if (arr[j][maxj] < max)//此時,max不為maxj列最小值
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
		{
			printf("%d %d", i, maxj);
			cnt++;//用於確定是否有鞍點
		}
	}
	if (cnt == 0) printf("NONE");
	return 0;
}

方陣迴圈右移

#include <stdio.h>
int main()
{
	int n, i, j,flag,max,maxj,cnt=0;
	int arr[6][6];//定義二維陣列
	//int max[6];//定義陣列儲存各行最大值所對應的列數
	//int min[6];//定義陣列儲存各列最小值所對應的行數
	scanf("%d", &n);
	for (i = 0; i < n; i++)//輸入二維陣列元素
	{
		for (j = 0; j < n; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
	for (i = 0; i < n; i++)
	{
		max= arr[i][0],maxj=0;
		for (j = 1; j < n; j++)//尋找每行最大值
		{
			if (arr[i][j] >= max)
			{
				max= arr[i][j];
				maxj= j;

			}
		}
		flag = 1;
		for (j = 0; j < n; j++)//判斷maxj列上,max是否為最小值,讓maxj列上的每一個數與max比較
		{
			if (arr[j][maxj] < max)//此時,max不為maxj列最小值
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
		{
			printf("%d %d", i, maxj);
			cnt++;//用於確定是否有鞍點
		}
	}
	if (cnt == 0) printf("NONE");
	return 0;
}