1. 程式人生 > 實用技巧 >C語言函式與資料

C語言函式與資料

這個作業屬於哪個班級 C語言--網路2011/2012
這個作業的地址 C部落格作業03--函式
這個作業的目標 學習如何設計函式、C語言基本資料型別
姓名 鄭俊佳

0.展示PTA總分

1.本章學習總結

1.1 函式定義、呼叫、宣告

void RandOperator(int grade);//函式宣告
//函式定義開始
void RandOperator(int grade)
{
char op;
//函式內容
return op;
}
//函式定義結束
int main()
{
char op;
int grade;
scanf("%c",&grade);
printf("%c",RandOperator(grade));//函式呼叫
return 0;
}

1.2 全域性、區域性變數、靜態區域性變數

全域性變數:
int grade;
int main()
void RandOperator()
//這裡int grade就是全域性變數,在主函式&&自定義函式裡都可以使用。
區域性變數:
int main()
{
int grade;
}
void RandOperator()
//這裡int grade就是區域性變數,只能在主函式中使用。
靜態區域性變數:
int main()
{
static int grade=1;
}
void RandOperator()
//這裡static int grade=1就是靜態區域性變數,只在主函式中屬於靜態,迴圈後再次回到最初始static int grade=1,grade的值不發生改變。

1.3 C資料型別及注意點

C語言中的三種基本資料型別是:整型、實型、字元型。每種型別又可以分為常量和變數。

整型常量:
(1) 十進位制的整型常量:由數字0~9組成。如:0、10、365、-12等。
(2) 八進位制的整型常量:以0開頭,由數字0~7組成。如:0、010、0365、-012、011等。
(3) 十六進位制的整型常量:以0x或0X開頭,由數字09、az或A~Z組成。如:0x11、0Xffff、0xa5、-0XAC等。
注:C語言系統預設為基本整型常量。

整型變數:
(1) 根據整數的最高位是否用作符號位,分為有符號(signed)整型和無符號(unsigned)整型。
(2) 根據整數在計算機記憶體中所佔用的空間大小,分為短整型(short int或short)、基本整型(int)和長整型(long int或long)。
short x = 10; 等價於 signed short x = 10; 同時等價於 signed short int x = 10;
int age = 20; 等價於 signed int age = 20;
long z = 10000L; (加L後說明10000是一個長整型常量,而不是一個基本整型常量)
注:
(1) C語言系統預設為有符號整數。
(2) unsigned和signed不能同時出現。
(3) short和long不能同時出現。

實型常量:
在C語言中,實型常量的兩種表現形式:小數形式和指數形式。或者叫做小數點式和字母E(或e)式。
(1) 小數點式:
1. 有且僅有一個小數點
2. 小數點的左邊和右邊可以有一邊沒有資料,但不能同時沒有資料
舉例:3.14、0.1、10.、0.0、.0、-10.08
(2) 字母E(或e)式:
1. 有且僅有一個字母E(或e)
2. 兩邊都必須有資料
3. 左邊可以是整數,也可以是小數
4. 右邊只能是整數
舉例:1e5、1.2E+4、3.0e-2、0e0、1.e0、.0e0

實型變數:
分為單精度和雙精度兩種,單精度用float表示,雙精度用double表示。
舉例:
float x = 1., y = .0, z = 1.2E+4;
double salary, sum;

字元型常量:
字元型常量的兩種表現形式:
(1) 由一對單引號括起來的單個字元:
舉例:'A'、'#'、'x'、'$'
(2) 由一對單引號括起來的,裡面是由反斜槓“\”引起的若干字元:
1. 一般轉義字元,如:'\t'、'"'、'\'、'\t'、'\n''、'''
2. “\”與其後的1~3位八進位制陣列成的八進位制轉義字元,如:'\123'、'\0'、'\61'、'\101'
3. “\x”與其後的1~2位十六進位制陣列成的十六進位制轉義字元,如:'\x41'、'\x61'、'\x7F'。注意:不能是大寫的“\X”。

字元型變數:
注:字元變數中存放的實際上是該字元的ASCII碼,因為字元型資料都被處理成整型資料。

舉例:
(1) char a = 'A'; 與 char a = 65; 是等價的。因為字元'A'在計算機中的形式是整型65。

1.4 C運算子

一、分類

C語言一共有34種運算子,10種運算型別:算術運算子(+、-、、/、%)、關係運算符(>、>=、、!=、<、<=)、位運算子(>>、<<、、!=、<、<=)、邏輯運算子(!、||、&&)、條件運算子、(?:)指標運算子(&、)、賦值運算子(=)、逗號運算子(,)、求位元組運算子(sizeof)、強制型別轉換運算子((型別名))、其他(下標[]、分量、函式);若按參與運算的物件個數,C語言運算子可分為單目運算子(如!)、雙目運算子(如+、-)和三目運算子(如?:)

二、運算子的結合性和優先順序

  1. 運算子的結合性

在C語言的運算子中,所有的單目運算子、條件運算子、賦值運算子及其擴充套件運算子,結合方向都是從右向左,其餘運算子的結合方向是從左向右。

2.運算子的優先順序

初等運算子(圓括號()、下標運算子[]、結構體成員運算子->)>單目運算子>算術運算子(先乘除後加減)>關係運算符>邏輯運算子(不包括!)條件運算子>賦值運算子>逗號運算子

三、算術運算符合和算術表示式

1.基本的算數運算子

(1) +加法運算或正值運算子

4+4、+5、

(2)- 減法運算或負值運算子

6-4、-10、-29

(3) *乘法運算

注意符號,不是x,而是*

(4) /除法運算

注意符號,不是÷,也不是\,而是/

整數除於整數,還是整數。1/2的值是0,這個並不是二分之一, 不會四捨五入,直接截斷取值。

(5)%取餘運算

取餘:即兩個整數相除之後的餘數

注意:%兩側只能是整數,正負性取決於%左側的數值

2.算術表示式

(1).算術表示式是用算術運算子和括號將運算量(也稱運算元)連線起來的、符合C語言語法規則的表示式。其中運算物件包括函式、常量、變數。

(2).算術表示式的運算規則:

A.在算術表示式中,可以使用多層圓括號,但括號必須配對。運算時從內層括號開始,由內向外依次計算各表示式的值。

B.在算術表示式中,對於不同優先順序的運算子,可按運算子的優先順序由高到低進行運算,若表示式中運算子的優先順序相同,則按運算子的結合方向(算術運算子的結合方向是從左到右)進行運算。

C.如果一個運算子兩側的運算元型別不同,則先利用自動轉換或強制轉換,使兩者具有相同資料型別,然後再進行運算。

四、關係運算(比較運算)和關係表示式

1.關係運算符:

C語言提供了6種關係運算符:>(大於)、>=(大於等於)、==(等於)、!=(不等於)、<(小於)、<=(小於等於)

2.結合性:自左向右:4>3>2,先判斷4是否大於3,再判斷1是否大於2

3.優先順序:關係運算符中(、!=)的優先順序相等,(<、<=、>、>=)的優先順序相等,且前者的優先順序低於後者:23>1,先判斷3是否大於1,再判斷2是否等於1。

4.關係表示式

(1).定義:由關係運算符連成的表示式。關係運算符的兩邊可以是C語言中任意合法的表示式。

(2).關係運算符的結果是一個整數值——“0或者1”,用非零值表示“真”,用零值表示“假”

(3).當關系運算子兩邊值的型別不一致時,系統將自動轉化。

5.注意:

A.當關系運算子兩邊值的型別不一致時,如一邊是整型,另一邊是實型,系統將自動將整型轉化為實型數,然後再進行比較。

B.若複合語句中有關係運算式和算術運算式時,因為算術運算子的優先順序高於關係運算符,所以應該先算出算術表示式的值再去判斷關係表示式的值。

五、邏輯運算子和邏輯表示式

C語言提供了3中邏輯運算子:

1.&&邏輯與

(1). 使用格式:

條件A && 條件B;

(2). 運算結果:

只有當條件A和條件B都成立時,結果才為1,也就是“真”;其餘情況的結果都為0,也就是“假”。因此,條件A或條件B只要有一個不成立,結果都為0,也就是“假”

(3).運算過程:

總是先判斷條件A是否成立

如果條件A成立,接著再判斷條件B是否成立:如果條件B成立,“條件A && 條件B”的結果就為1,即“真”,如果條件B不成立,結果就為0,即“假”

如果條件A不成立,就不會再去判斷條件B是否成立:因為條件A已經不成立了,不管條件B如何,“條件A && 條件B”的結果肯定是0,也就是“假”(邏輯與的“短路的運算”)

(4).注意:

1>.若想判斷a的值是否在(3, 5)範圍內,千萬不能寫成3<a<5,因為關係運算符的結合方向為“從左往右”。 比如a為2,它會先算3<a,也就是3<2,條件不成立,結果為0。再與5比較,即0<5,條件成立,結果為1。因此 3<a<5的結果為1,條件成立,也就是說當a的值為2時,a的值是在(3, 5)範圍內的。這明顯是不對的。正確的判斷方法是:(a>3)&& (a<5)

2>.C語言規定:任何非0值都為“真”,只有0才為“假”。因此邏輯與也適用於數值。比如 5&& 4的結果是1,為“真”;-6 && 0的結果是0,為“假”

2.|| 邏輯或

(1).使用格式:

條件A || 條件B;

(2). 運算結果:

當條件A或條件B只要有一個成立時(也包括條件A和條件B都成立),結果就為1,也就是“真”;只有當條件A和條件B都不成立時,結果才為0,也就是“假”。

(3).運算過程:

總是先判斷條件A是否成立

如果條件A成立,就不會再去判斷條件B是否成立:因為條件A已經成立了,不管條件B如何,“條件A || 條件B”的結果肯定是1,也就是“真”(邏輯或的“短路運算”)

如果條件A不成立,接著再判斷條件B是否成立:如果條件B成立,“條件A || 條件B”的結果就為1,即“真”,如果條件B不成立,結果就為0,即“假”

例:邏輯或的結合方向是“自左至右”。比如表示式(a<3) || (a>5)

若a的值是4:先判斷a<3,不成立;再判斷a>5,也不成立。因此結果為0

若a的值是2:先判斷a<3,成立,停止判斷。因此結果為1

因此,如果a的值在(-∞, 3)或者(5, +∞)範圍內,結果就為1;否則,結果就為0

(4).注意:

C語言規定:任何非0值都為“真”,只有0才為“假”。因此邏輯或也適用於數值。比如 5 || 4的結果是1,為“真”;-6 || 0的結果是1,為“真”;0 || 0的結果是0,為“假”。

3.! 邏輯非

(1 ) !使用格式:

! 條件A;

(2).運算結果:

其實就是對條件A進行取反:若條件A成立,結果就為0,即“假”;若條件A不成立,結果就為1,即“真”。也就是說:真的變假,假的變真。

例:邏輯非的結合方向是“自右至左”。比如表示式! (a>5)

若a的值是6:先判斷a>5,成立,再取反之後的結果為0

若a的值是2:先判斷a>3,不成立,再取反之後的結果為1

因此,如果a的值大於5,結果就為0;否則,結果就為1

(3). 注意:

1.可以多次連續使用邏輯非運算子:!(4>2)結果為0,是“假”,!!(4>2)結果為1,是“真”,!!!(4>2)結果為0,是“假”

2.C語言規定:任何非0值都為“真”,只有0才為“假”。因此,對非0值進行邏輯非!運算的結果都是0,對0值進行邏輯非!運算的結果為1。!5、!6.7、!-9的結果都為0,!0的結果為1

3.結合性:自左向右

4.優先順序

邏輯運算子的優先順序順序為: 小括號() > 負號 - > ! > 算術運算子 > 關係運算符 > && > ||

例1:表示式!(3>5) ||(2<4) && (6<1) :先計算 !(3>5)、(2<4)、(6<1),結果為1,式子變為1 || 1 && 0,再計算1 && 0,式子變為1 || 0,最後的結果為1

例2:表示式3+2<5||6>3 等價於 ((3+2) < 5) || (6>3),結果為1

例3:表示式4>3 &&!-5>2 等價於 (4>3) && ((!(-5)) > 2),結果為0

學習體會

沒什麼體會,就是更清楚C語言內容

2.綜合作業(6分):小學生口算表示式自動生成系統

2.1.模組流程圖

2.2.函式功能及全域性變數介紹

2.2.1.全域性變數

2.2.2 選單相關函式

2.2.3 出題相關函式

2.3.執行結果截圖,測試用例

2.4.大作業中程式設計技巧總結

程式碼提交

//#include<stdio.h>

//#include<windows.h>

//#include<stdlib.h>

//#include<time.h>

char RandOperator(int grade);//控制運算子函式

int RandOperands(int grade);//控制生成隨機數函式

void OperateMenu();//遊戲操作介面

void GradeOneMenu();//一年級

//void GradetwoMenu();//二年級

//void GradethreeMenu();//三年級
int count=0;//累計正確題目數量
int total=0;//累計總答題數
int main(void)

{

OperateMenu();//遊戲操作介面	

return 0;

}

void OperateMenu()//遊戲操作介面

{

char option;


system("cls");//清屏



do

{

	system("cls");

	printf("******************************************\n");

	printf("1.一年級口算\n");

	printf("2.二年級口算\n");

	printf("3.三年級口算\n");

	printf("4.退出系統\n");

	printf("******************************************\n");

	printf("請輸入您的選擇:");

	scanf(" %c", &option);

	switch (option)

	{

	case '1':

		system("cls");

		GradeOneMenu();

		//GradeOneMenu();

		break;

	case '2':
		system("cls");

		//GradetwoMenu();

		break;

	case '3':
		system("cls");

		//GradethreeMenu();

		break;

	case '4':

		printf("\n謝謝您的參與!\n");

		Sleep(500);

		exit(0);

	default:

		printf("您輸入不對,只能輸入1,2,3,4,請重輸!\n");

		Sleep(500);

	}

} while (!(option >= '1' && option <= '4'));

}

void GradeOneMenu()//一年級

{

srand((unsigned int)time(NULL));

while (1)

{

	system("cls");

	printf("*********************一年級小朋友好!********************************\n");

	printf("系統將隨機生成一個口算式,如果您會做,則輸入y,輸入結果。\n");

	printf("**如果您不想做,輸入n退回主選單。\n");

	printf("***************************************************************\n");

	int grade = 1;
	char op;
	int number1, number2;
	int answer;
	int right=1;
	
	double acc;
	op = RandOperator(grade);
	number1 = RandOperands(grade);
	number2= RandOperands(grade);
	/*1.生成運算元函式*/

	/*2.生成隨機運算子函式*/

	/*3.根據年級判斷生成的表示式是否合理的函式(選做)*/

	/*4.生成表示式函式,並輸出展示*/
	while (number1 <= number2&&op=='-')
	{
		number1 = RandOperands(grade);
		number2 = RandOperands(grade);
	}
	printf("%d%c%d=", number1, op, number2);
	printf("是否繼續答題y/n:");

	char ch;

	scanf("\n%c", &ch);

	if (ch == 'n')

	{

		Sleep(500);
		double acc;
		acc = 1.0*count / total;
		printf("%.2f", acc);
		Sleep(10000);
		OperateMenu();

		return;

	}

	else//選擇答題

	{
		
		scanf("%d", &answer);
		/*答題模組*/
		right = RightNumber(number1, op, number2);
		printf("%d\n", right);
		Sleep(500);
		if (answer == right)
		{
			printf("你很棒!\n");
				count++;
		}
		else
		{
			printf("繼續加油!\n");
		}
		total++;
		printf("%d %d", count, total);
		Sleep(500);
	}

}

}
char RandOperator(int grade)
{
int num = 0;

char op;

switch (grade)
{
case 1:case 2:num = rand() % 2; break;

case 3:case 4:case 5:case 6:num = rand() % 4; break;
}
switch (num)
{
case 0:op = '+'; break;

case 1:op = '-'; break;

case 2:op = '*'; break;

case 3:op = '/'; break;
}

return op;

}
int RandOperands(int grade)
{
int number;

switch (grade)
{
case 1:number = 1 + rand() % 9; break;

case 2:number = 1 + rand() % 99; break;

case 3:number = 1 + rand() % 999; break;
}
return number;

}
int RightNumber(int number1, char op, int number2)
{
int right = 0;
switch (op)
{
case '+':right = number1 + number2; break;
case'-':right = number1 - number2; break;
case'*':right = number1 * number2; break;
case'/':right = number1 / number2; break;
}
return right;
}