(普通题一题20分) 共七道题 选做
题目一:数组(array)
从键盘输入一个长度为N(比如10)的整型数组,第一行输出小于零的数,第二行输出零的个数,第三行输出大于零的数,维持原数组顺序,不进行排序。
输入描述 :第一行键盘输入 n,第二行输入n个数。
输出描述:
第一行输出小于零的数,第二行输出零的个数,第三行输出大于零的数。
样例输入:
10
2 -5 -89 75 0 -89 0 93 48 0
样例输出:
-5 -89 -89
3
2 75 93 48
解答:
#include <stdio.h>
#include <stdlib.h>
#define N 15
int main()
{
int n,a[N],i,count=0;
char c;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
if(a[i]<0)
{
printf("%4d",a[i]);
}
}
printf("
");
for(i=0;i<n;i++)
{
if(a[i]==0)
{
count++;
}
}
printf("%4d
",count);
for(i=0;i<n;i++)
{
if(a[i]>0)
{
printf("%4d",a[i]);
}
}
}
题目二:计算两个整数的最大公约数
按如下函数原型,采用欧几里德算法编写计算两个整数的最大公约数的函数Gcd()。欧几里德算法,也称辗转相除法。其基本思想是:对正整数a和b,连续进行求余运算,直到余数为0为止,此时非0的除数就是最大公约数。
/* 函数功能:计算a和b的最大公约数,输入负数时返回-1 */
int Gcd(int a, int b)
要求如下:
(1)从键盘任意输入的两整数
主函数调用Gcd()函数,并输出两整数的最大公约数。
(2)Gcd函数原型为:
int Gcd(int a, int b);
如果输入的数不是正整数,则返回-1,
否则,返回两个数的最大公约数。
(3)**输入提示信息格式要求:"Input a,b: "
输入两个整数时用,号分隔
**输出提示信息要求:
如果输入的数不是正整数,则输出"Input error! "
否则按如下格式输出"Gcd=%d "
解答:
#include<stdio.h>
void main()
{
int a,b,c;
int gcd(int,int);
printf("input two integers:");
scanf("%d%d",&a,&b);
if(a,b<=0)
{
printf("Input error! ");
}
c=gcd(a,b);
printf("Greatest commondivisor is %d ",c);
}
int gcd(int x,int y)
{
int t;
while(y)
{
t=x%y;
x=y;
y=t;
}
return x;
}
题目三:计算圆的面积。
要求:
(1)圆的半径r的值为1到10(包括1和10)之间的正整数;
(2)用符号常量定义PI为3.14;
(3)当圆的面积小于50时输出圆的面积并对圆的面积求累加和,
大于等于50时结束循环;
(4)输出累加和的结果
(5)不用数组编程
**要求输入提示信息为:无输入提示信息和输入数据
**要求输出格式为:
(1)"area=%.2f "
(2)"sum=%.2f "
解答:
#include <stdio.h>
void main ()
{
int r;
float s;
float PI=3.14;
float sum=0;
for(r=1;r<11;r++)
{
s=PI*r*r;
if(s<50)
{
printf("%f",s);
sum+=s;
}
else
{
printf("%f",sum);
break;
}
}
return 0;
}
题目四:汉语数字
输入一个整形数,按汉语习惯输出
要求:
输入提示信息为:请输入数字:
输出提示信息为:汉语为:
样例:
请输入数字:1052
汉语为:一千零五十二
解答:
# include <stdio.h>
# include <string.h>
void ChangeType1(char * px, char * pn, char * pw, int len);
int main(void)
{
char x[100];
char num[10][] = {'零','一','二','三','四','五','六','七','八','九'};
char wei[4][] = {' ','十','百','千'};
char danwei[3][] = {' ','万','亿'};
int len;
int lx;
char * pn = num, * pn2 = num2, * px = x, * pw = wei, * pw2 = wei2, * pdw = danwei
printf("请输入数字:");
lx=strlen(x);
for(i=0;i<lx;i++)
x[i]=x[i]-'0';
for(i=0;i<lx;i++)
{
d=lx-i;
puts(num2[x[i]]);
if(d==2||d==6||d==10)
puts(wei[0]);
if(d==3||d==7||d==11)
puts(wei[1]);
if(d==4||d==8||d==12)
puts(wei[2]);
if(d==5)
puts(danwei[0]);
if(d==9)
puts(danwei[1])
}??????
题目五:统计师的难题
一天统计师小明收到上司的一大串文字,让小明找出其中的数字,英文和其他
内容(空格与其他字符)的个数,请你写程序帮助小明解决这个问题。
输入
输入可能有多组测试用例,每个用例包含一行字符。
输出
每个用例包括 3 个整数,分别代表英文个数、 数字个数、其他内容个数,整数间以空格分隔。
样例输入
adfawef12345 *&
AFSAF587
样例输出
7 5 3
5 3 0
解答:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n=0,i;;
printf("请输入行数:");
scanf("%d",&n);
char** s;
s=(char**)malloc(sizeof(char*)*n);
for(i=0;i<n;i++)
{
s[i]=(char*)malloc(sizeof(char)*128);
}
for(i=0;i<n;i++)
{
scanf("%s",s[i]);
}
for(i=0;i<n;i++)
{
int len=strlen(s[i]);
int j,alpha=0,digit=0,other=0;
for(j=0;j<len;j++)
{
if(s[i][j]>='0' && s[i][j]<='9')
{
digit++;
}
else if((s[i][j]>='A' && s[i][j]<='Z') || (s[i][j]>='a' && s[i][j]<='z'))
{
alpha++;
}
else
{
other++;
}
}
printf("%d %d %d
",alpha,digit,other);
}
return 0;
}
题目六:人民币
用100元人民币兑换10元,5元和1元的纸币(每一种都要有)共50张,请用穷举法编程计算共有几种兑换方案,每种方案各兑换多少张纸币.
****输入提示信息要求为:无
****输出格式要求为:
"x = %d, y = %d, z = %d "
"count = %d "
解答:
#include <stdio.h>
int main ()
{
int x,y,z,count=0;
for(x=0;x<=5;x++)
{
for(y=1;y<11;y++)
{
z=50-x-y;
if(10*x+5*y+z==100);
{
count++;
printf("x=%d,y=%d,z=%d ",x,y,z);
}
}
题目七:素性检测
从键盘任意输入一个整数m,若m不是素数,则对m进行质因数分解,并将m表示为质因数从小到大顺序排列的乘积形式输出,否则输出"It is a prime number"。例如,用户输入90时,程序输出90 = 2 * 3 * 3 * 5;用户输入17时,程序输出"It is a prime number"。
输入提示信息:"Input m:"
输入格式:"%d"
输出格式:
是素数时输出"It is a prime number "
否则输出用"%d = ","%d * "
运行示例1:
Input m:90↙
90 = 2 * 3 * 3 * 5
运行示例2:
Input m:13↙
It is a prime number
解答:
#include <stdio.h>
#include <stdlib.h>
void main()
{
int a,b,i,f[10]={0},t=0,flag=1;
scanf("%d",&a);
b=a;
for(i=2;i<a;)
{
if(b%i==0)
{
f[t]=i;
b/=i;
t++;
flag=0;
}
else
{
i++;
}
}
if(flag)
{
printf("It is a prime number");
}
else
{
printf("%d = ",a);
for(t=1;f[t]!=0;t++)
{
printf("%2d *",f[t-1]);
}
printf("%2d",f[t-1]);
}
}
题目八:正弦
已知求正弦sin(x)的近似值的多项式公式为:
sin(x)=x−x 3 3! +x 5 5! −x 7 7! +⋯+(−1) n x 2n+1 (2n+1)! +…
要求输入x和e,按上述公式计算sin(x)的近似值,要求计算的误差小于给定的e。
**输入格式要求:"%f%f" 提示信息:"Enter x & eps:"
**输出格式要求:"sin(%f)=%f " "%d,sin(%f)=%f "
程序运行示例如下:
Enter x & eps:5 0.000001
sin(5.000000)=-0.958924
13,sin(5.000000)=-0.958924
(提高题部分一题40分)共3题 选做
提高题一:堆栈
堆栈是数据结构中的重要线性结构,最先进入栈中的元素最后才能出栈,现在
给出三种操作指令(进栈,出栈,查询栈中中位数),请你根据指令输出当前
操作的是哪个值,其中如果栈中数量为偶数,中位数定义为其中较小的元素,
比如栈中元素自底向上为 3 1 4 2,那么中位数为 2。
输入
第一行输入给出所输入指令的总条数 N( <1000) ,随后 N 行给出每个指令:
Push k 代表将 k 入栈, k 为小于 500 的正整数, Pop 代表出栈, Find 代表查
询栈中中位数。
输出
针对每个输入的指令,如果是 Pop 或 Find 操作则输出相应操作的元素。指令
非法则输出“Error”。
样例输入
12
Pop
Find
Push 3
Find
Push 2
Find
Push 1
Find
Pop
Pop
Pop
Pop
样例输出
Error
Error
3 2 2 1 2 3
Error
提高题二:结构体
定义存放一个学生信息的结构体类型,学生信息包括:姓名,学号,性别,院系,要求在随意输入5个学生的相关信息后,按照学号从小到大顺序输出这些学生的信息。
输入:
先输入5名学生的信息,按学号顺序排序输出后在输入要统计的院系名称
输出
先按学号从小到大的顺序输出学生信息
样例输入
zhang3 20149003 M 信息系
zhang5 20149005 F 信息系
zhang10 20149010 F 管理系
zhang1 20149001 M 会计系
zhang9 20149009 M 会计系
样例输出
zhang1 20149001 M 会计系
zhang3 20149003 M 信息系
zhang5 20149005 F 信息系
zhang9 20149009 M 会计系
zhang10 20149010 F 管理系
提高题三:字符串插入
通过指针实现字符串插入的功能,将一个字符串插入到另一个字符串的任意位置要求将源字符串srcStr连接到目的字符串dstStr的任意位置。
输入:
字符串srcStr:abc
字符串dstStr:hahaha
插入dstStr的第几位:3
输出:
结果为:hahabcaha