『壹』 急求2010 計算機二級c語言上機題庫
說明:修改或填空內容在相應位置後用紅色標識
1.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。該程序功能:將字元串s中所有的字元'c'刪除。
#include <stdio.h>
void main()
{ char s[80];
int i,j;
gets(s);
for(i=j=0;____ 1_ ____;i++) s[i]!=』\0』
if(s[i] != 'c')
{ s[j]=s[i];
______2______ j++;}
s[j]='\0';
puts(s);
}
2.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。該程序功能:輸入三個整數,按由小到大的順序輸出這三個數。
#include <stdio.h>
void swap(______1______) int *pa,int *pb
{ /*交換兩個數的位置*/
int temp;
temp = *pa;
*pa = *pb;
*pb = temp;
}
void main()
{
int a,b,c,temp;
scanf("%d%d%d",&a,&b,&c);
if(a>b)
swap(&a,&b);
if(b>c)
swap(&b,&c);
if(______2______) a>b
swap(&a,&b);
printf("%d,%d,%d",a,b,c);
}
3.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中「***** N *****」的下一行中有錯誤,請改正(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能: 輸入一個字元串,將組成字元串的所有字元先按順序存放到字元串t中,再將字元串中的字元按逆序連接到字元串t * 後面。例如:輸入"ABCD",則字元串t為"ABCDDCBA"。
# include <stdio.h>
# include <string.h>
void fun(char *s,char *t)
{
int i,sl;
sl=strlen(s);
for(i=0;i<sl;i++)
t[i]=s[i];
for(i=0;i<sl;i++)
/********1********/
t[sl+i]=s[sl-i]; 改為:t[sl+i]=s[sl-i-1];
/********2********/
t[sl]="\0"; 改為:t[2*sl]=』\0』;
}
void main()
{
char s[100],t[100];
scanf("%s",s);
fun(s,t);
printf("%s",t);
}
4.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中「***** N *****」的下一行中有錯誤,請改正(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能:
輸入一個字元串,將組成字元串的所有非英文字母的字元刪除後輸出。
例如:輸入"abc123+xyz.5",應輸出"abcxyz"。
#include <stdio.h>
#include <string.h>
void main()
{
char str[256];
int i,j,k=0,n;
gets(str);
n=strlen(str);
for(i=0;i<n;i++)
/********1********/
if (tolower(str[i])<'a' || tolower(str[i])>'z') 改為:tolower(str[i])>='a' && tolower(str[i])>='z'
{
/********2********/
str[n]=str[i]; n++; 改為:str[k]=str[i]; k++;
}
str[k]='\0';
printf("%s\n",str);
}
5.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能:調用函數f計算代數多項式 1.1+2.2*x+3.3*x*x+4.4*x*x*x+5.5*x*x*x*x
當x=1.7時的值。
#include <stdio.h>
float f(float,float*,int);
void main()
{ float b[5]={1.1,2.2,3.3,4.4,5.5};
printf("%f\n",f(1.7,b,5));
}
float f( _______1________ ) float x,float a[],int n
{ float y=a[0],t=1; int i;
for(i=1;i<n;i++) { t=t*x; y=y+a[i]*t; }
_____2_____ return y;
}
6.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中「***** N *****」的下一行中有錯誤,請改正(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能:
將輸入的十進制整數n通過函數DtoH轉換為十六進制數,並將轉換結果以字元串形式輸出。 例如:輸入十進制數79,將輸出十六進制4f。
# include <stdio.h>
# include <string.h>
char trans(int x)
{
if(x<10) return '0'+x;
/********1********/
else return 'a'+x; 改為:else return 'a'+x-10;
}
int DtoH(int n,char *str)
{
int i=0;
while(n!=0)
{
str[i]=trans(n%16);
/********2********/
n%=16; 改為:n/=16;
i++;}
return i-1;
}
void main()
{
int i,k,n;
char *str;
scanf("%d",&n);
k=DtoH(n,str);
for (i=0;i<=k;i++) printf("%c",str[k-i]);
}
7.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。該程序功能:數列的第1、2項均為1,此後各項值均為該項前二項之和。計算數列第30項的值。
#include <stdio.h>
_______1______ long f(int n);
void main()
{
printf("%ld\n",f(30));
}
long f(int n)
{
if( ______2______ ) n==1||n==2
return 1;
else
return f(n-1)+f(n-2);
}
8.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。該程序功能:輸入1個整數後,輸出該數的位數(若輸入3214則輸出4,輸入-23156則輸出5)。
#include <stdio.h>
void main()
{ int n,k=0;
scanf("%d",&n);
while( _____1_____ ) n!=0
{
k++;
_____2_____; n/=10
}
printf("%d\n",k);
}
9.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。該程序功能:調用函數f,從字元串中刪除所有的數字字元。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void f(char *s)
{ int i=0;
while(s[i]!='\0'){
if(isdigit(s[i])) ____1____(s+i,s+i+1); strcpy
___2___ i++;} else
}
void main()
{ char str[80];
gets(str); f(str); puts(str);
}
10.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。該程序功能:分別統計字元串中英文字母、數字和其他字元出現的次數。
#include <stdio.h>
#include <ctype.h>
void main()
{ char a[80]; int n[3]={0},i; gets(a);
________1________ for(i=0;a[i]!=』\0』;i++)
{if (tolower(a[i])>='a' && tolower(a[i])<='z') /*統計字母個數*/
n[0]++;
else if (________2________) /*統計數字個數*/ a[i])>='0' && a[i] <='9'
n[1]++;
else
n[2]++;
}
for(i=0;i<3;i++) printf("%d\n",n[i]);
}
11.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中「/***** N ***** /」的下一行中有錯誤,請改正(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能:運行時若輸入a、n分別為3、6,則輸出下列表達式的值:
3+33+333+3333+33333+333333
#include <stdio.h>
void main()
{ int i,a,n; long t=0;
/********* 1 *******/
s=0; 改為:long s=0;
scanf("%d%d",&a,&n);
for(i=1;i<=n;i++) {
/******* 2 ******/
t=t*10+i; 改為:t=t*10+1;
s=s+t;
}
s=s*a;
printf("%ld\n",s);
}
12.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。該程序功能:求輸入的整數各位數字之和,如輸入234則輸出9,輸入-312則輸出6。
#include <stdio.h>
#include <math.h>
void main()
{
int n,s=0;
scanf("%d",&n);
______ 1 ______n=n>0?n:-n;
while(n!=0) {
______ 2 ______s+=n%10;
n=n/10;
}
printf("%d\n",s);
}
13.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能:
找出100~999之間所有的Armstrong數。所謂Armstrong數是指這個3位數各位上數字的立方和等於自身。例如:371=3*3*3+7*7*7+1*1*1,那麼371就是Armstrong數。
#include <stdio.h>
#include<math.h>
void main()
{
int i,a,b,c;
for(i=100;i<=999;i++)
{
a=i/100;
_______1_______ b=(i/10)%10;
c=i%10;
if (________2________) i==a*a*a+b*b*b+c*c*c
printf("%d is a Armstrong number!\n",i);
}
}
14.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。該程序功能:輸入的一個小寫字母,將字母循環後移5個位置後輸出,如』a』變成』f』, 『w』變成』b』。
#include <stdio.h>
void main()
{
char c;
c=getchar();
if(______1______) c>='a' && c<='u'
c=c+5;
else
if (c>='v' && c<='z')
______2______ c=c-21;
putchar(c);
}
15.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能:對x=1,2,...,10,求f(x)=x*x-5*x+sin(x)的最大值。
#include <stdio.h>
#include <math.h>
#define f(x) x*x-5*x+sin(x)
void main()
{ int x; float max;
______1______ max=f(1);
for(x=2;x<=10;x++)
______2______ if(f(x)>max)max=f(x);
printf("%f\n",max);
}
16.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能:調用函數f,將1個整數首尾倒置,若程序輸入12345,則輸出54321;
若程序輸入-34567,則輸出-76543。
#include <stdio.h>
#include <math.h>
long f(long n)
{ long m,y=0; m=fabs(n);
while(m!=0) {
y=y*10+m%10;
____1____ m/=10;
}
if(n>=0) return y;
else _____2_____ return -y;
}
void main()
{
printf("%ld\t",f(12345)); printf("%ld\n",f(-34567));
}
17.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。該程序功能: 求出a中各相鄰兩個元素的和,並將這些和存放在數組 b中,按每行3個元素的形式輸出。例如: b[1]=a[1]+a[0],…………,b[9]=a[9]+a[8]。
#include <stdio.h>
void main()
{
int a[10],b[10],i;
printf("\nInput 10 numbers: ");
for (i=0; i<10;i++) /* 數組輸入 */
scanf("%d", &a[i]);
for (i=1; i<10; i++)
b[i]=______1______; b[i]=a[i]+a[i-1] /* 計算b數組中的元素 */
for (i=1; i<10; i++)
{
printf("%3d",b[i]);
if (______2______) printf("\n"); i%3==0 /* 每行列印3個數據 */
}
}
18.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。該程序功能:輸入m、n(要求輸入數均大於0),輸出它們的最大公約數。
#include <stdio.h>
void main()
{ int m,n,k;
while(scanf("%d%d",&m,&n), _______1______ ); m<=0||n<=0
for( ____2____; n%k!=0||m%k!=0; k--); k=m>n?n:m
printf("%d\n",k);
}
19.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中「/***** N ***** /」的下一行中有錯誤,請改正(注意:不得加行、減行、加句、減句,否則後果自負)。該程序功能:輸入x和正數eps,計算多項式1-x+x*x/2!-x*x*x/3!+...的和直到末項的絕對值小於eps為止。
#include <stdio.h>
#include <math.h>
void main()
{ float x,eps,s=1,t=1,i=1;
scanf("%f%f",&x,&eps);
do {
/***** 1 *****/
t=t*x/++i; 改為:t= -t*x/i++;
s+=t;
/***** 2 *****/
} while(fabs(t)<eps) 改為:while(fabs(t)>=eps) ;
printf("%f\n",s);
}
*20.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中「/***** N ***** /」的下一行中有錯誤,請改正(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能:用選擇法對10個整數按升序排序。
#include <stdio.h>
#define N 10
void main()
{
int i,j,min,temp;
int a[N]={5,4,3,2,1,9,8,7,6,0};
printf("\nThe array is:\n"); /* 輸出數組元素 */
for (i=0;i<N;i++)
printf("%5d",a[i]);
for (i=0;i<N-1;i++) /* 排序操作 */
{
min = i;
for (j=i+1; j<N; j++)
/****** 1 ******/
if (a[min]<=a[j]) min =j; 改為:if (a[min]<=a[j]) {
/****** 2 ******/
temp=a[min]; a[min]=a[j]; a[j]=temp; /*數據交換*/ 改為:temp=a[min]; a[min]=a[j]; a[j]=temp;}
}
printf("\nThe sorted numbers: \n"); /* 輸出排序結果 */
for (i=0;i<N;i++)
printf("%5d",a[i]);
printf("\n");
}
*27.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能:調用函數f,求二維數組a中全體元素之和。
#include <stdio.h>
float f(_______1______) float **x,int m,int n
{ float y=0; int i,j;
for(i=0;i<m;i++) for(j=0;j<n;j++) y=y+*(*(x+i)+j);
return y;
}
void main()
{ float a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},*b[3];
int i;
for(i=0;i<3;i++)_______2______ b[i]=a[i];
printf("%.2f\n",f(b,3,4));
}
2、在考生文件夾的Paper子文件夾下已有Modify1.c文件。
該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充。
(注意:不得加行、減行、加句、減句,否則後果自負)。
程序功能:該程序計算四位學生的平均成績,保存在結構中,然後列表輸出這些學生
的信息。
#include <stdio.h>
struct STUDENT
{
char name[16];
int math;
int english;
int computer;
int average;
};
void GetAverage(struct STUDENT *pst) /* 計算平均成績 */
{
int sum=0;
sum = ______1______; pst-> math+ pst-> english + pst-> computer
pst->average = sum/3;
}
void main()
{
int i;
struct STUDENT st[4]={{"Jessica",98,95,90},{"Mike",80,80,90},
{"Linda",87,76,70},{"Peter",90,100,99}};
for(i=0;i<4;i++)
{
GetAverage(______2______); &st[i]
}
printf("Name\tMath\tEnglish\tCompu\tAverage\n");
for(i=0;i<4;i++)
{
printf("%s\t%d\t%d\t%d\t%d\n",st[i].name,st[i].math,st[i].english,
st[i].computer,st[i].average);
}
}
程序調試題(2)
說明:修改或填空內容在相應位置後用紅色標識
*21.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中「/***** N ***** /」的下一行中有錯誤,請改正(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能:輸入n以及小於n個字元的字元串,將字元串中所有小寫字母改為相應的大寫字母後,輸出該字元串。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{ int n,i;
/***** 1 *****/
char str; 改為: char *str;
scanf("%d\n",&n); str=(char*)malloc(n); gets(str);
/***** 2 *****/
for(i=1;i<strlen(str);i++) 改為:for(i=0;i<strlen(str);i++)
if(str[i]>='a'&& str[i]<='z') str[i]=str[i]-('a'-'A');
puts(str);
}
*22.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中「/***** N ***** /」的下一行中有錯誤,請改正(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能:將一個char型數的高4位和低4位分離,分別輸出,如22(二進制:00010110)輸出為1和6。
#include <stdio.h>
void main()
{
char a,b1,b2,c;
scanf("%d",&a);
/****** 1 ******/
b1=a<<4; 改為:b1=a>>4; /*b1存放高4位*/
c=~(~0<<4);
/****** 2 ******/
b2=a|c; 改為:b2=a&c; /*b2存放低4位*/
printf("%d,%d",b1,b2);
}
*23.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能:調用函數f用以求1元2次方程 x*x+5*x-2=0 的實根。
#include <stdio.h>
#include <math.h>
int f(_______1______) float *x1,float *x2, float a, float b, float c
{ if(b*b-4*a*c<0) return 1;
*x1=(-b+sqrt(b*b-4*a*c))/2/a;
*x2=(-b-sqrt(b*b-4*a*c))/2/a;
_______2______
}
void main()
{ float u1,u2; float a=1,b=5,c=-2;
if(f(_______3______)==1) &u1,&u2,a,b,c
printf("實數范圍內無解\n");
else printf("%.2f%.2f\n",u1,u2);
}
*24.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能:函數f將數組循環左移k個元素,數組x[7]調用函數f後的輸出結果為:4 5 6 7 1 2 3
#include <stdio.h>
void f(int *a,int n,int k)
{ int i,j,t;
for(i=0;i<k;i++) {
_______1______ t=a[0];
for(_______2______) j=1;j<n-1;j++
a[j-1]=a[j];
a[n-1]=t;
}
}
void main()
{ int i,x[7]={1,2,3,4,5,6,7};
f(x,7,3);
for(i=0;i<7;i++) printf("%5d",x[i]); printf("\n");
}
25.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中「/***** N ***** /」的下一行中有錯誤,請改正(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能:運行時輸入n,輸出n各位數字之和(如n=1308則輸出12,n=-3204則輸出9)。
#include <stdio.h>
#include <math.h>
void main()
{ int n,s=0;
scanf("%d",&n);
n=fabs(n);
/******** 1 *******/
while(n<0){ 改為:while(n>0) {
s=s+n%10;
/******** 2 ******/
n=n%10; 改為:n=n/10;
}
printf("%d\n",s);
}
26.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能:輸入整數n(n>0),求m使得 2的m次方小於或等於n、2的m+1次方大於或等於n。
#include <stdio.h>
void main()
{ int m=0,t=1,n;
while(_______1______); scanf(「%d』,&n),n<=0
while(!(t<=n&&t*2>=n)){
_______2______ t=t*2;
m++;
}
printf("%d\n",m);
}
*27.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能:調用函數f,求二維數組a中全體元素之和。
#include <stdio.h>
float f(_______1______) float **x,int m,int n
{ float y=0; int i,j;
for(i=0;i<m;i++) for(j=0;j<n;j++) y=y+*(*(x+i)+j);
return y;
}
void main()
{ float a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},*b[3];
int i;
for(i=0;i<3;i++)_______2______ b[i]=a[i];
printf("%.2f\n",f(b,3,4));
}
28.在考生目錄的Paper子目錄下,有Modify.c文件,該文件中「/***** N ***** /」的下一行中有錯誤,請改正(注意:不得加行、減行、加句、減句,否則後果自負)。
該程序功能:輸入n,再輸入n個點的平面坐標,然後輸出那些距離坐標原點不超過5的點的坐標值。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void main()
{
int i,n;
/***** 1 *****/
struct axy { float x,y; } a; 改為:struct axy { float x,y; } *a;
scanf("%d",&n);
a=(float*) malloc(n*2*sizeof(float));
for(i=0;i<n;i++)
/***** 2 *****/
scanf("%f%f",a[i].x,a[i].y); 改為:scanf("%f%f",&a[i].x,&a[i].y);
for(i=0;i<n;i++)
if(sqrt(a[i].x*a[i].x+a[i].y*a[i].y)<=5)
printf("%f,%f\n",a[i].x,a[i].y);
}
增加新題(程序調試題):
1、在考生文件夾的Paper子文件夾下已有Modify1.c文件。
該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充。
(注意:不得加行、減行、加句、減句,否則後果自負)。
程序功能:調用函數f,去除數組中的負數,輸入數組x[7],輸出結果為:1 3 4 6
#include <stdio.h>
void f(int *a,int *m)
{ int i,j;
for(i=0;i<*m;i++)
if(a[i]<0) {
for(j=i--;j<*m-1;j++) a[j]=a[j+1];
_____1_____; (*m)--
}
}
void main()
{ int i,n=7,x[7]={1,-2,3,4,-5,6,-7};
_______2_______; f(x,&n)
for(i=0;i<n;i++) printf("%5d",x[i]);
printf("\n");
}
2、在考生文件夾的Paper子文件夾下已有Modify1.c文件。
該文件中"____ N ____"是根據程序功能需要填充部分,請完成程序填充。
(注意:不得加行、減行、加句、減句,否則後果自負)。
程序功能:該程序計算四位學生的平均成績,保存在結構中,然後列表輸出這些學生
的信息。
#include <stdio.h>
struct STUDENT
{
char name[16];
int math;
int english;
int computer;
int average;
};
void GetAverage(struct STUDENT *pst) /* 計算平均成績 */
{
int sum=0;
sum = ______1______; pst-> math+ pst-> english + pst-> computer
pst->average = sum/3;
}
void main()
{
int i;
struct STUDENT st[4]={{"Jessica",98,95,90},{"Mike",80,80,90},
{"Linda",87,76,70},{"Peter",90,100,99}};
for(i=0;i<4;i++)
{
GetAverage(______2______); &st[i]
}
printf("Name\tMath\tEnglish\tCompu\tAverage\n");
for(i=0;i<4;i++)
{
printf("%s\t%d\t%d\t%d\t%d\n",st[i].name,st[i].math,st[i].english,
st[i].computer,st[i].average);
}
}
3、在考生文件夾的Paper子文件夾下已有Modify1.c文件。
該文件中「/***** N ***** /」的下一行中有錯誤,請改正。
(注意:不得加行、減行、加句、減句,否則後果自負)。
程序功能:運行時輸入n,輸出n的所有質數因子。
(例如:n=13860,則輸出2、2、3、3、5、7、11)
#include <stdio.h>
void main()
{ int n,i;
scanf("%d",&n);
/****** 1 ******/
i=1; 改為: i=2;
while(n>1)
if(n%i==0) {
printf("%d\t",i);
n/=i;
}
else
/******** 2 *******/
n++; 改為: i++;
}
『貳』 2011年C語言上機題庫
計算機二級C語言上機(填空,改錯,編程)南開一百題完整版
http://ishare.iask.sina.com.cn/f/11224267.html?from=like
2011年計算機二級C語言上機考試南開100題
http://ishare.iask.sina.com.cn/f/14134980.html
『叄』 c語言第七章作業
#include "stdio.h"
void main()
{
int i,j,m;
printf("請輸入乘法表的大小:");
scanf("%d",
『肆』 c語言題庫
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Dome2
{
class Student
{
public string name;
public float[] score=new float[3];
public float sum, avg;
public void InitScore()
{
this.sum = 0;
this.avg = 0;
}
public void GetScore()
{
Console.WriteLine("學員姓名:");
this.name = Console.ReadLine();
for (int i = 0; i < score.Length; i++)
{
Console.WriteLine("第{0}門的成績是:",i+1);
this.score[i] = float.Parse(Console.ReadLine());
}
Console.WriteLine();
}
public void GetSum()
{
for (int i = 0; i < score.Length; i++)
{
this.sum+=this.score[i];
}
this.avg = this.sum / 3;
}
public void DisplayScore()
{
Console.WriteLine("學員姓名:{0}", this.name);
for (int j = 0; j < 3; j++)
{
Console.WriteLine("第{0}門課程考試成績是{1}", j + 1, this.score[j]);
} Console.WriteLine("三門課程的總成績是{0},平均成績是{1}",this.sum, this.avg.ToString("0.00"));
Console.WriteLine();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Dome2
{
class Program
{
static void Main(string[] args)
{
Student[] student = new Student[5];
float max = 0,average = 0;
int i;
int counter = 0;
for (i = 0; i < student.Length; i++)
{
student[i] = new Student();
student[i].GetScore();
student[i].GetSum();
}
for (i = 0; i < student.Length; i++)
{
student[i].DisplayScore();
}
Console.WriteLine("");
Console.WriteLine("");
Console.WriteLine("");
Console.WriteLine("");
Console.WriteLine("========================================================");
for (i = 0; i < student.Length;i++ )
{
counter++;
max = student[i].sum + max;
average = student[i].avg + average;
}
Console.WriteLine("班級參加考試人數:{0} 最高分:{1} 平均分:{2}", counter, max, average);
}
}
}
『伍』 c語言試題
++ 6.0 集成開發環境。
2.掌握結構化程序設計的方法,具有良好的程序設計風格。
3.掌握程序設計中簡單的數據結構和演算法並能閱讀簡單的程序。
4.在 Visual C++ 6.0 集成環境下,能夠編寫簡單的C程序,並具有基本的糾錯和調試程序的能力
◆ 考試內容
一、C語言程序的結構
1.程序的構成,main函數和其他函數。
2.頭文件,數據說明,函數的開始和結束標志以及程序中的注釋。
3.源程序的書寫格式。
4.C語言的風格。
二、數據類型及其運算
1.C的數據類型(基本類型,構造類型,指針類型,無值類型)及其定義方法。
2.C運算符的種類、運算優先順序和結合性。
3.不同類型數據間的轉換與運算。
4.C表達式類型(賦值表達式,算術表達式,關系表達式,邏輯表達式,條件表達式,逗號表達式)和求值規則。
三、基本語句
1.表達式語句,空語句,復合語句。
2.輸入輸出函數的調用,正確輸入數據並正確設計輸出格式。
四、選擇結構程序設計
1.用if語句實現選擇結構。
2.用switch語句實現多分支選擇結構。
3.選擇結構的嵌套。
五、循環結構程序設計
1.for循環結構。
2.while和do-while循環結構。
3.continue語句和break語句。
4.循環的嵌套。
六、數組的定義和引用
1.一維數組和二維數組的定義、初始化和數組元素的引用。
2.字元串與字元數組。
七、函數
1.庫函數的正確調用。
2.函數的定義方法。
3.函數的類型和返回值。
4.形式參數與實在參數,參數值傳遞。
5.函數的正確調用,嵌套調用,遞歸調用。
6.局部變數和全局變數。
7.變數的存儲類別(自動,靜態,寄存器,外部),變數的作用域和生存期。
八、編譯預處理
1.宏定義和調用(不帶參數的宏,帶參數的宏)。
2.「文件包含」處理。
九、指針
1.地址與指針變數的概念,地址運算符與間址運算符。
2.一維、二維數組和字元串的地址以及指向變數、數組、字元串、函數、結構體的指針變數的定義。通過指針引用以上各類型數據。
3.用指針作函數參數。
4.返回地址值的函數。
5.指針數組,指向指針的指針。
十、結構體(即「結構」)與共同體(即「聯合」)
1.用typedef說明一個新類型。
2.結構體和共用體類型數據的定義和成員的引用。
3.通過結構體構成鏈表,單向鏈表的建立,結點數據的輸出、刪除與插入。
十一、位運算
1.位運算符的含義和使用。
2.簡單的位運算。
十二、文件操作
只要求緩沖文件系統(即高級磁碟I/O系統),對非標准緩沖文件系統(即低級磁碟I/O系統)不要求。
1.文件類型指針(FILE類型指針)。
2.文件的打開與關閉(fopen,fclose)。
3.文件的讀寫(fputc,fgetc,fputs,fgets,fread,fwrite,fprintf,fscanf函數的應用),文件的定位(rewind,fseek函數的應用)。
◆ 考試方式
1.筆試:90分鍾,滿分100分,其中含公共基礎知識部分的30分。
2.上機:90分鍾,滿分100分
3、上機操作包括:
(1)填空。
(2)改錯。
(3)編程。
另外,虛機團上產品團購,超級便宜
『陸』 求C語言上機題庫 2010年的
2: 第2題 請編寫函數fun,它的功能是:求出1到100之內能北7或者11整除,但不能同時北7和11整除的所有證書,並將他們放在a所指的數組中,通過n返回這些數的個數。
答案:
void fun(int *a, int *n)
{
int i,j=0;
for(i=2;i<1000;i++)
if ((i%7==0 || i%11==0) && i%77!=0)
a[j++]=i;
*n=j;
}
9: 第9題 編寫一個函數fun,它的功能是:根據以下公式求p的值,結果由函數值帶回。M與n為兩個正整數,且要求m>n。 p=m!/n!(m-n)!
答案:
float fun(int m, int n)
{
float p,t=1.0;
int I;
for (i=1;i<=m;i++)
t=t*I;
p=t;
for(t=1.0,i=1;i<=n;i++)
t=t*I;
p=p/t;
for(t=1.0,i=1;i<=m-n;i++)
t=t*I;
p=p/t;
return p;
}
10: 第10題 編寫函數fun,它的功能是:利用以下的簡單迭代方法求方程cos(x)-x=0的一個實根。
迭代步驟如下:(1)取x1初值為0.0; (2)x0=x1,把x1的值賦各x0;
(3)x1=cos(x0),求出一個新的x1;
(4)若x0-x1的絕對值小於0.000001,則執行步驟(5),否則執行步驟(2);
(5)所求x1就是方程cos(x)-x=0的一個實根,作為函數值返回。
程序將輸出root=0.739085。
答案:
float fun()
{
float x1=0.0,x0;
do
{
x0=x1;
x1=cos(x0);
}
while(fabs(x0-x1)>1e-6);
return x1;
}
19: 第19題 編寫函數fun,該函數的功能是:從字元中刪除指定的字元,同一字母的大、小寫按不同字元處理。
答案:
void fun(char s[],int c)
{
int i=0;
char *p;
p=s;
while(*p)
{
if(*p!=c)
{
s[i]=*p;
i++;
}
p++;
}
s[i]='\0';
}
23: 第23題 請編寫函數fun,該函數的功能是:判斷字元串是否為迴文?若是則函數返回1,主函數中輸出yes,否則返回0,主函數中輸出no。迴文是指順讀和倒讀都是一樣的字元串。
答案:
int fun(char *str)
{
int I,n=0;fg=1;
char *p=str;
while (*p)
{
n++;
p++;
}
for(i=0;i<n/2;i++)
if (str[i]==str[n-1-i]);
else
{
fg=0;
break;
}
return fg;
}
24: 第24題 請編寫一個函數fun,它的功能是:將一個字元串轉換為一個整數(不得調用c語言提供的將字元串轉換為整數的函數)。
答案:
long fun (char *p)
{
long s=0,t;
int i=0,j,n=strlen(p),k,s1;
if(p[0]=='-')
i++;
for(j=I;j<=n-1;j++)
{
t=p[j]-'0';
s1=10;
for(k=j;k<n-1;k++)
t*=s1;
s+=t;
}
if(p[0]=='-')
return –s;
else
return s;
}
25: 第25題 請編寫一個函數fun,它的功能是:比較兩個字元串的長度,(不得調用c語言提供的求字元串長度的函數),函數返回較長的字元串。若兩個字元串長度相同,則返回第一個字元串。
答案:
char *fun(char *s,char *t)
{
char *p,*t1=t,*s1=s;
int n=0;m=0;
while (*s1)
{
n++;
s1++;
}
while(*t1)
{
m++;
t1++;
}
if(n>=m)
p=s;
else
p=t;
return p;
}
27: 第27題 請編寫一個函數fun,它的功能是:求除1到m之內(含m)能北7或11整除的所有整數放在數組a中,通過n返回這些數的個數。
答案:
void fun(int m, int *a, int *n)
{
int I,j=0; *n=0;
for(i=1;i<=m;i++)
if (i%7==0 || i%11 ==0)
{
a[j]=I;
j++;
}
*n=j;
}
29: 第29題 請編寫一個函數fun,它的功能是:將ss所指字元串中所有下標為奇數位置上的字母轉換為大寫(若該位置上不是字母,則不轉換)。
答案:
void fun(char *ss)
{
int I,n;
n=strlen(ss);
for(i=1;i<n;i+=2)
if(ss[i]>='a'&& ss[i]<='z')
ss[i]=ss[i]-32;
}
31: 第31題 請編寫函數fun,其功能是:將s所指字元串中除了下標為偶數、同時ascii值也為偶數的字元外,其餘的全都刪除;串中剩餘字元所形成的一個新串放在t所指的一個數組中。
答案:
void fun(char *s,char t[])
{
int I,j=0,n;
n=strlen(s);
for(i=0;I,n;i++)
if(i%2==0&&s[i]%2==0)
{
t[j]=s[i];
j++;
}
t[j]='\0';
}
32: 第32題 請編寫函數fun,其功能是:將s所指字元串中除了下標為奇數、同時ascii值也為奇數的字元之外,其餘的所有字元都刪除,串中剩餘字元所形成的一個新串放在t所指的一個數組中。
答案:
void fun(char *s,char t[])
{
int I,j=0,n;
n=strlen(s);
for(i=0;I,n;i++)
if(i%2!=0&&s[i]%2!=0)
{
t[j]=s[i];
j++;
}
t[j]='\0';
}
38: 第38題 請編寫函數fun,它的功能是:求出ss所指字元串中指定字元的個數,並返回此值。
答案:
int fun(char *ss, char c)
{
int n=0;
while (*ss)
{
if(*ss==c)
n++;
ss++;
}
return n;
}
48: 第48題 請編寫函數fun,其功能是:將兩個兩位數的正整數a,b合並成一個整數放在c中。合並的方式是:將a數的十位和個位依次放在c數的千位和十位上,b數的十位和個位數依次放在c數的百位和個位上。
答案:
void fun(int a,int b,long *c)
{*c=(a/10)*1000+(b/10)*100+(a%10)*10+b%10;}
49: 第49題 請編寫函數fun,其功能是:將s所指字元串中下標位偶數同時ascii值為奇數的字元刪除,s中剩餘的字元形成的新串放在t所指的數組中。
答案:
void fun(char *s,char t[])
{int i,j=0,n=strlen(s);
for(i=0;i<n;i++)
if(i%2==0&s%2!=0)
else
{f[j]=s;
j++;}
t[j]='\0';}
51: 第51題 請編寫函數fun,其功能是:將所有大於1小於整數m的非素數存入xx所指的數組中,非素數的個數通過k傳回。
答案:
void fun(int m,int *k,int xx[])
{int i,j;
int t=0;
for(i=2;i<m;i++)
{j=2;
while(j,<i)
{if(i%j==0)
{xx[t]=i;
t++;
break;}
j++;}
*k=t;}}
52: 第52題 編寫一個函數fun,它的功能是:實現兩個字元串的連接(不使用庫函數strcat),即把p2所指的字元串連接到p1所指的字元串後。
答案:
void fun(char p1[],char p2[])
{int i=0,n=0;
char *p=p1,*q=p2;
while (*p)
{p++;
n++;}
i=n;
while(*p)
{p1=*q;
q++;
i++;}
p1='\0';}
53: 第53題 請編寫函數fun,該函數的功能是:實現b=a+a,即把矩陣a加上a的轉置,存放在矩陣b中。計算結果在main函數中輸出。
答案:
void fun(int a[3][3],int b[3][3])
{int i,j,at[3][3];
for(i=0;i<=2;i++)
for(j=0;j<=2;j++)
at[j]=a[j];
for(i=0;i<3;i++)
for(j=0;j<3;j++)
b[j]=a[j]+at[j];}
58: 第58題 編寫函數藏服那,它的功能是:求n以內(不包括n)同時能被3與7整除的所有自然數之和的平方根s,並作為函數值返回。
答案:
double fun(int n)
{double s=0.0;
int i;
for(i=1;i<n;i++)
if(i%3==0&i%7==0)
s=s+i;
s=sqrt(s);
return s;}
59: 第59題 請別寫函數fun,該函數的功能是:將放在字元串數組中的m個字元串(每串的長度不超過n),按順序合並組成一個新的字元串。
答案:
void fun(char a[m][n],char *b)
{int i,j,k=0;
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
if(*(*(a+i)+j))
{b[k]=*(*(a+i)+j)
k++;}
else
break;
b[k]='\0';}}
61: 第61題 第請編寫函數fun,該函數的功能使:統計各年齡段的人數。N個年齡通過調用隨機函數獲得,並放在主函數的age數組中;要求函數把0至9歲年齡段的人數放在d[0]中,把10至19歲年齡段的人數放在d[1]中,把20至29歲的人數放在d[2]中,其餘以此類推,把100歲(含100以上年齡的人數都放在d[10]中。結果在主函數中輸出。
答案:
void fun(int *a,int *b)
{int i,j;
for(j=0;i<m;j++)
b[j]=0;
for(i=0;i<n;i++)
if(a>=0&a<=9)
b[0]+=1;
else if(a>=10&a<=19)
b[1]+=1;
else if(a>=20&a<=29)
b[2]+=1;
else if(a>=30&a<=39)
b[3]+=1;
else if(a>=40&a<=49)
b[4]+=1;
else if(a>=50&a<=59)
b[5]+=1;
else if(a>=60&a<=69)
b[6]+=1;
else if(a>=70&a<=79)
b[7]+=1;
else if(a>=80&a<=89)
b[8]+=1;
else if(a>=90&a<=99)
b[9]+=1;
else
b[10]+=1;}
84: 第84題 請編寫函數fun,其功能是:將兩個兩位數的正整數a b合並形成一個整數放在c中,合並的方式是:將a數的十位和個位數依次放在c的個位和百位上,b數的十位和個位數依次放在c數的千位和十位上。
答案:
void fun(int a,int b,long *c)
{c=(b/10)*1000+(a%10)*100+(b%10)*10+a/10;}
87: 第87題 請編寫函數fun,其功能是:將兩個兩位數的正整數a b合並形成一個整數放在c 中。合並的方式是:將a數的十位和個位數依次放在c數的千位和十位上,b數的十位和個位數依次放在c數的個位和百位上。
答案:
void fun(int a,int b,long *c)
{*c=(a/10)*1000+(a%10)*10+(b%10)*100+b/10;}
91: 第91題 請編寫函數fun,其功能是:將兩個兩位數的正整數a b合並形成一個整數放在c中。合並的方式是:將a數的十位和個位數依次放在c的十位和千位上,b數的十位和個位數依次放在c數的個位和百位上。
答案:
void fun(int a, int b, long *c)
{
*c=(a%10)*1000+(b%10)*100+(a/10)*10+b/10;
}
81: 第81題 請編寫函數fun,其功能使:將兩個兩位正整數a b合並形成一個整數放在c中。合並的方式使:將a數的十位和個位數依次放在c數的百位和個位上,b數的十位和個位數依次放在c數的千位和十位上。
答案:
void fun(int a,int b,long *c)
{*c=(b/10)*1000+(a/10)*100+(b%10)*10+a%10;}
78: 第78題 請編寫函數fun,其功能是:將s所指字元串中ascii值為偶數的字元刪除,串中剩餘字元形成一個新串放在t所指的數組中。
答案:
void fun(char *s,char t[])
{int i,j=0,n=strlen(s);
for(i=0;i<n;i++)
if (s%2!=0)
{t[j]=s;
j++;}
t[j]='\0';}
77: 第77題 請編寫一個函數fun,其功能是:將兩個兩位數的正整數ab合並形成一個整數放在c中。合並方式是:將a數的十位和個位數依次放在c數的個位和百位上,b數的十位和個位數依次放在c數的十位和千位上。
答案:
void fun(int a,int b,long *c)
{*c=(b%10)*1000+(a%10)*100+(b/10)*10+a/10;}
71: 第71題 請編寫函數fun,其功能時:將兩個兩位數的正整數a、b合並形成一個整數放在c中,合並的方式是:將a數的十位和個位數依次放在c數的十位和千位上,b的十位和個位整數依次放在c數的百位和個位上。
答案:
void fun(int a,int b,long *c)
{*c=(a%10)*1000+(b/10)*100+(a/10)*10+b%10;}
72: 第72題 請編寫函數fun,其功能是:將s所指字元串中下標為偶數的字元刪除,串中剩餘字元形成新串放在t所指數組中。
答案:
void fun(char *s,char t[])
{int i,j=0,n=strlen(s);
for(i=0;i<n;i++)
if(i%2!=0)
{t[j]=s;
j++;}
t[j]='\0';}
65: 第65題 請編寫函數fun,其功能是:將兩位數的正整數a、b合並成一個整數放在c中。合並的方式是:將a數的十位和個位數依次放在c數的百位和個位上,b數的十位和個位數依次放在c數的十位和千位上。
答案:
void fun(int a,int b,long *c)
{*c=(b%10)*1000+(a/10)*100+(b/10)*10+a%10;}
40: 第40題 請編寫函數fun,該函數的功能是移動字元串中內容,移動的規則如下:把第1到第m個字元,平移到字元串的最後,把第m+1到最後的字元移到字元串的前部。
答案:
void fun(char *w,int m)
{
char b[N];
int I,j=0;
for(i=0;i<m;i++)
{
b[j]=w[i];
j++;
}
for (i=0;i<strlen(w)-m;i++)
w[i]=w[i+m];
for(j=0;j<m;j++)
{
w[i]=b[j];
i++;
}
w[i]='\0';
64: 第64題 請編寫函數fun,其功能是:將s所指字元串中ascii值為奇數的字元刪除,串中剩餘字元形成一個新串放在t所指的數組中。
答案:
void fun(char *s,char t[])
{int i,j=0,n;
n=strlen(s);
for(i=0;i<n;i++)
if(s%2==0)
{t[j]=s;
j++;}
t[j]='\0';}
62: 第62題 請編寫函數fun,該函數的功能是:統一一含字元串中單詞的個數,作為函數值返回。一行字元串在主函數中輸入,規定所有單詞由小寫字母組成,單詞之間由若干個空格格開,一行的開始沒有空格。
答案:
int fun (char *s)
{int i,n=0;
for(i=0;i<strlen(s);i++)
{if(s='a'&s<='z'&s[i+1]==''
‖s[i+1]=='\0')
n++;}
return n;}
這是原題題庫
『柒』 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網上有許多產品團購,便宜有口碑
『捌』 【c語言現代方法第七章編程題4】 求大佬解答-- 編寫程序可以把字母格式的電話號碼翻譯成數值格式 2=ABC等
你的問題關鍵 是如何 把 電話機 鍵盤字母 翻譯成 數字。
可以用 表格:
int key[26]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9};
char s[27];
若 ( (s[i] >= 'A') && (s[i] <= 'Z') ) 則 翻譯成 數字 key[ s[i]-'A' ]
---
驗證鍵盤 字母-〉數字 程序:
#include<stdio.h>
int main(){
int i;
int key[26]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9};
char s[27]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (i=0;i<strlen(s);i++){
printf("%c %d\n",s[i],key[s[i]-'A']);
}
return 0;
}
『玖』 C語言編程題
#include<stdio.h>
struct student
{
char stuno[20];
char name[20];
float Math, Chinese,English;
float getAvgre(){return (Math+Chinese+English)/3;};
}stu[5];
int main()
{
int i;
float total,fscore;
printf("請出入5個學生的學生號、姓名、數學成績、語文成績、英語成績\n");
for(i=0;i<5;i++)
{
scanf("%s%s%f%f%f",&stu[i].stuno,stu[i].name,&stu[i].Math,&stu[i].Chinese, &stu[i].English);
}
total=0.0;
for(i=0;i<5;i++)
printf("學生號[%s]的平均成績是:%f\n",stu[i].stuno,stu[i].getAvgre());
total=0.0;
for(i=0;i<5;i++)
total=total+stu[i].Math;
fscore=total/5;
printf("Math成績平均分是:%f\n",fscore);
total=0.0;
for(i=1;i<5;i++)
total=total+stu[i].English;
fscore=total/5;
printf("English成績平均分是:%f\n",fscore);
total=0.0;
for(i=1;i<5;i++)
total=total+stu[i].Chinese;
fscore=total/5;
printf("Chinese成績平均分是:%f\n",fscore);
return 0;
}