算法與編程實習報告_第1頁
算法與編程實習報告_第2頁
算法與編程實習報告_第3頁
算法與編程實習報告_第4頁
算法與編程實習報告_第5頁
已閱讀5頁,還剩18頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

算法與編程實習報告指導老師:XXX專業:通信工程班級:10083415學號:XXXXXXXX姓名:XX第一題問題描述一、題目:統計字母的使用頻率二、目的與規定1.目的:通過編寫程序統計字母的使用頻率,培養學生綜合運用C語言進行程序設計的能力,熟悉字符串的操作辦法,加強函數的運用,提高軟件系統分析能力和程序文檔建立、歸納總結的能力。2.基本規定:1)規定用C語言編程,在VisualC++環境下調試完畢;2)規定按照程序功效分成幾個功效模塊來實現,各個功效模塊分別使用函數來完畢;規定應用本課所講授的程序設計語言知識來解決問題三、設計辦法和基本原理1.課題功效描述本程序的功效,就是要統計英文字母的使用頻率。2.問題具體描述為統計英文字母的使用頻率,輸入一種不涉及空格的由英文字母構成的字符串,長度不超出200個字符。統計26個英文字母的使用頻率,不分辨大小寫。最后按使用頻率從大到小輸出字母(小寫字母)和使用頻率(出現的次數)。3.問題的解決方案按照程序規定,本程序應采用模塊化設計辦法,設計幾個功效模塊。例如(僅供參考):1)將字符串中的大寫字母轉換為小寫字母2)統計輸入的字符串中字母的使用頻率3)按使用頻率從大到小進行排序4)主函數中控制輸入、函數調用和輸出。四、重要技術問題的描述根據三的分析,重要問題在于:1)為統計字母的使用頻率,定義一種長度為26的int數組寄存所統計的各個字母的使用頻率。2)在統計字母的使用頻率時,不要使用if語句或switch語句,運用字母的ASCII碼與數組元素下標之間的關系來求得。3)按使用頻率從大到小進行排序時,建議使用指針數組更為方便。五、創新規定實現程序功效后,可進行創新設計:1)使用多文獻,即主函數和各個函數分別寄存在不同的.c文獻中,在頭文獻中進行函數原型聲明。讀入一篇英文文檔,并對其進行字母頻率分析。功效描述運用MFC實現和諧界面,設計了兩個功效按鈕,“打開文獻”和“計算”對文檔的讀入有兩種方案,一是直接在界面上直接輸入,二是運用“打開文獻”按鈕,打開一種寄存于D盤根目錄的data.txt文本文獻。把讀取來的英文數據都在顯示框內顯示。當顧客按下“計算”按鈕時,程序讀取顯示框內的數據,用于計算。將計算得到的成果在成果輸出框內顯示,并寫入D盤的result.txt文本文獻。(下頁流程圖)解決方案(流程圖)數據讀入數據讀入OnButtonFopen事件OnButtonFopen事件按下“打開文獻”按鈕data_input函數顧客在輸入框內輸入result_display函數成果顯示OnButtonCalc事件字母次數計算result_display函數成果顯示OnButtonCalc事件字母次數計算重要函數描述1)OnButtonCalc()按鈕解決函數“計算”,用于控制數據的輸入與輸出2)OnButtonFopen()按鈕解決函數“打開文獻”,用于打開文獻操作3)result_display() 成果顯示函數4)freq_sort()成果排序,并寫入文獻5)freq_calc()計算字母出現頻率6)num_change字母大小寫轉換重要技術問題對字符串的操作和問件的操作。指針的運用,函數的調用。結論(實驗心得)函數必須加上必要的注釋,否則要記起當時的思路很難。附錄:第一題部分源程序/*****************************按鈕解決函數“計算”*****************************/voidCTask_oneDlg::OnButtonCalc(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE);//把現在文本框中的內容保存到變量中charen_in[N]; charen_out[250]={0}; intres[26]={0}; strcpy(en_in,m_input);//讀取EDIT中的值,存入字符數組 data_input(en_in,res);//輸入數據解決函數 result_display(en_out);//成果顯示 m_display=en_out;//變量傳入控件 UpdateData(FALSE);}/**************************按鈕解決函數“打開文獻”***************************/voidCTask_oneDlg::OnButtonFopen(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE);//把現在文本框中的內容保存到變量中 charen_in[N];//定義字符數組用于寄存輸入數據 charen_out[250]={0}; //定義字符數組用于寄存成果,寫入文獻 intres[26]={0};//26個字母的數組用于頻率值 FILE*fp_r; if((fp_r=fopen("d:\\data.txt","r"))==NULL)//打開D盤根目錄的data.txt文獻 { MessageBox(TEXT("在D:\\中找不到文獻data.txt!"),TEXT("錯誤"),MB_OK); } else { fscanf(fp_r,"%s",en_in);//文獻的值讀取到數組中 fclose(fp_r); m_input=en_in;//把讀入的數據在界面上顯示(原數據) } UpdateData(FALSE); }/***************************字母大小寫變換******************************/voidnum_change(char*en){inti=0; for(i=0;*(en+i)!='\0';i++)//三目運算符當字在AZ之間時,轉化為小寫 { *(en+i)=('A'<=*(en+i)&&*(en+i)<='Z')?(*(en+i)+32):(*(en+i)); }}/**************************計算字母出現頻率****************************/voidfreq_calc(char*en,int*res){ inti=0; for(i=0;*(en+i)!='\0';i++) { (*(res+(int)(*(en+i))-97))++;//字符與成果數組相對應自加一次 }}/*************************成果顯示,并寫入文獻**************************/voidresult_display(char*en_out){ FILE*fp;//存入D盤根目錄的result.txt文獻中 if((fp=fopen("d:\\result.txt","r"))==NULL) { exit(1); } fscanf(fp,"%s",en_out);//讀取并在界面上顯示(解決后的數據) fclose(fp);}第二題問題描述一、題目:自然數的進制轉換二、目的與規定1.目的:通過編寫對自然數進行不同進制轉換程序,培養學生綜合運用C語言進行程序設計的能力,熟悉字符串的操作辦法,加強函數的運用,提高軟件系統分析能力和程序文檔建立、歸納總結的能力。2.基本規定:1)規定用C語言編程,在VisualC++環境下調試完畢;2)規定按照程序功效分成幾個功效模塊來實現,各個功效模塊分別使用函數來完畢;3)規定應用本課所講授的程序設計語言知識來解決問題.三、設計辦法和基本原理1.課題功效描述本程序的功效,就是實現自然數的十進制、二進制、八進制、十六進制轉換。即根據顧客選擇的進制和輸入的數據,轉換得到該數所對應的十進制、二進制、八進制和十六進制數。2.問題具體描述程序運行時,首先由顧客選擇輸入數據所使用的進制,如:歡迎使用進制轉換程序!1.十進制2.二進制3.八進制4.十六進制0.退出請選擇輸入數據的進制:顧客選擇后,再輸入數據,如選擇3(八進制),則顯示:請輸入八進制數據:輸入數據后,程序進行轉換,最后輸出該數所對應的十進制、二進制、八進制和十六進制數。如輸出:轉換成果:十進制21809二進制001八進制52461十六進制55313.問題的解決方案事實上,C語言在輸入輸出時可直接輸入或輸出多個進制的數,本題目是為了提高學生的編程能力,因此要自己編程來實現數制的轉換。根據問題的描述,使用字符數組來寄存輸入的數據,轉換后的數據也寄存到字符數組中,按字符串進行輸入和輸出。注意:問題的解決方案有諸多,下面給出的僅供同窗們參考。按照程序規定,每次要將數據轉換成多個進制,因此將輸入數據(字符數組中)先轉換成十進制數(long),再將其轉換成多個進制并存入對應的字符數組中,最后輸出。本程序應采用模塊化設計辦法,設計幾個功效模塊。例如(僅供參考):1)檢查輸入數與否正當(例八進制數中只能出現0~7)2)將數據(字符數組中)轉換成十進制數(long)3)將十進制數(long)轉換成某種進制數據(字符數組中)還能夠把這幾個模塊中都使用的字符與數字之間的轉換作為獨立模塊,供上面的模塊調用。例如(僅供參考):4)字符轉數字5)數字轉字符主函數中控制輸入、函數調用和輸出。四、重要技術問題的描述根據三的分析,重要問題在于:1)單個字符與數字的轉換在字符轉數字時,’0’~’9’只需減去’0’即可,要考慮到’a’~’f’和’A’~’F’的轉換(十六進制數)。同樣的,數字轉字符時,要考慮到10~15的轉換與0~9不同。2)將數據(字符數組中)轉換成十進制數(long)時,采用的算法是:按現在數制的位權進行多項式展開相加,即得到對應的十進制數。3)將十進制數(long)轉換成某種進制數據(字符數組中)時,采用除留余數法:將十進制數除以轉換進制的位權,保存余數(存到字符數組中),商繼續除,直到商為零;然后將字符數組中的內容求頭逆序,即得到轉換數據。其中求逆序也可用一種獨立模塊來實現。五、創新規定實現程序功效后,可進行創新設計:1)使用多文獻,即主函數和各個函數分別寄存在不同的.c文獻中,在頭文獻中進行函數原型聲明;2)本程序實現的是自然數的不同進制的轉換,可進一步實現帶小數的轉換;3)實現負數的轉換功效描述運用MFC實現和諧界面,設計了兩個功效按鈕,“轉換”和“退出”。設計了一種Combox用來選擇現在輸入數據的進制。一種Edit框用于寄存輸入數據。其它Edit框用于顯示。(下頁流程圖)解決方案(流程圖)GetCurSelGetCurSel函數讀取顧客選擇的進制Change_decChange_dec函數讀取源數據,轉換為十進制dec_to_string函數十進制轉字符串dec_to_hex函數dec_to_string函數十進制轉字符串dec_to_hex函數十進制轉十六進制dec_to_oct函數十進制轉八進制dec_to_bin函數十進制轉二進制OnButtonChange函數把成果放入控件中顯示 OnButtonChange函數把成果放入控件中顯示重要函數描述1)OnButtonChange()“轉換”按鈕解決函數2)Change_dec() 按類別把輸入的數據轉換為十進制存入value中3)dec_to_string()dec_to_bin()dec_to_oct()dec_to_hex 十進制轉化為多個進制4)OnButtonExit()“退出”按鈕解決函數重要技術問題Combox控件的運用,Combox選用值的讀取。按讀進來的進制類型,統一轉換為十進制。字符串轉數字,數字轉字符串。結論(實驗心得)合理運用MFC能夠使程序簡潔又和諧。附錄:第二題部分源程序/**************************Combox初始化******************************/m_kind.InsertString(0,"十進制");m_kind.InsertString(1,"二進制");m_kind.InsertString(2,"八進制");m_kind.InsertString(3,"十六進制");m_kind.SetCurSel(0);//默認顯示十進制/************************“轉換”按鈕解決函數************************/voidCTask_twoDlg::OnButtonChange(){//TODO:Addyourcontrolnotificationhandlercodehereintkind=0;//輸入數據的類別chars_dat[30]={0};//用于寄存輸入的數據longvalue=0;//十進制存儲位置把讀到數據統一轉換為十進制再解決kind=m_kind.GetCurSel();//讀取combox的值,得到選中的類別UpdateData(TRUE);//把現在文本框中的內容保存到變量中 strcpy(s_dat,m_data);//把文本框的內容拷貝到字符數組里Change_dec(s_dat,kind,&value);//調用數據解決函數把讀到數據統一轉換為十進制/*******************************顯示函數*******************************/dec_to_string(s_dat,&value);//十進制輸出m_dec=s_dat; //把變量的值傳控件中顯示UpdateData(FALSE); dec_to_bin(s_dat,&value);//二進制輸出m_bin=s_dat;UpdateData(FALSE);dec_to_oct(s_dat,&value);//八進制輸出m_oct=s_dat;UpdateData(FALSE);dec_to_hex(s_dat,&value);//十六進制輸出m_hex=s_dat;UpdateData(FALSE);}/***************************************************************************/voidChange_dec(char*dat,intkind,long*value)//把輸入的數據轉換為十進制存入value中{inti=0;kind=kind+1;//Combox中類別從0開始switch(kind)//按類別把輸入的數據轉換為十進制存入value中{case1://十進制while(*(dat+i)>='0'&&*(dat+i)<='9'){*value=(*value)*10+(*(dat+i)-'0');i++;}break;case2://二進制while(*(dat+i)>='0'&&*(dat+i)<='1'){*value=(*value)*2+(*(dat+i)-'0'); i++;}break;case3://八進制while(*(dat+i)>='0'&&*(dat+i)<='7'){*value=(*value)*8+(*(dat+i)-'0'); i++;}break; case4://十六進制while(*(dat+i)>='0'&&*(dat+i)<='F'){if((*dat)>'9')//十六進制時當數據不不大于9,單獨解決{*value=(*value)*16+(*(dat+i)-'7'); //把大寫的A轉化為10}else{ *value=(*value)*16+(*(dat+i)-'0');}i++;}break; }}/*****************************十進制轉十六進制***********************/voiddec_to_hex(char*dat,long*vp){ inti=0,j=0; charnum=0; longtemp=*vp; memset(dat,0,30); //清空字符串 while(temp) { if((temp%16)>9) { *(dat+i)=temp%16+'7';//余數不不大于9時解決10-15toA-F } else { *(dat+i)=temp%16+'0'; } temp=temp/16; i++; } for(j=0;j<i/2;j++)//字符串倒序輸出 { num=*(dat+j); *(dat+j)=*(dat+i-1-j); *(dat+i-1-j)=num; }}第三題問題描述一、題目:四則運算二、目的與規定1.目的:通過編寫四則運算程序,培養學生綜合運用C語言進行程序設計的能力,熟悉字符串的操作辦法,加強函數的運用,提高軟件系統分析能力和程序文檔建立、歸納總結的能力。2.基本規定:1)規定用C語言編程,在VisualC++環境下調試完畢;2)規定按照程序功效分成幾個功效模塊來實現,各個功效模塊分別使用函數來完畢;3)規定應用本課所講授的程序設計語言知識來解決問題.三、設計辦法和基本原理1.課題功效描述本程序的功效,就是實現數的加減乘除四則運算,如自動計算3+5*8的成果。2.問題具體描述程序運行時,首先提示顧客輸入四則運算體現式(體現式中最多有3個運算符,數據范疇為1-100的整數);輸入結束后,程序自動行計算并給進出成果。如:輸入13-10+5/8時輸出3.625。3.問題的解決方案注意:問題的解決方案有諸多,下面給出的僅供同窗們參考。該問題重要注意四則運算的優先級問題:乘除運算比加減運算優先級高,同級運算按從左到右的次序運算。本程序應采用模塊化設計辦法,設計幾個功效模塊。例如(僅供參考):1)字符串解析函數(將輸入字符串分解成數和運算符)2)將數據(字符數組中)轉換成十進制數(long)3)判讀與否存在高優先級運算符,若存在首先計算其運算成果并保存。4)同級運算按先后次序進行。四、創新規定實現程序功效后,可進行創新設計:1)使用多文獻,即主函數和各個函數分別寄存在不同的.c文獻中,在頭文獻中進行函數原型聲明;2)在程序中增加自動出題功效及自動批卷功效3)不限定運算符個數允許括號運算的存在。功效描述讀入現在字符串,并進行轉換。按類別,把運算數字和運算符分辨開分別存入對應字符數組中。按四則運算法則,先乘除后加減執行計算。重要函數描述get_dat()字符串解析函數data_make()判讀與否存在高優先級運算符,若存在首先計算其運算成果并保存重要技術問題字符串的解析,數據和運算符的分類先乘除后加減,把已運算過的數據賦值為0,已運算過的變為加號輸入字符串必須以數字開頭結論(實驗心得)在解決先乘除后加減的過程中,對已進行乘除運算的數據解決時一種核心,這里我把這類數據賦值為0,乘除號變為加號,便于下面的加減運算。附錄:第三題源程序#include<stdio.h>/**************************數據和運算符歸類解決***************************/voidget_dat(char*dat,float*num,char*sig)//字符串解析函數{ inti=0,j=0; *num=0;//初始化 printf("歡迎使用簡易四則運算器,請輸入:\n"); scanf("%s",dat); for(i=0;*(dat+i)!='\0';i++) { if((*(dat+i)<'0')||(*(dat+i)>'9'))//如果輸入的不是0-9的自然數 { if(i==0) { printf("算式有誤,請重新輸入!\n");//如果輸入字符不是以數字開頭 break; } *(sig+j)=*(dat+i);//如果是運算符就存儲 j++;//指針位置加一 } else { *(num+j)=*(num+j)*10+(*(dat+i)-'0');//不是運算符就轉化為數據存儲 } }}//判讀與否存在高優先級運算符,若存在首先計算其運算成果并保存voiddata_make(float*num,char*sig){ inti=0; for(i=0;*(sig+i)!='\0';i++)//掃描一遍先乘除后加減 { if(*(sig+i)=='*')//執行對應法則計算成果存入后一種數據單元 { *(num+i+1)=(*(num+i))*(*(num+i+1)); *(num+i)=0;//清空前一種數據單元,便于加減的運算 *(sig+i)='+';//把乘除轉換為加避免運算符干擾 } if(*(sig+i)=='/') { *(num+i+1)=(*(num+i))/(*(num+i+1)); *(num+i)=0; *(sig+i)='+'; } } for(i=0;*(sig+i)!='\0';i++)//掃描一遍加減運算 { if(*(sig+i)=='+')//執行對應法則計算成果存入后一種數據單元 { *(num+i+1)=(*(num+i))+(*(num+i+1)); *(num+i)=0;//清空前一種數據單元,便于下一種運算 } if(*(sig+i)=='-') { *(num+i+1)=(*(num+i))-(*(num+i+1)); *(num+i)=0; } } printf("計算答案是:%.3f\n",*(num+i));//最后一種數據單元為計算成果}/*******************************主函數**********************************/intmain()//主函數{ inti=0; charcalc_dat[200]={0};//定義一種保存算式的字符數組 charcalc_sig[100]={0};//定義一種保存運算符的字符數組 floatnum_dat[100]={0};//定義一種保存運算數據的數組//字符串解析函數顧客輸入算式運算符運算數據 get_dat(calc_dat,num_dat,calc_sig);//運算數據運算符先乘除后加減 data_make(num_dat,calc_sig); return0;}第四題問題描述一、題目:數字游戲玲玲喜歡通過玩數字游戲的方式來加深別人對她的印象。她最喜歡的一種數字游戲是讓人給出一種數N,然后她會立刻說出N的階乘最末尾有多少個持續的零。很顯然,這會讓別人會對她印象深刻,由于,普通來說N!是一種非常大的數。例如,N為100時,100!會比地球上全部原子的數目還要大,但玲玲能夠很快說出100!末尾有持續24個0。但是,她的某些朋友普通不是以10為進制的。這時,玲玲卻不懂得該怎么修改她的技巧來適應這些朋友了。問題:給出一種進制b和一種數n,計算當采用b進制時,n!末尾有多少個持續的0。例如,當b=2和n=5時,由于5!=120=1111000(2),成果應當為3.輸入:第一行包含了總的計算次數。接下來的每一行給出了不同狀況下的問題中的兩個數b(2≤b≤1000)和n(1≤n≤1000000),這兩個數都是10進制的。輸出:輸出成果中,對每一次計算都以"Scenario#i:"開始,其中的i是從1開始的第i次計算。然后打印一行,輸出:當采用b進制時,n!末尾有多少個持續的0(以十進制形式)。對每一次計算都以一種空白行結束。輸入樣例:325101004510000對樣例的對的輸出:Scenario#1:3Scenario#2:24Scenario#3:2498功效描述這個問題是對n!背面有幾個0的變種。如果是問n!最后有幾個0應當怎么算?必定不是先算出n!是幾,然后再數0的。如題目所言,N為100時,100!會比地球上全部原子的數目還要大,那么如何得出我們想要的成果呢?現在我們懂得,5!=120,因此當5!采用十進制表達的時候,5!末尾有一種零。也就是說5!只能被一種10整除!那么同理,當問5!采用二進制表達的時候,5!末尾有幾個零,實際就是5!能被多少個2整除,120能被3個2整除,因此末尾就是3個0。例如現在規定12進制時9!末尾有幾個0。我們先把12分解質因數,得12=2*2*3,然后再算9!=1*2*3*4*5*6*7*8*9,把這些階乘逐個分解質因數,算出共有幾個2,幾個3相乘。顯然里面有2+(2+2)+2+(2+2+2)共7個2,有3+3+(3+3)共4個3,又由于12里面有2個2,因此7/2=3.5,一種3,因此4/1=4,顯然只能取3,因此9!能被3個12整除,末尾必有3個0。解決方案(流程圖)Main函數Main函數主函數result_calc函數對兩次的質因數進行計算display函數成果顯示data_calcresult_calc函數對兩次的質因數進行計算display函數成果顯示data_calc函數對階乘逐次分解質因數factor_calc函數對進制分解質因數scanf函數掃描運算次數和對應的數據重要函數描述1)factor_calc()//對進制進行分解質因數data_calc()//對階乘逐個進行分解質因數result_calc//對統計的質因數進行比較display()//成果輸出重要技術問題該題事實上是求n!能夠被多少個對應的進制整除。運用C語言對進制進行分解質因數。運用C語言對階乘逐個分解質因數。把兩個成果進行比較,得出n!至多能被多少個進制整除,則在該進制下,它的末尾就有幾個0。結論(實驗心得)巧妙的算法很重要。附錄:第四題源程序#include<stdio.h>voidfactor_calc(intbase,int*factor,int*factor_num)//計算進制的因數種類和個數{ inti=0,j=0,n=2,flag=0; while(n<=base) { if(base%n==0)//如果整除 { flag=1;//整除標志 base=base/n;//下次用商進行計算 *(factor+i)=n;//統計因數 *(factor_num+i)=++j;//對應次數加一 } else { n++;//除數加一 if(flag==1)//如果上次整除了 { i++;//統計的因數的數組向后移 j=0;//釋放j flag=0;//釋放flag } } }}voiddata_calc(intdata,int*factor,int*data_factor)//階乘的因素計算{ inti=0,data_s=0,value=1;//計算n!中各個數所含因數 inttemp=0;//臨時值用于存儲n的階乘 for(i=0;*(factor+i)!=0;i++)//因數一種個比較下去 { for(data_s=2;data_s<=data;data_s++)//階乘一種個計算下去 { temp=data_s; while(temp%(*(factor+i))==0)//如果整除對應計數值就加一 { *(data_factor+i)=value++; temp=temp/(*(factor+i));

溫馨提示

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

評論

0/150

提交評論