slide1
Download
Skip this Video
Download Presentation
上机考试复习

Loading in 2 Seconds...

play fullscreen
1 / 61

上机考试复习 - PowerPoint PPT Presentation


  • 110 Views
  • Uploaded on

上机考试复习. 一、上机考试事项. 考试范围:条件判断、循环、数组、函数。 考试题型:程序填空题。与实验题完全相同 考试日期: 6 月 7 日 14:00-15:10 考试时间: 1 小时 4 题 带学生证或有效证件(有学号和照片的证件) 带上机卡 , 刷卡进入 ( 上机卡卡内余额不能为负值 ) 只能带文具入场和一张 A4 草稿纸 补考时间: 6 月 7 日 17:00-18:10. 注 : 如果考试时间冲突 ( 下午微积分 I), 请让学生在下周四 10:00--11:00,12:30--15:30 到计算中心 316 登记. 二、上机考试系统操作.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' 上机考试复习' - eavan


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide1

上机考试复习

一、上机考试事项

考试范围:条件判断、循环、数组、函数。

考试题型:程序填空题。与实验题完全相同

考试日期:6月7日14:00-15:10

考试时间:1小时4题

带学生证或有效证件(有学号和照片的证件)

带上机卡,刷卡进入(上机卡卡内余额不能为负值)

只能带文具入场和一张A4草稿纸

补考时间: 6月7日17:00-18:10

注:如果考试时间冲突(下午微积分I),请让学生在下周四10:00--11:00,12:30--15:30到计算中心316登记.

slide2

二、上机考试系统操作

1.考试系统操作过程

启动计算机,

以用户名del登录Windows,系统将自动删除E盘上的所有文件(夹)

利用浏览器进入考试系统

机房:网址10.71.5.8(未定)

选题

复制题程序

粘贴题程序到VC

编程、调试、保存源程序文件.c

递交源程序文件.c

查看程序是否通过

slide3

2.考试系统操作注意

(1)不能改变原程序的输入/输出语句,特别要注意有的题目输出语句在题目解释处给出,如50008题,输出语句:printf("%d ", i).

其它程序可以变动,如增加变量定义,函数可不用函数实现等

(2) 编程要注意考题的特殊解和边界解

(3)浏览递交源程序文件的路径

要记住使用盘、工程名、源程序文件名.c

VC++编辑的源程序在工程名的文件夹下

源程序文件名.c

源程序内容改动过,要运行后,再提交。否则源程序要保存过

(4) 工程文件要建在用户盘,

VC++在存储工程文件的盘需要工作目录temp

(5) 考题repeat循环和用#分割字符串,##表示结束

slide4

例 求最大值

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入一个正整数n, 再输入n个整数,输出最大值。

例:括号内是说明

输入

3 (repeat=3)

4 2 123 -100 0

4 9 1 -1 8

3 1 3 5

输出

123

9

5

#include <stdio.h>

int main( )

{

int ri, repeat;

int i , max, n, x;

scanf("%d", &repeat);

for(ri=1; ri<=repeat; ri++){

scanf("%d", &n);

/*---------*/

printf("%d\n", max);

}

}

slide5

例 查找字符

程序填空,不要改变与输入输出有关的语句。

输入一个字符并回车,再连续输入一批以 # 结束的字符串(字符串的长度不超过80),遇 ## 则全部输入结束。在每个字符串中查找该字符,如果找到,则输出该字符在字符串中所对应的最大下标(下标从0开始);否则输出“Not Found”。

#include "stdio.h"

#define MAXLEN 80

int main( )

{ int count,i,k,flag,sub;

char cc,ch,oldch,str[MAXLEN];

oldch=\' \';

cc=getchar();

getchar();

while((ch=getchar())!=\'#\'||oldch!=\'#\'){

k=0;

while(ch!=\'#\'&& k< MAXLEN-1){

str[k++]=ch;

ch=getchar();

}

oldch=\'#\';

str[k]=\'\0\';

/*---------*/

if(flag) printf("%d\n",sub);

else printf("Not Found\n");

}

}

slide6

三、考试系统题库猜测与分类归纳

题库随机抽题,每个同学的题目不同。

与作业的编程题疑难程度和类型差不多,关键在算法。

掌握各种题型的算法,做到举一反三

教学大纲要求掌握的常用算法:

分类(排序)算法

冒泡、选择、插入

检索(查找)算法

(1) 无序数据序列的查找(见遍历算法)

(2) 有序数据序列的查找:二分法

遍历算法

(1) 一维数组和二维数组的遍历

(2) 了解单向链表的遍历

(3) 文件的遍历

简单的数值计算方法:如多项式函数的计算

其它基本算法:如进制转换

slide7

1.多项式计算

 找出通项

 循环控制 n项或给定一个数(计算精度)

 由多项式之和求多项式的项数

slide8

求 ex=1+x+x2/2!+x3/3!+…+xn/n!

通项 t=xi/i! 或 t=t*x/i 初值t=1

然后 e=e+t

给出n项:

sacnf(“%f”,&x);

t=1;e=1;

for(i=1;i<=n;i++)

{t=t*x/i; e=e+t;}

给出之和e求多项式的项数n

#include<stdio.h>

void main()

{double t,e,x;int i;

scanf("%lf",&x);

scanf("%lf",&e);

t=x;i=1;e=e-1;

while(e>t)

{e=e-t;i++;t=t*x/i;}

if(e==0)

printf("%d\n",i-1);

else

printf("%d-%d\n",i-1,i);

}

给出计算精度eps:

scanf("%f",&x);

scanf("%f",&eps);

t=1;e=0;i=1;

while(t>eps)

{e=e+t;t=t*x/i;i++;}

注:判断满足相加

slide9

求 s=a+aa+aaa+…+aa…….a



n个a

给出之和s求多项式的项数n

n=0;t=0;

while(s>t)

{ s-=t;n++; t=10*t+a;}

if(s==0)

printf("%d\n",n);

else

printf("%d-%d\n",n,n+1);

通项 t=t*10+a

然后 s=s+t

程序: t=0;s=0;

for(i=1;i<=n;i++)

{t=t*10+a; s=s+t;}

printf("%d\n",s);

类似:

求 Fibonacci(斐波那契)数列和分数的序列

求s=11+22+33+44+…+NN

求 s=1+1/2+(1*2)/(2*4)+(2*3)/(3*5)+…

slide10

2.对数组的遍历算法

数组的下标作为循环变量,对数组的每个元素依次访问

输入一个正整数n (1<n<=10),再输入n个整数,求出数组元素最大值

#include <stdio.h>

int main( )

{int i, n, a[10],max;

scanf("%d", &n);

for(i=0; i<n; i++)

scanf("%lf", &a[i]);

max=a[0];

for(i=1;i<n;i++)

if(max<a[i])max=a[i];

printf("%d",max);

slide11

输入一个正整数n (1<n<=10),再输入n个实数,求出最接近该数组平均值的数组元素。

near=a[0];def=fabs(aver-a[0]);

for(i=1;i<n;i++)

if(fabs(aver-a[i])<def)

{near=a[i];

def=fabs(aver-a[i]);

}

printf("%f\n", near);

}

#include <stdio.h>

#include <math.h>

int main( )

{int i, n;

double a[10],aver,def,near;

scanf("%d", &n);

for(i=0; i<n; i++)

scanf("%lf", &a[i]);

aver=0.0;

for(i=0;i<n;i++)

aver+=a[i];

aver=aver/n;

类似有

求数组的奇数之和、偶数之和

求数组的负数之和、正数之和

输入数组,统计相临大于的次数

输入数组,最小与最后数交换

输入数组,输出相同值的数组元素

slide12

3.求素数

即素数:指只能被1和自身整除的正整数

输入一个正整数n,如果它是素数,输出"YES“,否则输出"NO"

main( )

{ int flag,n;

scanf("%d", &n);

if(n==1) flag=0;

else if(n==2) flag=1;

else {int i;

for(i=2;i<n-1;i++)

if(n%i==0) {flag=0;break;}

if(i==n) flag=1;}

if(flag) printf("YES\n");

else printf("NO\n");

}

slide13

求n之内的素数之和。

#include "math.h"

main()

{int i,m,n,k=0;

scanf(“%d”,&n);

m=0;

for(i=2;i<=n;i++)

if(f(i)>0) m=m+i;

printf("%d\n",m);

}

}

int f(int m)

{int i,c;

if(m==2) return 1;

c=m-1;

for(i=2;i<=c;i++)

if(m%i==0)break;

if(i==c+1) return 1;

else return 0;

}

slide14

给出任何一个大于6的偶数,求出所有素数之和的组合。给出任何一个大于6的偶数,求出所有素数之和的组合。

例如 偶数10 ,素数之和为 10=3+7,10=5+5

#include "math.h"

main()

{int i,m,n,k=0;

scanf("%d",&m);

for(i=2;i<=m/2;i++)

if(f(i)>0)

{n=m-i;

if(f(n)>0)

printf("%d=%d+%d\n",m,i,n);

}

}

int f(int m)

{int i,c;

c=sqrt((float)m);

for(i=2;i<=c;i++)

if(m%i==0)break;

if(i==c+1) return 1;

else return 0;

}

slide15

给出任何一个正整数,求出小于等于该数的最大素数给出任何一个正整数,求出小于等于该数的最大素数

例如正整数100 ,最大素数为 97

#include <stdio.h>

main()

{int m;

scanf("%d",&m);

while(m)

if(f(m)>0)

{printf("%d\n",m);

break;

}

else m--;

}

int f(int m)

{int i,c;

if(m==2) return 1;

c=m-1;

for(i=2;i<=c;i++)

if(m%i==0)break;

if(i==c+1) return 1;

else return 0;

}

slide16

4.求整数的因子

因子:为被该数整除的数

因子的范围:1~整数/2

输入任意一个整数,输出该数的全部因子。

main()

{int x,i;

scanf("%d",&x);

for(i=1;i<=x/2;i++)

if(x%i==0)

printf("%d ",i);

printf("\n");

}

slide17

求n之内的完数

完数:整数的因子之和等于本身

main()

{int x,i;

scanf("%d",&n);

for(m=2;m<=n;m++)

{s=0;

for(i=1;i<m/2;i++)

if(m%i==0) s=s+i;

if(s==m) printf("%d ",m);

}

printf("\n");

}

slide18

将一个正整数分解质因数,例如 输入90,输入90=2*3*3*5

#include "stdio.h"

int main()

{long n,j;

scanf("%ld",&n);

printf("%ld=",n);

j=2;

while(n>j)

{

if(n%j==0){printf("%ld*",j);n=n/j;}

else j=j+1;

}

printf("%ld\n",n);

}

注:因子重复用

slide19

5.分离整数各位

整数n n%10 -> 余数 分离最低位

n/=10 -> 去掉最低位

当n>0 循环分离整数所有的位

输入任意一个正整数,按逆序输出其各位数字.

例: 输入12345, 输出 5 4 3 2 1

void f(int x)

{if(x>0)

{printf("%d",x%10);

f(x/10);

}

}

void main()

{int n;

scanf("%d",&n);

f(n);

}

void main()

{int n;

scanf("%d",&n);

while(n)

{printf("%-2d",n%10);

n=n/10;

}

}

slide20

输入一个整数 n,从高位开始逐位分割并输出它的各位数。

void main()

{int n,m=1,x;

scanf("%d",&n);

x=n;

while(x>=10)

{ x=x/10;

m=m*10;

}

while(m>0)

{printf("%-2d",n/m);

n=n%m;

m=m/10;

}

}

void f(int x)

{ if(x>=10) f(x/10);

printf("%-2d",x%10);

}

void main()

{int n;

scanf("%d",&n);

f(n);

}

slide21

打印水仙花,三位的整数,各位立方之和等于本身 打印水仙花,三位的整数,各位立方之和等于本身

如 153=13+53+33

main()

{int n,x,y,s;

for(n=101;n<999;n++)

{x=n;s=0;

while(x)

{y=x%10;

s=s+y*y*y;

x=x/10;

}

if(n==s)printf("%d\n",n);

}}

slide22

输入一个正整数,将其各位数相加,一直加到只剩一位数为止输入一个正整数,将其各位数相加,一直加到只剩一位数为止

如 123456789 --> 45 --> 9

main()

{long x;

int n;

scanf("%ld",&x);

do{n=0;

do{n=n+x%10;

x=x/10;

}while(x!=0);

x=n;

}while(x>=10);

printf("%d\n",n);

}

slide23

读入三个正整数 m,n和k,判别m,n 的高k位是否相等? 如相等, 输出"YES", 如不相等, 输出"NO".

例: 输入 12345 12356 3 输出 "YES"

输入 2345 12356 4 输出 "NO"

for(a=1;a<=k;a++)

if(mm[--i]!=nn[--j])break;

if(a>=k+1)

printf("YES\n");

else

printf("NO\n");

}

main()

{long int m,n;

int k,mm[10],nn[10],i,j,a;

scanf("%ld%ld%d",&m,&n,&k);

i=0;

while(m)

{mm[i++]=m%10;

m=m/10; }

j=0;

while(n)

{nn[j++]=n%10;

n=n/10; }

又如,统计并输出整数 in 中数字 digit 的个数

slide24

6.数制转化

(1)整数: 除进制数取余

i=0;

while(n>0)

{y=n%x;

if(y>=10)ch[i++]=y+\'a\'-10;

else ch[i++]=y+\'0\';

n=n/x;

}

ch[i]=\'\0\';需字符串逆序

for(j=0;j<i/2;j++)

{c=ch[j];

ch[j]=ch[i-1-j];

ch[i-1-j]=c;

}

printf("%s",ch);

正整数n,转换为x进制数的字符串

先分离,然后个位转换

0~9\'0\'~\'9\': y+\'0\'

10~15\'A\'~\'F\': y+\'A\'+10

或\'a\'~\'f\': y+\'a\'+10

slide25

输入正整数n,输出7进制相应的字符串后输出。

i=0;

while(n>0)

{y=n%7;

ch[i++]=y+\'0\';

n=n/7;

}

ch[i]=\'\0\';

for(j=0;j<i/2;j++)

{c=ch[j];

ch[j]=ch[i-1-j];

ch[i-1-j]=c;

}

printf("%s",ch);

slide26

 x进制字符串a转为数值d

a0xn-1+a1xn-2+… +an-3x2 +an-2x+an-1

d=0;t=1;

n=strlen(a);

for(i=n-1;i>=0;i--)

{if(a[i]>=‘0’&&a[i]<=‘9’)

d=d+(a[i]-’0’)*t;

else if (a[i]>=‘A’&&a[i]<=‘F’ )

d=d+(a[i]-’A’+10)*t;

else

d=d+(a[i]-’a’+10)*t;

t=t*x;

}

printf(“%d”,d);

(… ((a0x+a1)x+ a2)x +…+an-2)x+an-1

d=0;

for(i=0;a[i]!=‘\0’;i++)

if(a[i]>=‘0’&&a[i]<=‘9’)

d=d*x+a[i]-’0’;

else if (a[i]>=‘A’&&a[i]<=‘F’ )

d=d*x+a[i]-’A’+10;

else

d=d*x+a[i]-’a’+10;

printf(“%d”,d);

slide27

输入一个字符串,内有数字和非数字字符,将其中连续的数字作为一个整数,依次存放到一维数组。并统计整数的个数和输出这些整数。

如输入 a123x 17960?302tab5876得4个整数:123,17960,302,5876

#include <stdio.h>

main()

{char s[80];

int i,n=0;long a[10]={0},m=0;

gets(s);

for(i=0;s[i]!=\'\0\';i++)

if(s[i]>=\'0\'&&s[i]<=\'9\')

m=m*10+s[i]-\'0\';

else

if(m>0)

{a[n++]=m;

m=0;

}

printf("\nn=%d\n",n);

for(i=0;i<n;i++)

printf("%ld ",a[i]);

printf("\n");

}

slide28

编写一个十进制字符串转成十六进制字符串输出的程序。

先将十进制字符串转成十进制数,再转成十六进制字符串

#include "stdio.h"

void cc(int d,char c[])

{int y,i=0,j;char ch;

while(d>0)

{y=d%16;

if(y>9)c[i++]=y-10+\'a\';

else c[i++]=y+\'0\';

d=d/16;

}

c[i]=\'\0\';

for(j=0;j<i/2;j++)

{ch=c[j];c[j]=c[i-1-j];

c[i-1-j]=ch;}

}

int cnum(char *p)

{int d=0;

while(*p!=\'\0\')

d=d*10+*p++-\'0\';

return d;

}

void main()

{int d;char a[20];

gets(a);

d=cnum(a);

cc(d,a);

printf("%s\n",a);

}

slide29

(2)小数: 乘进制数取整

例 读入1 个十进制数s(0<s<1),输出其二进制数,保留最多六位二进制小数。

小数s,转换为x进制数的字符串,保留最多n位小数

#include <stdio.h>

void main()

{float s;int d,count;

scanf("%f",&s);

count=1;

printf("0.");

while(count<=6&&s>0)

{d=s*2;

printf("%d",d);

s=s*2-d;

count++;

}

printf("\n");

}

scanf("%f",&s);

count=1;

ch[0]=\'0\';ch[1]=\'.\';i=2;

while(count<=n&&s!=0)

{d=s*x;

if(d>=10)ch[i++]=d+\'a\'-10;

else ch[i++]=d+\'0\';

s=s*x-d;

count++;

}

ch[i]=\'\0\';

printf("%s\n",ch);

slide30

7.对称性判别

字符串是否为回文(正读、反读一样)

如”abcdcba”,若是返回YES,否返回NO。

#include <string.h>

f(char s[])

{ int i,j,n= strlen(s);

for(i=0,j=n-1;i<n/2;i++,j--)

if(s[i]!=s[j]) return 0;

return 1;

}

main()

{char *c;

gets(c);

if(f(c)) printf(" YES");

else printf(" NO");

}

slide31

判别输入正整数是否对称,如对称,输出”YES”,如不对称,输”NO”。判别输入正整数是否对称,如对称,输出”YES”,如不对称,输”NO”。

例 输入12321,输出 YES

输入12345,输出 NO

void main()

{long n,m=0,x;

scanf("%ld",&n);

x=n;

while(n>0)

{m=m*10+ n%10;

n=n/10;

}

if(x==m) printf(" YES");

else printf(" NO");

}

void main()

{long n;

int a[20],i=0;

scanf("%ld",&n);

while(n>0)

{a[i++]= n%10;

n=n/10;

}

for(n=0;n<i/2;n++)

if (a[n]!=a[i-n-1]) break;

if(n>=i/2) printf(" YES");

else printf(" NO");

}

slide32

8.矩阵运算

主对角线 i==j

上三角 i<=j

下三角 i>=j

副对角线 i+j==n-1

slide33

判断 n(n<6)阶方阵 a 是否对称矩阵. 输入 n 和 a 中的元素,如果对称, 输出"YES", 否则, 输出"NO".

对称矩阵:a[i][j]==a[j][i]

main()

{int a[6][6],i,j,n,flag=1;

scanf("%d",&n);

for(i=0;i<n;i++)

for(j=0;j<n;j++)

scanf("%d",&a[i][j]);

for(i=0;i<n;i++)

for(j=i+1;j<n;j++)

if(a[i][j]!=a[j][i])flag=0;

if(flag)printf("YES");

else printf("NO");

printf("\n");

}

slide34

判断 n(n<6)阶方阵 a 是否关于副对角线对称,副对角线为从矩阵的右 上角至左下角的连线. 输入 n 和 a 中的元素,如果对称, 输出"YES", 否则, 输出"NO".

副对角线对称:

a[i][j]==a[n-1-j][n-1-i]

main()

{int a[6][6],i,j,n,flag=1;

scanf("%d",&n);

for(i=0;i<n;i++)

for(j=0;j<n;j++)

scanf("%d",&a[i][j]);

for(i=0;i<n;i++)

for(j=0;j<n-1-i;j++)

if(a[i][j]!=a[n-1-j][n-1-i])flag=0;

if(flag)printf("YES");

else printf("NO");

printf("\n");}

slide35

判断 n(n<6) 阶方阵 a 是否为下三角矩阵, 即主对角线以上的元素都 为0, 主对角线为从矩阵的左上角至右下角的连线. 输入n 和 a 中的 元素, 如果是下三角矩阵, 输出"YES", 否则, 输出"NO".

main()

{int a[6][6],i,j,n,flag=1;

scanf("%d",&n);

for(i=0;i<n;i++)

for(j=0;j<n;j++)

scanf("%d",&a[i][j]);

for(i=0;i<n;i++)

for(j=i+1;j<n;j++)

if(a[i][j]!=0)flag=0;

if(flag)printf("YES");

else printf("NO");

printf("\n");

}

j>i

slide36

判断 n(n<6)阶方阵 a 是否关于水平中心线对称,即第一行与最后一行 对应元素相等, 第二行与倒数第二行对应元素相等,...... 输入 n 和 a 中的元素, 如果对称, 输出"YES", 否则, 输出"NO".

main()

{int a[6][6],i,j,n,flag=1;

scanf("%d",&n);

for(i=0;i<n;i++)

for(j=0;j<n;j++)

scanf("%d",&a[i][j]);

for(i=0;i<n/2;i++)

for(j=0;j<n;j++)

if(a[i][j]!=a[n-1-i][j])flag=0;

if(flag)printf("YES");

else printf("NO");

printf("\n");

}

行对称:

a[i][j]==a[n-1-i][j]

slide37

判断 n(n<6) 阶方阵 a 是否为行对角占优阵, 即该矩阵的每一行主对角元素的绝对值都大于或等于同行其它元素绝对值之和.(主对角元素的行下标和列下标相同) 输入 n 和 a 中的元素, 如果是行对角占优阵, 输出"YES", 否则, 输出"NO"

#include <math.h>

main()

{int a[6][6],i,j,n,s;

scanf("%d",&n);

for(i=0;i<n;i++)

for(j=0;j<n;j++)

scanf("%d",&a[i][j]);

for(i=0;i<n;i++)

{s=0;

for(j=0;j<n;j++)

if(i!=j)s=s+abs(a[i][j]);

if(s>abs(a[i][i])) break;

}

if(i>=n) printf("YES");

else printf("NO");

printf("\n");

}

slide38

其它:

求矩阵的转置阵。

求矩阵主对角线上所有元素的和

求矩阵副对角线上所有元素的和

求矩阵每一行上所有元素的和。

求矩阵每一列上所有元素的和。

求矩阵中绝对值最大的元素。

求矩阵鞍点

形成矩阵输入a,在线元素为a,其他为a-1

slide39

9.字符转换

将每个字符串中的大写字母用下面列出的对应大写字母替换, 其余字符不变, 输出替换后的字符串.

原字母 对应字母

A ──→ Z

B ──→ Y

……

Y ──→ B

Z ──→ A

c=\'A\'+\'Z\'-c;

将每个字符串中的数字用下面列出的对应数字替换, 其余字符不变, 输出替换后的字符串.

原数字 对应数字

0 ──→ 9

1 ──→ 8

……

8 ──→ 1

9 ──→ 0

c=\'0\'+\'9\'-c;

又如 设置密码

大小写字母转换

slide40

10.字符串操作

输入字符串s和正整数n,把字符串s的最多前n个字符拷贝到t中去, 再输出t.

main()

{char s[100],t[50];

int i,n;

gets(s);

scanf("%d",&n);

for(i=0;s[i]!=\'\0\'&&i<n;i++)

t[i]=s[i];

t[i]=\'\0\';

printf("%s\n",t);

}

slide41

求两个字符串s1和s2对应位置字符的ACSII值乘积之和.例:输入 1bf

zc

输出 15680

main()

{char s[100],t[100];

long int d=0;

int i,n;

gets(s);gets(t);

for(i=0;s[i]!=\'\0\'&&t[i]!=\'\0\';i++)

d+=t[i]*s[i];

printf("%ld\n",d);

}

slide42

 编一个程序检查给定字符串 S 是否满足下列两个条件:

(1) 字符串 S 中左括号\'(\'的个数与右括号\')\'的个数相同.

(2) 从字符串首字符起顺序检查 S 中的字符, 遇到的右括号的个数在任何时候均不超过所遇到的左括号的个数.

如满足条件, 输出YES; 否则, 输出NO.

#include <string.h>

int check(s)

char s[];

{int l,r,i;

l=0;r=0;i=0;

while(s[i]!=\'\0\')

{if(s[i]==\'(\')l++;

if(s[i]==\')\')r++;

if(r>l)break;

i++; }

return(l==r);

}

例: 输入 (2+(3*6)-10) 输出YES

输入 (2+(3)*6)-10) 输出NO

输入 )(A)BC( 输出NO

main()

{char s[100];

gets(s);

if(check(s)) printf("%s","YES");

else printf("%s","NO");

}

slide43

11.统计

输入一行字符,分别统计出其中的字母、数字、空格和其它字符的个数。

连续输入一批以 # 结束的字符串(字符串的长度不超过80),遇 ## 则全部输入结束。统计并输出每个字符串中大写辅音字母的个数(大写辅音字母:除\'A\',\'E\',\'I\',\'O\',\'U\'以外的大写字母)。

#include "stdio.h"

int main( )

{ int count,i,k; char ch,oldch,str[80];

oldch=\' \';

while((ch=getchar())!=\'#\'||oldch!=\'#\')

{ k=0;

while(ch!=\'#\'&& k<79)

{str[k++]=ch; ch=getchar();}

oldch=\'#\'; str[k]=\'\0\'; count=0;

for(i=0;str[i]!=\'\0\';i++)

if(str[i]>=\'A\' && str[i]<=\'Z\') if(str[i]!=\'A\'&&str[i]!=\'E\'&&str[i]!=\'I\'&&str[i]!=\'O\'&&str[i]!=\'U\') count++;

printf("%d\n",count);

}

}

slide44

输入一行字符,统计其单词的个数,各单词间以空格为分隔,且空格数可以是多个。输入一行字符,统计其单词的个数,各单词间以空格为分隔,且空格数可以是多个。

算法:判别前一个是空格后一个是字符,统计一个单词

#include <stdio.h>

int main( )

{int i,count;

char str[100],c;

gets(str);

count=0; c=\' \';

for(i=0;str[i]!=‘\0’;i++)

{if(c==\' \'&&str[i]!=\' \') count++;

c=str[i];

}

printf("count = %d\n", count);

}

slide45

12.排序

气泡法、选择法

main()/*选择法*/

{int a[20],i,j,t,n;

scanf("%d",&n);

for(i=0;i<n;i++)

scanf("%d",&a[i]);

printf("\n");

for(i=0;i<n-1;i++)

for(j=i+1;j<n;j++)

if(a[i]>a[j])

{t=a[j];a[j]=a[i];a[i]=t;}

for(i=0;i<n;i++)

printf("%d ",a[i]);

printf("\n");

}

对n个数排序,从小到大

main()/*气泡法*/

{int a[20],i,j,t,n;

scanf("%d",&n);

for(i=0;i<n;i++) scanf("%d",&a[i]);

printf("\n");

for(i=0;i<n-1;i++)

for(j=0;j<n-1-i;j++)

if(a[j]>a[j+1])

{t=a[j];a[j]=a[j+1];a[j+1]=t;}

for(i=0;i<n;i++)

printf("%d ",a[i]);

printf("\n");

}

slide46

设一歌唱评奖晚会上有n(n>20)个评委为歌手打分.评分规则:每个评委依次打分,再去掉2个最高分和2个最低分,计算余下的分数平均值为歌手的得分.设一歌唱评奖晚会上有n(n>20)个评委为歌手打分.评分规则:每个评委依次打分,再去掉2个最高分和2个最低分,计算余下的分数平均值为歌手的得分.

main( )

{ int i,n;

double a[20],aver;

scanf("%d", &n);

for(i=0; i<n; i++)

scanf("%lf", &a[i]);

sort(n,a);

aver=0;

for(i=2;i<n-2;i++)

aver+=a[i];

aver/=n-4;

printf("aver=%.2f\n", aver);

}

void sort(int n,double a[])

{int i,j,index;

double t;

for(i=0;i<n-1;i++)

{index=i;

for(j=i+1;j<n;j++)

if(a[j]<a[index]) index=j;

t=a[i];

a[i]=a[index];

a[index]=t;

}

}

slide47

求数组前从小到大的个数

main()

{int a[20],i,t,n;

scanf("%d",&n);

for(i=0;i<n;i++)

scanf("%d",&a[i]);

printf("\n");

t=a[0];

for(i=1;i<n-1;i++)

if(t>a[i])

break;

else

t=a[i];

printf("%d\n",i);

}

slide48

有一个已排好序的整数数组,今输入一个数,要求按原来排序的规律将它插入到数组中有一个已排好序的整数数组,今输入一个数,要求按原来排序的规律将它插入到数组中

main()

{int a[20],m,n,i;

scanf("%d",&n);

for(i=0;i<n;i++) scanf("%d",&a[i]);

scanf("%d",&m);

a[n]=m;

for(i=n-1;i>=0;i--)

if(a[i+1]<a[i])

{m=a[i+1]; a[i+1]=a[i]; a[i]=m;

}

for(i=0;i<=n;i++)

printf("%d ",a[i]);

printf("\n");

}

slide49

13.检索(查找)

输入n个整数存入数组a中,再输入一个整数x,在数组a中查找x,如果找到则输出相应元素的最小下标,否则输出"Not found"。

#include <stdio.h>

int main(void)

{ int i, index, n, x,a[10];

scanf("%d", &n);

for(i=0;i<n;i++)

scanf("%d", &a[i]);

scanf("%d", &x);

index=find(a,n,x);

if(index!=-1)

printf("index = %d\n",index);

else

printf("Not found\n");

}

int find(int a[], int n, int x)

{int i;

for(i=0;i<n;i++)

if(x==a[i]) return i;

return -1;

}

slide50

折半法(二分法)查数 对已排序数据序列(小到大或大到小)的查找

算法:

值区间不断折半缩小,直到找到要查的数

例 a[9]={1,2,3,6,8,9,10,12,14}

0 1 2 3 4 5 6 7 8

要求查 x=2

a的有值区间0~8 折半 (0+8)/2=4 a[4]=8 不是

a的区间分为 0~3 5~8 判别有值区间 0~3

a的有值区间0~3 折半 (0+3)/2=1 a[1]=2=x 是

slide51

折半法流程

输入数组a

a[0]~a[N-1]:小到大排序

x:为查找的数

top:查找区间下标下界

bot:查找区间下标上界

mid:查找区间折半下标

输入x

top=0, mid=0

bot=N-1

0

x>a[bot]||x<a[top]

0

top<=bot

1

1

mid=(top+bot)/2

0

x==a[mid]

1

0

x<a[mid]

break

1

bot=mid-1

top=mid+1

0

x==a[mid]

1

输出mid,x

打印无此数

slide52

#define N 10

#include "stdio.h"

void main()

{int a[N],top=0,bot=N-1,mid=0,x,i;

for(i=0;i<N;i++) scanf("%d",&a[i]);

scanf("%d",&x);

if(x>=a[0]&&x<=a[N-1])

while(top<=bot)

{mid=(top+bot)/2;

if(x==a[mid]) break;

else if(x<a[mid]) bot=mid-1;

else top=mid+1;

}

if(x==a[mid]) printf("a[%d]=%d\n", mid,a[mid]);

else printf("no number");

}

slide53

输入一个字符串 str,再输入一个字符 c,将字符串 str 中出现的所有字符 c 删除。

#include<stdio.h>

void main()

{char c,str[80];

int i,j=0;

gets(str);

scanf("%c", &c);

for(i=0;str[i]!=0;i++)

if(str[i]!=c) {str[j]=str[i];j++;}

str[j]=\'\0\';

puts(str);

}

slide54

在字符串中找子字符串。如子字符串存在, 输出YES; 否则, 输出NO.

#include <string.h>

main()

{char s[100],c[20];

int i,j,flag;

gets(s);gets(c);

for(i=0;s[i]!=\'\0\';i++)

{flag=1;

for(j=0;c[j]!=\'\0\';j++)

if(s[i+j]!=c[j]){flag=0;break;}

if(flag) break;

}

if(flag) printf("YES\n");

else printf("NO\n");

}

abcdefghy

efg

又如,计算一个字符串中子字符串出现的次数。

slide55

14.智能题

猴子吃桃问题。猴子第一天搞下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天又将剩下的桃子吃掉一半,又多吃一个。以后每天都吃了前一天剩下的一半零一个。到m天只剩一个桃子了。问共摘多少个挑子?

#include <stdio.h>

void main()

{int i, n=1,m;

scanf("%d",&m);

for(i=m-1;i>=1;i--)

n=(n+1)*2;

printf("%d",n);

}

slide56

年龄问题。有n人坐在一起,问第n个人多少岁?他说比第n-1个人大2岁。问第n-1个人多少岁?他说比第n-2个人大2岁,……, 问第3个人多少岁?他说比第2个人大2岁。 问第2个人多少岁?他说比第1个人大2岁。 最后问第1个人,他说10岁。求第5个人的岁数?

用递归函数表示

int age(int n)

{int c;

if(n==1) c=10;

else c=age(n-1)+2;

return(c);}

void main()

{int n;

scanf("%d",&n);

printf("%d\n ",age(n));

}

#include <stdio.h>

void main()

{int i,n,m=10;

scanf("%d",&n);

for(i=1;i<n;i++)

m=m+2;

printf("%d\n ",m);

}

类似有:

球体自由落地

搬砖头

围圈报数

兑换硬币

slide57

15.杂题

#include "stdio.h"

void main( )

{ int i,j,n;char c;

scanf("%d",&n);

for(i=1;i<=n;i++)

{c=\'1\'-1;

for(j=1;j<=2*n-1;j++)

if(j<=n-i) printf(" ");

else if(j<=n)

{c=c+1; printf("%c",c);}

else if(j<n+i)

{c=c-1; printf("%c",c);}

printf("\n");

}

}

打印扬辉三角

1

121

12321

1234321

123454321

如打印

A

ABA

ABCBA

ABCDCBA

slide58

输入a,b使a>=bn的n, n为最大的整数

#include "stdio.h"

long pown(long b,int n)/*求bn*/

{int i;

long g=1;

if (n==0) return 1;

for(i=1;i<=n;i++)

g=g*b;

return g;

}

void main( )

{

int n;

long a,b;

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

n=0;

while(a>pown(b,n))

n++;

printf("%d\n",--n);

}

slide59

摸拟袖珍计算器

求最大公约数和最小公倍数

输入某年某月某日转成这一年的第几天

计算时间(小时:分:秒)

计算分段函数

由于上机考试要进行服务器整理,练习系统使用截止日期为6月4日。6月5日开始停止使用。

slide60

1

输入a

k=1;k<n;k++

i=0;i<n;i++

0

a[row][col]>a[k][col]

col=0

1

j=1;j<n;j++

row=k

0

a[i][col]<a[i][j])

k

1

0

row==i

col=j

1

输出i,col

j

row=0

i

1

输出NO

找矩阵的鞍点(元素值在该行上最大, 在该列上最小)

解法一:

1.固定i行,在i行找到最大元素的列j=>col

2.在col列找到最小元素的行k=>row

3.如i==row,则鞍点为row行col列

void main()

{int i,j,k,row,col,flag=0,n;

int a[6][6];

scanf("%d",&n);

for(i=0;i<n;i++)

for(j=0;j<n;j++)

scanf("%d",&a[i][j]);

for(i=0;i<n;i++)

{col=0;

for(j=1;j<n;j++)

if(a[i][col]<a[i][j])col=j;

row=0;

for(k=1;k<n;k++)

if(a[i][col]>a[k][col])row=k;

if(row==i) {flag=1;break;}

}

if(flag)

printf("i=%d,j=%d",row,col);

else printf("NO");

}

slide61

……

…… aij ……

……

解法二:

对每个元素判别是否鞍点

1.固定i行j列的元素aij

2.对i行求出列最大值max

3.对j列求出列最小值min

4.若 max==min==aij

则鞍点为i行j列

#include<stdio.h>

void main()

{int n,i,j,p,max,min,a[6][6];

scanf("%d",&n);

for(i=0;i<n;i++)

for(j=0;j<n;j++) scanf("%d",&a[i][j]);

for(i=0;i<n;i++)

for(j=0;j<n;j++)

{max=a[i][0];

for(p=1;p<n;p++)

if(max<a[i][p]) max=a[i][p];

min=a[0][j];

for(p=1;p<n;p++)

if(min>a[p][j]) min=a[p][j];

if(max==min&&max==a[i][j])

{printf("%d %d\n",i,j); return;}

}

printf("no\n");}

ad