【EduCoder答案】C/C++實訓答案

2020-08-10 12:51:35

簡介

其他各類實訓答案的目錄見這裏
答案查詢的入口見這裏
答案獲取的方法簡介見這裏

並不是所有的關卡都有答案,有些只有部分關卡有,因爲金幣不太夠…

在電腦網頁介面的右側,有個文章目錄,可以在那裏查一下要找的實訓標題

C/C++相關實訓答案

C&C++基本輸入輸出 >>>鏈接

第1關: 重要的事情說三遍

解題程式碼

// 包含標準輸入輸出函數庫
#include <stdio.h>

// 定義main函數
int main()
{
    // 請在下面 下麪編寫將字元輸出三遍的程式程式碼
    /********** Begin *********/
    char x = getchar();
    putchar(x);
    putchar(x);
    putchar(x);
    putchar('!');
    /********** End **********/
    return 0;
}

第2關: 整數四則運算表達式的輸出格式控制

解題程式碼

//包含標準輸入輸出函數庫
#include <stdio.h>

int main()
{
    //宣告兩個整型變數,用於儲存輸入的兩個整數
    int x,y;
    //請在Begin-End之間新增你的程式碼,按要求格式輸出四則運算式子
    /********** Begin *********/
	scanf("%d%d",&x,&y);
    printf("%5d + %-5d = %10d\n", x, y, x + y);
    printf("%5d - %-5d = %10d\n", x, y, x - y);
    printf("%5d * %-5d = %10d\n", x, y, x * y);
    printf("%5d / %-5d = %10d", x, y, x / y);
    /********** End **********/
    return 0;
}

第3關: 你好,生日

解題程式碼

// 包含I/O流庫iostream
#include <iostream>

// 載入命名空間std
using namespace std; 

int main()
{
    // 宣告三個變數,分別用來儲存年、月、日
    int y, m, d;
    // 請在Begin-End之間新增你的程式碼,輸入你的生日,並按指定格式輸出資訊。	
    /********** Begin *********/
	cin >> y >> m >> d;
    cout << "Hello! " << m << " " << d << " " << y;
    /********** End **********/
    return 0;
}

第4關: 不同精度的PI

解題程式碼

#include <iostream>

// 包含流操作運算元庫
#include <iomanip>
using namespace std;

// 定義常數PI,後面可以直接用PI代替後面的數值
#define PI 3.14159265358979323846

int main()
{
    int n;
    // 請在Begin-End之間新增你的程式碼,輸入n,按不同的精度輸出 PI。
    /********** Begin *********/
	// 輸入n
    cin >> n;
    // 輸出PI
    cout << setiosflags(ios::fixed) << setprecision(n) << PI << endl;
    cout << setprecision(n + 1) << PI << endl;
    cout << setprecision(n + 2) << PI << endl;
    cout << setprecision(n + 3) << PI << endl;
    cout << setprecision(n + 4) << PI;
    /********** End **********/
    return 0;
}

C&C++控制結構實訓 >>>鏈接

第1關: 分支結構:是閏年嗎

解題程式碼

// 包含兩種I/O庫,可以使用任一種輸入輸出方式
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    int year;
    // 請在此新增程式碼,判斷輸入的年份是否位閏年,是則輸出"Yes",否則輸出"No"
    /********** Begin *********/
	cin >> year;
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
        cout << "Yes";
    else
        cout << "No";
    /********** End **********/
    return 0;
}

第3關: 分支結構:重排最大數

解題程式碼

// 包含兩種I/O庫,可以使用任一種輸入輸出方式
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    // n-輸入的數,m-重排後的數
    int n, m;
    // 請在此新增程式碼,輸入一個小於1000的正整數,重排出最大的數存入m中
    /********** Begin *********/
	cin >> n;
    int a = n % 10, b, c, t;
    n = n / 10;
    b = n % 10;
    c = n / 10;
    if (a < b)
    {
        t = a; a = b; b = t;
    }
    if (a < c)
    {
        t = a; a = c; c = t;
    }
    if (b < c)
    {
        t = b; b = c; c = t;
    }
    m = a * 100 + b * 10 + c;
    /********** End **********/
    // 輸出重排後的數
    cout << m << endl;
    return 0;
}

第4關: 回圈結構:黑洞陷阱

解題程式碼

// 包含兩種I/O庫,可以使用任一種輸入輸出方式
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    int n;
    // 請在此新增程式碼,輸出整數進入黑洞過程
    /********** Begin *********/
	cin >> n;
    int k = 1;
    while(1)
    {
        int a = n % 10, b, c, t;
        n = n / 10;
        b = n % 10;
        c = n / 10;
        if(a < b)
        {
            t = a; a = b; b = t;
        }
        if(a < c)
        {
            t = a; a = c; c = t;
        }
        if(b < c)
        {
            t = b; b = c; c = t;
        }
        t = a * 100 + c - c * 100 - a;
        if(t != 495)
          cout << k << ":" << a * 100 + b * 10 + c <<"-" << a + b * 10 + c * 100 << "=" << t << endl;
        if( t == 495)
          cout << k << ":" << a * 100 + b * 10 + c <<"-" << a + b * 10 + c * 100 << "=" << t << endl;
        k++;
        n = t;
        if(t == 495)
            break;
	}
    /********** End **********/
    return 0;
}

第5關: 回圈結構:是素數嗎

解題程式碼
本關任務對應參考程式碼實現如下:

// 包含兩種I/O庫,可以使用任一種輸入輸出方式
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    int n;

    // 請在此新增程式碼,輸入正整數n,如果n是素數則輸出「Yes」,否則輸出「No」
    /********** Begin *********/
    cin >> n;
    if(n == 1)
    {
        cout << "No";
        return 0;
    }
    int flag = 1;
    for(int i = 2; i * i <= n; i++)
        if(n % i == 0)
        {
            flag = 0;
            break;
        }
    if(flag)
        cout << "Yes";
    else
        cout << "No";
    /********** End **********/

    return 0;
}

第6關: 回圈結構:素數和

解題程式碼
本關任務對應參考程式碼實現如下:

// 包含兩種I/O庫,可以使用任一種輸入輸出方式
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    int n, k;
    // 請在此新增程式碼,輸入n和k,並輸出n以內k個素數以及它們的和
    /********** Begin *********/
    cin >> n >> k;
    int t, m = 0, sum = 0;
    for(t = n; t >= 2; t--)
    {
        int flag = 1;
        for(int i = 2; i * i <= t; i++)
            if(t % i == 0)
            {
                flag = 0;
                break;
            }
        if(flag)
        {
            cout << t << " ";
            m++;
            sum += t;
            if(m == k)
                break;
        }
    }
    cout << sum;
    /********** End **********/

    return 0;
}

C&C++函數實訓 >>>鏈接

第1關: 登月紙橋

解題程式碼

#include <iostream>
using namespace std;

// foldTimes-計算建紙橋的摺疊次數
// 參數:dis-星際距離(千米),thick-紙的厚度(毫米)
// 返回值:建橋需要摺疊的次數
int foldTimes(double dis, double thick);

int main()
{
    double dis, thick;
    cin >> dis >> thick;
    cout << "需要摺疊" << foldTimes(dis,thick) << "次" << endl;
    return 0;
}

int foldTimes(double dis, double thick)
{
    // 請在這裏補充程式碼,實現函數foldTimes
    /********** Begin *********/
    thick = thick / 1000.0;      // 調整單位爲米
    dis = dis * 1000.0;     // 調整單位爲米
    int t = 0;     // 摺疊次數
    while(thick < dis)
    {
        t++;
        thick *= 2;
    }
    return t;
    /********** End **********/
}

第2關: 幾點幾分了?

解題程式碼

#include <iostream>
using namespace std;

void whatTime(int secs, int &h, int &m, int &s)
{
    // 請在這裏補充程式碼,設計並實現函數whatTime,使main函數中的函數呼叫正確
    /********** Begin *********/
	h = secs / 3600;
    secs = secs % 3600;
    m = secs / 60;
    s = secs % 60;
    /********** End **********/
}

int main()
{
    int secs;     // secs秒錶上的秒數   
    int h, m, s;     // 當前時間:h-小時,m-分,s-秒
    cin >> secs;     // 輸入秒錶上的秒數
    whatTime(secs,h,m,s);     // 計算當前時間
    cout << h << ":" << m << ":" << s << endl;     // 輸出當前時間
    return 0;
}

第3關: 這天星期幾?

解題程式碼

#include <iostream>
using namespace std;

// 函數leapYear
int leapYear(int y)
{
    if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
        return 1;
    return 0;
}

// 函數whatDay:計算某年某月某日是星期幾
// 參數:year-年,month-月
// 返回值:--7分別表示星期一到星期日
int whatDay(int year, int month)
{
    // 請在這裏補充程式碼,實現函數whatDay
    /********** Begin *********/
	// 1年月日是星期一
    int w = 1;
    int i;
    // 1到year-1都是全年
    for(i = 1; i < year; i++)
    {
        if(leapYear(i))
            w += 366;
        else
            w += 365;
    }
    switch(month)
    {
    case 12:
        w += 30;
    case 11:
        w += 31;
    case 10:
        w += 30;
    case 9:
        w += 31;
    case 8:
        w += 31;
    case 7:
        w += 30;
    case 6:
        w += 31;
    case 5:
        w += 30;
    case 4:
        w += 31;
    case 3:
        if(leapYear(year))
            w += 29;
        else
            w += 28;
    case 2:
        w += 31;
    case 1:     // 1月不加了
        ;
    }
    w = w % 7;     // 得到-6,其中爲星期天
    // 調整星期天
    if(w == 0)
        w = 7;
    return w;

    /********** End **********/
}

int main()
{
    int y, m, xq;     // 年、月、星期幾
    cin >> y >> m;     // 輸入年月
    xq = whatDay(y,m);     // 計算星期幾
    cout << y << "年" << m << "月1日是星期";     // 輸出星期
    if(xq == 7)
        cout << "日" << endl;
    else
        cout << xq << endl;
    return 0;
}

第4關: 列印日曆

解題程式碼

// 包含兩種I/O庫,可以使用任一種輸入輸出方式
#include <stdio.h>
#include <iostream>
using namespace std;

// 函數printMonth:按要求的格式列印某年某月的日曆
// 參數:year-年,month-月
// 返回值:無
void printMonth(int year, int month);

// leapYear:判斷閏年
// 參數:y-年
// 返回值:1-是閏年,0-不是閏年
int leapYear(int y)
{
    if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
        return 1;
    return 0;
}

// 函數whatDay:計算某年某月的1號是星期幾
// 參數:year-年,month-月
// 返回值:1到7--星期1到星期日
int whatDay(int year, int month)
{
    // 1年月日是星期一
    int w = 1;
    int i;

    // 1到year-1都是全年
    for(i = 1; i < year; i++)
    {
        if(leapYear(i))
            w += 366;
        else
            w += 365;
    }
    switch(month)
    {
    case 12:
        w += 30;
    case 11:
        w += 31;
    case 10:
        w += 30;
    case 9:
        w += 31;
    case 8:
        w += 31;
    case 7:
        w += 30;
    case 6:
        w += 31;
    case 5:
        w += 30;
    case 4:
        w += 31;
    case 3:
        if(leapYear(year))
            w += 29;
        else
            w += 28;
    case 2:
        w += 31;
    case 1:     // 1月不加了
        ;
    }
    w = w % 7;     // 得到-6,其中爲星期天
    // 調整星期天
    if(w == 0)
        w = 7;
    return w;
}

// 請在下面 下麪補充程式碼,實現函數printMonth
/*************** Begin **************/

// 函數days:計算某年某月有多少天
// 參數:year-年,month-月
// 返回值:該年該月的天數
int days(int year, int month)
{
    switch(month)
    {
    case 1:case 3:case 5:case 7: case 8:case 10: case 12:
        return 31;
    case 2: // 考慮閏年
        if(leapYear(year))
            return 29;
        return 28;
    default:
        return 30;
    }
}

void printMonth(int year, int month)
{
    printf("  一  二  三  四  五  六  日\n");     // 輸出頭部資訊
    int w = whatDay(year, month);     // 這個月的1號是星期幾
    int i;
    // 1號前輸出w-1個空位
    for(i = 0; i < w - 1; i++)
        printf("%4c",' ');
    // 輸出每一個日期
    for(i = 1; i <= days(year,month); i++)
    {
        printf("%4d",i);
        // 空位數加日期數是 7 的倍數則輸出換行符
        if((i + w - 1) % 7 == 0)
            printf("\n");
    }
    // 如果最後沒有輸出換行符,則輸出一個
    if((i + w - 1) % 7 != 0)
        printf("\n");
}
/*************** End **************/

int main()
{
    int y, m;     // 年、月
    cin >> y >> m;     // 輸入年月
    printMonth(y,m);     // 輸出該年月的日曆
    return 0;
}

第5關: 拆開了輸出整數

解題程式碼

#include <iostream>
using namespace std;

// 遞回函數splitNum:順序輸出n的各位數位,每個數位佔一行
// 返回值:無
void splitNum(unsigned int n)
{
    // 請在這裏補充程式碼,實現遞回函數splitNum
    /********** Begin *********/
	if(n>9)
        splitNum(n/10);
    cout<<n%10<<endl;
    /********** End **********/
}

int main()
{
    unsigned n;
    cin >> n;     // 輸入正整數n
    splitNum(n);     // 呼叫splitNum函數,順序輸出n的各位數位
    return 0;
}

C&C++陣列實訓 >>>鏈接

第1關: 銷售波動統計

解題程式碼

#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    int n, a[30], i;     // 定義變數及陣列,n-銷售額個數,a-銷售額
    cin >> n;     // 輸入銷售額數量,n <= 30
    // 輸入n個銷售額,分別存入a[0]到a[n-1]
    for(i = 0; i < n; i++)
        cin >> a[i];
    // 請在此新增程式碼,計算並輸出銷售額的波動情況
    /********** Begin *********/
	for(i = 0; i < n - 1; i++)
    {
        if(i == 0)
            cout << a[i + 1] - a[i];
        else
            cout << " " << a[i + 1] - a[i];
    }
    cout << endl;
    /********** End **********/
    return 0;
}

第6關: 朋友圈點贊

解題程式碼

// 請在此新增程式碼,通過統計朋友圈點贊,統計個人愛好功能
/********** Begin *********/
#include <iostream>
using namespace std;
int main()
{
    int i, j, t;
    // 定義標籤表,bq[i]存放標籤i出現的次數,開始都是次
    int bq[1001] = {0};
    int N, K;
    // 輸入點贊文章數
    cin >> N;
    // 逐個處理每篇文章
    for(i = 0; i < N; i++)
    {
        // 輸入文章標籤數
        cin >> K;
        for(j = 0; j < K; j++)
        {
            // 讀入一個標籤
            cin >> t;
            // 加到標籤表中
            bq[t]++;
        }
    }
    // 查詢出現最多的最大標籤
    int maxx = 0, index = -1;
    for(i = 0; i < 1001; i++)
    {
        if(bq[i] >= maxx)
        {
            maxx = bq[i];
            index = i;
        }
    }
    // 輸出標籤及次數
    cout << index << " " << maxx << endl;
    return 0;
}
// 參數:a-100*100的二維陣列,用來儲存n行n列的陣列(<n<100),儲存在其~n-1行和~n-1列,
// m-回圈右移的位數(0<m<n)
// 返回值:無,回圈右移的結果寫入原二維陣列中
void rotateLeft(int a[][100],int n,int m)
{
    int t[100];
    int i, j, k;
    for(i = 0; i < m; i++)
    {
        // 快取第一列
        for(k = 0; k < n;k++)
            t[k] = a[k][0];
        // 左移
        for(j = 0; j < n - 1; j++)//列
            for(k = 0; k < n; k++)//行
                a[k][j] = a[k][j+1];
        // t放回最後一列
        for(k = 0; k < n; k++)
            a[k][n-1] = t[k];
    }
}

/********** End **********/

C++之For回圈性質程式設計實訓 >>>鏈接

第1關: 求1到n間所有整數的和

解題程式碼
請將以下程式碼直接拷貝到右側相應位置:

// 求1到n間所有整數的和
int SumOfNumber(int n)
{
    int sum = 0;
    for(int i = 1;i <= n;i ++)
    {
        sum = sum + i;
    }
    return sum;
}

第2關: 求s=a+aa+aaa+aaaa+aa…a的值

解題程式碼
請將以下程式碼直接拷貝到右側相應位置:

// 求s=a+aa+aaa+aaaa+aa...a的值
int FunCal(int a, int n)
{
    int c,s,sum;
    for (s = 0,c = 1,sum = 0;c <= n;c ++)
    {
        s = 10 * s + a;
        sum = sum + s;
    }
    return sum;
}

第3關: 求1!+2!+3!+⋯+n!的值

解題程式碼
請將以下程式碼直接拷貝到右側相應位置:

// 計算1!+2!+3!+...+n!的值
double FactorialSum(int n)
{
    int sum = 1;
    double result = 1;

    for(int i = 2; i <= n; i++)
    {
        sum *= i;
        result += sum;
    }

    return result;
}

C&C++指針實訓 >>>鏈接

第5關: 子串出現的次數

解題程式碼

// 包含字串函數庫
#include <string.h>
#include <iostream>
using namespace std;

int frequency(char * substr, char * str);

int main()
{
    char sub[128],str[1024];
    cin.getline(sub,128);     // 輸入子串
    cin.getline(str,1024);     // 輸入長串
    int n = frequency(sub,str);     // 呼叫frequency函數,計運算元串在長串中出現的次數
    cout<<n<<endl;     // 輸出次數
    return 0;
}

// 函數frequency:計運算元串在長串中出現的次數
// 參數:substr-指向子串,str-指向長串
// 返回值:出現的次數
int frequency(char * substr, char * str)
{
    // 請在此新增程式碼,實現函數frequency
    /********** Begin *********/
	int n=strlen(substr);
    int t=0;
    char *p=str;
    while(p=strstr(p,substr))
    {
        t++;
        p=p+n;
    }
    return t;
    /********** End **********/
}

第6關: 字串的部分複製

解題程式碼

#include <iostream>
using namespace std;

void strmncpy(char *s, int m, int n, char *t);

int main()
{
    char s[128],t[128];
    int m,n;
    cin>>s;     // 輸入源串
    cin>>m>>n;     // 輸入m和n
    strmncpy(s, m, n, t);     // 字串複製
    cout << t <<endl;     // 輸出複製結果
    return 0;
}

// 函數strmncpy:字串的部分複製,將s指向字串從第m個字元開始的n個字元複製的t中
// 參數:s-指向源字串,t-指向目標字串,m-起始位置,n-字元個數
// 返回值:無
void strmncpy(char *s, int m, int n, char *t)
{
    // 請在此新增程式碼,實現函數strmncpy
    /********** Begin *********/
	int k=0;
    while(s[k]!=0)k++;
    if(k<=m)
    {
        *t='\0';
        return;
    }
    char *p=s+m;
    for(int i=0;i<n;i++)
    {
        *t=*p;
        if(*t=='\0')
            return;
        t++;
        p++;
    }
    *t='\0';
    /********** End **********/
}

C&C++線性表實訓 >>>鏈接

第1關: 順序構建線性表

解題程式碼

#include "linearList.h"

node *insertTail(node *h, node *t)
{
    // 請在此新增程式碼,補全函數insertTail
    /********** Begin *********/
	if(h == NULL)     // 空鏈表單獨處理
    {
        t->next = NULL;     // 鏈表尾指針置爲NULL
        return t;     // 返回第一個結點的地址(即鏈表頭指針)
    }
    // 非空鏈表的情況
    node *p = h;
    // 讓p指向最後一個結點
    while(p->next)
        p = p->next;
    p->next = t;     // 讓最後一個結點的指針域指向結點t
    t->next = NULL;     // 鏈表尾指針置爲NULL
    return h;     // 返回第一個結點的地址(即鏈表頭指針)
    /********** End **********/
}

第2關: 逆序構建線性表

解題程式碼

#include "linearList.h"

node * insertHead(node *h, node *t)
{
    // 請在此新增程式碼,補全函數insertHead
    /********** Begin *********/
    t->next = h;
    return t;
    /********** End **********/
}

第3關: 排序構建線性表

解題程式碼

#include "linearList.h"

node * insertSort(node *h, node *t)
{
    // 請在此新增程式碼,補全函數insertSort
    /********** Begin *********/
	node *p = NULL, *q = h;     // 定位第一個插入點:鏈首
    // 查詢插入點
    while(q && q->data < t->data)
    {     // 兩個指針並行後移
        p = q;
        q = q->next;
    }
    // 插入鏈首
    if(p == NULL)
    {
        t->next = h;
        return t;
    }
    // 插入鏈尾
    if(q == NULL)
    {
        p->next = t;
        t->next = NULL;
    }
    // 插入p、q之間
    t->next = q;
    p->next = t;
    return h;
    /********** End **********/
}

第4關: 查詢元素

解題程式碼

#include "linearList.h"

node * search(node * h, int num)
{
    // 請在此新增程式碼,補全函數search
    /********** Begin *********/
    while(h)
    {    // h爲真,即 h 指向的結點存在
        if(h->data == num)
            return h;
        h = h->next;     // 將該結點的指針域賦值給 h,h 就指向了下一個結點
    }
    return NULL;     // 沒找到包含 num 的結點
    /********** End **********/
}

第5關: 刪除指定位置的結點

解題程式碼

#include "linearList.h"

node * delAt(node * h, int i)
{
    // 請在此新增程式碼,補全函數delAt
    /********** Begin *********/
    // 序號非法,不刪除
    if(i<0)
        return h;
    node *p = NULL, *q = h;     // 定位刪除結點,試圖讓 q 指向要刪除結點,p 指向其前面的結點
    for(int k = 0; k < i; k++)
    {
        if(q->next == NULL)     // 後面沒有結點了,序號非法
            return h;
        p = q;
        q = q->next;
    }
    if(p){     // p 指向的結點存在,不是刪除首結點
        // 刪除 q 指向的結點,讓 p 指向結點的指針域指向 q 的後續結點
        p->next = q->next;
        // 釋放空間
        delete q;
        return h;
    }else     // 刪除首結點
    {
        h = q->next;     // 下一個結點成了首結點
        // 釋放空間
        delete q;
        return h;
    }
    /********** End **********/
}

第6關: 刪除包含特定數據的結點

解題程式碼

#include "linearList.h"

node * delHas(node * h, int n)
{
    // 請在此新增程式碼,補全函數delHas
    /********** Begin *********/
	node *p = NULL, *q = h;     // p 爲要刪除結點的前結點,q 指向要刪除結點
    while(q)
    {    // h 爲真,即 h 指向的結點存在
        if(q->data == n)
            break;     // 找到了
        if(q->next == NULL)     // 後面沒有結點了,沒有結點滿足條件
            return h;     // 不刪除,直接返回
        // 繼續往後找,兩個指針一起後移
        p = q;
        q = q->next;
    }
    // 刪除 q 指向的結點
    if(p == NULL)     // 刪除頭結點
    {
        h = q->next;     // 下一個結點變成頭結點
        delete q;     // 刪除結點
        return h;
    }
    // 不是頭結點
    p->next = q->next;     // 把 q 指向結點的指針域( q 後面結點的地址)賦值給 p 指向結點的指針域
    return h;
    /********** End **********/
}

第7關: 線性表長度

解題程式碼

#include "linearList.h"

int listLength(node * h)
{
    // 請在此新增程式碼,補全函數listLength
    /********** Begin *********/
	int n = 0;
    while(h)
    {
        n++;
        h = h->next;
    }
    return n;
    /********** End **********/
}

第8關: 線性表應用一:棧

解題程式碼

#include "mstack.h"

// 函數empty:判斷棧sk是否爲空
// 參數:sk-棧
// 返回值:true-sk爲空,false-sk不爲空
bool empty(intStack sk)
{
    // 請在此新增程式碼,補全函數empty
    /********** Begin *********/
	return (listLength(sk) == 0);     // 鏈表長度爲 0,則棧爲空
    /********** End **********/
}

// 函數pop:彈棧
// 參數:sk-棧,傳參照,彈棧可能會改變sk的值
// 返回值:彈棧的彈出的整數,如果棧空,返回-1
int pop(intStack &sk)
{
    // 請在此新增程式碼,補全函數pop
    /********** Begin *********/
	if(empty(sk))     // 棧空,返回-1
        return -1;
    int n = sk->data;     // 獲取棧頂結點(鏈首結點)的數據
    sk = delAt(sk,0);     // 刪除首結點(彈棧,第一個結點出棧)
    return n;     // 返回彈棧數據
    /********** End **********/
}

// 函數push:壓棧,將整數n壓入棧sk中
// 參數:sk-棧,傳參照,壓棧會改變sk的值,n-要壓棧的整數
// 返回值:無,採用鏈表實現棧,只要還有記憶體,壓棧都會成功
void push(intStack &sk, int n)
{
    // 請在此新增程式碼,補全函數push
    /********** Begin *********/
    node *p = new node;     // 建立要壓棧的結點
    p->data = n;
    sk = insertHead(sk,p);     // 壓棧(插入鏈首)
    /********** End **********/
}

第9關: 線性表應用二:佇列

解題程式碼

#include "mqueue.h"

// 函數queueEmpty:判斷佇列iq是否爲空
// 參數:iq-整數佇列
// 返回值:true-佇列iq爲空,false-iq不爲空
bool queueEmpty(intQueue iq)
{
    // 請在此新增程式碼,補全函數queueEmpty
    /********** Begin *********/ 
	return (iq==NULL);     // iq 爲 NULL,則佇列爲空
    /********** End **********/
}

// 函數enQueue:將整數num入列到iq
// 參數:iq-整數佇列,傳參照,入列有可能改變佇列頭指針,num-入列的整數
// 返回值:無,只要還有記憶體,入列總會成功
void enQueue(intQueue &iq, int num)
{
    // 請在此新增程式碼,補全函數enQueue
    /********** Begin *********/
    node *t=new node;     // 準備結點
    t->data=num;
    t->next=NULL;
    iq = insertTail(iq,t);     // 結點插入到尾部
    /********** End **********/
}

// 函數deQueue:出列
// 參數:iq-整數佇列,傳參照,出列有可能改變佇列頭指針
// 返回值:出列結點的數據,如果佇列爲空,返回-1
int deQueue(intQueue &iq)
{
    // 請在此新增程式碼,補全函數deQueue
    /********** Begin *********/
	if(queueEmpty(iq))
        return -1;
    int n = iq->data;     // 獲取佇列頭結點的數據
    iq = delAt(iq,0);     // 刪除佇列頭結點(出列)
    return n;     // 返回出列數據
    /********** End **********/
}

第10關: 線性表應用三:集合

解題程式碼

#include "mset.h"

// 函數unionSet:求集合a和b的並集
// 參數:a-集合,b-集合
// 返回值:集合(集合a和b的並集)
intSet unionSet(intSet a, intSet b)
{
    // 請在此新增程式碼,補全函數unionSet
    /********** Begin *********/
    intSet c=NULL;     // 準備空集合
    // 把 a 中每一個元素加入 c 中
    node *p=a;
    while(p)
    {
        addElement(c,p->data);
        p=p->next;
    }
    // 把 b 中每一個元素加入 c 中
    p=b;
    while(p)
    {
        addElement(c,p->data);
        p=p->next;
    }
    return c;
    /********** End **********/
}

// 函數intersection:求集合a和b的交集
// 參數:a-集合,b-集合
// 返回值:集合(集合a和b的交集)
intSet intersection(intSet a, intSet b)
{
    // 請在此新增程式碼,補全函數intersection
    /********** Begin *********/
    intSet c=NULL;     // 準備空集合
    // 檢視 a 中每一個元素
    node *p=a;
    while(p)
    {
        if(search(b,p->data))
        {    // 也在 b 中,則選入集合 c
            addElement(c,p->data);
        }
        p=p->next;
    }
    return c;
    /********** End **********/
}

// 函數addElement:在集合is中增加元素num
// 參數:is-集合,num-要增加的元素
// 返回值:無
void addElement(intSet &is, int num)
{
    // 請在此新增程式碼,補全函數addElement
    /********** Begin *********/
	// 首先確認 num 是否在 is 中
    node *p=search(is,num);
    if(p!=NULL)
        return;
    p=new node;      // 準備結點
    p->data = num;
    p->next = NULL;
    is = insertHead(is,p);
    /********** End **********/
}

C&C++檔案實訓 >>>鏈接

第1關: 使用FILE結構操作文字檔案

解題程式碼

#include <stdio.h>

// 函數extractDigit的功能:從檔案a.txt中提取數值寫入檔案b.txt中
void extractDigit();

// 請在此新增程式碼,實現extractDigit函數
/********** Begin *********/

char readADigit(FILE *fi)
{
    char c = fgetc(fi);  // 從檔案讀取一個字元
    if(c==EOF)  // 是結束符則返回
        return EOF;
    while(c>'9' || c<'0')  // 如果不是數位字元,則繼續讀取下一個字元
    {
        c = fgetc(fi);  // 讀取下一個字元
        if(c==EOF)  // 是結束符則返回
            return EOF;
    }
    return c;  // 返回讀取的數位字元
}

// 函數extractDigit的功能:從檔案a.txt中提取數值寫入檔案b.txt中
void extractDigit()
{
    FILE *fi = fopen("a.txt","r");  // 以讀的方式開啓檔案a.txt
    FILE *fo = fopen("b.txt","w");  // 以寫的方式開啓檔案b.txt
    if(fi==NULL || fo==NULL)  // 如果某個檔案開啓失敗,則返回
        return;
    char c;
    int num=0,k=0;
    c = readADigit(fi);  // 讀取一個數字字元
    while(c!=EOF)
    {
        num=num*10+c-'0';  // 計算數位字元構成的整數
        k++;
        if(k==3)  // 已經三位了
        {
            fprintf(fo,"%d ",num);  // 將計算的整數寫入檔案指針fo指向的檔案
            k=0;  // 重新計數
            num=0;  // 重新計算
    }
        c = readADigit(fi);  // 讀取下一個數位字元
    }
    if(k!=0)  // 如果有不到三位的數值,則寫入檔案b.txt
    {
        fprintf(fo,"%d ",num);
    }
    fclose(fi);  // 關閉檔案fi
    fclose(fo);  // 關閉檔案fo
}
/********** End **********/

第2關: 使用FILE結構操作二進制檔案

解題程式碼

int readClothing(FILE *fp, clothing cloth[])
{
    // 請在此新增程式碼,補全函數readClothing
    /********** Begin *********/
    int n;
    // 讀一個整數(服裝資訊數)
    fread(&n,sizeof(n),1,fp);

    // 讀出n種服裝資訊到cloth中
    fread(cloth,sizeof(clothing),n,fp);
    return n;

    /********** End **********/
}

第3關: 使用檔案流操作文字檔案

解題程式碼

#include <iostream>
#include <fstream>
using namespace std;

//函數count:統計檔案fin中每種服裝的銷售總額,並寫入檔案fout中
//參數fin:檔案每種服裝的銷售情況,fout:每種服裝銷售總額的寫入檔案
//返回值:無
//說明:檔案fin中,每種服裝資訊佔一行,分別爲服裝編號,銷售件數,每件的銷售價格(整型)。
//檔案fout:每種服裝統計資訊佔一行,分別爲服裝編號,銷售總額(整型),中間用一個空格隔開。

void count(ifstream & fin, ofstream & fout)
{
    // 請在此新增程式碼,補全函數count
    /********** Begin *********/
    char s[100];
    fin>>s;
    while(!fin.eof())
    {
        int i,n,c=0,t;
        fin>>n;
        for(i=0;i<n;i++)
        {
            fin>>t;
            c+=t;
        }
        fout<<s<<" "<<c<<endl;
        fin>>s;
    }

    /********** End **********/
}

第4關: 使用檔案流操作二進制檔案

解題程式碼

int getNumber(ifstream &ifile, char *label)
{
    // 請在此新增程式碼,補全函數getNumber
    /********** Begin *********/
    clothing  t;
    // 讀出種服裝資訊到t中
    ifile.read((char*)&t,sizeof(clothing));
    while(!ifile.eof())
    {
        if(strcmp(label, t.label)==0)
            return t.numberRemaining;
        ifile.read((char*)&t,sizeof(clothing));
    }
    return 0;
    /********** End **********/
}

C函數 >>>鏈接

第1關: 素數判斷

解題程式碼

//包含標準輸入輸出函數
#include<stdio.h>
//基本框架如下,請在此新增‘素數判斷’的程式碼
/********** 修改以下程式碼 **********/
int main(){
    int isPrime(int a);
    int a;
    scanf("%d",&a);
    if(isPrime(a))
        printf("%d是一個素數",a);
    else
        printf("%d不是一個素數",a);
    return 0; 
} 
int isPrime(int a) {
    int t=0;
    if(a<=1)
        return 0;
    for(int b=2;b<a;b++){
        if(a%b==0){
            t=1;
            break;
        }
    }
    if(t==0)
        return 1;
    else
        return 0;
} 

C陣列 >>>鏈接

第1關: C陣列-歌手評分系統

解題程式碼

#include <stdio.h>
// 定義main函數
int main()
{
    // 請在此新增程式碼
    /********** Begin *********/
    int i;
    double a[7],max=0,min=100,sum=0,num=0;
    for(i=0;i<7;i++){
        scanf("%lf",&a[i]);
        if(max<a[i]) max = a[i];
        if(min>a[i]) min = a[i];
    }
    for(i=0;i<7;i++){
        if(a[i]==max||a[i]==min){
            if(num<2){
                num++;
            	continue;
            }
        }
        sum+=a[i];
    }
    printf("score=%.2f",sum/5);
    /********** End **********/
    return 0;
}

第2關: C陣列-插入元素

解題程式碼

#include <stdio.h>
// 定義main函數
int main()
{
    // 請在此新增程式碼
    /********** Begin *********/
    int a[11] = {1,4,6,9,11,25,31,46,83,100},n,i,temp;
    scanf("%d",&n);
    for(i=0;i<10;i++){
        if(n<a[i]&&i==0){
            printf("%d ",n);
        }
        printf("%d ",a[i]);
        if(n>a[i]&&n<a[i+1]){
            printf("%d ",n);
        }
    }
    if(n>a[i-1]&&i==10){
        printf("%d ",n);
    }
    /********** End **********/
    return 0;
}

第3關: C陣列-字元陣列

解題程式碼

#include <stdio.h>
#include<string.h>
// 定義main函數
int main()
{
    // 請在此新增程式碼
    /********** Begin *********/
    char a[100];
    int zm=0,sz=0,kg=0,qt=0,i;
    gets(a);
    for(i=0;i<strlen(a);i++){
        if('A'<=a[i]&&a[i]<='Z' || 'a'<=a[i]&&a[i]<='z' ){
            zm++;
        }else if('0'<=a[i]&&a[i]<='9'){
            sz++;
        }else if(a[i] == ' '){
            kg++;
        }else{
            qt++;
        }
    }
    printf("數位:%d\n",sz);
    printf("空格:%d\n",kg);
    printf("字母:%d\n",zm);
    printf("其他字元:%d",qt);
    /********** End **********/
    return 0;
}

第4關: C陣列-字元陣列函數

解題程式碼

#include <stdio.h>
#include<string.h>
// 定義main函數
int main()
{
    // 請在此新增程式碼
    /********** Begin *********/
    char a[100],b[100];
    scanf("%s%s",a,b);
    if(strcmp(a,b)==0){
        printf("%s",a);
    }else if(strlen(a)<strlen(b)){
        printf("%s",strcat(b,a));
    }else{
        printf("%s",strcat(a,b));
    }
    /********** End **********/
    return 0;
}

第5關: C陣列-字元陣列應用

解題程式碼

#include <stdio.h>
#include<string.h>
// 定義main函數
int main()
{
    // 請在此新增程式碼
    /********** Begin *********/
    char a[100],b;
    int i;
    gets(a);
    scanf("%c",&b);
    for(i=0;i<strlen(a);i++){
        if(a[i]!=b){
            printf("%c",a[i]);
        }
    }
    /********** End **********/
    return 0;
}

C語言基本語法入門練習題 >>>鏈接

第1關: 求絕對值

解題程式碼

#include<stdio.h>
#include<math.h>
int main()
{
	// 請在此新增你的程式碼
    /********** Begin *********/
	int a;
	scanf("%d",&a);
	a=fabs(a);
	printf("%d",a);
	return 0;
	/********** End **********/
}

第2關: 求m以內的奇數之和

解題程式碼

#include<stdio.h>
int main(){
	// 請在此新增你的程式碼
    /********** Begin *********/
	int a=1;
	int n,sum=0;
	scanf("%d",&n);
	while(a<=n){
		sum=sum+a;
			a=a+2;
	}
	printf("%d",sum);
	return 0;
	/********** End **********/
}

第3關: 排除此數還是輸出此數

解題程式碼

#include<stdio.h>
int main(){
 	// 請在此新增你的程式碼
    /********** Begin *********/
    int n;
    scanf("%d", &n);
    if( (n % 3) == 0 || (n/100 % 10) == 3){
        printf("%d\n", n);
    }else{
        printf("排除此數\n");
    }
    return 0;
	/********** End **********/

}


C語言基本語法進階練習題 >>>鏈接

第1關: 溫度轉換

解題程式碼

#include <stdio.h>
int main()
{
 	// 請在此新增你的程式碼
    /********** Begin *********/
    float a,b;
    scanf("%f",&a);
    b=5*1.0/9*(a-32);
    printf("攝氏溫度爲:%.2f",b);
	/********** End **********/
}

C語言之條件語句練習題 >>>鏈接

第1關: 判斷平方和是否大於100

解題程式碼

#include<stdio.h>
int main()
{
	/*********begin*********/
	int a,b,c,d,e,f,g;
	scanf("%d%d",&a,&b);
	c=a*a+b*b;
	d=a+b;
	e=c/100;
	f=c/100-e*10;
	g=e*10+f;
	 
	 if(c>100)
	 printf("%d",g);
	 else
	 printf("%d",d);
	 /*********end*********/
}

第2關: 判斷學生成績等級

解題程式碼

#include<stdio.h>
int main()
{
	/*********begin*********/
	int x,y;
	scanf("%d",&x);
	if(x>=85)
	printf("成績是%d,相應的等級是A\n",x);
	else
	if(x>=70&&x<=84)
	printf("成績是%d,相應的等級是B\n",x);
	else
	if(x>=60&&x<=69)
	printf("成績是%d,相應的等級是C\n",x);
    else
   	printf("成績是%d,相應的等級是D\n",x);
	/*********end*********/
}

第3關: 區間內求和

解題程式碼

#include<stdio.h>
int main()
{
	/*********begin*********/
	int a,b;
	int sum=0;
	scanf("%d,%d",&a,&b);
    for (a;a<=b;a++)
	{
     if(a%11==0||a%7==0)
	 sum=a+sum;
	 }
	 printf("%d",sum);
	 /*********end*********/
}

第4關: 判斷是否爲閏年

解題程式碼

#include <stdio.h>
void main()
{
/*********begin*********/
int runnian(int y)
{
if((y%4==0 && y%100!=0) || y%400==0)
return 1;
return 0;
}
int year;
scanf("%d",&year);
if(runnian(year))
printf("%d年是閏年。",year);
else 
printf("%d年不是閏年。",year);
/*********end*********/
}

第5關: 判斷數位是否相同

解題程式碼

#include <stdio.h>
int main()
{
	/*********begin*********/
    int a,b,c,d;
    scanf("%3d",&a);
    b=a/100;  c=a/10%10;  d=a%10;
    if
	((d==b &&d!=c) ||(d==c&& d!=b) ||(b==c&& d!=c)  )
    printf("1");
    else
    printf("0");
	/*********end**********/
}

第6關: 判斷日期是一年中的第幾天

解題程式碼

#include<stdio.h>

int main()
{
	/*********begin*********/
    int year,month,day,sum=0 ;
    scanf("%d-%d-%d", &year, &month, &day);
    switch(month)
    {
       case 12:sum=30+sum;
       case 11:sum=31+sum;
       case 10:sum=30+sum;
       case 9:sum=31+sum;
       case 8:sum=31+sum;
       case 7:sum=30+sum;
       case 6:sum=31+sum;
       case 5:sum=30+sum;
       case 4:sum=31+sum;
       case 3:sum=28+sum;
       case 2:sum=31+sum;
       case 1:;
    }
    sum=sum+day;
    
	if (((year % 400 == 0) || (year % 100 != 0 && year % 4 == 0))&& (month>2) )
    	sum=sum+1;
    
    printf("%d",sum);
/*********end*********/
	return 0;
}

C++之基礎語法入門練習題 >>>鏈接

第1關: 銀行存款計算

解題程式碼

#include <stdio.h>
#include <iostream>
using namespace std;
int main ()
{
     // 請在此新增你的程式碼
    /********** Begin ********/
	 double a = 100000 ;
	int n,i;
	scanf ("%d",&n);
	for (i = 1;i<=n;i++)
		a = a*(1+0.0375);
	printf ("%.2f",a);
  return 0;
    /********** End **********/
}

第3關: 水分子總數

解題程式碼

#include <iostream>
using namespace std;
int main()
{
     // 請在此新增你的程式碼
    /********** Begin ********/
    double moleculeWeight = 3e-23;
    double quartWeight = 950;
    double n;
    cin >> n;
    double total = n * quartWeight / moleculeWeight; 
    cout << total ;
    return 0;
    /********** End **********/
}

第4關: 取整近似數

解題程式碼

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
 	// 請在此新增你的程式碼
    /********** Begin ********/
	int places;
    double a;
    cin >> a;
    for(places=3;places<=7;places++)
    cout<<setprecision(places)<<a<<endl;
    return 0;
	/********** End **********/
}

全國綠色計算大賽 模擬賽第一階段(C++) >>>鏈接

第1關: 求和

解題程式碼

int getSum(int num1, int num2)
{
	/********** BEGIN **********/
	int sum = 0;
    for(int i = num1; i <= num2; i++)
    {
        int tmp = i;
        while(tmp >= 10)
        {
            sum += (tmp % 10);
            tmp /= 10;
        }
        
        sum += tmp;
    }
    
    return sum;
	
	/********** END **********/
}

第2關: 檔案檢視器

解題程式碼

int level = 0; //記錄資料夾層數

/***************************
 * func: 遍歷資料夾
 * return: void
 * @para folderPath: 資料夾路徑
***************************/
void showDirStructure(char *folderPath)
{
	/********** BEGIN **********/
    level++;   
    DIR *fd = opendir(folderPath);
    if(fd == NULL)
    {
        cout << "open folder failure!" << endl;
        return ;
    }
    
    //只列印目錄名
    int index = 0;
    for(int i = 0; i < strlen(folderPath); i++)
    {
        if(folderPath[i] == '/')
            index = i+1;
    }
    for(int i = 1; i < level; i++)
        cout << "  ";
    cout << "+--" << &folderPath[index] << endl;
    
    struct dirent *dir;
    struct stat statbuf;
    while((dir = readdir(fd)) != NULL)
    {
        if(strcmp(dir->d_name, ".") == 0 || strcmp(dir->d_name, "..") == 0)
            continue;
        
        char tmp_name[1024];
        sprintf(tmp_name, "%s/%s", folderPath, dir->d_name);
        stat(tmp_name, &statbuf);
        
        //判斷是目錄則遞回呼叫開啓函數
        if(S_ISDIR(statbuf.st_mode))
            showDirStructure(tmp_name);
        else if(S_ISREG(statbuf.st_mode))
        {
            for(int i = 0; i < level; i++)
                cout << "  ";
            cout << "--" << dir->d_name << endl;
        }
    }
    
    level--;
    closedir(fd);
	
	/********** END **********/
}

第3關: 圖片檢視器

解題程式碼

int level = 0; //記錄資料夾層數

/***************************
 * func: 遍歷資料夾
 * return: void
 * @para folderPath: 資料夾路徑
***************************/
void showDirStructure(char *folderPath)
{
	/********** BEGIN **********/
    level++;   
    DIR *fd = opendir(folderPath);
    if(fd == NULL)
    {
        cout << "open folder failure!" << endl;
        return ;
    }
    
    //只列印目錄名
    int index = 0;
    for(int i = 0; i < strlen(folderPath); i++)
    {
        if(folderPath[i] == '/')
            index = i+1;
    }
    for(int i = 1; i < level; i++)
        cout << "  ";
    cout << "+--" << &folderPath[index] << endl;
    
    struct dirent *dir;
    struct stat statbuf;
    while((dir = readdir(fd)) != NULL)
    {
        if(strcmp(dir->d_name, ".") == 0 || strcmp(dir->d_name, "..") == 0)
            continue;
        
        char tmp_name[1024];
        sprintf(tmp_name, "%s/%s", folderPath, dir->d_name);
        stat(tmp_name, &statbuf);
        
        //判斷是目錄則遞回呼叫開啓函數
        if(S_ISDIR(statbuf.st_mode))
            showDirStructure(tmp_name);
        else if(S_ISREG(statbuf.st_mode))
        {
            //判斷是否爲圖片格式檔案
            int length = strlen(dir->d_name);
            if(length > 4)
            {
                char *type = &dir->d_name[length-4];
                if(strcmp(type, ".bmp") == 0 || strcmp(type, ".png") == 0 || strcmp(type, ".jpg") == 0)
                {
                    for(int i = 0; i < level; i++)
                        cout << "  ";
                    cout << "--" << dir->d_name << endl;
                }
            }
        }
    }
    
    level--;
    closedir(fd);
	
	/********** END **********/
}

C語言程式設計編輯與偵錯環境 >>>鏈接

第1關: 列印輸出 Hello World

解題程式碼

#include<stdio.h>
	int main(void)
	{  
	/********* Begin *********/
		printf("Hello World");
	/********* End *********/
        return 0;
	}


第2關: 列印輸出圖形

解題程式碼

#include<stdio.h>
	int main(void)
	{  	
	/********* Begin *********/
	   printf("    *\n");
       printf("   ***\n");
       printf("  OK\n");
       printf(" Hello!\n");
       printf("*********");
	
	/********* End *********/
       return 0;
	}


第3關: 求3個數的最大值

解題程式碼

#include<stdio.h>
	int main(void)
	{  
	/********* Begin *********/
	   int a,b,c,max;      
       scanf("%d,%d,%d",&a,&b,&c);
       max=a;
       if(max<b)
         max=b;
       if(max<c)
         max=c;
       printf("max=%d",max);
	
	/********* End *********/
       return 0;
	}

第4關: 熟悉C語言偵錯過程

解題程式碼

#include"stdio.h"
int main(void)
  {
	/********* Begin *********/
    int  x;
    int y=2,z=3;
    scanf("%d",&x); 
    if(x==y+z)
       printf("*****");
    else  
      printf("#####" );
    
	/********* End *********/
	return 0;
  }

C練習三 >>>鏈接

第1關: 水仙花數

解題程式碼

1). num<=999 或 num<1000 或 num <= 999 或 num < 1000
2). num/10%10; 或 (num-bai100)/10; 或 ( num - bai * 100 ) / 10 ; 或 num / 10 % 10 ;
3). num==bai
baibai+shishishi+gege*ge 或 num == bai * bai * bai + shi * shi * shi + ge * ge * ge

第2關: 第2關 數陣

解題程式碼
1). i<=5 或 i<6
解題思路2
2). k<=10-i 或 k<11-i 或 k<=5-i 或 k<6-i
解題思路3
3). j<=2i-1 或 j<=2i

C++使用者自定義數據型別——結構體 >>>鏈接

第1關: 尋找第一名

解題思路1

#include<iostream>
#include<string>
using namespace std;
struct Stu
{
   int num;
   string name;
   float computer;
   float english;
};

int main()
{
    Stu stu[5];
    int i,k_com,j_eng;
    float ave_com=0,ave_eng=0,max_com=0,max_eng=0;
    for(i=0;i<5;i++)
    {
        cin>>stu[i].num>>stu[i].name>>stu[i].computer>>stu[i].english;
        ave_com+=stu[i].computer;
        ave_eng+=stu[i].english;
        if(stu[i].computer>max_com)
        {
            max_com=stu[i].computer;
	        k_com=i;
        }
        if(stu[i].english>max_eng)
        {
            max_eng=stu[i].english;
	        j_eng=i;
        }

    }
    ave_com/=5;
    ave_eng/=5;
    cout<<"計算機成績最高分是:"<<stu[k_com].name<<"    "\
        <<"分數是:"<<stu[k_com].computer<<"分"<<endl;
    cout<<"全班計算機成績平均成績是:"<<ave_com<<"分"<<endl;
    cout<<"英語成績最高分是:"<<stu[j_eng].name<<"    "\
        <<"分數是:"<<stu[j_eng].english<<"分"<<endl;
    cout<<"全班英語成績平均成績是:"<<ave_eng<<"分"<<endl;
    return 0;
}

第2關: 成績排序

解題思路1
冒泡法排序程式碼爲:

#include <iostream>
using namespace std;
struct Stu
{
   int num;
   string name;
   float computer;
};

int main()
{
    Stu student[6],temp;
    int i,j;
    for(i=0;i<6;i++)
        cin>>student[i].num>>student[i].name>>student[i].computer;
    for(j=1;j<6;j++)
        for(i=0;i<6-j;i++)
            if(student[i].computer<student[i+1].computer)
            {
                temp=student[i];
                student[i]=student[i+1];
                student[i+1]=temp;
            }
    cout<<"按計算機成績由高到低爲:"<<endl;
    for(i=0;i<6;i++)
        cout<<student[i].name<<"   "<<student[i].computer<<endl;
    return 0;
}

第3關: 結構體指針

解題思路1

#include <iostream>
#include <string>
using namespace std;
struct student
{
    int num;
    string name;
    float score[3];
};
void print(student *q);

int main( )
{
      struct student stu[5],*pt=stu;
      int i,j;
      for(i=0;i<5;i++)
      {
          cin>>stu[i].num>>stu[i].name;
          for(j=0;j<3;j++)
              cin>>stu[i].score[j];
      }
      cout<<"5名學生成績如下:"<<endl;
      print(pt);
      return 0;
}

void print(student *q)
{
    for(int i=0;i<5;i++,q++)
        cout<<q->num<<"   "<<q->name<<"   "\
            <<q->score[0]<<"   "<<q->score[1]<<"   "\
            <<q->score[2]<<endl;
}

第4關: 選票統計小程式

解題思路1

#include<iostream>
#include<string>
using namespace std;
struct  Person
{
    string name;
    int  count;
};

int main()
{
    Person leader[3]={"li",0, "zhang",0, "sun",0};
    int i,j;
    string leader_name;
    for(i=0;i<10;i++)
    {
        cin>>leader_name;
        for(j=0;j<3;j++)
            if(leader_name==leader[j].name)
                leader[j].count++;
    }
    cout<<"三位候選人票數如下:"<<endl;
    for(i=0;i<3;i++)
        cout<<leader[i].name<<"  票數是: "<<leader[i].count<<endl;
    return 0;
}