第七章 数组实验
C程序?qū)嶒瀳蟾?/h1> 實驗項目:
1、一維數(shù)組的運用
2、二維數(shù)組的應用
3、字符數(shù)組的應用
姓名:郭薪? 實驗地點:教學樓514教室? 實驗時間:2019.5.29
一、實驗目的與要求
1、掌握一維和多維數(shù)組的定義和數(shù)組元素的引用方法。
2、了解一維和多維數(shù)組初始化方法。
3、學習一維和多維數(shù)組的基本算法。
4、掌握數(shù)組的定義、初始化方法及其元素的引用方法。
5、掌握c語言提供的對字符串進行處理的基本函數(shù)庫。
?
?二、實驗內(nèi)容
一維數(shù)組的應用(7.3.1)
實驗練習1:(1)問題的簡單描述:編寫程序,利用隨機函數(shù)產(chǎn)生的10個數(shù),按升序排序輸出。
流程圖:
實驗代碼:
#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("隨機產(chǎn)生10個整數(shù):\n");for(i=0;i<10;i++)a[i]=rand()%100;for(i=0;i<10;i++){printf("%d",a[i]);printf(" ");}printf("\n");sort1(a ,10);printf("排序后的結(jié)果:\n");for(i=0;i<10;i++){printf("%d",a[i]);printf(" ");} }?
運行結(jié)果;
問題分析:首先排序函數(shù)確實已經(jīng)在學習過程中見得比較多了,i控制比較的次數(shù),j控制第幾個數(shù)組,每一次分別和出自己以外其他數(shù)組比較,內(nèi)外循環(huán)。
? ? 然后是主函數(shù)里面,它涉及到“srand()”函數(shù)的應用,首先聲明,然后再用“rand()”隨機選出數(shù)列,這是大家在編譯中普遍碰到的問題。不過我看到一些很好的輸出格式,就是 ? ? 在每一個printf()后面加一個“ ”空格輸出,這樣會顯得運行結(jié)果比較工整。注意的是,最后運行結(jié)果依然是以for循環(huán)從第一個依次輸出。?
2.(7.3.1.2)
1.問題描述:
編寫函數(shù),利用隨機函數(shù)產(chǎn)生10個隨機數(shù),按升序排列輸出.(選擇排序)
2.流程圖:
實驗代碼:
#include <stdio.h> #include <stdlib.h> #include <time.h> void sort2(int s[],int n) {int i,j,k;int temp;for(i=0;i<n-1;i++){for(j=i+1;j<=n-1;j++){if(s[j]<s[i]){temp=s[i];s[i]=s[j];s[j]=temp;}}} } main() {int i,a[10];srand(time(NULL));printf("隨機產(chǎn)生10個整數(shù):\n");for(i=0;i<10;i++)a[i]=rand( )%100;for(i=0;i<10;i++){printf("%d",a[i]);printf(" ");}printf("\n");sort2(a ,10);printf("排序后的結(jié)果:\n");for(i=0;i<10;i++){printf("%d",a[i]);printf(" ");} }運行結(jié)果:
問題分析:思路基本與上題一樣。
二維數(shù)組的運用(7.3.2)
實驗練習1:(1)問題的簡單描述:編寫程序,從鍵盤輸入行數(shù),輸出指定函數(shù)的楊輝三角形。
流程圖:
實驗代碼:
#include<stdio.h> main() {int a[50][50],i,j,n;printf("請輸入楊輝三角的行數(shù):");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(" ");printf("%d",a[i][j]); }printf("\n");} }運行結(jié)果:
問題分析:因為這是一個二維數(shù)組,i,j分別代表的是二維數(shù)組的行和列。而楊輝三角在第一列和斜對角線都是1,所以有a[i][i],a[i][0]=0,接下來就是其核心部分:從第二行開始每一個數(shù)等于其之上的兩個數(shù)之和。輸出同樣是以for循環(huán)輸出,由于是二維數(shù)組,分別有內(nèi)外循環(huán)。大致思路就是這樣,但是操作的時候還是會碰到各種各樣的細節(jié)問題,比如說我在輸出的時候就忘了用for循環(huán)。
實驗練習2:(1)問題的簡單描述:編寫程序,從鍵盤分別輸入年、月、日,計算出該天是這年的第幾天。
流程圖:
?
?實驗代碼:
#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 year,int month,int day){int i,j,s=0;if((year%4==0&&year%100!=0)||year%400==0)i=1;elsei=0;for(j=1;j<month;j++)s=s+day_tab[i][j];return s+day; } main() {int y,m,d;printf("Input year_month_day:\n");scanf("%d%d%d",&y,&m,&d);day_year(y,m,d);printf("是這年的第%d天\n",day_year(y,m,d)); }運行結(jié)果:
問題分析:
這個二維數(shù)組已經(jīng)給出了實參,就是要針對是否為閏年,將該年的某月某日所在的天數(shù)加起來。在其中,“i”是控制年份是否為閏年,但在判定其是否為閏年的時候不能用“i”去相余。要注意的是函數(shù)頭部與數(shù)組名稱不能相同,然后用for循環(huán)運行定義月份之前的所有月份的天數(shù)和,每計算出一個月份用return返回到“s”的值。
字符數(shù)組應用(7.3.3)
(1)問題的簡單描述:編寫程序,從鍵盤輸入一個字符串,判斷其是否是回文數(shù)。
流程圖:
實驗代碼:
#include "stdio.h" #include "string.h" #define N 40 main() {char str[N],ch='Y';int i;int len;printf("Please input a strings:");scanf("%s",&str);len=strlen(str);printf("\n");printf("字符串長度為%d",len);printf("\n");for(i=0;i<=len/2;i++){if(str[i]!=str[len-1-i]){ch='N';break;}}if(ch=='Y')printf("%s是一個回文數(shù)\n",str);elseprintf("該字符串不是回文數(shù)"); }運行結(jié)果:
問題分析:這里有個不一樣的地方在于它循環(huán)的次數(shù),len/2次循環(huán)。雖然在編譯中不對它的約束條件減半依然是對的,但思路要理解。自己在編譯的過程,沒有想到用break跳出循環(huán),可能是太久了不是很熟悉。
?
?小結(jié):通過數(shù)組的練習,發(fā)現(xiàn)自己編譯明顯要弱于之前,因為在這里for循環(huán)的嵌套頻繁,分支結(jié)構(gòu)也經(jīng)常套用。我覺得還是要理解每一個形參代表的是什么,限制條件可以多樣化,這要基于對for循環(huán)參數(shù)的含義深刻理解,流程圖是一個鏈接思路的工具,但今后要逐漸擺脫這種不依靠流程圖就毫無頭緒的境況。
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/Artificial/p/10961753.html
總結(jié)
- 上一篇: 尚学linux课程---8、rpm软件包
- 下一篇: ADO winform注册