C語言函數實驗報告_第1頁
C語言函數實驗報告_第2頁
C語言函數實驗報告_第3頁
C語言函數實驗報告_第4頁
C語言函數實驗報告_第5頁
已閱讀5頁,還剩4頁未讀, 繼續免費閱讀

付費下載

VIP免費下載

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

文檔簡介

北京聯合大學信息學院“程序設計基礎”課程調研(研究)報告題目:函數姓名(學號):專業:計算機科學與技術編制時間:2012-6-3。版本:指導教師:北京聯合大學-信息學院編制函數實驗(程序)設計報告2012年6月3日班號:姓名:學號:實驗情況概述本次實驗主要做了判斷素數和用一個函數來實現將一行字符串中最長的單詞輸出、寫一函數能輸入一個十六進制數后輸出相應的十進制數以及用遞歸法將一個整數轉換成字符串實驗,主要實踐了函數的定義、聲明、調用及運用返回值等的內容,驗證了函數的遞歸調用和嵌套調用。理解了函數用來完成特定功能的便捷性,并初步了解并掌握了模塊化程序設計思路。實驗記錄1.寫一個判斷素數的函數,在主函數輸入一個整數,輸出是否是素數的信息。素數定義:除了1和它本身外,不能被任何數整除且大于2的整數。#include<stdio.h>intmain(){voidfun(intn);//函數聲明intn; printf("inputanumberwhichislargerthan2:\n");scanf("%d",&n);fun(n);//調用函數 return0; /*若主函數為int型用getchar()也可以,若為void則只能用getchar,或什么都不用;此處可以將return注釋掉*/}voidfun(intn)//定義被調用函數{inti,j;for(i=2,j=2;i<n;i++)//i做除數,j用來計數。 { if(n%i!=0) j++; else break; } if(j<n) printf("%d不是素數!\n",n);else printf("%d是素數!\n",n);}寫一函數,輸入一個十六進制數,輸出相應的十進制數。#include<stdio.h> intfun(void)//定義無參被調函數fun的類型、名稱{ intn; //定義int型變量n printf("Pleaseinputahexnumber:"); //打印提示信息 scanf("%x",&n); //從鍵盤上讀入數據,%x表示該數以16進制形式輸入 printf("\nItsdecimalnumberis:%d\n",n);//打印所需的結果,即十進制數輸出return0;}intmain() //主調函數{intfun(void);//聲明無參被調函數的fun類型、名稱 fun(); //調用函數funreturn0;}3.用遞歸法將一個整數轉換成字符串。#include<stdio.h>voidmain(){voidexchange(intn);//聲明轉換函數exchangeintn;printf("inputaintegernumber:\n");scanf("%d",&n);printf("itsstringis:\n");if(n<0)//如果輸入的是負數{putchar('-');//輸出負號“-”n=-n;//將此負數轉化為正數處理}exchange(n);//調用轉換函數,該函數包括了整數的轉換和轉換成的字符串的輸出printf("\n");}voidexchange(intm)//定義轉換函數,其中m為形參。{inti;if((i=m/10)!=0){exchange(i);}/*因為i和10都是整數,所以i=m/10的結果不會是浮點型,只能是整型;根據該編譯系統“向零取整”的規則,如果等于0,說明m就只有一位數;若不為0,則說明m是一個多位數,遞歸調用繼續處理i,使m除去個位的數字*/printf("%c",m%10+'0');/*m%10是取余運算,結果為0~9之間的整數,即整數n的最后一位數。字符'0'~'9'的ASCⅡ代碼依次比字符'0'的代碼大0~9,m%10+'0'表示所要輸出的該數的ASCⅡ代碼,這樣才能使打印出的是字符'0'~'9'中的某個字符而不是整數0~9中的某個整數。*/}4.用一個函數來實現將一行字符串中最長的單詞輸出。此行字符串從主函數傳遞給該函數。#include<stdio.h>#include<string.h>/*以下6行,函數fun,判斷是否為字母*/intfun(charc){if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))return(1);elsereturn(0);}/*以下30行,函數longest,計算最長單詞的起始位置。*/intlongest(charstring[])//變量為字符型數組{inti,flag,len=0,length=strlen(string),place,point;/*flag表示單詞是否開始,flag=0表示未開始,flag=1表示單詞開始;len表示單詞已累計的字母個數;length表示先前單詞中最長單詞的長度;point表示當前單詞的起始位置;place表示最長單詞的起始位置*/for(i=0;i<=strlen(string);i++){if(fun(string[i]))/*判斷是否為字母*/ {if(flag)/*是,開始*/ {flag=0;point=i; }else len++;/*進入計算,+1*/ }else/*不是,比較已統計*/ {flag=1;if(len>=length) {length=len;place=point; len=0; } }}return(place);}/*以下14行,主函數,調用longest計算最長單詞的起始位置,并輸出*/voidmain(){charline[1000];inti,n=0;printf("pleaseinputoneline:\n");gets(line);printf("Thelongestwordis:");for(i=longest(line);fun(line[i]);i++) {printf("%c",line[i]);n++; }printf("\nItslengthis%d.\n",n);}實驗程序調試的步驟:根據該題目相應的要求,通過主動思考、查資料、與人交流等方式構思算法,在草稿紙上編寫出簡單的流程圖,再將具體的程序在電腦上敲出來,不斷的更正并改進,得出比較完善的程序。遇到的問題:如圖所示,調試程序時無錯誤,但運行完后,求得的是最長單詞及其長度不是預期的,而是輸入的第一個單詞。問題的解決方法:根據檢查結果,出現上述問題的原因是第二個函數longest內部for循環的控制條件及for內部的if()else()選擇結構有重大缺陷,解決辦法主要是在賦初始值時,將flag變為flag=1,將length=strlen(string)改為length=0,if選擇結構里面就不至于混亂,這樣就可以解決上述問題了。第三章.系統的評測測試方案:該程序是用一個函數來實現將一行字符串中最長的單詞輸出,且此行字符串從主函數傳遞給該函數。這樣,我們不妨輸入幾組容易辨別的單詞組,再夾雜一些數字或符號的混合組,查看是否與預期結果相符。測試用例:(1)abcabcd(2)abcdabc(3)3a2bc@#$abc根據測試的結果進行分析和修改:部分運行結果如下:有結果可知,經過改進后,運行結果完全符合要求,達到了預期目的。第四章.程序清單#include<stdio.h>#include<string.h>/*以下是函數letter,判斷是否為字母*/intletter(charc)//定義函數letter{if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))//判斷由主調函數傳來的line[i]是否在a~b或A~Z之間return(1);//是,則返回真值1給主調函數elsereturn(0);//否,則返回假值0給主調函數}/*以下是函數longest,計算最長單詞的起始地址。*/intlongest(charstring[])//定義函數longest,變量為字符串數組{intletter(charc);//聲明被調函數inti,flag=1;//flag表示單詞是否開始,flag=0表示未開始,flag=1表示單詞開始;intlength0=0,length=0;//length0表示單詞已累計的字母個數;length表示先前單詞中最長單詞的長度;intpoint,place;//point表示當前單詞的首字母地址,即起始地址;place表示最長單詞的起始地址for(i=0;i<=strlen(string);i++)//strlen(string)表示string[]的長度,strlen為測字符串長度函數{if(letter(string[i]))//判斷string[i]是否為字母,string[i]代表一個字母、空格或其他符號 {if(flag)//若是,開始處理以string[i]開頭的一個單詞 {point=i; //point代表當前單詞的起始位置,將該單詞首字母地址賦給point flag=0;//將i傳給point后,把flag變為零,使下幾步連續執行length0++} else length0++;//統計除首字母外該單詞的長度 }else//若string[i]不是字母,而是空格或其他符號 {flag=1;//將flag變為1,當下一個字符是字母時就計數if(length0>length)//length代表該字符串數組中的單詞的最大長度,初始化賦值為0 {length=length0;//當length0大于length時,把length0賦給lengthplace=point;//把該單詞的首字母地址作為所求的最長單詞的起始位置 length0=0;//將統計的前一個單詞的長度清零,以便統計下一個單詞長度 } }}return(place);//將所求最長單詞的初始位置返回給主調函數}/*以下是主調函數,調用longest計算最長單詞的起始位置,并輸出*/voidmain(){ intlongest(charstring[]);//聲明被調函數 intletter(charc);//聲明被調函數charline[1000];//定義字符串數組inti,n;printf("pleaseinputoneline:\n");gets(line);//將從鍵盤輸入的數據讀入數組printf("Thelongestwordis:");for(i=longest(line),n=0;letter(line[i]);i++)//調用函數longest(char)、letter(char) {//i的初始值為longest函數的返回值place,for循環的控制條件為函數letter的返回值為真值1

溫馨提示

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

評論

0/150

提交評論