上機實驗報告

一. 題目1.  建立一個學生檔案,內容包括學號,姓名,年齡,性別,數學,物理和英語3門功課成績。要求實現以下功能:1)  數據輸入;2)  查詢某個學生的成績;3)  按平均排列輸出;4)  統計某門課各分數段人數;5)  刪除某個學生記錄;2.  編程實現對二位數進行加,減,乘運算,每運行一次程式做10道題,完成後給出成績(每題10分)。二. 設計思想和模組劃分1.1.先定義所需要的條件,例如,姓名,學號,性別,三門功課的成績,平均分等。2.輸入姓名,學號,性別,年齡,三門功課的成績後,就輸出相應的姓名,學號,性別,年齡,三門功課的成績。3.列印表頭;4.在求出平均分,並列印出平均分。5.在查找學生,並列印出學生的相關資料;並按照平均分的高低排列;6.在統計學生各科成績是否》=60分,如果是就是通過,否就是沒通過,最後列印出最後的結果。7.刪除學生,選中刪除的學生,如果確定要,那么該學生的一切記錄就變為0;2.1.隨機調用函式,產生兩個其值為10到99的隨機整數分別放在c,d中用作運算時的運算數。2.隨機調用函式,產生一個值為1到3 的隨機整數放入b中,用來選擇不同的運算。根據b的值選擇不同的運算。當b=1時,去進行c+d的運算練習;當b=2 時,去進行c-d的運算練習;當b=3時,去進行c×d的運算練習。每完成一個算題就給出是否正確的信息。3.根據答案正確與否統計。正確時,顯示’right’; 錯誤時,顯示’wrong’。4.步驟1. 2. 3. 4. 重複10次。5.輸出學生成績。 三. 運行結果1. Input the 1 student :num:03name:wfage:18sex:fmath:98phy:75eng:65Input the 2 student :num:06name:scage:17sex:fmath:78phy:45eng:65Input the 3 student :num:09name:ytage:17sex:mmath:69phy:75eng:50 1.readin 2.finds 3.del 4.tj 5.exit1 ----------------------------- table--------------------------------------------------------------------------------------------------------------------------------  num  name  age sex math  phy eng  ave ---------------------------------------------------------------------------------------------------  3 wf  18 f  98.0  75.0  65.0  79.3 ---------------------------------------------------------------------------------------------------  9 yt  17 m  69.0  75.0  50.0  64.7 ----------------------------------------------------------------------------------------------------  6 sc  17 f   78.0  45.0  65.0  62.7 ----------------------------------------------------------------------------------------------------1.readin 2.finds 3.del 4.tj 5.exit2Into number:3 ------------------------------------------------------------------------------------------------  num  name  age sex math  phy  eng  ave ------------------------------------------------------------------------------------------------  3 wf 18 f   98.0  75.0   65.0   79.3 -------------------------------------------------------------------------------------------------1.readin 2.finds 3.del 4.tj 5.exit3Into number:6 ------------------------------------------------------------------------------------------------  num  name  age sex math  phy  eng  ave ------------------------------------------------------------------------------------------------  6 sc 17 f  78.0   45.0   65.0  62.6 ------------------------------------------------------------------------------------------------true? Y/Ny1  ---------------- table---------------------------------------------------------------------------------------------------------------  num  name  age sex math phy eng   ave -------------------------------------------------------------------------------------------------  3 wf   18 f  98.0  75.0  65.0 79.3 --------------------------------------------------------------------------------------------------  9 yt 17 m  69.0   75.0  50.0 64.7 --------------------------------------------------------------------------------------------------  0  0  0 f 0.0 0.0 0.0 0.0 --------------------------------------------------------------------------------------------------1.readin 2.finds 3.del 4.tj 5.exit4 1.input the math 2.input the phy  3.input the eng 1math: pass num is :3 no pass num is :02.32+82=114right!97*15=1455right!99-58=41right!76-66=10right!58+13=71right!37+49=86right!99+52=151right!49*69=5462wrong!73-38=31wrong!86+34=120right!mark is 80 四. 主要錯誤改正方法1.在本題的編寫過程中常出現begin 和end 不配對,只要始它們的個數相同就可以了,就可以了。在程式中常出現的’unknown identifier’沒有定義的錯誤,只要在程式前加上定義,就可以了。還有就是type mismatch’的類型不匹配,只要根據前後內容,重新定義,就可以了。2.在本題編寫中,題目要求是兩個兩位數運算,如果寫成c:=random(100)在運行過程中,就會出現一位數運算,只要把它寫成c:=random(90)+10,就可以了。五. 實習小結1.第一題的程式編寫比較複雜,需要較多的定義,因而在後面的程式部分,就常出現標識符重複,而導致的類型不匹配。還有就是每個部分編好後,上下不能連線,而無法調用。2.第二題較第一題簡單,和書上的例題類似,所以,比較簡單,但從中也出現一些不問題。以上兩大題中出現的問題,要在同學的幫助下,才能完成。總的來說兩題程式比較困難 六. 程式清單1.program twins;const m=3; n=3 ;typestudent=recordnum:integer;name:string[3];age:integer;sex:char;s:array[1..n] of real;math,eng,phy:real;ave:real;end;sarr=array[1..m] of student;ta=array [1..m] of student;f=string[6];varstu:sarr; ct:ta; k,d:integer;procedure readin (var stu:sarr);const wrong='0<=data<=100 ,again!';var j,i:integer; a:student;beginwriteln;writeln('Input ',m,'  num name sex math phy eng',' of student.');for j:=1 to m dobeginwriteln;writeln('Input the ',j,' student :');with a dobeginwrite('num:'); readln(num);write('name:'); readln(name);write('age:'); readln(age);write('sex:'); readln(sex);while (sex<>'m')and(sex<>'f') dobeginwrite('sex:'); readln(sex)end;for i:=1 to n do begincase i of1:begin write('math:'); readln(s[i]);while(s[i]<0)or(s[i]>100)dobeginwriteln(wrong);write('math:'); readln(s[i]);end;end;2:begin write('phy:'); readln(s[i]);while(s[i]<0)or(s[i]>100)dobeginwriteln(wrong);write('phy:'); readln(s[i]);end;end;3:begin write('eng:'); readln(s[i]);while(s[i]<0)or(s[i]>100)dobeginwriteln(wrong);write('eng:'); readln(s[i]);end;end;end;end;stu[j]:=a;end;writeln;end;end;procedure ave (var stu:sarr);var j,i:integer; k:real;beginfor j:=1 to m dobegink:=0;with stu[j] dobeginfor i:=1 to n do k:=k+s[i];ave:=k/nend;end;end;procedure px (var stu:sarr);var tm:ta; j,i,p:integer;beginfor j:=1 to m dobeginp:=j;for i:=j+1 to m doif stu[i].ave>stu[p].ave then p:=i;tm[1]:=stu[p]; stu[p]:=stu[j]; stu[j]:=tm[1];end;end;procedure head (ct:ta);var i:integer;beginwrite(' '); for i:=1 to 72 do write('-');writeln;write('','  num':4,' ','name':9,' ','age':8,' ','sex':5,' ','math':6,' ','phy':9,' ','eng':8,' ');writeln('ave':6,' ');write(' '); for i:=1 to 72 do write('-');writeln;with ct[1] dobeginwrite('',num:7,' ',name:8,' ',age:8,' ',sex:5,' ');for i:=1 to n do write(s[i]:7,' ');write(ave:10,' ');writeln;end;write(' '); for i:=1 to 72 do write('-');writeln;end;procedure find (var stu:sarr);var n,i:integer; u:boolean;beginu:=true;while u dobeginwrite('Into number:');readln(n);for i:=1 to m dobeginif stu[i].num=n then beginct[1]:=stu[i];u:=false;d:=iend;end;end;end;procedure del (var stu:sarr);var i:integer; b:char;beginhead(ct);write('true? Y/N'); readln(b);if b='y' then begin write('1');with stu[d] dobeginnum:=0; name:='0'; age:=0;  sex:='f';for i:=1 to n do s[i]:=0;ave:=0end;endelseend;procedure tj (var stu:sarr);var w1,q1,q2,num,j:integer;h1,h2,h3:boolean;beginh1:=false;h2:=false;h3:=false;q1:=0;q2:=0;writeln(' ':30,'1.input the math 2.input the phy  3.input the eng ');readln(w1);case w1 of1:h1:=true;2:h2:=true;3:h3:=true;end;if h1 thenbeginbeginfor j:=1 to m dowith stu[j] doif stu[j].math>=60 thenq1:=q1+1elseq2:=q2+1;writeln('math:');end;if h2 thenbeginbeginfor j:=1 to m dowith stu[j] doif stu[j].phy>=60 thenq1:=q1+1elseq2:=q2+1;writeln('phy:');end;if h3 thenbeginbeginfor j:=1 to m dowith stu[j] doif stu[j].eng>=60 thenq1:=q1+1elseq2:=q2+1;writeln('eng:');end;end;end;end;writeln(' ':5,'pass num is :',q1);writeln(' ':5,'no pass num is :',q2);end;procedure head1 (var stu:sarr);var j,i:integer;beginwriteln('---------------- table--------------':60);writeln;write(' '); for i:=1 to 72 do write('-');writeln;write('','  num':4,' ','name':9,' ','age':8,' ','sex':5,' ','math':6,' ','phy':9,' ','eng':8,' ');writeln('ave':6,' ');write(' '); for i:=1 to 72 do write('-');writeln;for j:=1 to m do beginwith stu[j] dobeginwrite('',num:7,' ',name:8,' ',age:8,' ',sex:5,' ');for i:=1 to n do write(s[i]:7:1,' ');write(ave:10:1,' ');writeln;end;write(' '); for i:=1 to 72 do write('-');writeln;end;end;beginreadin(stu);ave(stu);k:=0;while k<>5 dobeginwriteln('1.readin 2.finds 3.del 4.tj 5.exit');read(k); readln;while (k<>1)and(k<>2)and(k<>3)and(k<>4)and(k<>5) dobeginwriteln(' mistake,Please  again');read(k)end;case k of1: begin px(stu); head1(stu) end;2: begin find(stu); head(ct) end;3: begin find(stu); del(stu); px(stu); head1(stu) end;4: begin tj(stu); end;5: writeln('exit!');end;end;end..2.program shadow;var a,b,c,d,e:integer;right:boolean;procedure s1;beginwriteln('right!');right:=trueend;procedure s2;beginwriteln('wrong!');right:=falseend;procedure s3 (x,y:integer);var h:integer;beginwrite(x,'+',y,'=');readln(h);if h=x+y then s1else s2  end;procedure s4 (x,y:integer);var h,w:integer;beginif x<y thenbegin w:=x; x:=y; y:=wend;write(x,'-',y,'=');readln(h);if h=x-y then s1 else s2end;procedure s5 (x,y:integer);var h:integer;beginwrite(x,'*',y,'=');readln(h);if h=x*y then s1 else s2end;beginrandomize;e:=0;for a:=1 to 10 dobeginc:=random(90)+10;d:=random(90)+10;b:=random(3);case b of0:s3(c,d);1:s4(c,d);2:s5(c,d);end;if right then e:=e+10;end;writeln('mark is',e:3)end.