1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。
#include<stdio.h>
void main(void)
{
int maxgy(int x,int y);
int mingb(int x,int y);
int a,b;
printf("输入两个整数:\n");
scanf("%d%d",&a,&b);
printf("最大公约数为:%d\n",maxgy(a,b));
printf("最小公倍数为:%d\n",mingb(a,b));
}
int maxgy(int x,int y)
{
int z;
while(y!=0)
{
z=x%y;
x=y;
y=z;
}
return x;
}
int mingb(int x,int y)
{
int z;
z=x*y/maxgy(x,y);
return z;
}
2.求方程式ax^2+bx+c=0的根,用3个函数分别求当:b^2-4ac大于0,等于0,和小于0时的根并输出结果。从主函数输入a,b,c的值。
#include<stdio.h>
#include<math.h>
#define disc b*b-4*a*c
double x1,x2;
void m(float a,float b,float c)
{
printf("方程式有两个不相等的实根:\n");
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf("方程式的根是:%.2lf\t%.2lf",x1,x2);
}
void n(float a,float b,float c)
{
printf("方程式有两个相等的实根:\n");
x1=x2=(-b)/(2*a);
printf("方程式的根是:%.2lf\t%.2lf",x1,x2);
}
void f(float a,float b,float c)
{
printf("方程式没有实根");
}
main()
{
float a,b,c;
printf("请输入a,b,c的值:\n");
scanf("%f%f%f",&a,&b,&c);
if(disc>0) m(a,b,c);
else if(disc==0) n(a,b,c);
else f(a,b,c);
}
3.写一个判断素数的函数,在主函数输入一个整数,输出是否为素数的信息。
#include<stdio.h>
#include<math.h>
int sushu(int a)
{
int i,k=sqrt(a);
for(i=2;i<=k+1;i++)
if(a%i==0)break;
if(i<k+1) return 0;
else return 1;
}
main()
{
int a,b;
printf("请输入一个整数:\n");
scanf("%d",&a);
b=sushu(a);
if(b) printf("%d是一个素数\n",a);
else printf("%d不是一个素数\n",a);
}
4.写一函数,使给定一个3*3的二维整型数组转置,即行列互换。
#include<stdio.h>
int exchange(b)
int b[3][3];
{
int i,j,t;
for(i=0;i<3;i++)
for(j=0;j>=i&&j<3-i;j++)
{
t=b[i][j];b[i][j]=b[j][i];b[j][i]=t;
}
}
main()
{
int i,j,a[3][3];
printf("请输入3*3整形数组:\n");
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
printf("原数组:\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%5d",a[i][j]);
printf("\n");
}
printf("\n");
exchange(a);
printf("行列互换:\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%5d",a[i][j]);
printf("\n");
}
}
5.写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。
#include<stdio.h>
#include<string.h>
char fanxu(b)
char b[100];
{
int i,j,t;
char c[100];strcpy(c,b);
t=strlen(b);
for(i=0,j=t-1;j>-1;i++,j--)
b[i]=c[j];
}
main()
{
char a[100],i;
gets(a);
fanxu(a);
puts(a);
}
6.写一个函数,将两个字符串连接。
#include<stdio.h>
void lianjie(char a[],char b[])
{
char c[20];
int i,j;
for(i=0;a[i]!='\0';i++) c[i]=a[i];
for(j=0;b[j]!='\0';j++) c[i+j]=b[j];
c[i+j+1]='\0';
printf("连接后:\n");
puts(c);
}
main()
{
char a[10],b[10];
printf("输入两个字符串:\n");
gets(a);
gets(b);
lianjie(a,b);
}
7.写一函数,将一个字符串中的元音字母复制到另一字符串,然后输出。
#include<stdio.h>
char copy(char c[],char d[])
{
int i,j=0;
for (i=0;c[i]!='\0';i++)
if(c[i]==97||c[i]==101||c[i]==105||
c[i]==111||c[i]==117||c[i]==65||
c[i]==69||c[i]==73||c[i]==85)
{
d[j]=c[i];
j++;
}
}
main()
{
char a[10],b[10];
printf("输入一个字符串:\n");
gets(a);
copy(a,b);
printf("输出元音字母的字符串:\n");
puts(b);
}
8.写一个函数,输入一个4位数字,要求输出这数字字符,但每两个数字间空一个空格。如 输入1990,应输出“1 9 9 0”.
#include<stdio.h>
void f(int n)
{
int a,b,c,d;
a=n/1000;//千位
b=(n-a*1000)/100;//百位
c=(n-a*1000-b*100)/10;//十位
d=n-a*1000-b*100-c*10;//个位
printf("输出4位数数字字符:\n");
printf("%d %d %d %d\n",a,b,c,d);
}
main()
{
int n;
printf("输入一个4位数字:\n");
scanf("%d",&n);
f(n);
}
9.编写一个函数,由实参传来一个字符串,统计此字符串中字母,数字,空格和其他字符的个数。在主函数中输入字符串以及输出上述结果。
#include<string.h>
#include<stdio.h>
char f(a1,b1)
char a1[100];
int b1[4];
{
int j;
for (j=0;a1[j]!='\0';j++) //字符串中字符不为空字符时继续执行下一位
{
if(a1[j]>=65&&a1[j]<=90||a1[j]>=97&&a1[j]<=122) b1[0]++;//这是大小写字母的条件
else if(a1[j]>=48&&a1[j]<=57) b1[1]++; //数字的条件
else if(a1[j]==32) b1[2]++; //空格的条件
else b1[3]++;//其他字符的条件
}
}
main()
{
char a[100];
static int i,b[4];//b[4]是字母 数字 空格 其他 个数的数组
gets(a);
f(a,b);//函数调用
printf("字母 数字 空格 其他字符\n");
for (i=0;i<4;i++)
printf("%-8d",b[i]);
}
10.写一个函数,输入一行字符,将此字符串中最长的单词输出。
#include<stdio.h>
#include<string.h>
#define M 100
char maxword(p)
char p[M];
{
int q,j,x,z,count;
//单词起始地址,结束地址,循环变量,中间变量,最长单词长度
int q_z,j_z;
q=0,j=0,count=0;
for (x=0;x<strlen(p);x++)
{
z=0;
q_z=x;
//在字符串长度内循环定义单词起始地址
while(p[x]!=' '&&p[x]!='\0')
{
z++;
x++;
//字符不为空格和空字符时字母自加,指向下一个字母
}
j_z=x-1;
//结束下标减去一个空字符字节
if(z>count) //如果第一个单词>max单词长度
{
count=z;
//则把第一个单词赋值给max单词长度,循环比较
q=q_z;
j=j_z;
}
}
printf("字符串中最长的单词为:\n");
for (x=q;x<=j;x++)
putchar(p[x]);
//max单词起始,结束地址已求出,输出
}
main()
{
char str[M];
printf("输入一行字符串:\n");
gets(str);
maxword(str);
}
11.写一个函数,用“气泡法”对输入的10个字符按由小到大顺序排列。
#include<stdio.h>
#define M 10
char paixu(char p[])
{
int a,b;
char t;
for (a=M-1;a>0;a--)
{
for (b=0;b<a;b++)
if(p[b]>p[b+1])
{
t=p[b];
p[b]=p[b+1];
p[b+1]=t;
}
}
printf("输出排序后的字符:\n");
for (b=0;b<M;b++)
printf("%4c",p[b]);
}
main()
{
char str[M];
int i=0;
printf("输入10个字符");
for (;i<M;i++)
scanf("%c",&str[i]);
paixu(str);
}
12.用牛顿迭代法求根。方程为ax3+bx2+cx+d=0 系数a,b,c,d的值依次为1,2,3,4, 由主函数输入。求x在1附近的一个实根。求出根后由主函数输出。
#include <stdio.h>
#include <math.h>
int main()
{float solut(float a,float b,float c,float d);
float a,b,c,d;
printf("input a,b,c,d:");
scanf("%f,%f,%f,%f",&a,&b,&c,&d);
printf("x=%10.7f\n",solut(a,b,c,d));
return 0;
}
float solut(float a,float b,float c,float d)
{float x=1,x0,f,f1;
do
{x0=x;
f=((a*x0+b)*x0+c)*x0+d;
f1=(3*a*x0+2*b)*x0+c;
x=x0-f/f1;
}
while(fabs(x-x0)>=1e-3);
return(x);
}
13.用递归方法求 n 阶勒让德多项式的值,递归公式为
#include <stdio.h>
float p(int x,int n)
{
float t,t1,t2;
if(n= =0) return 1;
else if(n= =1) return x;
else
{
t1=(2*n-1)*x*p(x,(n-1));
t2=(n-1)*p(x,(n-2));
t=(t1-t2)/n;
return t;
}
}
int main()
{
int x,n;
printf(“input two int (x and n):”);
scanf(“%d%d”,&x,&n);
printf(“%.2f\n”,p(x,n));
return 0;
}
14.输入10个学生5门课成绩,分别用函数实现下列功能
1、 计算每个学生平均分;
2、 计算每科平均分 ;
3 、找出五十个分数中最高分,和对应的学生和课程;
4、求出平均分方差:σ=1/n∑xi2-(∑xi/n)2,xi为某一学生的平均分。
#include<stdio.h>
#include<string.h>
#define N 10
float a_stu[N];
int average1(int str1[][5],int m,int n);
int average2(int str1[][5],int m,int n);
int average3(int str1[][5],int m,int n);
int average4(int str1[][5],int m,int n);
int main()
{
int str[10][5]={{87,88,92,67,78},{88,86,87,98,90},{76,75,65,65,78},{67,87,60,90,67},
{77,78,85,64,56},{76,89,94,65,76},{78,75,64,67,77},{77,76,56,87,85},{84,67,78,76,89},
{86,75,64,69,90}};
int i,j;
printf("每个学生的平均成绩\n");
average1(str,10,5);
printf("每门课的平均成绩\n");
average2(str,10,5);
average3(str,10,5);
printf("某个学生的平均成绩的偏差\n");
average4(str,10,5);
return 0;
}
int average1(int str1[][5],int m,int n)//单个学生的平均成绩
{
int i,j;
float average1;
for(i=0;i<m;i++)
{
float sum=0;
for(j=0;j<n;j++)
{
sum+=str1[i][j];
}
a_stu[i]=sum/n;
printf("%.2f\n",a_stu[i]);
}
}
int average2(int str1[][5],int m,int n)//单门课的平均成绩
{
int i,j;
float average2;
for(j=0;j<n;j++)
{
float sum=0;
for(i=0;i<m;i++)
{
sum+=str1[i][j];
}
average2=sum/m;
printf("%.2f\n",average2);
}
}
int average3(int str1[][5],int m,int n)
{
int max=str1[0][0];
int p,k,i,j;
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
if(str1[i][j]>max)
{
max=str1[i][j];
k=i+1;
p=j+1;
}
}
printf("最高分对应的学生和课程\n");
printf("max=%d,k=%d,p=%d\n",max,k,p);
}
int average4(int str1[][5],int m,int n)//某个学生的平均偏差
{
int i;
float sum1=0,sum2=0;
float average4;
for(i=0;i<m;i++)
{
sum1+=a_stu[i];
sum2+= a_stu[i]*a_stu[i];
average4=sum2/m-(sum1/m)*(sum1/m);
}
printf("%.2f\n",average4);
}
15.写几个函数:
1. 输入10个职工的姓名和职工号;
按职工号由小到大顺序排序,姓名顺序也随之调整;
要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。
#include <stdio.h>
#include <string.h>
void input (char na[][20], int nu[]); //定义输入函数
void sorts (char na[][20], int nu[]); //定义排序函数
void search (char na[][20], int nu[], int x); //定义查找函数
int main()
{
char name[10][20];
int num[10], numb, i;
input(name, num); //调用输入函数
sorts(name, num); //调用排序函数
for (i=0; i<10; i++){
printf("%8s ", name[i]);
printf("%d\n", num[i]);
}
printf("Input your number:"); //输入一个职工号
scanf("%d", &numb);
search(name, num, numb); //调用查找函数
return 0;
}
//输入函数
void input (char na[][20], int nu[])
{
int i;
for (i=0; i<10; i++){
printf("Input No.%d name:", i+1);
scanf("%s", na[i]);
printf("Input No.%d number:", i+1);
scanf("%d", &nu[i]);
}
}
//排序函数
void sorts (char na[][20], int nu[])
{
int i, j, temp;
char tm[20];
for (i=0; i<10; i++)
for (j=i+1; j<10; j++){
if (nu[i]>nu[j]){
temp=nu[i];
nu[i]=nu[j];
nu[j]=temp;
strcpy(tm, na[i]);
strcpy(na[i], na[j]);
strcpy(na[j], tm);
}
}
}
//查找函数
void search (char na[][20], int nu[], int x)
{
int low, high, mid;
low = 0;
high = 9;
while (low<=high){
mid=(low+high)/2;
if (x>nu[mid])
low=mid + 1;
else if (x<nu[mid])
high=mid-1;
else if (x==nu[mid]){
printf("%s\n", na[mid]);
break;
}
}
if (x!=nu[mid])
printf("No match!\n");
}
16.写一个函数,输入一个十六进制数,输出相应的十进制数。
#include<stdio.h>
#include<string.h>
main()
{
char a[100];
int i,k,sum=0;
printf("请输入十六进制数:\n");
gets(a);
for (i=strlen(a)-1,k=1;i>=0;i--)
{
if(a[i]>='0'&&a[i]<='9')
sum+=(a[i]-'0')*k;
else if(a[i]>='A'&&a[i]<='F')
sum+=(a[i]-'A'+10)*k;
else if(a[i]>='a'&&a[i]<='f')
sum+=(a[i]-'a'+10)*k;
k*=16;
}
printf("\n十六进制数%s转换成十进制数为:\n%d",a,sum);
}
17.用递归法将一个整数n转换成字符串。例如 输入483,应输出字符串“483”。n的倍数不确定,可以是任意倍数的整数。
#include <stdio.h>
int main()
{ void convert(int n);
int number;
printf("input an integer: ");
scanf("%d",&number);
printf("output: ");
if (number<0)
{putchar('-');putchar(' '); /* 先输出一个‘-’号和空格 */
number=-number;
}
convert(number);
printf("\n");
return 0;
}
void convert(int n)
{ int i;
if ((i=n/10)!=0)
convert(i);
putchar(n%10+'0');
putchar(32);
}