當前位置:首頁 » 編程語言 » c語言基礎改錯題
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言基礎改錯題

發布時間: 2023-02-15 14:21:26

1. c語言改錯題

這個c語言問題原因是舊C編譯器中,要求函數max必須先聲明才能定義和使用,可是在上文先使用max函數而在下文才定義,就和先使用變數再定義一樣會報錯error。

原代碼在新編譯器中是可以用的,但是會報警告warning

#include <stdio.h>

int max(int x,int y);

void main()

{

int a,b,c;

scanf("%d,%d",&a ,&b);

c=max(a,b);

printf("max=%d ",c);

}

int max(x,y)

int x,y;

{int z;

z=y;

if(x>9) z=x;

return (z);

}

2. c語言改錯題

改錯,並經實際運行,結果如下圖:

#include<conio.h>
#include<stdio.h>

//intfound(inta[10][30],intn)//錯誤,彈出錯誤[Error]
intfound(inta[10][30],intn)//改錯
{
inti,j,s,k,x;

//for(i=0,k=1;k<=n;k++)//修改
i=0;//此處修改,但不算錯誤
for(k=1;k<=n;k++)
{
//s=1;//錯誤
s=0;//改錯,累加器,初始值為0
x=k;
for(;x<n;x++)
{
s+=x;
if(s>=n)break;
}

if(s==n)
{
//for(j=0;k+j<=x;j++)//錯誤,丟失最後1個元素
for(j=0;k+j<=x;j++)//改錯
a[i][j]=k+j;
i++;
}

}
returni;
}

intmain()
{
inta[10][30]={0};
inti,j,n,m;

printf("n=");
//scanf("%d",&n);錯誤
scanf("%d",&n);//改錯:n-->&n

m=found(a,n);

if(m>0)
{
printf("%dserials ",m);
for(i=0;i<m;i++)
{
for(j=0;a[i][j]!=0;j++)
printf("%4d",a[i][j]);
printf(" ");
}
}
else
printf("notfound ");

getch();
return0;
}

3. 求C語言改錯題

1,給定程序MODI1.C中函數fun的功能是:根據整型形參m,計算如下公式的值。
1
1
1
1
y
=
-------
+
---------
+
---------
+
……
+
-------
100*100
200*200
300*300
m*m
例如,若m
=
2000,則應輸出:
0.000160。
請改正程序中的語法錯誤,使它能計算出正確的結果。
注意:不要改動
main
函數,不得增行或刪行,也不得更改程序的結構!
#include
<stdio.h>
/************found************/
fun
(
int
m
)/*改為double
fun
(int
m)*/
{
double
y
=
0,
d
;
int
i
;
/************found************/
for(
i
=
100,
i
<=
m,
i
+=
100
)/*改為for(
i
=
100;i
<=
m,;i
+=
100
)*/
{
d
=
(double)i
*
(double)i
;
y
+=
1.0
/
d
;
}
return(
y
)
;
}
main(
)
{
int
n
=
2000
;
printf(
"\nThe
result
is
%lf\n",
fun
(
n
)
)
;
}
2,給定程序MODI1.C中
fun
函數的功能是:分別統計字元串中大寫字母和小寫字母的個數。
例如,
給字元串
s
輸入:AAaaBBb123CCccccd,則應輸出結果:upper
=
6,
lower
=
8。
請改正程序中的錯誤,使它能計算出正確的結果。
注意:不要改動
main
函數,不得增行或刪行,也不得更改程序的結構!
#include
<stdio.h>
/**********found**********/
void
fun
(
char
*s,
int
a,
int
b
)/*改為void
fun
(
char
*s,
int
*a,
int
*b
*/)
{
while
(
*s
)
{
if
(
*s
>=
'A'
&&
*s
<=
'Z'
)
/**********found**********/
*a=a+1
;/*改為*a=*a+1
;*/
if
(
*s
>=
'a'
&&
*s
<=
'z'
)
/**********found**********/
*b=b+1;/*改為
*b=*b+1;*/
s++;
}
}
main(
)
{
char
s[100];
int
upper
=
0,
lower
=
0
;
printf(
"\nPlease
a
string
:
"
);
gets
(
s
);
fun
(
s,
&
upper,
&lower
);
printf(
"\n
upper
=
%d
lower
=
%d\n",
upper,
lower
);
}
3,給定程序MODI1.C中函數fun的功能是:根據整型形參m的值,計算如下公式的值。
1
1
1
t
=
1
-
-----
-
-----
-
……
-
-----
2*2
3*3
m*m
例如,若
m
中的值為:
5,則應輸出:
0.536389。
請改正程序中的錯誤,使它能得出正確的結果。
注意:不要改動main函數,不得增行或刪行,也不得更改程序的結構!
#include
<stdio.h>
double
fun
(
int
m
)
{
double
y
=
1.0
;
int
i
;
/**************found**************/
for(i
=
2
;
i
<
m
;
i++)/*for(i
=
2
;
i
<=
m
;
i++)
*/
/**************found**************/
y
-=
1
/(i
*
i)
;/*
y
-=
1.0
/(i
*
i)
;
*/
return(
y
)
;
}
main(
)
{
int
n
=
5
;
printf(
"\nThe
result
is
%lf\n",
fun
(
n
)
)
;
}
4,給定程序MODI1.C中函數fun的功能是:從s所指字元串中刪除所有小寫字母c。
請改正程序中的錯誤,使它能計算出正確的結果。
注意:不要改動
main
函數,不得增行或刪行,也不得更改程序的結構!
#include
<stdio.h>
void
fun(
char
*s
)
{
int
i,j;
for(i=j=0;
s[i]!='\0';
i++)
if(s[i]!='c')
/************found************/
s[j]=s[i];/*
s[j++]=s[i];*/
/************found************/
s[i]='\0';/*
s[j]='\0';*/
}
main()
{
char
s[80];
printf("Enter
a
string:
");
gets(s);
printf("The
original
string:
");
puts(s);
fun(s);
printf("The
string
after
deleted
:
");
puts(s);printf("\n\n");
}
可以了吧

4. C語言程序改錯題(分析程序功能,指出題中的錯點,對錯誤進行分析並改正)

林銳的<<高質量C/C++編程>>
你看了這本書會有些認識的.
下面是本書的前言部分.....

軟體質量是被大多數程序員掛在嘴上而不是放在心上的東西!

除了完全外行和真正的編程高手外,初讀本書,你最先的感受將是驚慌:「哇!我以前捏造的C++/C程序怎麼會有那麼多的毛病?」

別難過,作者只不過比你早幾年、多幾次驚慌而已。

請花一兩個小時認真閱讀這本百頁經書,你將會獲益匪淺,這是前面N-1個讀者的建議。

一、編程老手與高手的誤區

自從計算機問世以來,程序設計就成了令人羨慕的職業,程序員在受人寵愛之後容易發展成為毛病特多卻常能自我臭美的群體。

如今在 Internet 上流傳的「真正」的程序員據說是這樣的:

(1) 真正的程序員沒有進度表,只有討好領導的馬屁精才有進度表,真正的程序員會讓領導提心吊膽。

(2) 真正的程序員不寫使用說明書,用戶應當自己去猜想程序的功能。

(3) 真正的程序員幾乎不寫代碼的注釋,如果注釋很難寫,它理所當然也很難讀。

(4) 真正的程序員不畫流程圖,原始人和文盲才會干這事。

(5) 真正的程序員不看參考手冊,新手和膽小鬼才會看。

(6) 真正的程序員不寫文檔也不需要文檔,只有看不懂程序的笨蛋才用文檔。

(7) 真正的程序員認為自己比用戶更明白用戶需要什麼。

(8) 真正的程序員不接受團隊開發的理念,除非他自己是頭頭。

(9) 真正的程序員的程序不會在第一次就正確運行,但是他們願意守著機器進行若干個 30 小時的調試改錯。

(10) 真正的程序員不會在上午 9:00 到下午 5:00 之間工作,如果你看到他在上午 9:00 工作,這表明他從昨晚一直干到現在。

……

具備上述特徵越多,越顯得水平高,資格老。所以別奇怪,程序員的很多缺點竟然可以被當作優點來欣賞。就象在武俠小說中,那些獨來獨往、不受約束且帶點邪氣的高手最令人崇拜。我曾經也這樣信奉,並且希望自己成為那樣的「真正」的程序員,結果沒有得到好下場。

我從讀大學到博士畢業十年來一直勤奮好學,累計編寫了數十萬行 C++/C 代碼。有這樣的苦勞和疲勞,我應該稱得上是編程老手了吧?

我開發的軟體都與科研相關(集成電路 CAD 和 3D 圖形學領域),動輒數萬行程序,技術復雜,難度頗高。這些軟體頻頻獲獎,有一個軟體獲得首屆中國大學生電腦大賽軟體展示一等獎。在 1995 年開發的一套圖形軟體庫到 2000 年還有人買。羅列出這些「業績」,可以說明我算得上是編程高手了吧?

可惜這種個人感覺不等於事實。

讀博期間我曾用一年時間開發了一個近 10 萬行 C++ 代碼的 3D 圖形軟體產品,我內心得意表面謙虛地向一位真正的軟體高手請教。他雖然從未涉足過 3D 圖形領域,卻在幾十分鍾內指出該軟體多處重大設計錯誤。讓人感覺那套軟體是用紙糊的華麗衣服,扯一下掉一塊,戳一下破個洞。我目瞪口呆地意識到這套軟體毫無實用價值,一年的心血白化了,並且害死了自己的軟體公司。

人的頓悟通常發生在最心痛的時刻,在沮喪和心痛之後,我作了深刻反省,「面壁」半年,重新溫習軟體設計的基礎知識。補修「內功」之後,又覺得腰板硬了起來。博士畢業前半年,我曾到微軟中國研究院找工作,接受微軟公司一位資深軟體工程師的面試。他讓我寫函數 strcpy 的代碼。

太容易了吧?

錯!

這么一個小不點的函數,他從三個方面考查:

( 1 )編程風格;

( 2 )出錯處理;

( 3 )演算法復雜度分析(用於提高性能)。

在大學里從來沒有人如此嚴格地考查過我的程序。我化了半個小時,修改了數次,他還不盡滿意,讓我回家好好琢磨。我精神抖擻地進「考場」,大汗淋漓地出「考場」。這「高手」當得也太窩囊了。我又好好地反省了一次。

我把反省後的心得體會寫成文章放在網上傳閱,引起了不少軟體開發人員的共鳴。我因此有幸和國產大型 IT 企業如華為、上海貝爾、中興等公司的同志們廣泛交流。大家認為提高質量與生產率是軟體工程要解決的核心問題。高質量程序設計是非常重要的環節,畢竟軟體是靠編程來實現的。

我們心目中的老手們和高手們能否編寫出高質量的程序來?

不見得都能!

就我的經歷與閱歷來看,國內大學的計算機教育壓根就沒有灌輸高質量程序設計的觀念,教師們和學生們也很少自覺關心軟體的質量。勤奮好學的程序員長期在低質量的程序堆中滾爬,吃盡苦頭之後才有一些心得體會,長進極慢,我就是一例。

現在國內 IT 企業擁有學士、碩士、博士文憑的軟體開發人員比比皆是,但他們在接受大學教育時就「先天不足」,豈能一到企業就突然實現質的飛躍。試問有多少軟體開發人員對正確性、健壯性、可靠性、效率、易用性、可讀性(可理解性)、可擴展性、可復用性、兼容性、可移植性等質量屬性了如指掌?並且能在實踐中運用自如?。「高質量」可不是幹活小心點就能實現的!

我們有充分的理由疑慮:

( 1 )編程老手可能會長期用隱含錯誤的方式編程(習慣成自然),發現毛病後都不願相信那是真的!

( 2 )編程高手可以在某一領域寫出極有水平的代碼,但未必能從全局把握軟體質量的方方面面。

事實證明如此。我到上海貝爾工作一年來,陸續面試或測試過近百名「新」「老」程序員的編程技能,質量合格率大約是 10 %。很少有人能夠寫出完全符合質量要求的 if 語句,很多程序員對指針、內存管理一知半解, …… 。

領導們不敢相信這是真的。我做過現場試驗:有一次部門新進 14 名碩士生,在開歡迎會之前對他們進行「 C++/C 編程技能」摸底考試。我問大家試題難不難?所有的人都回答不難。結果沒有一個人及格,有半數人得零分。競爭對手公司的朋友們也做過試驗,同樣一敗塗地。

真的不是我「心狠手辣」或者要求過高,而是很多軟體開發人員對自己的要求不夠高。

要知道華為、上海貝爾、中興等公司的員工素質在國內 IT 企業中是比較前列的,倘若他們的編程質量都如此差的話,我們怎麼敢期望中小公司拿出高質量的軟體呢?連程序都編不好,還談什麼振興民族軟體產業,豈不胡扯。

我打算定義編程老手和編程高手,請您別見笑。

定義 1 :能長期穩定地編寫出高質量程序的程序員稱為編程老手。

定義 2 :能長期穩定地編寫出高難度、高質量程序的程序員稱為編程高手。

根據上述定義,馬上得到第一推論:我既不是高手也算不上是老手。

在寫此書前,我閱讀了不少程序設計方面的英文著作,越看越羞慚。因為發現自己連編程基本技能都未能全面掌握,頂多算是二流水平,還好意思談什麼老手和高手。希望和我一樣在國內土生土長的程序員朋友們能夠做到:

( 1 )知錯就改;

( 2 )經常溫故而知新;

( 3 )堅持學習,天天向上。

二、本書導讀

首先請做附錄B的C++/C試題(不要看答案),考查自己的編程質量究竟如何。然後參照答案嚴格打分。

( 1)如果你只得了幾十分,請不要聲張,也不要太難過。編程質量差往往是由於不良習慣造成的,與人的智力、能力沒有多大關系,還是有葯可救的。成績越差,可以進步的空間就越大,中國不就是在落後中趕超發達資本主義國家嗎?只要你能下決心改掉不良的編程習慣,第二次考試就能及格了。

( 2)如果你考及格了,表明你的技術基礎不錯,希望你能虛心學習、不斷進步。如果你還沒有找到合適的工作單位,不妨到上海貝爾試一試。

( 3)如果你考出85分以上的好成績,你有義務和資格為你所在的團隊作「C++/C編程」培訓。希望你能和我們多多交流、相互促進。半年前我曾經發現一顆好苗子,就把他挖到我們小組來。

( 4)如果你在沒有任何提示的情況下考了滿分,希望你能收我做你的徒弟。

編程考試結束後,請閱讀本書的正文。

本書第一章至第六章主要論述C++/C編程風格。難度不高,但是細節比較多。別小看了,提高質量就是要從這些點點滴滴做起。世上不存在最好的編程風格,一切因需求而定。團隊開發講究風格一致,如果制定了大家認可的編程風格,那麼所有組員都要遵守。如果讀者覺得本書的編程風格比較合你的工作,那麼就採用它,不要只看不做。人在小時候說話發音不準,寫字潦草,如果不改正,總有後悔的時候。編程也是同樣道理。

第七章至第十一章是專題論述,技術難度比較高,看書時要積極思考。特別是第七章「內存管理」,讀了並不表示懂了,懂了並不表示就能正確使用。有一位同事看了第七章後覺得「野指針」寫得不錯,與我切磋了一把。可是過了兩周,他告訴我,他忙了兩天追查出一個Bug,想不到又是「野指針」出問題,只好重讀第七章。

光看本書對提高編程質量是有限的,建議大家閱讀本書的參考文獻,那些都是經典名著。

如果你的編程質量已經過關了,不要就此滿足。如果你想成為優秀的軟體開發人員,建議你閱讀並按照 CMMI 規范做事,讓自己的綜合水平上升一個台階。上海貝爾的員工可以向網路應用事業部軟體工程研究小組索取 CMMI 有關資料,最好能參加培訓。

三、版權聲明

本書的大部分內容取材於作者一年前的書籍手稿(尚未出版),現整理匯編成為上海貝爾網路應用事業部的一個規范化文件,同時作為培訓教材。

由於 C++/C 編程是眾所周知的技術,沒有秘密可言。編程的好經驗應該大家共享,我們自己也是這么學來的。作者願意公開本書的電子文檔。

版權聲明如下:

( 1 )讀者可以任意拷貝、修改本書的內容,但不可以篡改作者及所屬單位。

( 2 )未經作者許可,不得出版或大量印發本書。

( 3 )如果競爭對手公司的員工得到本書,請勿公開使用,以免發生糾紛。

預計到 2002 年 7 月,我們將建立切合中國國情的 CMMI 3 級解決方案。屆時,包括本書在內的約 1000 頁規范將嚴格受控。

歡迎讀者對本書提出批評建議 。
另外,團IDC網上有許多產品團購,便宜有口碑

5. 初學者C語言程序改錯題

首先我指出你書寫的一個錯誤。switch(c-'2')下面那行的(
應該改成{
因為{是與default:putchar(c+2);下面出現的}進行配對的。
依次輸入2473得到輸出668977,只需修改一處地方。在case
2:putchar(c+4);後面加上
break;
分析如下:使用getchar輸入,每次只能識別一個字元,而又使用了while循環,輸入2473就相當於輸入了4個數,while每次識別一個。
先分析輸入2的情況:這里的2是字元'2',執行switch(c-'2'),『2』-『2』=0;因此要執行case
0的情況,case
0
和case
1
共用putchar(c+4),故2+4=6,要輸出6,記住:輸出的這個6其實是字元『6』。然後繼續執行case
2:putchar(c+4);輸出第二個『6』。這時後面加上了break;即跳出本層switch,本次while循環執行完畢。第一次循環完畢,輸出了:66
然後是輸入為4的情況:執行switch(c-'2'),『4』-『2』=2;所以執行case
2:putchar(c+4);即4+4=8,輸出一個8(字元『8』)。繼續執行break;跳出本層switch,本次while循環執行完畢。第二次循環完畢,輸出了:8
繼續輸入為7的情況:執行switch(c-'2'),『7』-『2』=5;要執行case
5,但本程序中並沒有case
5,故執行預設情況
default:putchar(c+2);『7』+『2』=『9』,因此輸出9(字元『9』)。本次while循環執行完畢。第三次循環完畢,輸出了:9
最後一個輸入數3的情況:執行switch(c-'2'),『3』-『2』=1;所以執行
case
1:putchar(c+4);即『3』+『4』=『7』,輸出7(字元『7』)。繼續執行case
2:putchar(c+4);又輸出了一個7(字元『7』)。遇到後面的break;跳出switch,本次while循環結束。第四次循環結束,輸出了:77
至此,全部四次循環均結束,所以最後的輸出是668977.