C語言程序設計實驗報告六


C程序設計實驗報告六

姓   名:賴瑾  
實驗地點:家                      
實驗時間:2020年5月7日                 
實驗項目:7.3.1練習1 冒泡排序法的運用
     7.3.1練習2 選擇排序法的運用
     7.3.2練習1 輸出指定行數的楊輝三角
     7.3.2練習1 輸出指定行數的楊輝三角(等腰)
     7.3.2練習2 輸入年月日計算第幾天
     7.3.3 判斷輸入的數是不是回文數
  
       

一、實驗目的與要求

7.3.1練習1 寫一個函數,對用隨機函數產生的10個整數按從小到大的順序排序(升序,冒泡排序實現)

1.定義一個一維整型數組,其大小為10,即它能存放10個數據;
2.使用循環語句,利用隨機函數產生10個整數存放在數組中;
3.編寫排序函數sort1();
4.使用循環語句,將排好序的10個數依次輸出;
5.將數組定義為全局數組或局部數組;
6.在主函數中,用隨機函數生成10個元素放入數組中;
7.將sort1()函數部分放入主函數中。

7.3.1.練習2 寫一個函數,對用隨機函數產生的10個整數按從小到大的順序排序(升序,用選擇排序實現)

1.定義一個一維整型數組,其大小為10,即它能存放10個數據;
2. 使用循環語句,利用隨機函數產生10個整數存放在數組中;
3.編寫排序函數sort1();
4.使用循環語句,將排好序的10個數依次輸出;
5.將數組定義為全局數組或局部數組;
6.在主函數中,用隨機函數生成10個元素放入數組中;
7.將sort1()函數部分放入主函數中。

7.3.2練習1 輸出指定行數的楊輝三角形

1.怎樣定義和使用二維數組;
2.怎樣用循環進行二維數組中值的計算;
3.使用循環依次輸出二維數組中的元素(注意換行);
4.用if語句根據條件判斷某個字符是否是大寫字母。

7.3.2練習2 給定某年某月某日,將其轉換成這一年的第幾天並輸出

  1. 使用scanf()函數輸入年、月、日;
    2.使用一個二維數組存放閏年和非閏年的每個月的天數;
    3.使用邏輯表達式判斷某年是否是閏年;
    4.使用變量day對前幾個月的天數進行累加;
    5.在強化練習中,學生將練習不使用二維數組存放每個月的天數;
    6.使用if語句對年、月、日的正確性進行驗證;
    7.將存放每個月的天數的二維數組說明為局部數組。

7.3.3 編寫程序,判斷某一字符是不是“回文數”,回文數是從左至右或從從右至左讀起來都是一樣的字符

1.用scanf()函數,從鍵盤輸入一個字符串存入字符數組中
2.求出該字符串的長度
3.用for循環依次比較,循環的終值為長度的一半
4.設置一個標志符ch,初值為‘Y’,若某字符對不相等,將其設置為‘N’
5.根據ch是‘Y’還是‘N’,輸出該字符串是否是回文數
6.強化練習中不使用strlen()求出字符串的長度
7.將求回文數的部分獨立出來,編成一個函數
                

二、實驗內容

(1)7.3.1練習1 冒泡排序法的運用

1、問題的簡單描述:編寫程序,利用隨機函數產生10個隨機數,按升序排列輸出。(冒泡排序)

2、流程圖: 

3、實驗代碼:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void sort1(int s[],int n)
{
    int i,j;
    int temp;
    for(i=9;i>0;i--)
        for(j=0;j<i;j++)          //從下標為0的數開始兩兩比較
   if(s[j]>s[j+1])  
{
    temp=s[j];     
    s[j]=s[j+1];
    s[j+1]=temp;      //交換數,使大的數位於后面 
}
}
main()
{
    int i,a[10];
    srand((unsigned int)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("輸出排序后的10個整數\n");
    for(i=0;i<10;i++)
    printf("%d ",a[i]);
}

4、問題:①不太理解冒泡排序法怎么實現的 ②隨機數的取法忘記了 ③%100以確保取的數在100以內
      
5、分析:①我在紙上寫了一些數字按冒泡排序法排了一下就理解了,就是從第一個數開始兩兩相比,大的放后面,這樣比較后會使全部數中最大的數排在最后 ②在C語言中,rand()函數可以用來產生隨機數,但是這不是真正意義上的隨機數,是一個偽隨機數,利用srand((unsigned int)(time(NULL))是一種方法,因為每一次運行程序的時間是不同的。 ③如果沒有這個%100取到的數會偏大,這個算是一種技巧處理。

6、最終運行效果:

     

(2)7.3.1練習2 選擇排序法的運用

1、問題的簡單描述:寫一個函數,對用隨機函數產生的10個整數按從小到大的順序排序(升序,用選擇排序實現)

2、流程圖:

3、實驗代碼:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
sort2(int s[],int n)
{
    int i,j,k,temp;
    for(i=0;i<n-1;i++)
    {
      k=i;
      for(j=i+1;j<=n-1;j++)  //第i個數與后面n-i個數比較大小 
      {
          if (s[j]<s[k])
          k=j;
      }
      if(k!=i)   //if語句用於交換使最小數位於前方 
      {
          temp=s[k];
          s[k]=s[i];
          s[i]=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]);
}

     
4、問題:這個大體是跟前一個是一樣的,主要問題也是對選擇排序法不清楚
    
5、分析:選擇排序法就是 第一次從下標為0的開始下標為0的這個數與后面的n-1個進行比較,找出最小或者最大的放在下標為0的這個位置,第二次從下標為1的開始比較,查詢剩下的最大或者最小值,放在 下標為1的位置,以此類推,直到結束。

6、最終運行效果: 

       

(3)7.3.2練習1 輸出指定行數的楊輝三角

1、問題的簡單描述:輸出指定行數的楊輝三角形輸出指定行數的楊輝三角形
 
2、流程圖: 

3、實驗代碼:

#include<stdio.h>
main()
{
    int a[50][50],i,j,n;
    printf("請輸入楊輝三角形的行數:") ;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        a[i][i]=1;
        a[i][1]=1;
    } 
    for(i=3;i<=n;i++)  //給數組賦值 
    { 
		for(j=2;j<=i-1;j++)
        a[i][j]=a[i-1][j-1]+a[i-1][j];  //每個數等於上一行同一列與前一列的和 
    }    
    for(i=1;i<=n;i++)  //將數打印出 
    {
        for(j=1;j<=i;j++)
            printf("%-4d",a[i][j]);
            printf("\n");
    }
}

       
4、問題:這個主要是要理解楊輝三角的構成還有就是空格排布
        
5、分析:要先將它外圍的1全部輸入了構成一個框架,然后才能實現這種兩數相加等於下一行的那個數的楊輝三角。如果沒有%-4d這個部分的-4的話數字會排在一起不太好看,然后如果是4的話就是左補空格右對齊,這樣看起來也怪怪的,加上-就是右補空格左對齊了。

6、最終運行效果:  

       

(4)7.3.2練習1 輸出指定行數的楊輝三角(等腰)

1、問題的簡單描述:輸出指定行數的楊輝三角形(等腰三角形)
  
2、實驗代碼:

#include<stdio.h>
main()
{
    int a[50][50],i,j,n;
    printf("請輸入楊輝三角形的行數:") ;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        a[i][i]=1;
        a[i][1]=1;
    } 
    for(i=3;i<=n;i++)  //給數組賦值 
    { 
		for(j=2;j<=i-1;j++)
        a[i][j]=a[i-1][j-1]+a[i-1][j];  //每個數等於上一行同一列與前一列的和 
    }    
    for(i=1;i<=n;i++)  //將數打印出 
    {
    for(j=1;j<=n-i;j++)  //變成等腰三角形的關鍵 
    printf("   ");
        for(j=1;j<=i;j++)
            printf("%-6d",a[i][j]);
            printf("\n");
    }
}

3、問題:這個之前也做過比較多了,但是這次又有點不同,我剛開始按之前那樣做變成了下面這個樣子
    
4、分析:我剛開始就覺得很奇怪怎么會變成這樣呢,代碼沒有什么問題呀,然后發現調整一下空格數量把%-4d改成了%-6d就變成等腰的了。

5、最終運行效果:

(5)7.3.2練習2 輸入年月日計算第幾天

1、問題的簡單描述:編寫程序,從鍵盤分別輸入年,月,日。計算出該天是這年中的第幾天。
2、流程圖:  

3、實驗代碼:

#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 day_year(int y,int m,int d)
{
    int i,j,s=0;
    if((y%4==0&&y%100!=0)||(y%400==0))  //判斷是不是閏年 
    i=1;
    else i=0;
    for(j=1;j<m;j++)
    {
        s=s+day_tab[i][j];   //計算整月的天數 
    }
    s=s+d;
    return s;
}
main()
{
    int y,m,d;
    printf("input year_month_day:\n");
    scanf("%d,%d,%d",&y,&m,&d);
    printf("是這年的第%d天\n",day_year(y,m,d));
}

4、問題分析:這個基本沒有什么問題,就是復習了一下閏年的判斷條件,還有就是運用了二維數組,更了解了二維數組的用處用法。
  
5、最終運行效果:

(6)7.3.3 判斷輸入的數是不是回文數

1、問題的簡單描述:編寫程序,從鍵盤輸入一個字符串,判斷其是否為回文數。
2、流程圖: 

3、實驗代碼:

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

4、問題分析:這個程序這句for(i=0;i<=len/2;i++) 比較關鍵回文數是前一半和后一半一樣,這里如果是奇數用/回舍去小數剛好滿足我們的需求。
    
5、最終運行效果:

    

四、實驗小結

  這次的代碼敲了比較久,主要是因為對冒泡排序法和選擇排序法的理解不夠清晰,光看理論表述感覺自己理解了,但其實還是沒有動手寫了一下過程感覺就理解多了。冒泡排序法就是比較相鄰的兩個數,將小數放在前面,大數放在后面這樣比較下去最大的數就會排在最后面。選擇排序法是第一次從下標為0的開始下標為0的這個數與后面的n-1個進行比較,找出最小或者最大的放在下標為0的這個位置,第二次從下標為1的開始比較,查詢剩下的最大或者最小值,放在 下標為1的位置,以此類推,直到結束。
  然后還要就是之前的一些知識忘記了不少,所以邊敲邊遇到問題又邊回去復習就花了比較多的時間。
在這里記一下這次實驗發現的忘記了的知識加深下記憶:
  ①在C語言中,rand()函數可以用來產生隨機數,但是這不是真正意義上的隨機數,是一個偽隨機數,利用srand((unsigned int)(time(NULL))是一種方法,因為每一次運行程序的時間是不同的。
  ②字段寬度修飾符:%md以寬度m輸出整型數,數據寬度不足m時,左補空格;%0md以寬度m輸出整型數,數據寬度不足m時,左補0;%m.nf以寬度m輸出實型小數,小數位為n;%-md-右補空格。

     回到頂部


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM