59、C语言程序设计谭浩强第七章
1、写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输人。
#include <stdio.h>
int s1(int n,int m ){//最大公约数
int a=n*m;
int b;
while(b=n%m){
n=m;
m=b;
}
return m;
}
int s2(int n,int m){//最小公倍数
int a=n*m;
int b;
while(b=n%m){
n=m;
m=b;
}
return a/m;
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
if(n<m){
int temp=n;
n=m;
m=temp;
}
printf("最大公约数为%d\n",s1(n,m));
printf("最小公倍数为%d\n",s2(n,m));
return 0;
}
输入输出:
6 9
最大公约数为3
最小公倍数为18
2、求方程ax^2+bx+c=0的根,用3个函数分别求当: b^2-4ac大于0、等于0、小于0的根并输出结果。从主函数输如a,b,c的值。
#include <stdio.h>
#include <math.h>
double x1,x2;
void greater_than_zero(double a,double b,double c){
double m = sqrt(b*b-4*a*c);
x1 = (-b+m)/(2*a);
x2 = (-b-m)/(2*a);
}
void equal_to_zero(double a,double b,double c){
x1 = x2 = (-b)/(2*a);
}
void small_to_zero(double a,double b,double c){
double m = sqrt(4*a*c-b*b);
x1 = (-b)/(2*a);
x2 = m/(2*a);
}
int main(){
double a,b,c;
scanf("%lf %lf %lf",&a,&b,&c);
double m = b*b-4*a*c;
if(m>0){
greater_than_zero(a,b,c);
printf("根大于0:x1=%lf,x2=%lf",x1,x2);
}else if(m==0){
equal_to_zero(a,b,c);
printf("根等于0:x1=%lf,x2=%lf",x1,x2);
}else{
small_to_zero(a,b,c);
printf("根小于0:x1=%lf+%lfi,x2=%lf-%lfi",x1,x2,x1,x2);
}
return 0;
}
样例输入输出:
3 4 1
根大于0:x1=-0.333333,x2=-1.000000
2 4 2
根等于0:x1=-1.000000,x2=-1.000000
3 4 3
根小于0:x1=-0.666667+0.745356i,x2=-0.666667-0.745356i
3、写一个判素数的函数,在主函数输人一个整数,输出是否为素数的信息
#include <stdio.h>
#include <stdbool.h>
bool issushu(int n){
int i;
for(i=2;i<n;i++){
if(n%i==0)
return false;
}
return true;
}
int main(){
int n;
scanf("%d",&n);
if(issushu(n)==true){
printf("YES");
}else{
printf("NO");
}
return 0;
}
4、写一个函数,使给定的一个3X3的二维整型数组转置,即行列互换
#include <stdio.h>
int main(){
int a[4][4],b[4][4];
int i,j;
printf("请输入二维数组:\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
scanf("%d",&a[i][j]);
}
}
for(i=0;i<3;i++){
for(j=0;j<3;j++){
b[j][i]=a[i][j];
}
}
printf("转置后的二维数组:\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d ",b[i][j]);
}
printf("\n");
}
return 0;
}
样例输入输出:
请输入二维数组:
1 2 3
4 5 6
7 8 9
转置后的二维数组:
1 4 7
2 5 8
3 6 9
5、写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串
#include <stdio.h>
#include <string.h>
void Reverse(char a[]){
int len = strlen(a);
int i;
char temp;
for(i=0;i<len/2;i++){
temp=a[i];
a[i]=a[len-i-1];
a[len-i-1]=temp;
}
}
int main(){
char s[101];
gets(s);
Reverse(s);
puts(s);
return 0;
}
样例输入输出:
abcxyz
zyxcba
6、写一个函数,将两个字符串连接
#include <stdio.h>
void ConcatStr(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';
}
int main(){
char s1[100]={0},s2[100]={0},s[200]={0};
gets(s1);
gets(s2);
ConcatStr(s1,s2,s);
puts(s);
return 0;
}
样例输入输出:
welcome
China
welcomeChina
7、写一个函数,将一个字符串中的元音字母复制到另一字符串,然后输出
#include <stdio.h>
void cpy(char s[],char c[]){
int i,j;
for(i=0,j=0;s[i]!='\0';i++){
if(s[i]=='a'||s[i]=='A'||s[i]=='i'||
s[i]=='I'||s[i]=='e'||s[i]=='E'||
s[i]=='o'||s[i]=='O'||s[i]=='u'||
s[i]=='U'){
c[j++]=s[i];
}
}
c[j]='\0';
}
int main(){
char str[80],c[80];
gets(str);
cpy(str,c);
puts(c);
return 0;
}
样例输入输出:
hello jing
eoi
8、写一个函数,输人一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格。如输人1990,应输出“1 9 9 0”
#include <stdio.h>
void OutString (char str[]){
int i = 0;
while(str[i]!='\0'){
printf("%c",str[i]);
if(str[i+1]=='\0')
break;
printf("%c",' ');
i++;
}
printf("\n");
}
int main(){
char str[5]={0};
gets(str);
OutString(str);
return 0;
}
9、编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输人字符串以及输出上述的结果
#include <stdio.h>
#include <math.h>
#include <ctype.h>
int letter,digit,space,others;
void CountChar(char str[]){
int i;
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 {
others++;
}
}
}
int main(){
char str[101];
gets(str);
CountChar(str);
printf("字母的个数:%d\n",letter);
printf("数字的个数为:%d\n",digit);
printf("空格的个数:%d\n",space);
printf("其他字符的个数:%d",others);
return 0;
}
10、写一个函数,输人一行字符,将此字符串中最长的单词输出。
#include <stdio.h>
#include <string.h>
void Std(char s[]){
int a=0,b;//第一个单词第一个字符的下标为a,最后一个为b;单词长度为b-a+1
int start=0,end=0;//存储最长单词的首尾字符的下标
int maxlen=0;//来存储最长单词默认为0
int len = strlen(s);
for(int i=0;i<len+1;i++){
if(s[i]==' '||s[i]=='\0'){
b=i-1;
if((b-a+1)>maxlen){
maxlen=b-a+1;
start=a;
end=b;
}
a=i+1;
}
}
for(int i=start;i<=end;i++){
printf("%c",s[i]);
}
printf("\n");
}
int main(){
char s[101];
gets(s);
Std(s);
return 0;
}
11、写一个函数,用“起泡法”对输人的10个字符按由小到大顺序排列。
#include <stdio.h>
#include <string.h>
void BubbleSort(char str[]){
int i,j;
char temp;
int len=strlen(str);
for(i=0;i<len-1;i++){
for(j=i+1;j<len;j++){
if(str[i]>str[j]){
temp=str[i];
str[i]=str[j];
str[j]=temp;
}
}
}
}
int main(){
char str[101];
gets(str);
BubbleSort(str);
puts(str);
return 0;
}
12、用牛顿迭代法求根。方程为ax^3+bx^2+cx+d=0,系数a,b,c,d的值依次为1,2,3,4,由主函数输入。求x在1附近的一个实根。求出根后由主函数输出。
#include<stdio.h>
#include<math.h>
float solut(int a, int b, int c, int 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);
}
int main()
{
int a, b, c, d;
printf("input a,b,c,d:");
scanf("%d %d %d %d", &a, &b, &c, &d);
printf("x=%10.7f\n", solut(a, b, c, d));
return 0;
}
样例输入输出:
1 2 3 4
x=-1.6506292
13、用递归方法求n阶勒让德多项式的值,递归公式为
#include <stdio.h>
double polya(int n,int x){
double result;
if(n==0){
result=1;
}
if(n==1){
result=x;
}
if(n>1){
result=((2*n-1)*x-polya(n-1,x)-(n-1)*polya(n-2,x))/n;
}
return result;
}
int main(){
int n,x;
scanf("%d %d",&n,&x);
printf("%.2lf",polya(n,x));
return 0;
}
14、输人10个学生5门课的成绩,分别用函数实现下列功能:
①计算每个学生的平均分;
②计算每门课的平均分;
③找出所有50个分数中最高的分数所对应的学生和课程;
④计算平均分方差:
其,x;为某一学生的平均分。
#include<stdio.h>
#define N 10
#define M 5
float score[N][M];
float a_stu[N], a_cour[M];
int r, c;
//输入学生成绩信息函数
void input_stu(void)
{
int i, j;
for (i = 0; i < N; i++)
{
printf("\ninput score of student%2d:\n", i + 1);
for (j = 0; j < M; j++)
scanf("%f", &score[i][j]);
}
}
//每个学生平均分
void aver_stu(void)
{
int i, j;
float s;
for (i = 0; i < N; i++)
{
for (j = 0, s = 0; j < M; j++)
s += score[i][j];
a_stu[i] = s / 5.0;
}
}
//每门课程平均分
void aver_cour(void)
{
int i, j;
float s;
for (j = 0; j < M; j++)
{
s = 0;
for (i = 0; i < N; i++)
s += score[i][j];
a_cour[j] = s / (float)N;
}
}
//最高分函数
float highest()
{
float high;
int i, j;
high = score[0][0];
for (i = 0; i < N; i++)
for (j = 0; j<M; j++)
if (score[i][j]>high)
{
high = score[i][j];
r = i + 1;
c = j + 1;
}
return(high);
}
//方差函数
float s_var(void)
{
int i;
float sumx, sumxn;
sumx = 0.0;
sumxn = 0.0;
for (i = 0; i < N; i++)
{
sumx += a_stu[i] * a_stu[i];
sumxn += a_stu[i];
}
return(sumx / N - (sumxn / N)*(sumxn / N));
}
int main()
{
int i, j;
float h;
input_stu();
aver_stu();
aver_cour();
printf("\n NO. cour1 cour2 cour3 cour4 cour5 aver\n");
for (i = 0; i < N; i++)
{
printf("\n NO %2d ", i + 1);
for (j = 0; j < M; j++)
printf("%8.2f", score[i][j]);
printf("%8.2f\n", a_stu[i]);
}
printf("\naverage:");
for (j = 0; j < M; j++)
printf("%8.2f", a_cour[j]);
printf("\n");
h = highest();
printf("highest:%7.2f NO. %2d course %2d\n", h, r, c);
printf("variance %8.2f\n", s_var());
return 0;
}
15、写几个函数:
①输入10个职工的姓名和职工号;
②按职工号由小到大顺序排序,姓名顺序也随之调整;
③要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输人要查找的职工号,输出该职工姓名。
#include <stdio.h>
struct emploee{
int num;
char name[6];
}empl[101];
//输入函数
void input_employee(){
int i;
for(i=0;i<10;i++){
scanf("%d %s",&empl[i].num,empl[i].name);
}
}
//按职工号排序
void sort_num(){
struct emploee a;
int i,j;
for(i=0;i<9;i++){
for(j=i+1;j<10;j++){
if(empl[i].num>empl[j].num){
a=empl[i];
empl[i]=empl[j];
empl[j]=a;
}
}
}
printf("职工号 姓名\n");
for(i=0;i<10;i++){
printf("%d %s\n",empl[i].num,empl[i].name);
}
}
//折半查找
char sort_binary(int n){
int left=0,right=9;
while(left<=right){
int mid=(left+right)/2;
if(empl[mid].num==n){
printf("%s",empl[mid].name);
break;
}else if(empl[mid].num>n){
right = mid-1;
}else{
left = mid+1;
}
}
if(left>right){
printf("该职工不存在");
}
}
int main(){
printf("请输入职工的职工号和姓名:\n");
input_employee();
sort_num();
int n;
printf("请输入职工号:\n");
scanf("%d",&n);
sort_binary(n);
return 0;
}
样例输入输出:
请输入职工的职工号和姓名:
4 sd
3 er
2 we
1 df
10 hc
9 sb
8 nh
7 qi
6 li
5 wi
职工号 姓名
1 df
2 we
3 er
4 sd
5 wi
6 li
7 qi
8 nh
9 sb
10 hc
请输入职工号:
10
hc
16、写一个函数,输人一个十六进制数,输出相应的十进制数。
#include <stdio.h>
#include <string.h>
#include <math.h>
double chang(char s[]){
int len = strlen(s);
int i,j;
double a[101];
double sum=0;
for(i=0;i<len;i++){
if(s[i]=='A'){
a[i]=10;
}else if(s[i]=='B'){
a[i]=11;
}else if(s[i]=='C'){
a[i]=12;
}else if(s[i]=='D'){
a[i]=13;
}else if(s[i]=='E'){
a[i]=14;
}else if(s[i]=='F'){
a[i]=15;
}else {
a[i]=s[i]-'0';
}
}
for(i=len-1,j=0;i>=0;i--,j++){
sum+=pow(16,j)*a[i];
}
return sum;
}
int main(){
char s[101];
gets(s);
double m = chang(s);
printf("%.0lf",m);
return 0;
}
样例输入输出:
2AF5
10997
17、用递归法将一个整数n转换成字符串。例如,输人483,应输出字符串”483”。n的位数不确定,可以是任意位数的整数
#include <stdio.h>
#include <string.h>
void Convert(int n){
int i;
if((i=n/10)!=0)
Convert(i);
putchar(n%10+'0');
}
int main(){
int n;
scanf("%d",&n);
if(n<0){
putchar("-");
n=-n;
}
Convert(n);
return 0;
}
18、给出年、月、日,计算该日是该年的第几天。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main(){
int year,mon,day;
int mday[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int total[13]={0};
for(mon=2;mon<13;mon++){
total[mon]=total[mon-1]+mday[mon-1];
}
scanf("%d %d %d",&year,&mon,&day);
bool isleap = year%400==0 || year%100!=0&&year%4==0;
if(isleap==true && mon>=3){
total[mon]++;
}
printf("%d",total[mon]+day);
return 0;
}
样例输入输出:
2020 6 24
176