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 給定某年某月某日,將其轉換成這一年的第幾天並輸出
- 使用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
加-
右補空格。