c語言習題集答案清華大學出版社
❶ 求<c語言程序設計>的答案
(第一題)#include <stdio.h>
void main()
{
int gy(int m, int n);
int x,y,max, min;
printf("請輸入兩個大於0的正整數,以空格或者回車間隔:\n");
scanf("%d%d",&x,&y);
while(x<1 || y<1)
{
printf("輸入數據不正確,請重新輸入。\n");
printf("請輸入兩個大於0的正整數,以空格或者回車間隔:\n");
scanf("%d%d",&x,&y);
}
max=gy(x,y);
min=x*y/max;
printf("%d與%d的最大公約數是:%d,最小公倍數是:%d\n",x,y,max,min);
}
int gy(int m, int n)
{
int max, t;
while(m%n != 0) // while(m%n)
{
t=n; n=m%n; m=t;
}
max=n;
return max;
}
第二題#include <stdio.h>
#include <math.h>
void main()
{
void root(double a, double b, double c);
double a, b, c;
printf("請輸入一元二次方程的系數,用空格或者回車間隔:\n");
scanf("%lf%lf%lf",&a,&b,&c);
root(a,b,c);
}
void root(double a, double b, double c)
{
double disc, x1, x2, real , imag;
disc = b*b-4*a*c;
if(disc>0)
{
x1 = (-b+sqrt(disc))/(2*a);
x2 = (-b-sqrt(disc))/(2*a);
printf("方程有兩個實根,分別是:%f 與 %f\n", x1, x2);
}
else if(disc==0)
{
x1 = (-b)/(2*a);
printf("方程有一個實根,它是:%f\n ", x1);
}
else
{
real=(-b)/(2*a);
imag=sqrt(-disc)/(2*a);
printf("方程有兩個虛根,分別是:%f+%fi, %f-%fi\n", real,imag,real,imag);
}
}
測試1:請輸入一元二次方程的系數,用空格或者回車間隔:1 2 1
方程有一個實根,它是:-1.000000
測試2:請輸入一元二次方程的系數,用空格或者回車間隔:1 6 5
方程有兩個實根,分別是:-1.000000 與 -5.000000
測試3:請輸入一元二次方程的系數,用空格或者回車間隔:1 1 1
方程有兩個虛根,分別是:-0.500000+0.866025i, -0.500000-0.866025i
第三題#include <stdio.h>
#include <math.h>
void main()
{
int isprime(int n);
int n;
scanf("%d",&n);
while(n<2)
{
printf("Please reinput(n>=2):");
scanf("%d",&n);
}
if(isprime(n))
printf("%d是素數。\n",n);
else
printf("%d不是素數。\n",n);
}
int isprime(int n)
{
int i,k=sqrt(n);
for(i=2;i<=k;i++)
{
if(n%i==0)
return 0;
}
return 1;
}
第四題#include <stdio.h>
#include <math.h>
void main()
{
void printA(int a[3][3]);
void reverse(int a[3][3]); //轉置函數的聲明
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
printf("原二維數組:\n");
printA(a);
reverse(a); //函數轉置
printf("轉置後的數組:\n");
printA(a);
}
void printA(int a[3][3])
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%6d",a[i][j]);
}
printf("\n");
}
}
void reverse(int a[3][3]) //函數轉置的定義
{
int i,j,t;
for(i=0;i<3;i++)
{
for(j=0;j<i;j++)
{
t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t;
}
}
}
第五題#include <stdio.h>
#include <string.h>
void main()
{
char str[30];
void fanxu(char *p);
printf("請輸入一個字元串:");
gets(str);
printf("進行反序......\n");
fanxu(str);
printf("反序後的字元串:");
puts(str);
}
void fanxu(char *p)
{
int len=strlen(p);
char *q,c;
q=p+len-1; //字元串最後一個字元位置
for(;p<q;p++,q--)
{
c=*p; *p=*q; *q=c;
}
}
第六題#include <stdio.h>
#include <string.h>
void main()
{
char str1[60],str2[30];
void str_(char *p, char *q);
printf("請輸入第一個字元串:");
gets(str1);
printf("請輸入第二個字元串:");
gets(str2);
str_(str1, str2);
printf("連接後的字元串:");
puts(str1);
}
void str_(char *p, char *q)
{
for(;*p!='\0';p++);
for(;*q!='\0';p++,q++)
{
*p=*q;
}
*p='\0';
}
(0808)#include <stdio.h>
#include <string.h>
void main()
{
char str[80];
void insert(char str[]); //插入空格的函數
printf("請輸入一個字元串:");
gets(str);
insert(str); //插入空格
puts(str); //輸出字元串
}
void insert(char str[])
{
int len, i;
len=strlen(str);
for(i=len; i>0; i--) // 設置空格
{
str[2*i]=str[i];
str[2*i-1]=' ';
}
}
(0809)#include <stdio.h>
int letter; //字母個數
int digit; //數字個數
int space; //空格個數
int others; //其它字母個數
void main()
{
void count(char str[]); //統計個數的函數的聲明
char s[81];
printf("請輸入一個字元串:");
gets(s);
letter=0; digit=0;
space=0; others=0;
count(s);
printf("字元串中共有 %d 個字母,%d 個數字,%d 個空格,%d個其它字母。\n",letter,digit,space,others);
}
void count(char str[]) //統計個數的函數的定義
{
int i;
char c;
for(i=0; str[i]!='\0';i++)
{
c=str[i];
if(c>='a' && c<='z' || c>='A' && c<='Z')
{ letter++; }
else if(c>='0' && c<='9')
{ digit++; }
else if(c==' ')
{ space++; }
else
{ others++; }
}
}
(0810)#include <stdio.h>
#include <string.h>
void main()
{
int i;
char line[81];
int alphabetic(char c); //判斷一個字元是空格還是其它字母
int longest(char str[]);//尋找最長單詞的起始位置
printf("請輸入一行字元串:\n");
gets(line);
printf("最長的字元串是:");
for(i=longest(line); alphabetic(line[i]); i++)
{ printf("%c",line[i]);}
printf("\n");
}
int alphabetic(char c) //如果為空格返回0,其它字母返回1
{
if(c!=' ')
return 1;
else
return 0;
}
int longest(char str[])
{
int len=0; // 記錄每一個單詞的長度
int length=0; // 記錄最長單詞的長度
int flag=1; // 其值為0時表示當前位置處於字元串中,為1時表示當前位置為空格
int place=0; // 記錄最長字元串(單詞)的起始位置
int point; // 每個字元串的起始位置
for(int i=0; i<=strlen(str); i++)
{
if(alphabetic(str[i])) //如果當前位置為非空格
{
if(flag) //如果前一字元為空格
{
point = i; // 設置當前單詞的起始位置
flag = 0; // flag設為0,表示處於單詞中
}
else //如果前一字元為非空格
{ len++; } // 單詞的長度加1
}
else //當前位置為空格
{
flag = 1; //flag設為1,表示當前位置為空格
if(len >= length) //如果最近單詞的長度大於最長長度
{
length = len;
place = point; //設置最長單詞的起始位置
len = 0; //len歸0,重新開始計算單詞的長度
}
}
}
return place;
}
(0811)#include <stdio.h>
#include <string.h>
void main()
{
void inputNum(int a[], int n);
void outputNum(int a[], int n);
void bubble(int a[], int n);
int a[11], n;
printf("請輸入你要排序的數的個數:");
scanf("%d",&n);
inputNum(a,n);
outputNum(a,n);
bubble(a,n);
printf("從小到大排序為:\n");
outputNum(a,n);
}
void inputNum(int a[], int n)
{
int i;
for(i=1;i<=n;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
}
void outputNum(int a[], int n)
{
int i;
for(i=1;i<=n;i++)
{
printf("%6d",a[i]);
}
printf("\n");
}
void bubble(int a[], int n)
{
int i,j,t;
for(i=1;i<=n-1;i++)
{
for(j=1; j<=n-i; j++)
{
if(a[j]>a[j+1])
{ t=a[j]; a[j]=a[j+1]; a[j+1]=t; }
}
}
}
(0813)#include <stdio.h>
void main()
{
double lrd(int, double);
double x;
int n;
printf("請輸入n階勒讓德多項式的階數:\n");
scanf("%d",&n);
printf("請輸入x的值:\n");
scanf("%lf",&x);
printf("參數為%f 的 %d 階勒讓德多項式的值為 %f.\n",x,n,lrd(n,x));
}
double lrd(int n, double x)
{
if(n==0)
return 1;
else if(n==1)
return x;
else
return ((2*n-1)*x - lrd(n-1,x) -(n-1)*lrd(n-2,x))/n;
}
/*
測試1:請輸入n階勒讓德多項式的階數:0請輸入x的值:99.99參數為99.990000 的 0 階勒讓德多項式的值為 1.000000.
測試2:請輸入n階勒讓德多項式的階數:1請輸入x的值:99.99
參數為99.990000 的 1 階勒讓德多項式的值為 99.990000.
測試3:請輸入n階勒讓德多項式的階數:2
請輸入x的值:99.99 參數為99.990000 的 2 階勒讓德多項式的值為 99.490000.
測試4:請輸入n階勒讓德多項式的階數:10
請輸入x的值:1.1
參數為1.100000 的 10 階勒讓德多項式的值為 0.888677.
(0817)#include <stdio.h>
void main()
{
int num;
void convert(int num); // 轉換為字元串的函數的聲明
printf("請輸入一個整數:\n");
scanf("%d",&num);
printf("轉換成字元串:");
if(num<0)
{
putchar('-');
num = -num;
}
convert(num);
printf("\n");
}
void convert(int n)
{
int i;
if((i = (n/10)) != 0)
{
convert(i);
}
putchar(n%10 + '0');
}
(0818)#include <stdio.h>
int d[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
void main()
{
int year,month,day;
int days;
int count(int year,int month, int day);
int leap(int y);
printf("請輸入年份:");
scanf("%d",&year);
while(year<=0)
{
printf("年份不能為負,請重新輸入:");
scanf("%d",&year);;
}
if(leap(year)) //如果為閏年,2月份的天數為29
{ d[2]=29; }
printf("輸入月份:");
scanf("%d",&month);
while(month<1 || month>12)
{
printf("月份在1月和12月之間,你的輸入有誤,請重新輸入:");
scanf("%d",&month);
}
printf("輸入日數:");
scanf("%d",&day);;
while(day<1 || day >d[month])
{
printf("日數應在1和%d之間,請重新輸入:",d[month]);
scanf("%d",&day);
}
days=count(year,month,day);
printf("%d年%d月%d日是該年的第%d天\n",year,month,day,days);
}
int leap(int y)
{
if(y%4==0 && y%100!=0 || y%400==0)
return 1;
else
return 0;
}
int count(int year,int month, int day)
{
int i,days=0;
for(i=1; i<month; i++)
{ days += d[i]; }
days+=day;
return days;
}
(08050)#include <stdio.h>
#include <string.h>
void main()
{
char str[30];
void fanxu(char str[]);
printf("請輸入一個字元串:");
gets(str);
printf("進行反序......\n");
fanxu(str);
printf("反序後的字元串:");
puts(str);
}
void fanxu(char str[])
{
int len=strlen(str);
int i,j;
char c;
i=0; j=len-1;//i,j分別存儲第一個字元和最後一個字元的下標
for(;i<j; i++,j--)
{
c=str[i]; str[i]=str[j]; str[j]=c;
}
}
(08051)#include <stdio.h>
#include <string.h>
void main()
{
char str[30];
void fanxu(char s[]);
printf("請輸入一個字元串:");
gets(str);
printf("進行反序......\n");
fanxu(str);
printf("反序後的字元串:");
puts(str);
}
void fanxu(char s[])
{
int len=strlen(s);
int i;
char c;
for(i=0;i<=len/2;i++)
{
c=s[i];
s[i]=s[len-i-1];
s[len-i-1]=c;
}
}
(08061)#include <stdio.h>
#include <string.h>
void main()
{
char str1[60],str2[30];
void str_(char s1[], char s2[]);
printf("請輸入第一個字元串:");
gets(str1);
printf("請輸入第二個字元串:");
gets(str2);
str_(str1, str2);
printf("連接後的字元串:");
puts(str1);
}
void str_(char s1[], char s2[])
{
int i,j;
for(i=0;s1[i];i++); // s1[i]!='\0'
for(j=0;s1[i]=s2[j];i++,j++);
// (s1[i]=s2[j])!='\0'
}
(08110)#include <stdio.h>
#include <string.h>
void main()
{
void inputNum(char a[], char n);
void outputNum(char a[], char n);
void bubble(char a[], char n);
char a[11], n;
printf("請輸入你要排序的數的個數:");
scanf("%d",&n);
inputNum(a,n);
outputNum(a,n);
bubble(a,n);
printf("從小到大排序為:\n");
outputNum(a,n);
}
void inputNum(char a[], char n)
{
char i;
printf("請連續輸入%d個字元:",n);
fflush(stdin); //一般在輸入字元或者字元串之前要清空輸入緩沖區
for(i=1;i<=n;i++)
{
scanf("%c",&a[i]);
}
}
void outputNum(char a[], char n)
{
char i;
for(i=1;i<=n;i++)
{
printf("%2c",a[i]);
}
printf("\n");
}
void bubble(char a[], char n)
{
char i,j,t;
for(i=1;i<=n-1;i++)
{
for(j=1; j<=n-i; j++)
{
if(a[j]>a[j+1])
{ t=a[j]; a[j]=a[j+1]; a[j+1]=t; }
}
}
}
(08112)#include <iostream.h>
#include <iomanip.h>
void main()
{
void inputNum(int a[], int n);
void outputNum(int a[], int n);
void bubble(int a[], int n);
int a[11], n;
cout<<"請輸入你要排序的數的個數:";
cin>>n;
while(n<1 || n>10)
{
cout<<"請重新輸入,(1<=n<=10):";
cin>>n;
}
inputNum(a,n);
outputNum(a,n);
bubble(a,n);
cout<<"從小到大排序為:\n";
outputNum(a,n);
}
void inputNum(int a[], int n)
{
int i;
for(i=1;i<=n;i++)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}
}
void outputNum(int a[], int n)
{
int i;
for(i=1;i<=n;i++)
{
cout<<setw(6)<<a[i];
}
cout<<endl;
}
void bubble(int a[], int n)
{
int i,j,t;
for(i=1;i<=n-1;i++)
{
for(j=1; j<=n-i; j++)
{
if(a[j]>a[j+1])
{ t=a[j]; a[j]=a[j+1]; a[j+1]=t; }
}
}
}
(08181)#include <iostream.h>
#include <iomanip.h>
int d[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
void main()
{
int year,month,day;
int days;
int count(int year,int month, int day);
int leap(int y);
cout<<"請輸入年份:";
cin>>year;
while(year<=0)
{
cout<<"年份不能為負,請重新輸入:";
cin>>year;
}
if(leap(year)) //如果為閏年,2月份的天數為29
{ d[2]=29; }
cout<<"輸入月份:";
cin>>month;
while(month<1 || month>12)
{
cout<<"月份在1月和12月之間,你的輸入有誤,請重新輸入:";
cin>>month;
}
cout<<"輸入日數:";
cin>>day;
while(day<1 || day >d[month])
{
cout<<"日數應在1和"<<d[month]<<"之間,請重新輸入:"<<endl;
cin>>day;
}
days=count(year,month,day);
cout<<year<<"年"<<month<<"月"<<day<<"日是該年的第"<<days<<"天\n";
}
int leap(int y)
{
if(y%4==0 && y%100!=0 || y%400==0)
return 1;
else
return 0;
}
int count(int year,int month, int day)
{
int i,days=0;
for(i=1; i<month; i++)
{ days += d[i]; }
days+=day;
return days;
}
❷ C程序設計第二版(譚浩強) 清華大學《C語言》 (第2版)
算你找對人了!
1.這是教材:
http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=4363060
2.這是習題答案:
http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=2302699
至於視頻,你可到新浪視頻,比如這個:
http://search.you.video.sina.com.cn/s?sort=click&key=C%D3%EF%D1%D4&type=video
當然你可以選擇其它的.
❸ 跪求C語言程序設計學習指導與上機實踐答案 ~~清華大學出版的~~估計是第六版,應暉主編的。
可以抄看看中國鐵道出版社出版的《C語言程序設計》,軟體可以用Visual C++ 6.0、turbo C一類的。學習語言一定要多多練習,把書上的例子不停的往電腦里敲,然後看看自己能不能用別的演算法來解決這些例題,一定要舉一反三,把基礎融會貫通。
❹ 跪求 清華大學出版社的數據結構(C語音版)(第2版)唐國民 王國鈞 主編的課後習題答案。
1.簡述下列概念:數據、數據元素、數據項、數據對象、數據結構、邏輯結構、存儲結構、抽象數據類型。
答案:
數據:是客觀事物的符號表示,指所有能輸入到計算機中並被計算機程序處理的符號的總稱。如數學計算中用到的整數和實數,文本編輯所用到的字元串,多媒體程序處理的圖形、圖像、聲音、動畫等通過特殊編碼定義後的數據。
數據元素:是數據的基本單位,在計算機中通常作為一個整體進行考慮和處理。在有些情況下,數據元素也稱為元素、結點、記錄等。數據元素用於完整地描述一個對象,如一個學生記錄,樹中棋盤的一個格局(狀態)、圖中的一個頂點等。
數據項:是組成數據元素的、有獨立含義的、不可分割的最小單位。例如,學生基本信息表中的學號、姓名、性別等都是數據項。
數據對象:是性質相同的數據元素的集合,是數據的一個子集。例如:整數數據對象是集合N={0,±1,±2,„},字母字元數據對象是集合C={『A』,『B』,„,『Z』, 『a』,『b』,„,『z』},學生基本信息表也可是一個數據對象。
數據結構:是相互之間存在一種或多種特定關系的數據元素的集合。換句話說,數據結構是帶「結構」的數據元素的集合,「結構」就是指數據元素之間存在的關系。
邏輯結構:從邏輯關繫上描述數據,它與數據的存儲無關,是獨立於計算機的。因此,數據的邏輯結構可以看作是從具體問題抽象出來的數學模型。
存儲結構:數據對象在計算機中的存儲表示,也稱為物理結構。
抽象數據類型:由用戶定義的,表示應用問題的數學模型,以及定義在這個模型上的一組操作的總稱。具體包括三部分:數據對象、數據對象上關系的集合和對數據對象的基本操作的集合。
2.試舉一個數據結構的例子,敘述其邏輯結構和存儲結構兩方面的含義和相互關系。
答案:
例如有一張學生基本信息表,包括學生的學號、姓名、性別、籍貫、專業等。每個學生基本信息記錄對應一個數據元素,學生記錄按順序號排列,形成了學生基本信息記錄的線性序列。對於整個表來說,只有一個開始結點(它的前面無記錄)和一個終端結點(它的後面無記錄),其他的結點則各有一個也只有一個直接前趨和直接後繼。學生記錄之間的這種關系就確定了學生表的邏輯結構,即線性結構。。。完整答案出處
數據結構_C語言版_第2版_唐國民_王國鈞_課後答案_清華大學出版社
http://www.daanjia.com/forum.php?mod=viewthread&tid=100156&fromuid=36878
(出處: 答案家)
❺ 求《C語言程序設計》第四版,譚浩強編,清華大學出版社 課後習題答案
#include<stdio.h>
int main(){
fload a[3];
scanf("%f,%f,%f",&a[0],&a[1],&a[2]);
float temp;
if(a[0]>a[1]){
temp = a[0];
a[0] = a[1];
a[1] = temp;
}
if(a[1]>a[2]){
temp = a[1];
a[1] = a[2];
a[2] = temp;
}
if(a[0]>a[1]){
temp = a[0];
a[0] = a[1];
a[1] = temp;
}
print("%f %f %f \n", a[0],a[1],a[2]);
}
❻ c語言程序設計答案 清華大學出版社第二版
大學學習資料免費下載網 有(下載不用積分點數之類)
點擊「各版本教材課後答案與習題詳解」里的「C語言」就可以下載啦!!!
內含:
譚浩強C語言程序設計習題參考解答
和配套 C程序設計題解與上機指導 答案
參考資料:大學學習資料免費下載網(哲學、法學、文學、理學、工學、農學、醫學、管理學等考研資料、等級考試、課後答案等資料全集)
❼ 求《數據結構》(C語言,第二版) 嚴蔚敏、吳偉民主編,清華大學出版社 課後習題答案
http://wenku..com/link?url=-wmTox3c-s9Pk6r0MyGk1N6YqJu-Fya9-LrzhksZfVTfM0R09K9kzLVq9d4_AtX-ZXlPWuZC
❽ c++程序設計基礎教程課後答案(清華大學出版社鄭莉 董淵著)
第 一 章 概述
1-1 簡述計算機程序設計語言的發展歷程。
解:
迄今為止計算機程序設計語言的發展經歷了機器語言、匯編語言、高級語言等階段,C++語言是一種面向對象的編程語言,也屬於高級語言。
1-2 面向對象的編程語言有哪些特點?
解:
面向對象的編程語言與以往各種編程語言有根本的不同,它設計的出發點就是為了能更直接的描述客觀世界中存在的事物以及它們之間的關系。面向對象的編程語言將客觀事物看作具有屬性和行為的對象,通過抽象找出同一類對象的共同屬性(靜態特徵)和行為(動態特徵),形成類。通過類的繼承與多態可以很方便地實現代碼重用,大大縮短了軟體開發周期,並使得軟體風格統一。因此,面向對象的編程語言使程序能夠比較直接地反問題域的本來面目,軟體開發人員能夠利用人類認識事物所採用的一般思維方法來進行軟體開發。C++語言是目前應用最廣的面向對象的編程語言。
1-3 什麼是結構化程序設計方法?這種方法有哪些優點和缺點?
解:
結構化程序設計的思路是:自頂向下、逐步求精;其程序結構是按功能劃分為若干個基本模塊;各模塊之間的關系盡可能簡單,在功能上相對獨立;每一模塊內部均是由順序、選擇和循環三種基本結構組成;其模塊化實現的具體方法是使用子程序。結構化程序設計由於採用了模塊分解與功能抽象,自頂向下、分而治之的方法,從而有效地將一個較復雜的程序系統設計任務分解成許多易於控制和處理的子任務,便於開發和維護。
雖然結構化程序設計方法具有很多的優點,但它仍是一種面向過程的程序設計方法,它把數據和處理數據的過程分離為相互獨立的實體。當數據結構改變時,所有相關的處理過程都要進行相應的修改,每一種相對於老問題的新方法都要帶來額外的開銷,程序的可重用性差。
由於圖形用戶界面的應用,程序運行由順序運行演變為事件驅動,使得軟體使用起來越來越方便,但開發起來卻越來越困難,對這種軟體的功能很難用過程來描述和實現,使用面向過程的方法來開發和維護都將非常困難。
1-4 什麼是對象?什麼是面向對象方法?這種方法有哪些特點?
解:
從一般意義上講,對象是現實世界中一個實際存在的事物,它可以是有形的,也可以是無形的。對象是構成世界的一個獨立單位,它具有自己的靜態特徵和動態特徵。面向對象方法中的對象,是系統中用來描述客觀事物的一個實體,它是用來構成系統的一個基本單位,由一組屬性和一組行為構成。
面向對象的方法將數據及對數據的操作方法放在一起,作為一個相互依存、不可分離的整體--對象。對同類型對象抽象出其共性,形成類。類中的大多數數據,只能用本類的方法進行處理。類通過一個簡單的外部介面,與外界發生關系,對象與對象之間通過消息進行通訊。這樣,程序模塊間的關系更為簡單,程序模塊的獨立性、數據的安全性就有了良好的保障。通過實現繼承與多態性,還可以大大提高程序的可重用性,使得軟體的開發和維護都更為方便。
面向對象方法所強調的基本原則,就是直接面對客觀存在的事物來進行軟體開發,將人們在日常生活中習慣的思維方式和表達方式應用在軟體開發中,使軟體開發從過分專業化的方法、規則和技巧中回到客觀世界,回到人們通常的思維。
1-5 什麼叫做封裝?
解:
封裝是面向對象方法的一個重要原則,就是把對象的屬性和服務結合成一個獨立的系統單位,並盡可能隱蔽對象的內部細節。
1-6 面向對象的軟體工程包括哪些主要內容?
解:
面向對象的軟體工程是面向對象方法在軟體工程領域的全面應用,它包括面向對象的分析(OOA)、面向對象的設計(OOD)、面向對象的編程(OOP)、面向對象的測試(OOT)和面向對象的軟體維護(OOSM)等主要內容。
1-7 簡述計算機內部的信息可分為幾類?
解:
計算機內部的信息可以分成控制信息和數據信息二大類;控制信息可分為指令和控制字兩類;數據信息可分為數值信息和非數值信息兩類。
1-8 什麼叫二進制?使用二進制有何優點和缺點?
解:
二進制是基數為2,每位的權是以2 為底的冪的進制,遵循逢二進一原則,基本符號為0和1。採用二進制碼表示信息,有如下幾個優點:1.易於物理實現;2.二進制數運算簡單;3.機器可靠性高;4.通用性強。其缺點是它表示數的容量較小,表示同一個數,二進制較其他進制需要更多的位數。
1-9 請將以下十進制數值轉換為二進制和十六進制補碼:
(1)2 (2)9 (3)93
(4)-32 (5)65535 (6)-1
解:
(1) (2)10 = (10)2 = (2)16
(2) (9)10 = (1001)2 = (9)16
(3) (93)10 = (1011101)2 = (5D)16
(4) (-32)10 = (11100000)2 = (E0)16
(5) (65535)10 = (11111111 11111111)2 = (FFFF)16
(6) (-1)10 = (11111111 11111111)2 = (FFFF)16
1-10 請將以下數值轉換為十進制:
(1)(1010)2 (2)(10001111)2 (3)(01011111 11000011)2
(4)(7F)16 (5)(2D3E)16 (6)(F10E)16
解:
(1)(1010)2 = (10)10
(2)(10001111)2 = (143)10
(3)(01011111 11000011)2 = (24515)10
(4)(7F)16 = (127)10
(5)(2D3E)16 = (11582)10
(6)(F10E)16 = (61710)10
1-11 簡要比較原碼、反碼、補碼等幾種編碼方法。
解:
原碼:將符號位數字化為 0 或 1,數的絕對值與符號一起編碼,即所謂"符號——絕對值表示"的編碼。
正數的反碼和補碼與原碼表示相同。
負數的反碼與原碼有如下關系:
符號位相同(仍用1表示),其餘各位取反(0變1,1變0)。
補碼由該數反碼的最末位加1求得。
第 二 章 C++簡單程序設計
2-1 C++語言有那些主要特點和優點?
解:
C++語言的主要特點表現在兩個方面,一是全面兼容C,二是支持面向對象的方法。C++是一個更好的C,它保持了C的簡潔、高效、接近匯編語言、具有良好的可讀性和可移植性等特點,對C的類型系統進行了改革和擴充,因此C++比C更安全,C++的編譯系統能檢查出更多的類型錯誤。 C++語言最重要的特點是支持面向對象。
2-2 下列標識符哪些是合法的?
Program, -page, _lock, test2, 3in1, @mail, A_B_C_D
解:
Program, _lock, test2, A_B_C_D是合法的標識符,其它的不是。
2-3 例2.1中每條語句的作用是什麼?
#include <iostream.h>
void main(void)
{
cout<<"Hello!\n";
cout<<"Welcome to c++!\n";
}
解:
#include <iostream.h> //指示編譯器將文件iostream.h中的代碼
//嵌入到該程序中該指令所在的地方
void main() //主函數名,void 表示函數沒有返回值
{ //函數體標志
cout<<"Hello!\n"; //輸出字元串Hello!到標准輸出設備(顯示器)上。
cout<<"Welcome to c++!\n"; //輸出字元串Welcome to c++!
}
在屏幕輸出如下:
Hello!
Welcome to c++!
2-4 使用關鍵字const而不是#define語句的好處有哪些?
解:
const定義的常量是有類型的,所以在使用它們時編譯器可以查錯;而且,這些變數在調試時仍然是可見的。
2-5 請寫出C++語句聲明一個常量PI,值為3.1416;再聲明一個浮點型變數a,把PI的值賦給a。
解:
const float PI = 3.1416;
float a = PI;
2-6 在下面的枚舉類型中,Blue的值是多少?
enum COLOR ;
解:
Blue = 102
2-7 注釋有什麼作用?C++中有哪幾種注釋的方法?他們之間有什麼區別?
解:
注釋在程序中的作用是對程序進行註解和說明,以便於閱讀。編譯系統在對源程序進行編譯時不理會注釋部分,因此注釋對於程序的功能實現不起任何作用。而且由於編譯時忽略注釋部分,所以注釋內容不會增加最終產生的可執行程序的大小。適當地使用注釋,能夠提高程序的可讀性。在C++中,有兩種給出注釋的方法:一種是延用C語言方法,使用"/*"和"*/"括起注釋文字。另一種方法是使用"//",從"//"開始,直到它所在行的行尾,所有字元都被作為注釋處理。
2-8 什麼叫做表達式?x = 5 + 7是一個表達式嗎?它的值是多少?
解:
任何一個用於計算值的公式都可稱為表達式。x = 5 + 7是一個表達式,它的值為12。
2-9 下列表達式的值是多少?
1. 201 / 4
2. 201 % 4
3. 201 / 4.0
解:
1. 50
2. 1
3. 50.25
2-10 執行完下列語句後,a、b、c三個變數的值為多少?
a = 30;
b = a++;
c = ++a;
解:
a:32 ; b:30 ; c:32;
2-11 在一個for循環中,可以初始化多個變數嗎?如何實現?
解:
在for循環設置條件的第一個";"前,用,分隔不同的賦值表達式。
例如:
for (x = 0, y = 10; x < 100; x++, y++)
2-12 執行完下列語句後,n的值為多少?
int n;
for (n = 0; n < 100; n++)
❾ 急需數據結構C語言版(清華大學出版社)的期末考試試題及答案
《數據結構》期末考試試卷( A )
一、 選擇題(每小題2分,共24分)
1.計算機識別、存儲和加工處理的對象被統稱為( A )
A.數據 B.數據元素
C.數據結構 D.數據類型
2.棧和隊列都是( A )
A.限制存取位置的線性結構 B.順序存儲的線性結構
C.鏈式存儲的線性結構 D.限制存取位置的非線性結構
3.鏈棧與順序棧相比,比較明顯的優點是( D )
A.插入操作更加方便 B.刪除操作更加方便
C.不會出現下溢的情況 D.不會出現上溢的情況
4.採用兩類不同存儲結構的字元串可分別簡稱為( B )
A.主串和子串 B.順序串和鏈串
C.目標串和模式串 D.變數串和常量串
5. 一個向量第一個元素的存儲地址是100,每個元素的長度為2,則第5個元素的地址是:B
A. 110 B .108
C. 100 D. 120
6.串是一種特殊的線性表,其特殊性體現在:B
A.可以順序存儲 B .數據元素是一個字元
C. 可以鏈接存儲 D. 數據元素可以是多個字元
7.設高度為h的二叉樹上只有度為0和度為2的結點,則此類二叉樹中所包含的結點數至少為: C
A. 2h B .2h-1
C. 2h+1 D. h+1
軟體開發網
8.樹的基本遍歷策略可分為先根遍歷和後根遍歷;二叉樹的基本遍歷策略可分為先序遍歷、中序遍歷和後序遍歷。這里,我們把 由樹轉化得到的二叉樹叫做這棵樹對應的二叉樹。下列結論哪個正確? A
A. 樹的先根遍歷序列與其對應的二叉樹的先序遍歷序列相同
B .樹的後根遍歷序列與其對應的二叉樹的後序遍歷序列相同
C. 樹的先根遍歷序列與其對應的二叉樹的中序遍歷序列相同
D. 以上都不對
9.一個有n個頂點的無向圖最多有多少邊?C
A. n B .n(n-1)
C. n(n-1)/2 D. 2n
10.在一個圖中,所有頂點的度數之和等於所有邊數的多少倍?C
A. 1/2 B .1
C. 2 D. 4
11.當在二叉排序樹中插入一個新結點時,若樹中不存在與待插入結點的關鍵字相同的結點,且新結點的關鍵字小於根結點的關鍵字,則新結點將成為( A )
A.左子樹的葉子結點 B.左子樹的分支結點
C.右子樹的葉子結點 D.右子樹的分支結點
軟體開發網
12.對於哈希函數H(key)=key%13,被稱為同義詞的關鍵字是( D )
A.35和41 B.23和39
C.15和44 D.25和51
二、已知某棵二叉樹的前序遍歷結果為A,B,D,E,G,C,F,H,I,J,其中中序遍歷的結果為D,B,G,E,A,H,F,I,J,C。請畫出二叉的具體結構。(注意要寫出具體步驟)(10分)
原理見課本128頁
三、有圖如下,請寫出從頂點c0出發的深度優先及寬度優先遍歷的結果。(10分)
深度優先;C0-C1-C3-C4-C5-C2
寬度優先:C0-C1-C2-C3-C4-C5
四、有圖如下,按Kruskal演算法求出其最小生成樹。要求寫出完整的步驟。(10分)
原理見課本250頁
五、給定線性表(12,23,45,66,76,88,93,103,166),試寫出在其上進行二分查找關鍵字值12,93,166的過程。並寫出二分查找的演算法。(20分)
0 1 2 3 4 5 6 7 8
12 23 45 66 76 88 93 103 166
過程:
mid=(0+8)/2=4
high=3,low=0 mid=1
high=0,low=0 mid=0(找到12)
high=8,low=5,mid=6(找到93)
high=8,low=7,mid=7
high=8 low=8 mid=8
演算法:見課本84頁上
六、知單鏈表的結點結構為
Data next
下列演算法對帶頭結點的單鏈表L進行簡單選擇排序,使得L中的元素按值從小到大排列。
請在空缺處填入合適的內容,使其成為完整的演算法。 (可用文字說明該演算法的基本思想及執行的過程,10分)
void SelectSort(LinkedList L)
{
LinkedList p,q,min;
DataType rcd;
p= (1) ;
while(p!=NULL) {
min=p;
q=p->next;
while(q!=NULL){
if( (2) )min=q;
q=q->next;
}
if( (3) ){
rcd=p->data;
p->data=min->data;
min->data=rcd;
}
(4) ;
}
}
本題不會。嘿嘿。。。。
七、一個完整的演算法應該具有哪幾個基本性質?分別簡要說明每一性質的含意。(5分)
輸入:
四個基本性質:1.輸入:有零個或多個有外部提供的量作為演算法的輸入
2:輸出:演算法產生至少一個量作為輸出
3.:確定性:組成演算法的每條指令是清晰的,無歧異的。
4.:有限性:演算法中每條指令的執行次數是有限的,執行每條指令的時間也是有限的
八、何謂隊列的"假溢"現象?如何解決?(5分)
隊列的假溢現象是指數組實現的順序隊列中,隊尾指針已到達數組的下表上界產生上溢而隊頭指針之前還有若干 空間閑置的現象。解決的辦法之一是利用循環隊列技術使數組空間的首尾相連。
九、說明並比較文件的各種物理結構。(6分)