第七章實驗報告(數組實驗)

C語言程序設計實驗報告

實驗項目:

一、一維數組的應用數組

二、二維數組的應用函數

三、字符數組應用spa

姓名:徐溢璠     實驗地點: 514實驗室       實驗時間:2019年5月29日

1、實驗目的與要求

一、一維數組的應用

  • 定義一個一維整型數組,其大小爲10,即它能存放10個數據;設計

  • 使用循環語句,利用隨機函數產生10個整數存放在數組中;3d

  • 編寫排序函數sort1();code

  • 使用循環語句,將排好序的10個數依次輸出。blog

二、二維數組的應用

  • 怎樣定義和使用二維數組;排序

  • 怎樣用循環進行二維數組中值的計算;字符串

  • 使用循環依次輸出二維數組中的元素;input

  • 用if語句根據條件判斷某個字符是不是大寫字母。

三、字符數組應用

  • 用scanf()函數,從鍵盤輸入一個字符串存入字符數組中;

  • 求出該字符串的長度;

  • 用for循環依次比較,循環的終值爲長度的一半;

  • 設置一個標誌符ch,初值爲'Y',若某字符對不相等,將其設置爲‘N';

  • 根據ch是’Y'仍是'N',輸出該字符串是不是迴文數。

2、實驗內容

7.3.1  一維數組的應用

實驗練習 1 

一、簡單問題描述

寫一個函數,對用隨機函數產生的10個整數按從小到大的順序排序(升序,冒泡排序實現)。程序流程圖以下所示:

二、實驗代碼

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void sort1(int s[],int n)
{
    int i,j;
    int temp;
    for(i=0 ;i<n-1;i++)
    {
        for(j=9;j>=i+1;j--)
        {
            if(s[j]<s[j-1])
                {
                    temp=s[j];
                    s[j]=s[j-1];
                    s[j-1]=temp;
                }
        }
    }        
}
main()
{
    int i,a[10];
    srand(time(NULL));
    printf("隨機產生10個整數:\n");
    for(i=0;i<10;i++)
        a[i]=rand()%100;
    for(i=0;i<10;i++)
        {
        printf("%d ",a[i]);
        }
        printf("\n");
        sort1(a ,10);
        printf("排序後的結果:\n");
    for(i=0;i<10;i++)
        {
        printf("%d ",a[i]);
        }
}

三、問題分析

問題:該開始我並不知道怎樣給出隨機種子以及調用排序函數,致使程序報錯。

解決辦法:經過百度,將srand()改成srand(time(NULL)),將sort1改成sort1(a,10)。srand(time(NULL))是以當前時間爲種子,產生隨意數。其中,time(NULL)用來獲取當前時間,本質上獲得的是一個大整數,而後用這個數來出隨機數。

問題:第一次輸出的隨機數很大。

解決辦法:a[i]=rand()%100

實驗練習 2 

一、簡單問題描述

寫一個函數,對用隨機函數產生的10個整數按從小到大的順序排序(升序,選擇排序實現)。程序流程圖以下所示:

二、實驗代碼

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void sort2(int s[],int n)
{
int i,j,temp;
    for(i=0;i<n-1;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(s[i]>s[j])
            {
                temp=s[i];
                s[i]=s[j];
                s[j]=temp;
            }
        }
    }
}
main()
{
    int i,a[10];
    srand(time(NULL));
    printf("隨機產生10個整數:\n");
    for(i=0;i<10;i++)
        a[i]=rand()%100;
    for(i=0;i<10;i++)
        {
        printf("%d ",a[i]);
        }
        printf("\n");
        sort2(a ,10);
        printf("排序後的結果:\n");
    for(i=0;i<10;i++)
        {
        printf("%d ",a[i]);
        }
}

三、問題分析

問題:和上一個實驗差很少,並無什麼問題。

7.3.2  二維數組的應用

實驗練習 1

一、簡單問題描述

編寫程序,從鍵盤輸入行數,輸出指定行數的楊輝三角形。程序流程圖以下所示:

二、實驗代碼

#include<stdio.h>
main()
 {
    int i,j,n,a[50][50];
    printf("請輸入須要打印的行數:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        a[i][i]=1;
        a[i][0]=1;
    }
    for(i=2;i<n;i++)
    {
        for(j=1;j<=i-1;j++)
        {
            a[i][j]=a[i-1][j-1]+a[i-1][j];
        }
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<=i;j++)
        {
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    return 0;
 }

三、問題分析

問題:首先獲得的是這樣的結果:

解決問題:楊輝三角剛開始的兩行是特殊的,必須分開討論。

實驗練習 2 

一、簡單問題描述

編寫程序,從鍵盤分別輸入年、月、日,計算出該天是這年中的第幾天。程序流程圖以下所示:

二、實驗代碼

#include<stdio.h>
int day_tab[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int day1(int year,int month,int day)
{
    int i,j,s=0;
    if (year % 400 == 0 || (year % 4 ==0 && year % 100 != 0))
{ i=1; } else i=0; for(j=1;j<month;j++) { s=s+day_tab[i][j]; } s=s+day; return s; } main() { int y,m,d; printf("input year_month_day:\n"); scanf("%d,%d,%d",&y,&m,&d); day1(y,m,d); printf("是這一年的第%d天\n",day1(y,m,d)); }

三、問題分析

問題:剛開始我獲得的結果以下:

解決辦法:經過分析,我發現我在代碼上的寫法爲scanf("%d,%d,%d",&y,&m,&d);因此我輸入數字應該加符號。

問題:改正後,我發現仍是不對,結果以下:

解決辦法:在for關於j的循環後加入s=s+day;return s。

7.3.3  字符數組應用

實驗練習 1

一、簡單問題描述

編寫程序,從鍵盤輸入·一個字符,判斷其是否是「迴文數」,程序流程圖以下所示:

二、實驗代碼

#include<stdio.h>
#include<string.h>
#define N 40
main()
{
    char str[N],ch='Y';
    int i;
    int Len;
    printf("input a string:");
    scanf("%s",&str);
    Len=strlen(str);
    printf("\n");
    printf("字符串長度爲%d",Len);
    printf("\n");
    printf("\n");
    for(i=0;i<=Len/2;i++)
    {
        if(str[i]!=str[Len-1-i])
        {
            ch='N';
            break;
        }
    }        
        if(ch=='Y')
            printf("%s是一個迴文數",str);
        else
            printf("該字符串不是迴文數。") ;

}

三、問題分析

根據流程圖並無什麼問題。

3、實驗小結

收穫

一、將數字按大小排序,有冒泡法,二分法,選擇法。

a、冒泡法:將相鄰數字兩兩相比,交換位置,直到排好序。

b、二分法:將數字與中間的數相比,交換位置。

c、選擇法:將數字與任意一個數字相比交換位置。

二、rand()能夠用%來控制生成的隨機數範圍,如rand()%100就是在100之內。

三、C語言和數學有着很像的思考方式,有時要分狀況討論。

四、閏年的判斷方法爲 if (year % 400 == 0 || (year % 4 ==0 && year % 100 != 0))。

五、要注意scanf中的格式與輸入格式對應。

六、字符是以%s輸出。

不足

一、思惟不夠嚴密,如楊輝三角一題,我並無考慮到前面兩行的特殊性。

二、將年月日轉換,我並無第一時間想到分爲閏年和平年。

三、隨機數生成過大,沒有考慮限制範圍。

相關文章
相關標籤/搜索