C語言程序設計-進階篇:第5章 簡單程序設計之二_第1頁
C語言程序設計-進階篇:第5章 簡單程序設計之二_第2頁
C語言程序設計-進階篇:第5章 簡單程序設計之二_第3頁
C語言程序設計-進階篇:第5章 簡單程序設計之二_第4頁
C語言程序設計-進階篇:第5章 簡單程序設計之二_第5頁
已閱讀5頁,還剩37頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C語言程序設計

—進階篇第5章簡單程序設計之二

2022/11/2嵌套循環結構程序設計數學計算問題枚舉、查找和排序問題菜單設計內容概述2022/11/2教學目標掌握嵌套循環結構的程序設計掌握一些典型的算法,如數值計算問題、枚舉問題、查找問題、排序問題和應用程序菜單的設計。2022/11/25.1嵌套循環結構程序設計

在一個循環內又完整地包含另一個循環,稱為循環的嵌套。for語句可以與while語句、do-while語句相互嵌套,構成多重循環。例如:

2022/11/2(1)

(2)for() do{…{…while()for(){…}{…}

…} }while();(3)

(4)while()for(){{

…for()for(){…}{

…}}

}2022/11/2for(i=1;i<=9;i++){

打印第i行;}【例5.1】打印乘法小九九表。

使用一個循環9次的循環語句,每次循環打印一行:第i次循環,打印第i行,打印一個表達式:

for(j=1;j<=i;j++){

打印第j個表達式;}直到打印完一行后換行

2022/11/2#include<stdio.h>voidmain(){

inti,j;for(i=1;i<=9;i++){ for(j=1;j<=i;j++)

printf("%d*%d=%-3d",i,j,i*j);

printf("\n");}}2022/11/25.2數學計算問題

計算機自從其誕生之日起,它的主要任務就是進行各種各樣的科學計算。文檔處理,數據處理,圖像處理,硬件設計,軟件設計等等,都可以抽象為兩大類:數值計算與非數值計算。計算機在解決數值計算、離散數學、數論、計算理論等數值計算問題都發揮著及其重要的作用。

2022/11/2【例5.2】用泰勒級數求e的近似值。直到最后一項小于1e-6為止。〖程序分析〗數學上常用泰勒級數來求e的近似值。因此可以通過迭代,逐個計算出每個數據項,再將它們累加起來。另外,為了滿足要求的精度,可以通過檢查數據項的大小來控制循環的終止。這里設置一個精確的標準,小數點后6位,也就是說:直到最后一項小于1e-6,這就是計算完成的判斷條件。2022/11/2〖程序代碼〗#include"stdio.h"voidmain(){floate=1.0,t=1.0;

intn=1;while(1.0/t>1e-6){t=t*n;e=e+1.0/t;n++;}

printf("e=%8.6f\n",e);}2022/11/25.3枚舉問題枚舉法是利用計算機運算速度快、精確度高的特點,對要解決問題的所有可能情況,一個不漏地進行檢驗,從中找出符合要求的答案,因此枚舉法是通過犧牲時間來換取答案的全面性。采用枚舉算法解題的基本思路:(1)確定枚舉對象、枚舉范圍和判定條件;(2)枚舉可能的解,驗證是否是問題的解。2022/11/2【例7.3】百雞問題。百雞問題是一個有趣的數學題:公雞賣5元錢1只,母雞賣3元錢1只,小雞賣1元錢3只,用100元錢去買100只雞,問公雞、母雞、小雞各買幾只?〖程序分析〗枚舉對象:公雞x只、母雞y只、小雞z只枚舉條件:

判定條件這是一個不定方程,可以用窮舉法,將不同的公雞、母雞、小雞的數量枚舉一遍,找出那些符合題目要求的解。窮舉法可用循環嵌套解出所有的可行解。2022/11/2#include"stdio.h"voidmain(){

int

x,y,z;

for(x=0;x<=20;x++) /*設公雞有0,2,…,20只*/

for(y=0;y<=33;y++)/*設母雞有0,2,…,33只*/for(z=0;z<=100;z+=3)/*設小雞有0,6,…,99只*/if(x*5+y*3+z/3==100&&x+y+z==100)

printf("公雞%d只、母雞%d只、小雞%d只\n",x,y,z);}2022/11/2

在上面的程序中,最外層循環每循環一次,第二層循環要執行34次,而第三層循環則要執行3434=1156次,這樣,程序執行到最內層的if語句總共要執行213434=24276次。由條件x+y+z=100知z=100-x-y,這樣可將第三重循環去掉,將程序改為兩重循環。2022/11/2for(x=0;x<=20;x++)

for(y=0;y<=33;y++){z=100-x-y;if(x*5+y*3+z/3.0==100)

printf("公雞%d只、母雞%d只、小雞%d只\n",x,y,z);}內層循環體只需執行2134=714次。很大程度提高了程序執行的效率。2022/11/2

由于枚舉法一般是現實生活中問題的“直譯”,因此比較直觀,易于理解。但用枚舉法解題的缺點是運算量比較大,解題效率不高,如果枚舉范圍太大(一般以不超過兩百萬次為限),在時間上就難以承受。2022/11/25.4查找問題根據查詢要求從一個計算機文件或數據庫中提取所需要的數據的技術,這是數據處理的基本技術之一。查找的方法有很多,例3.5曾介紹了順序查找方法,這里將介紹折半查找。2022/11/2【例5.4】數組元素的折半查找。思想:先確定待查找記錄所在的范圍,然后逐步縮小范圍,直到找到或確認找不到該記錄為止。前提:必須在具有順序存儲結構的有序表中進行。2022/11/2設n個有序數(從小到大)存放在數組a[0]、…、a[n1]中,要查找的數為x。用變量bot、top、mid分別表示查找數據范圍的底部(數組下界)、頂部(數組的上界)和中間值,其中mid=(top+bot)/2。算法實現2022/11/2(1)若x=a[mid],則已找到并退出循環,否則繼續判斷;(2)若x<a[mid],則x必在bot和mid1范圍之內,即top=mid1;(3)若x>a[mid],則x必在mid+1和top范圍之內,即bot=mid+1;(4)在確定了新的查找范圍后,重復進行以上比較,直到找到x或bot<=top為止。折半查找的過程如下:2022/11/2算法描述lowhighmid例1234567891011513192137566475808892找211234567891011513192137566475808892lowhighmid1234567891011513192137566475808892lowhighmid2022/11/2例1234567891011513192137566475808892lowhighmid找701234567891011513192137566475808892lowhighmid1234567891011513192137566475808892lowhighmid1234567891011513192137566475808892lowhighmid2022/11/2#definen10#include"stdio.h"voidmain(){

int

a[n]={1,4,7,13,16,19,28,36,49,60};

int

mid,bot,top,x,find;

printf("pleaseinputthenumber:");

scanf("%d",&x);

bot=0;top=n-1;find=0;/*find=0代表沒找到*/2022/11/2

while(bot<=top&&find==0){mid=(top+bot)/2; /*計算中間要比較的元素下標*/

if(x==a[mid]){find=1;break;} /*查找成功*/else

if(x<a[mid])top=mid-1; /*數據x在下半部分*/else

bot=mid+1; /*數據x在上半部分*/}if(find==1)

printf("thenumberisfoundedtheno.%d!\n",mid);else

printf("thenumberisnotfound!\n");}2022/11/25.5排序問題

排序是計算機內經常進行的一種操作,其目的是將一組“無序”的記錄序列調整為“有序”的記錄序列。排序的方法有很多種,這里,我們例舉兩種簡單的排序方法——冒泡排序和選擇排序。2022/11/2【例5.5】數組元素排序——冒泡排序(以升序為例)

排序過程:比較第一個數與第二個數,若為逆序a[0]>a[1],則交換;然后比較第二個數與第三個數;依次類推,直至第n-1個數和第n個數比較為止——第一趟冒泡排序,結果最大的數被安置在最后一個元素位置上;對前n-1個數進行第二趟冒泡排序,結果使次大的數被安置在第n-1個元素位置;重復上述過程,共經過n-1趟冒泡排序后,排序結束。2022/11/2例3849657613273097

第一趟38496513273076

第二趟384913273065

第三趟3813273049

第四趟13273038

第五趟132730

第六趟4938659776132730

初始關鍵字n=8384976971397279730971376767627301365276530651313494930492738273830381327

第七趟2022/11/2輸入n個數給a[0]

到a[n-1]for(i=0;i<n-1;i++)for(j=0;j<n-i-1;j++)a[j]>a[j+1]真假a[j]a[j+1]輸出a[0]

到a[n-1]2022/11/2#include<stdio.h>main(){inta[10],i,j,t;

printf("Input10numbers:\n");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

printf("\n");

for(i=0;i<9;i++)

for(j=0;j<9-i;j++)

if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}

printf("Thesortednumbers:\n");

for(i=0;i<10;i++)

printf("%d",a[i]);}2022/11/2【例5.6】數組元素排序——選擇排序(以升序為例)

排序過程:首先通過n-1次比較,從n個數中找出最小的,將它與第一個數交換—第一趟選擇排序,結果最小的數被安置在第一個元素位置上再通過n-2次比較,從剩余的n-1個數中找出關鍵字次小的記錄,將它與第二個數交換—第二趟選擇排序重復上述過程,共經過n-1趟排序后,排序結束2022/11/2例初始:[49386597761327]kji=11349一趟:

13[386597764927]i=22738二趟:

1327[6597764938]三趟:

132738[97764965]四趟:

13273849[769765]五趟:

1327384965[9776]六趟:

132738496576[97]kkkkjjjjjjjjjj2022/11/2輸入n個數給a[0]到

a[n-1]for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)a[j]<a[k]真假k=j輸出a[0]到

a[n-1]k=ia[i]a[k]i!=k真假2022/11/2#include<stdio.h>main(){inta[11],i,j,k,x;

printf("Input10numbers:\n");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

printf("\n");

for(i=0;i<9;i++){k=i;for(j=i+1;j<10;j++)if(a[j]<a[k])k=j;if(i!=k)

{x=a[i];a[i]=a[k];a[k]=x;}}

printf("Thesortednumbers:\n");

for(i=0;i<10;i++)

printf("%d",a[i]);}2022/11/25.6菜單設計#include<stdio.h>#include<stdlib.h>voidmain(){

intn=0; charc; while(1) {

【例5.7】學生成績管理系統菜單設計。2022/11/2do{

system("cls");

printf("\t\t****學生成績管理系統****\n");

printf("\t\t*1.添加信息");

printf("\t\t*2.顯示全部\n");

printf("\t\t*3.刪除信息");

printf("\t\t*4.查詢信息\n");

printf("\t\t*5.修改信息");

printf("\t\t*6.保存信息\n");

printf("\t\t*7.打開文件");

printf("\t\t*0.退出程序\n");

printf("\t\t

請選擇(0-7):"); c=getchar(); }while(c<'0'||c>'7');2022/11/2switch(c){ case'1':

printf("\n\t添加記錄\n");

system("pause"); break;case'2':

printf("\n\t\t\t

記錄表\n");

system("pause"); break; case'3':

printf("\n\t刪除記錄\n");

system("pause"); break; case'4':

printf("\n\t查找記錄\n");

system("pause");

break;2022/11/2

case'5':

printf("\n\t修改記錄\n");

system("pause"); break; case'6':

printf("\n\t保存功能\n");

system("pause"); break; case'7':

printf("\n\t打開功能\n");

system("pause"); break; case'0':

printf("\n\t\t謝謝使用,再見!\n");

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論