1. 程式人生 > >程式設計題——虛數求和(簡單結構體的應用)

程式設計題——虛數求和(簡單結構體的應用)

結構體知識回顧

結構基礎知識

C的聚合資料型別(aggregate data type) 能夠同時儲存超過一個的單獨資料.
C提供了兩種型別的聚合資料型別,陣列和結構.

  • 陣列是相同型別的元素的集合,它的每個元素是通過下標引用或指標間接訪問來選擇的.
  • 結構也是一些值的集合,值成為它的成員(member),結構屬於標量型別可以作為傳遞給函式的引數,它們也可以作為返回值從函式返回,相同型別的結構變數之間可以賦值,可以宣告指向結構的指標,取一個結構變數的地址,也可以宣告結構陣列.

一些結構體的使用誤區

struct
{	
	int a;
	char b;
	float c;
}
struct
{
	int a;
	char b;
	float c;
}y[20], *z;

z = &x;//此語句是非法的使用

這兩個宣告被編譯器當做兩種不同的型別,即是它們的成員列表完全相同.因此,變數y和z的型別和x的型別不同, z = &x語句是非法的

兩種不同函式引數定義的函式

定義結構體,仿照int求和函式

#include <stdio.h>
//定義複數結構體,型別重新命名為complex
typedef struct 
{
	int real;
	int imaginary;
}complex;

/*	
**	類比整型的求和函式
**	int sum(int a, int b);
**	函式返回值是結構體,函式引數也是結構體型別
*/
complex Sum_Complex(complex a, complex b)
{
	complex temp;
	temp.real = a.real + b.real;
	temp.imaginary = a.imaginary + b.imaginary;

	return temp;	//返回結構體
}

int main()
{

	complex a1, a2, sum;
	printf("Please input the first number's real part and imaginary part:\n");
	scanf("%d %d", &a1.real, &a1.imaginary);

	printf("Please input the second number's real part and imaginary part:\n");
	scanf("%d %d", &a2.real, &a2.imaginary);

	sum = Sum_Complex(a1, a2);
	
	//結構體變數訪問成員方式
	printf("Sum is %d + %di\n", sum.real, sum.imaginary);
}

這個函式雖然能夠產生正確地結果,但是效率很低.
C語言的引數傳值呼叫方式要求把引數的一份拷貝傳遞給函式,要想把它作為引數進行傳遞,必須在堆疊中進行復制,結束後再丟棄,利用效率非常低.

利用結構體 指標重新編寫

#include <stdio.h>
#include <stdlib.h>

//定義複數結構體,型別重新命名為complex
typedef struct 
{
	int real;
	int imaginary;
}complex;


//返回值:complex的結構體指標
//函式引數也是結構體指標
complex *Add(complex *x, complex *y)
{
	//malloc返回值是一個指標,不能申(complex)malloc(sizeof(complex))
	complex *result = (complex *)malloc(sizeof(complex));
	result->real = x->real + y->real;
	result->imaginary = x->imaginary + y->imaginary;

	return result;	//返回結構體
}

//亮點:將列印寫成函式
void Print_Struct(complex * ps)
{
	printf("%d + %di", ps->real, ps->imaginary);
}

int main()
{
	//結構體成員賦值可以用括號
	complex a1 = {1, 2};
	complex a2 = {3, 4};
	
	//定義結構體指標
	complex *result = Add(&a1, &a2);//&a1, &a2指標
	Print_Struct(result);
	return 0;
}

利用指標進行傳遞顯然好的多

  • 它並不需要把整個結構作為引數傳遞給函式,也不需要把整個結構作為返回值返回
  • 呼叫程式無需知道結構的內容,所以提高了程式的模組化程度.
  • PS:函式傳遞指標的缺陷在於函式可以對呼叫程式的結構變數進行修改.可以在函式中使用const關鍵字來防止這類修改