合肥工業大學宣城校區周波老師授17級本科生程式設計基礎作業(全)

u25th_engineer發表於2018-08-22

       秉著方便後來人的理念,刁肥宅已經將程式設計的所有實驗上傳到CSDN資源、豆丁文庫與百度文庫了,但是在CSDN上下載所有資源都至少需要1個積分,百度狗逼總會暗地裡把刁肥宅設定的“免積分”改為2到8個積分,其中幾個我昨天晚上都已經修改了,唯獨8個積分的那個文件一直改不掉——百度真噁心!豆丁也是亦步亦趨。因此,刁肥宅索性花點時間將所有程式設計的作業與實驗貼在此處,以供參考!參考的朋友請注意了,有一些題目刁肥宅已明顯發現那麼寫是錯的,但由於懶的原因有一些沒有修正,大家自己注意哈。另外,每一屆的作業內容多少都會有些不同,這一點萬請注意~~~

     這些內容都很簡單,但對於好學的初學者來說,刁肥宅願意熱情地為你們解答疑惑,歡迎直接聯絡刁肥宅Email:u25th_engineer@163.com!

       作業1

       2.21  設計一個程式,從鍵盤輸入一個小寫字母,將它轉換成大寫字母。

#include <stdio.h>

int main()
{
    int c,ans;
    scanf("%c",&c);
    ans=c-32;
    printf("%c",ans);
    return 0;
}
圖1.1 作業1.1程式執行截圖

       2.22  設計一個程式,從鍵盤輸入一個圓的半徑,求其周長和麵積。

#include <stdio.h>
#define PI 3.14


int main()
{
    double r;
    scanf("%lf",&r);
    printf("%lf\n%lf\n",2*PI*r,PI*r*r);
    return 0;
}

 

圖1.2 作業1.2程式執行截圖

       作業2 

       3.7  編寫一個程式,測試十進位制、八進位制、十六進位制格式整數值的輸入,並分別按照3種不同的基數輸出,測試資料為10、010、0x10。

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


int main()
{
    printf("%d %o %x\n",10,10,10);
    printf("%d %o %x\n",010,010,010);
    printf("%d %o %x\n",0x10,0x10,0x10);
    return 0;
}
圖2.1 作業2.1程式執行截圖

       3.8  編寫一個程式,分別用不同的域寬列印出整數12345和浮點數1.2345。當域寬小於數值的實際需要的域寬時,會發生什麼情況?

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


int main()
{
    printf("%1d\n%2d\n%3d\n%4d\n%5d\n%9d\n",12345,12345,12345,12345,12345,12345);
    printf("%.1f\n%.2f\n%.3f\n%.4f\n%.5f\n%.9f\n",1.2345,1.2345,1.2345,1.2345,1.2345,1.2345);
    return 0;
}

 

圖2.2 作業2.2程式執行截圖

       3.11 設計一個程式,判斷從鍵盤輸入的整數的正負性和奇偶性。

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


int main()
{
    int a,b;
    scanf("%d%d",&a,&b);
    if(a>0)
    {
        if(a%2==0)
            printf("a(%d) is a positive even number\n",a);
        else
            printf("a(%d) is a positive odd number\n",a);
    }
    else if(a<0)
        printf("a(%d) is a negative number\n",a);
    else
        printf("a(%d) = 0(even)\n",a);

    if(b>0)
    {
        if(b%2==0)
            printf("b(%d) is a positive even number\n",b);
        else
            printf("b(%d) is a positive odd number\n",b);
    }
    else if(b<0)
        printf("b(%d) is a negative number\n",b);
    else
        printf("b(%d) = 0(even)\n",b);
    //if(
    return 0;
}

 

圖2.3 作業2.3程式執行截圖1
圖2.4 作業2.3程式執行截圖2

 

圖2.5 作業2.3程式執行截圖3

 

圖2.6 作業2.3程式執行截圖4

        3.12 編寫一個程式,記錄5個班的學生成績,每個班有10個學生。要求用cin函式輸入資料,然後按行列格式列印該表。

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <iomanip>

using namespace std;

int main()
{
    int s[5][10];
    memset(s,0,sizeof(s));
    //srand(time(NULL));
    for(int i=0;i<5;i++)
        for(int j=0;j<10;j++)
            //s[i][j]=(rand()%((100-0+1)+0));
            cin>>s[i][j];

    for(int i=0;i<5;i++)
    {
        cout<<"Class "<<i+1<<":";
        for(int j=0;j<10;j++)
            cout<<setw(4)<<s[i][j];
            //cout<<s[i][j]<<'  ';
        cout<<endl;
    }
    return 0;
}
圖2.7 作業2.4程式執行截圖

       3.13 假定你是一大學教師,需要給出10個學生的平均分數。編寫一個程式,提示輸入10個不同的成績,然後將平均值顯示在螢幕上。

#include <iostream>

using namespace std;

int main()
{
    int s[10+1];
    float ans=0.0;
    for(int i=0;i<10;i++)
        cin>>s[i];
    for(int i=0;i<10;i++)
        ans+=s[i];
    cout<<ans/10<<endl;

    return 0;
}

 

圖2.8 作業2.5程式執行截圖

       3.14 編寫一個測試兒童算術的程式。要求輸入兩個數,然後算出第一個數加第二個數的和,當他準備好後(在告訴他怎麼樣做以後等著他按Enter鍵)列印結果,以便他核對答案。

#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    double a,b,in,sum;

    printf("請輸入兩個數,用於做加法:\n");
    scanf("%lf %lf",&a,&b);
    sum=a+b;
    printf("請輸入你的運算結果:\n");
    scanf("%lf",&in);
    printf("正確答案是:%lf\n",sum);
    if(sum==in)
        printf("恭喜你!結果正確!\n");
    else
        printf("很遺憾!結果錯誤!\n");

    return 0;
}

 

圖2.9 作業2.6程式執行截圖1
圖2.10 作業2.6程式執行截圖2
圖2.11 作業2.6程式執行截圖3

 

       3.16 從鍵盤輸入一個3位數abc,從左到右用a、b、c表示各位的數字,現要求依次輸出從右到左的各位數字,即輸出另一個3位數cba,如輸出123則輸出321,試設計程式(演算法提示:a=n/100,b=(n-a*100)/10,c=(n-a*100)%10,m=c*100+b*10+a)。

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

int main()
{
    int n;
    scanf("%d",&n);
    printf("%d%d%d\n",n%10,n/10%10,n/100);

    return 0;
}
圖2.12 作業2.7程式執行截圖

       作業3 

       4.10 設計一個程式,輸入實型變數x和y,若x>y,則輸出x-y;若x<y,則輸出y-x。

#include <stdio.h>

int main()
{
    float x,y;
    scanf("%f%f",&x,&y);
    if(x>y)
        printf("%f\n",x-y);
    else
        printf("%f\n",y-x);

    return 0;
}
圖3.1 作業3.1程式執行截圖1

 

圖3.2 作業3.1程式執行截圖2

       4.16 輸入4個整數,要求按從大到小的順序輸出。

#include <stdio.h>

int main()
{
    int a,b,c,d,tmp;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    if(a<b)
    {
        tmp=b;
        b=a;
        a=tmp;
    }
     if(a<c)
    {
        tmp=c;
        c=a;
        a=tmp;
    }
     if(a<d)
    {
        tmp=d;
        d=a;
        a=tmp;
    }
     if(b<c)
    {
        tmp=c;
        c=b;
        b=tmp;
    }
     if(b<d)
    {
        tmp=d;
        d=b;
        b=tmp;
    }
    if(c<d)
    {
        tmp=d;
        d=c;
        c=tmp;
    }

    printf("%d %d %d %d\n",a,b,c,d);

    return 0;
}

 

圖3.3 作業3.3程式執行截圖1
圖3.4 作業3.3程式執行截圖2

        3.11 編寫一個程式列印如圖4-19所示的圖案。使用for迴圈分別列印每一個圖案。所有星號(*)應在一條cout<<’*’的語句中列印(使星號緊靠在一起)。提示:最後兩個圖案要求每一行以適當空格數開始。附加部分:這4個問題的程式碼組合在一個程式中,利用巢狀for迴圈使4分圖案並排列印。

//#include <stdio.h>    //用printf語句就是不行 Why?
#include <iostream>

using namespace std;

int main()
{
    //freopen("x1.out","w",stdout);
    /*for(int i=0;i<10;i++)
    {
        for(int j=0;j<10;j++)

            if(j<=i)
                printf("*");
        printf("\n");
    }
    printf("\n");

    for(int i=0;i<10;i++)
    {
         for(int j=0;j<10;j++)
            if(j<10-i)
                printf("*");
        printf("\n");
    }
    printf("\n");

    for(int i=0;i<10;i++)
    {
        for(int j=0;j<10;j++)
            if(j<i)
                printf(" ");
            else
                printf("*");
        printf("\n");
    }
    printf("\n");

    for(int i=0;i<10;i++)
    {
        for(int j=0;j<10;j++)
            if(j<9-i)
                printf(" ");
            else
                printf("*");
        printf("\n");
    }
    printf("\n");*/

    for(int i=0;i<10;i++)
    {
        for(int j=0;j<10;j++)
        {
            if(j<=i)
                //printf("*");
                cout<<"*";
            else
                cout<<" ";

        }
        cout<<"\t";

        for(int j=0;j<10;j++)
            if(j<10-i)
                //printf("*");
                cout<<"*";
            else
                cout<<" ";
        //printf("\n");
            cout<<"\t";

        for(int j=0;j<10;j++)
            if(j<i)
                //printf(" ");
                cout<<" ";
            else
                cout<<"*";
                //printf("*");
        //printf("\n");
        cout<<"\t";

        for(int j=0;j<10;j++)
            if(j<9-i)
                //printf(" ");
                cout<<" ";
            else
                cout<<"*";
                //printf("*");

        //printf("\n");
        cout<<"\n";
    }
    return 0;
}
圖3.5 作業3.4程式執行截圖

       4.29 設用100元錢買100支筆,其中鋼筆每支3元,圓珠筆每支2元,鉛筆每支0.5元,問鋼筆、圓珠筆和鉛筆可以各買多少支(每種筆至少買一支)?

       提示:設鋼筆、圓珠筆和鉛筆各買i、j、k只,則應有下列式子成立。

       3*i+2*j+0.5*k=100

       i+j+k=100

       用窮舉法將購買鋼筆、圓珠筆的數量用二重迴圈遍歷一遍。從中找出符合上述條件的購買方案。

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    for(int i=1;i<=100;i++)
        for(int j=1;j<=100;j++)
            for(int k=1;k<=100;k++)
                if(3*i+2*j+0.5*k==100&&(i+j+k==100))
                    cout<<"鋼筆:"<<setw(2)<<i<<" "<<"鉛筆:"<<setw(2)<<j<<" "<<"鉛筆:"<<setw(2)<<k<<endl;

    return 0;
}

 

圖3.6 作業3.5程式執行截圖

       作業四       

       1.、題目:

       

       (1)從鍵盤上輸入10個浮點數,求出它們的和以及平均值,要求用函式實現。

       (2)設計一個函式,實現把輸入的一個十進位制數轉換為十二進位制數。

       (3)設計一個程式,用過載函式實現計算兩個數的平方和,分別實現整形和浮點數的計算。

       (4)根據斐波那契數列的計算公式,用遞迴的方法計算該數列。

       (5)寫出下列程式的運算結果。

        #include <iostream.h>

        #define A b*b-b

        #define C A-A

        int main()

        {

            int b=1;

            cout<<"C="<<C;

            cout<<endl<<"The screen will be closed in 30s.";

            return 0;

        }

       2、程式結果貼圖(注意標明對應題號和進行簡短說明):

圖4.1 作業4.1程式執行截圖

 

圖4.2 作業4.2程式執行截圖1

 

圖4.3 作業4.2程式執行截圖2(陣列版)

 

圖4.4 作業4.2程式執行截圖3(陣列版)

 

 

圖4.5 作業4.2程式執行截圖4(遞迴版)

 

 

圖4.6 作業4.3程式執行截圖1

 

圖4.7 作業4.3程式執行截圖2

 

圖4.8 作業4.4程式執行截圖1

 

圖4.9 作業4.4程式執行截圖2

 

圖4.10 作業4.5程式執行截圖

       3.程式設計碰到的問題及總結

       ①適當使用全域性變數可以降低編寫程式的複雜度;一定要謹慎使用全域性變數。  

       ②題目(2)(習題5.6)不用陣列或許也能實現,但我暫時沒有想到演算法。(現在想到了,遞迴)

       ③要熟悉C++的特性;閱讀相關書籍,要逐漸學會靈活使用C++的新特性。

       ④遞迴可以解決的問題,都能化為迴圈迭代;普通的遞迴會消耗大量的記憶體與執行時間,可以考慮使用記憶化搜尋等方法改進。

       ⑤題目(5)第一次判斷時,我錯判結果為0。要掌握一些基本定義與概念,在實踐逐漸學會靈活運用。

        4、 附原始碼:

       作業4.1原始碼:

/*4.1*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

float sum();
void average(float);

float _sum=0.0;

int main()
{
    sum();
    average(_sum);
    Sleep(1000*30);
    return 0;
}

float sum()
{
    float m;
    int i;
    for(i=0;i<10;i++)
    {
        scanf("%f",&m);
        _sum+=m;
    }
    printf("%f\n",_sum);
    return _sum;
}

void average(float sum_)
{
    printf("%f\n",sum_/10);
    printf("\nThe screen will be closed in 30s.");
}

       作業4.2原始碼:

       version 1:

//version1:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

void DecToDuo(int);
int times(int);    //空間節約一點吧

char s[536870911+1000000000];
static int _times;

int main()     //十二進位制 duodecimal
{
    int n,i=0;
    printf("n可接受的最大值為2147483647\n");
    printf("                 ");
    scanf("%d",&n);
    _times=times(n)-1;

    DecToDuo(n);
    printf("%d的十二進位制數為:",n);
    for(i=_times;i>=0;i--)
        printf("%c",s[i]);
    printf("\nThe screen will be closed in 30s.");
    Sleep(1000*30);
    return 0;
}

int times(int n)
{
    int _count=0;
    while(n)
    {
        n/=12;
        _count++;
    }
    return _count;
}

void DecToDuo(int n)
{
    int i=0,p;
    char ans;
    while(n)
    {
        p=n%12;
        n/=12;
        if(p==10)
            ans='a';
        else if(p==11)
            ans='b';
        else
            ans=p+'0';
        s[i++]=ans;
    }
}

       version 2:

//version2:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void f(int);

int main()
{
    int n,i;
    /*while(scanf("%d",&n)==1)
    {
        f(n);
        printf("\n");
    }*/
    srand(time(NULL));
    for(i=0;i<50;i++)
    {
        printf("decimal:");
        n=rand()%(100000-1000)+1000;
        printf("%d",n);
        printf("\nduodecimal:");
        f(n);
        printf("\n");
    }
    return 0;
}

void f(int n)
{
    if(n/12)
        f(n/12);
    if(n%12==10)
        printf("A");
    else if(n%12==11)
        printf("B");
    else
        printf("%d",n%12);
}

        作業4.3原始碼:

#include <iostream>
#include <windows.h>

using namespace std;

void sum_square(int,int);
void sum_square(double,double);

int main()
{
    int a,b;
    double x,y;
    //cout<<"Please enter two integers:"<<endl;
    cin>>a>>b;
    //cout<<"Please enter two floating point numbers:"<<endl;
    cin>>x>>y;
    sum_square(a,b);
    sum_square(x,y);
    Sleep(1000*30);
    return 0;
}

void sum_square(int a,int b)
{
    //cout<<"The quadratic sum of these two integers:"<<a*a+b*b<<endl;
    cout<<a*a+b*b<<endl;
}

void sum_square(double a,double b)
{
    cout<<a*a+b*b<<endl;
    cout<<endl<<"The screen will be closed in 30s.";
}

       作業4.4原始碼:

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

int Fibonacci(int);

int main()
{
    int n,i;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        printf("%20d",Fibonacci(i));
        if(i%4==0)
            printf("\n");
    }
    printf("\nThe screen will be closed in 30s.");
    Sleep(1000*30);
    return 0;
}

int Fibonacci(int n)
{
    return n==1||n==2?1:(Fibonacci(n-1)+Fibonacci(n-2));
}

 

       作業五 

       1、題目:

       (1)使用結構體變數來表示每個學生的資料:姓名、學號和3門課的成績。從鍵盤上輸入10個學生的資料,要求列印出每個學生的姓名和3門課的平均成績。

      (2)定義描述複數型別的結構體變數,編寫減法函式sub()與乘法函式mul(),分別完成複數的減法與乘法運算。在主函式中定義四個複數型別變數c1、c2、c3、c4,輸入c1、c2的複數值,呼叫sub()完成c3=c1-c2操作,呼叫mul()完成c4=c1*c2操作。最後輸出c3、c4複數值。

      (3)定義兩個操作結構worker的函式input和display。結構worker用於表示職工的資訊,如姓名,工齡,工資等。函式input輸入一個職工的有關資料。函式display顯示這些資訊。並設計一個使用這兩個函式的程式,該程式可以處理10個職工的資料。

       (4)回答問題:

       ①什麼是指標?指標的值和型別與一般變數有何不同?

       ②指標具有哪些運算?

       ③給指標賦值時應注意些什麼?使用沒用賦過值的指標有什麼危險?

       ④指標作為函式的引數有什麼特點?

       ⑤一維陣列和二維陣列的元素如何用指標表示?

       ⑥試述引用和指標的異同。

       ⑦設有宣告:

       int i=50,*ip=&i;

       並設變數i存放在起始地址為2500的儲存單元中,則ip和*ip的值各是多少?

       2. 程式結果貼圖(注意標明對應題號和進行簡短說明):

圖5.1 作業5.1程式輸入資料截圖1

 

 

圖5.2 作業5.1程式輸出資料截圖(C語言版)

 

 

圖5.3 作業5.1程式輸入資料截圖2

 

 

圖5.4 作業5.1程式輸出資料截圖(C++版)

 

圖5.5 作業5.2程式執行截圖

 

圖5.6 作業5.3程式輸入資料截圖1

 

圖5.7 作業5.3程式輸出資料截圖(C語言版)

 

圖5.8 作業5.3程式輸入資料截圖2

 

 

圖5.9 作業5.3程式輸出資料截圖(C++版)

       作業五題目(4)的解答:

       

①什麼是指標?指標的值和型別與一般變數有何不同?

答:指標變數(簡稱指標)是存放另一變數地址的變數。指標的值:指標與其他變數的不同之處在於,指標所對應的儲存單元存放的是地址,而不是一般的資料;指標的型別:指標存放的是某個指定型別變數的地址,即:指向某型別值的指標。

②指標具有哪些運算?

答:&運算子,稱為“取地址運算子”,是一元運算子,它返回運算元的地址。*運算子,稱為“間接引用運算子”、“復引用運算子”或“取目標運算子”,它返回運算元(指標)所指向的物件。算術運算:加和減。指標作為運算元每加上或減去一個整數n,其運算結果是指向指標當前指向的變數的後方或前方的第n個變數。關係運算:在關係表示式中可對相同型別的兩個指標進行各種關係運算,其結果可以反映兩指標所指向的地址之間的位置前後關係。賦值運算:為指標變數賦值時,賦的值必須是地址常量或變數,而不能是普通整數。

③給指標賦值時應注意些什麼?使用沒用賦過值的指標有什麼危險?

答:為指標變數賦值時,賦的值必須是地址常量或變數,而不能是普通整數。沒有分配空間的指標,即它是隨機指向的,系統自動對其初始化,所謂的“野指標”,最嚴重的可能造成記憶體洩漏。

④指標作為函式的引數有什麼特點?

答:主調函式和被調函式操作的是同一段記憶體空間(同一個地址)上的內容。傳遞效率高:如果所需要傳的是一個很大結構體之類變數,通過地址傳遞因為不用向變數所屬的棧拷貝資料,遠比傳值快得多,也比傳引用快。

⑤一維陣列和二維陣列的元素如何用指標表示?

答:假設有如下一維陣列和指向整形變數指的針定義:

int a[size];     //size為一固定正的整形變數

int *pa;     

pa = a;     

則可以這樣表示陣列元素:

*p, *(p+1),………*(p+i);

假設有如下定義:

int A[M][N], i, j, max;

int (*p)[N];

則可以這樣表示二維陣列的元素:

*(*(A+i)+j);

⑥試述引用和指標的異同。

同:

它們都是和地址有關係的,指標指向一塊記憶體,而引用是一塊記憶體的別名。

異:

a. 指標是一個實體它在棧中有自己使用的空間,但是引用沒有;

b. 引用必須初始化,指標不用但是最好初始化

c. 指標使用時必須加*,引用不用;

d. 引用只能初始化一次,指標不受此限制;

e. 引用不用const去修飾,但是指標可以

f. 指標和地址運用自增(++)不同,引用是值進行自增,而指標是地址進行自增。

聯絡

a. 引用的內部使用指標實現的;

b. 引用是受了限制的指標。

(⑥的回答基於此CSDN部落格:https://blog.csdn.net/study__linux/article/details/51352206

⑦設有宣告:

int i=50,*ip=&i;

並設變數i存放在起始地址為2500的儲存單元中,則ip和*ip的值各是多少?

答:ip的值為2500,*ip的值為50。

       4. 附原始碼:

       作業5.1原始碼:

       C version:

//C version:
#include <stdio.h>
#include <stdlib.h>

//name&number&the grade of 3 courses
typedef struct student
{
    char name[20];
    int num;
    int grade[3];
}stu,*st;

st init(stu *);
//void dispaly(st);
float dispaly(st);

int main()
{
    freopen("x1.in","r",stdin);
    freopen("x1.out","w",stdout);
    st p,q;
    p=init(q);
    display(p);
    return 0;
}

st init(stu* p)
{
    int i;
    p=(stu*)malloc(sizeof(stu)*10);
    for(i=0;i<10;i++)
    {
        //scanf("%s",p[i].name);
        gets(p[i].name);//如果用上面這句話執行時就會出錯
        scanf("%d%d%d%d",p[i].num,p[i].grade[0],p[i].grade[1],p[i].grade[2]);
    }
    return p;
}

//float display(st p)
void display(st p)
{
    int i;
    float aver=0.0;
    for(i=0;i<10;i++)
    {
        //aver=(p[i]->grade[i][0]+p[i]->grade[i][1]+p[i]->grade[i][2])/3;
        aver=(float)(p[i].grade[0]+p[i].grade[1]+p[i].grade[2])/3;
        //puts(p[i].name);
        printf("%s\n",p[i].name);//上面這句話和這句話輸出結果無差別
        printf(" ---- %.2f\n",aver);
        //printf("%s\n",p[i].name);
    }
    //return aver;
}

       C++version:

//C++ version:
#include <cstdio>
#include <iomanip>
#include <iostream>
//#include <windows.h>

using namespace std;
//name&number&the grade of 3 courses
typedef struct student
{
    char name[20];
    int num;
    int grade[10][3];
}stu,*st;

st init(stu *);
void display(st);

int main()
{
    freopen("x1.in","r",stdin);
    freopen("x1.out","w",stdout);
    st p,q;
    p=init(q);
    display(p);
    //Sleep(1000*60);
    return 0;
}

st init(stu* p)
{
    int i;
    p=new stu[10];
    for(i=0;i<10;i++)
        cin>>p[i].name>>p[i].num>>p[i].grade[i][0]>>p[i].grade[i][1]>>p[i].grade[i][2];
    return p;
}

void display(st p)
{
    int i;
    float aver=0.0;
    for(i=0;i<10;i++)
    {
        aver=(float)(p[i].grade[i][0]+p[i].grade[i][1]+p[i].grade[i][2])/3;
        cout<<p[i].name<<" "<<fixed<<setprecision(2)<<aver<<endl;
    }
}

       作業5.2原始碼:

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

typedef struct complex_number
{
    double re;
    double im;
}Im_m,*Ima;

Ima sub(Im_m*,Im_m*);
Ima mul(Im_m*,Im_m*);
Ima init(Im_m*);
void display(Ima);

int main()
{
    //freopen("x1.in","r",stdin);
    //freopen("x1.out","w",stdout);
    Ima c1=init(c1),c2=init(c2),c3,c4;
    c3=sub(c1,c2);
    c4=mul(c1,c2);//c3=c1-c2,c4=c1*c2
    display(c3);
    display(c4);
    return 0;
}

Ima init(Im_m* s)
{
    s=(Im_m*)malloc(sizeof(Im_m));
    scanf("%lf%lf",&s->re,&s->im);
    return s;
}

Ima sub(Im_m* a,Im_m* b)
{
    Ima c=(Im_m*)malloc(sizeof(Im_m));
    c->re=a->re-b->re;
    c->im=a->im-b->im;
    return c;
}

//Set two complex Numbers A= a+bi,B=c+di,where a,c is the real part,c,d is the imaginary part,
//then A¡ÁB=ac-bd+(ad+bc)i.

Ima mul(Im_m* a,Im_m* b)
{
   Ima c=(Im_m*)malloc(sizeof(Im_m));
   c->re=(a->re)*(b->re)-(a->im)*(b->im);
   c->im=(a->re)*(b->im) + (a->im)*(b->re);
   return c;
}

void display(Ima s)
{
    if(s->im<0)
        printf("%.2lf%.2lfi\n",s->re,s->im);
    else
        printf("%.2lf+%.2lfi\n",s->re,s->im);
}

       作業5.3原始碼:

       C version:

//C version
#include <stdio.h>
#include <stdlib.h>

typedef struct worker
{
    char name[20];
    int work_years;
    int salary;
}Worker,*PWorker;

PWorker input(Worker*);
void display(Worker*);

int main()
{
    freopen("x1.in","r",stdin);
    freopen("x1.out","w",stdout);
    Worker* w=input(w);
    display(w);
    printf("%p\n",w);
    free(w);
    printf("%p\n",w);
    /*if(w==NULL)
        printf("yes\n");
    else
        printf("no\n");*/
    return 0;
}

PWorker input(Worker* s)
{
    s=(Worker*)malloc(sizeof(Worker)*10);
    int i;
    for(i=0;i<10;i++)
    {
        gets(s[i].name);
        scanf("%d%d",s[i].work_years,s[i].salary);
    }
    return s;
}

void display(Worker* p)
{
    int i;
    for(i=0;i<10;i++)
    {
        puts(p[i].name);
        printf("%d%d\n",p[i].work_years,p[i].salary);
    }
    free(p);
}

       C++ version:

//C++ version
#include <iostream>
#include <cstdio>

//ÐÕÃû¡¢¹¤Áä¡¢¹¤×Ê
typedef struct worker
{
    char name[50];
    int work_years;
    int salary;
}Work,*PWorker;

using namespace std;

PWorker input(Work*);
void display(Work*);

int main()
{
    freopen("x1.in","r",stdin);
    freopen("x1.out","w",stdout);
    Work* wrk;
    wrk=input(wrk);
    display(wrk);
    return 0;
}

PWorker input(Work* wrk)
{
    wrk=new Work[10];
    for(int i=0;i<10;i++)
        cin>>wrk[i].name>>wrk[i].work_years>>wrk[i].salary;
    return wrk;
}

void display(Work* wrk)
{
    for(int i=0;i<10;i++)
    {
        cout<<wrk[i].name<<" "<<wrk[i].work_years<<" "<<wrk[i].salary<<endl;
    }
    delete wrk;
}

 

相關文章