1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这个函数,并输出结果,两个整数由键盘输入。
#include <stdio.h>
int main ( )
{
int Get_Max ( int a, int b) ;
int Get_Min ( int a, int b, int m) ;
int a, b, m, n;
printf ( "please input two number!\n" ) ;
scanf ( "%d%d" , & a, & b) ;
m= Get_Max ( a, b) ;
n= Get_Min ( a, b, m) ;
printf ( "max=%d\n" , m) ;
printf ( "min=%d\n" , n) ;
return 0 ;
}
int Get_Max ( int a, int b)
{
int r, t;
if ( a< b)
{
t= a;
a= b;
b= t;
}
while ( ( r= a% b) != 0 )
{
a= b;
b= r;
}
return b;
}
int Get_Min ( int a, int b, int m)
{
return a* b/ m;
}
2.求方程ax x+bx+c =0的根,用3个函数分别求当:b b-4a c大于0,等于0,小于0的根并输出结果,从主函数输入a,b,c的值。
#include <stdio.h>
#include <math.h>
float x1, x2, disc, p, q;
int main ( )
{
void greater_than_zero ( float , float ) ;
void smaller_than_zero ( float , float ) ;
void equal_than_zero ( float , float ) ;
float a, b, c;
printf ( "please input a,b,c\n" ) ;
scanf ( "%f%f%f" , & a, & b, & c) ;
printf ( "eqution:%5.2f*x*x+%5.2f*x+%5.2f=0\n" , a, b, c) ;
disc= b* b- 4 * a* c;
printf ( "root\n" ) ;
if ( disc> 0 )
{
greater_than_zero ( a, b) ;
printf ( "x1=%f\t\tx2=%f\n" , x1, x2) ;
}
if ( disc== 0 )
{
equal_than_zero ( a, b) ;
printf ( "x1=%f\t\tx2=%f\n" , x1, x2) ;
}
if ( disc< 0 )
{
smaller_than_zero ( a, b) ;
printf ( "x1=%f+%fi\tx2=%f-%fi\n" , p, q, p, q) ;
}
return 0 ;
}
void greater_than_zero ( float a, float b)
{
x1= ( - b- sqrt ( disc) ) / ( 2 * a) ;
x2= ( - b+ sqrt ( disc) ) / ( 2 * a) ;
}
void smaller_than_zero ( float a, float b)
{
p= ( - b) / ( 2 * a) ;
q= sqrt ( - disc) / ( 2 * a) ;
}
void equal_than_zero ( float a, float b)
{
x1= x2 = ( - b) / ( 2 * a) ;
}
3.写一个判断素数的函数,在主函数输入一个整数,输出是否为素数的信息。
#include <stdio.h>
int main ( )
{
int prime ( int ) ;
int x;
printf ( "please input a integer:\n" ) ;
scanf ( "%d" , & x) ;
if ( prime ( x) )
printf ( "%d is a prime\n" , x) ;
else
printf ( "%d is not a prime\n" , x) ;
return 0 ;
}
int prime ( int x)
{
int flag = 1 , i;
for ( i= 2 ; i<= x/ 2 ; i++ )
{
if ( x% i== 0 )
flag= 0 ;
}
return flag;
}
4.写一个程序,使给定的一个3*3的二维数组转置,即行列互换。
#include <stdio.h>
int main ( )
{
void convert ( int array[ ] [ 3 ] ) ;
int arr[ 3 ] [ 3 ] , i, j;
printf ( "input array\n" ) ;
for ( i= 0 ; i< 3 ; i++ )
for ( j= 0 ; j< 3 ; j++ )
scanf ( "%d" , & arr[ i] [ j] ) ;
for ( i= 0 ; i< 3 ; i++ )
{
for ( j= 0 ; j< 3 ; j++ )
printf ( "%5d" , arr[ i] [ j] ) ;
printf ( "\n" ) ;
}
printf ( "\n" ) ;
convert ( arr) ;
for ( i= 0 ; i< 3 ; i++ )
{
for ( j= 0 ; j< 3 ; j++ )
printf ( "%5d" , arr[ i] [ j] ) ;
printf ( "\n" ) ;
}
return 0 ;
}
void convert ( int array[ ] [ 3 ] )
{
int i, j, t;
for ( i= 0 ; i< 3 ; i++ )
for ( j= i+ 1 ; j< 3 ; j++ )
{ t= array[ i] [ j] ;
array[ i] [ j] = array[ j] [ i] ;
array[ j] [ i] = t;
}
}
5.写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。
#include <stdio.h>
#include <string.h>
int main ( )
{
void inverse ( char str[ ] ) ;
char str[ 100 ] ;
printf ( "input string\n" ) ;
scanf ( "%s" , str) ;
inverse ( str) ;
printf ( "inverse string: %s" , str) ;
return 0 ;
}
void inverse ( char str[ ] )
{
char t;
int i, j;
for ( i= 0 , j= strlen ( str) ; i< ( strlen ( str) / 2 ) ; i++ , j-- )
{
t= str[ i] ;
str[ i] = str[ j- 1 ] ;
str[ j- 1 ] = t;
}
}
6.写一个函数,将两个字符串连接。
#include <stdio.h>
int main ( )
{
void concatenate ( char string1[ ] , char string2[ ] , char string[ ] ) ;
char s1[ 100 ] , s2[ 100 ] , s[ 100 ] ;
printf ( "please input string1\n" ) ;
scanf ( "%s" , s1) ;
printf ( "please input string2\n" ) ;
scanf ( "%s" , s2) ;
concatenate ( s1, s2, s) ;
printf ( "The new string is %s\n" , s) ;
return 0 ;
}
void concatenate ( char string1[ ] , char string2[ ] , char string[ ] )
{
int i, j;
for ( i= 0 ; string1[ i] != '\0' ; i++ )
string[ i] = string1[ i] ;
for ( j= 0 ; string2[ j] != '\0' ; j++ )
string[ i+ j] = string2[ j] ;
string[ i+ j] = '\0' ;
}
7.写一个函数,将一个字符串的元音字母复制到另一个字符串,然后输出。
#include <stdio.h>
int main ( )
{
void copy ( char [ ] , char [ ] ) ;
char str[ 80 ] , string[ 80 ] ;
printf ( "please input str:\n" ) ;
scanf ( "%s" , str) ;
copy ( str, string) ;
printf ( "The vowel letters are: %s\n" , string) ;
return 0 ;
}
void copy ( char str[ ] , char str1[ ] )
{
int i, j= 0 ;
for ( i= 0 ; str[ i] != '\0' ; i++ )
if ( str[ i] == 'A' || str[ i] == 'E' || str[ i] == 'I' || str[ i] == 'O' || str[ i] == 'U' || str[ i] == 'a' || str[ i] == 'e' || str[ i] == 'i' || str[ i] == 'o' || str[ i] == 'u' )
str1[ j++ ] = str[ i] ;
str1[ j] = '\0' ;
}
8.写一个函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格,如输入1990,应输出“1990”。
#include <stdio.h>
#include <string.h>
int main ( )
{
void insert ( char [ ] ) ;
char str[ 80 ] ;
printf ( "please input digits:\n" ) ;
scanf ( "%s" , str) ;
insert ( str) ;
return 0 ;
}
void insert ( char str[ ] )
{
int i;
for ( i= strlen ( str) ; i> 0 ; i-- )
{
str[ 2 * i] = str[ i] ;
str[ 2 * i- 1 ] = ' ' ;
}
printf ( "output:\n%s\n" , str) ;
}
9.编写一个函数,由实参传来一个字符串,统计此字符串中字母,数字,空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。
#include <stdio.h>
int letter, space, digit, other;
int main ( )
{
void count ( char [ ] ) ;
char string[ 80 ] ;
printf ( "please input string:\n" ) ;
gets ( string) ;
count ( string) ;
printf ( "letter=%d,space=%d,digit=%d,other=%d\n" , letter, space, digit, other) ;
return 0 ;
}
void count ( char str[ ] )
{
int i;
letter= space= digit= other= 0 ;
for ( i= 0 ; str[ i] != '\0' ; i++ )
if ( ( str[ i] >= 'A' && str[ i] <= 'Z' ) || ( str[ i] >= 'a' && str[ i] <= 'z' ) )
letter++ ;
else if ( str[ i] >= '0' && str[ i] <= '9' )
digit++ ;
else if ( str[ i] == ' ' )
space++ ;
else
other++ ;
}
10.编写一个函数,输入一行字符,将此字符串中最长的单词输出。
#include <stdio.h>
#include <string.h>
int letter, space, digit, other;
int main ( )
{
int alphabetic ( char ) ;
int longest ( char [ ] ) ;
char str[ 80 ] ;
int i;
printf ( "please input string\n" ) ;
gets ( str) ;
printf ( "The longest word is:\n" ) ;
for ( i= longest ( str) ; alphabetic ( str[ i] ) ; i++ )
printf ( "%c" , str[ i] ) ;
return 0 ;
}
int alphabetic ( char c)
{
if ( ( c>= 'A' && c<= 'Z' ) || ( c>= 'a' && c<= 'z' ) )
return 1 ;
else
return 0 ;
}
int longest ( char ch[ ] )
{
int i, flag= 1 , len = 0 , length = 0 , place = 0 , point;
for ( i= 0 ; i<= strlen ( ch) ; i++ )
if ( alphabetic ( ch[ i] ) )
if ( flag)
{
point = i;
flag = 0 ;
}
else
len++ ;
else
{
flag = 1 ;
if ( len> length)
{
length= len;
place = point;
}
len= 0 ;
}
return place;
}
11.写一个函数,用起泡法对输入的10个字符由小到大顺序排列。
#include <stdio.h>
#include <string.h>
#define N 10
int main ( )
{
void sort ( char [ ] ) ;
char str[ N] ;
int i;
printf ( "please input string\n" ) ;
scanf ( "%s" , & str) ;
sort ( str) ;
printf ( "sorted string is:\n" ) ;
for ( i= 0 ; i< N; i++ )
printf ( "%c" , str[ i] ) ;
return 0 ;
}
void sort ( char str[ ] )
{
int i, j;
char t;
for ( i= 1 ; i< N; i++ )
for ( j= 0 ; ( j< N- i) && ( str[ j] != '\0' ) ; j++ )
if ( str[ j] > str[ j+ 1 ] )
{
t= str[ j] ;
str[ j] = str[ j+ 1 ] ;
str[ j+ 1 ] = t;
}
}
12.用牛顿迭代法求根。方程ax xx+b xx+c x+d=0,系数a,b,c,d的值依次是1,2,3,4,由主函数输入。求x在1附近的根,求出根后由主函数输出。
#include <stdio.h>
#include <math.h>
#define N 10
int main ( )
{
float solut ( float , float , float , float ) ;
float a, b, c, d;
printf ( "please input a,b,c,d\n" ) ;
scanf ( "%f%f%f%f" , & a, & b, & c, & d) ;
printf ( "x=%f\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阶勒让德多项式的值,递归公式为: Pn(x)=1 (n=0) Pn(x)=x (n=1) Pn(x)=((2*n-1)*x-Pn-1(x)-(n-1)*Pn-2(x))/n (n>=1)
#include <stdio.h>
int main ( )
{
float f ( int , int ) ;
int x, n;
printf ( "please input x and n\n" ) ;
scanf ( "%d%d" , & n, & x) ;
printf ( "P%d(%d)=%f\n" , n, x, f ( n, x) ) ;
return 0 ;
}
float f ( int n, int x)
{
if ( n== 0 )
return 1 ;
else if ( n== 1 )
return x;
else
return ( ( 2 * n- 1 ) * x- f ( n- 1 , x) - ( n- 1 ) * f ( n- 2 , x) ) / n;
}
14.输入10个学生5门课的成绩,分别用函数实现以下功能: (1)计算每个学生的平均分 (2)计算每门课的平均分 (3)找出所有50个分数最高的分数对应的学生与课程 (4)计算平均分差
#include <stdio.h>
#define M 10
#define N 5
float score[ M] [ N] ;
float a_score[ N] ;
float a_student[ M] ;
int r, c;
int main ( )
{
void input_score ( void ) ;
void Get_a_student ( void ) ;
void Get_a_score ( void ) ;
float highest ( ) ;
float Get_var ( void ) ;
float h;
int i;
input_score ( ) ;
Get_a_student ( ) ;
Get_a_score ( ) ;
for ( i= 0 ; i< M; i++ )
printf ( "the average score of No.%2d student is %f\n" , i+ 1 , a_student[ i] ) ;
for ( i= 0 ; i< N; i++ )
printf ( "the average score of No.%2d course is %f\n" , i+ 1 , a_score[ i] ) ;
h= highest ( ) ;
printf ( "The score %f of No. %2d student's No.%2d course is the highest score\n" , h, r, c) ;
printf ( "variance is %f\n" , Get_var ( ) ) ;
return 0 ;
}
void input_score ( void )
{
int i, j;
for ( i= 0 ; i< M; i++ )
{
printf ( "please input student %2d 's score\n" , i+ 1 ) ;
for ( j= 0 ; j< N; j++ )
scanf ( "%f" , & score[ i] [ j] ) ;
}
}
void Get_a_student ( void )
{
int i, j;
float s;
for ( i= 0 ; i< M; i++ )
{ s= 0 ;
for ( j= 0 ; j< N; j++ )
s+ = score[ i] [ j] ;
a_student[ i] = s/ N;
}
}
void Get_a_score ( void )
{
int i, j;
float s;
for ( i= 0 ; i< N; i++ )
{ s= 0 ;
for ( j= 0 ; j< M; j++ )
s + = score[ j] [ i] ;
a_score[ i] = s/ M;
}
}
float highest ( )
{
int i, j;
float max= score[ 0 ] [ 0 ] ;
for ( i= 0 ; i< M; i++ )
for ( j= 0 ; j< N; j++ )
if ( max< score[ i] [ j] )
{
max= score[ i] [ j] ;
r= i+ 1 ;
c= j+ 1 ;
}
return max;
}
float Get_var ( void )
{
float v1= 0 , v2= 0 , v;
int i, j;
for ( i= 0 ; i< M; i++ )
{
v1 + = a_student[ i] * a_student[ i] ;
v2 + = a_student[ i] ;
}
v= ( v1- v2* v2) / M;
return v;
}
15.写几个函数: (1)输入10个职工的姓名和职工号 (2)按职工工号由小到大排序,姓名也随之调整 (3)要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工好啊,输出该职工的姓名。
#include <stdio.h>
#define N 10
int main ( )
{
void input ( int [ ] , char name[ ] [ 8 ] ) ;
void sort ( int [ ] , char name[ ] [ 8 ] ) ;
void search ( int , int [ ] , char name[ ] [ 8 ] ) ;
int number[ N] , x, c, flag= 1 ;
char name[ N] [ 8 ] ;
input ( number, name) ;
sort ( number, name) ;
while ( flag== 1 )
{
printf ( "\nplease input number to look for:" ) ;
scanf ( "%d" , & x) ;
search ( x, number, name) ;
printf ( "continue or not(Y/N)" ) ;
getchar ( ) ;
c= getchar ( ) ;
if ( c== 'N' || c== 'n' )
flag= 0 ;
}
return 0 ;
}
void input ( int number[ ] , char name[ N] [ 8 ] )
{
int i, j;
for ( i= 0 ; i< N; i++ )
{
printf ( "please input No. " ) ;
scanf ( "%d" , & number[ i] ) ;
printf ( "please input name:" ) ;
getchar ( ) ;
gets ( name[ i] ) ;
}
}
void sort ( int number[ ] , char name[ N] [ 8 ] )
{
int i, j, min, t;
char c[ 8 ] ;
for ( i= 0 ; i< N; i++ )
{
min= i;
for ( j= i; j< N; j++ )
{
if ( number[ min] > number[ j] )
{
min= j;
}
}
t= number[ i] ;
number[ i] = number[ min] ;
number[ min] = t;
for ( j= 0 ; j< 8 ; j++ )
{
c[ j] = name[ i] [ j] ;
name[ i] [ j] = name[ min] [ j] ;
name[ min] [ j] = c[ j] ;
}
}
printf ( "result\n" ) ;
for ( i= 0 ; i< N; i++ )
printf ( "\n%5d%10s" , number[ i] , name[ i] ) ;
}
void search ( int x, int number[ ] , char name[ N] [ 8 ] )
{
int top = N- 1 , bot = 0 , mid, sign= 1 , local = 0 ;
if ( ( x< number[ bot] ) || x> number[ top] )
local= - 1 ;
while ( ( bot<= top) && ( sign== 1 ) )
{
mid= ( top+ bot) / 2 ;
if ( number[ mid] < x)
bot= mid+ 1 ;
else if ( number[ mid] > x)
top= mid- 1 ;
else
{
local= mid;
sign = - 1 ;
printf ( "No.%d,his name is %s.\n" , x, name[ local] ) ;
}
}
if ( local== - 1 || sign== 1 )
printf ( "%d not been found.\n" , x) ;
}
16.写一个函数,输入一个十六进制数,输出相应的十进制数。
#include <stdio.h>
#define MAX 1000
int main ( )
{
int htoi ( char s[ ] ) ;
int c, i, flag, flag1;
char t[ MAX] ;
i= 0 ;
flag= 0 ;
flag1= 1 ;
printf ( "input a HEX number:" ) ;
while ( ( c= getchar ( ) ) != '\0' && i< MAX&& flag1)
{
if ( c>= '0' && c<= '9' || c>= 'a' && c<= 'f' || c>= 'A' && c<= 'F' )
{
flag = 1 ;
t[ i++ ] = c;
}
else if ( flag)
{
t[ i] = '\0' ;
printf ( "decimal number %d\n" , htoi ( t) ) ;
printf ( "continue or not?(N/Y)" ) ;
c= getchar ( ) ;
if ( c== 'N' || c== 'n' )
flag1= 0 ;
else
{
flag = 0 ;
i= 0 ;
printf ( "\ninput a HEX number:" ) ;
}
}
}
return 0 ;
}
int htoi ( char s[ ] )
{
int i, n= 0 ;
for ( i= 0 ; s[ i] != '\0' ; i++ )
{
if ( s[ i] >= '0' && s[ i] <= '9' )
n= n* 16 + s[ i] - '0' ;
if ( s[ i] >= 'a' && s[ i] <= 'f' )
n= n* 16 + s[ i] - 'a' + 10 ;
if ( s[ i] >= 'A' && s[ i] <= 'F' )
n= n* 16 + s[ i] - 'A' + 10 ;
}
return n;
}
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 ) ;
}
18.给出年,月,日,计算该日是该年的第几天。
#include <stdio.h>
int main ( )
{
int sum_day ( int month, int day) ;
int leap ( int year) ;
int year, month, day, sum;
printf ( "please input year,month and day\n" ) ;
scanf ( "%d%d%d" , & year, & month, & day) ;
sum = sum_day ( month, day) ;
if ( ( leap ( year) ) && ( month>= 3 ) )
sum++ ;
printf ( "is the %dth day in this year\n" , sum) ;
return 0 ;
}
int sum_day ( int month, int day)
{
int i;
int day_tab[ 13 ] = { 0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 } ;
for ( i= 1 ; i< month; i++ )
day + = day_tab[ i] ;
return day;
}
int leap ( int year)
{
int flag;
flag = year% 4 == 0 && year% 100 != 0 && year% 400 == 0 ;
return flag;
}