谭浩强C语言第七章课后习题

1、用函数法求最大公约数与最小公倍数

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int hcf(int,int);
 5     int lcd(int,int,int);
 6     int u,v,h,l;
 7     scanf("%d,%d",&u,&v);
 8     h=hcf(u,v);
 9     printf("H.C.F=%d\n",h);
10     l=lcd(u,v,h);
11     printf("L.C.D=%d\n",l);
12     return 0;
13 }
14 int hcf(int u,int v)
15 {
16     int t,r;
17     if(v>u)
18     {t=u;u=v;v=t;}
19     while((r=u%v)!=0)
20     {
21         u=v;
22         v=r;
23     }
24     return v;
25 }
26 int lcd(int u,int v,int h)
27 {
28     return(u*v/h);
29 }

法二:用全局变量的方法

 1 #include<stdio.h>
 2 int Hcf,Lcd;
 3 int main()
 4 {
 5     void hcf(int,int);
 6     void lcd(int,int);
 7     int u,v;
 8     scanf("%d,%d",&u,&v);
 9     hcf(u,v);
10     lcd(u,v);
11     printf("H.C.F=%d\n",Hcf);
12     printf("L.C.D=%d\n",Lcd);
13     return 0;
14 }
15 void hcf(int u,int v)
16 {
17     int t,r;
18     if(v>u)
19     {t=u;u=v;v=t;}
20     while((r=u%v)!=0)
21     {
22         u=v;
23         v=r;
24     }
25     Hcf=v;
26 }
27 void lcd(int u,int v)
28 {Lcd=u*v/Hcf;
29 }

 2、求一元二次方程的根。

 1 #include<stdio.h>
 2 #include<math.h>
 3 float x1,x2,disc,p,q;
 4 int main()
 5 {
 6     void greater_than_zero(float,float);
 7     void equal_to_zero(float,float);
 8     void smaller_than_zero(float,float);
 9     float a,b,c;
10     printf("input a,b,c");
11     scanf("%f,%f,%f",&a,&b,&c);
12     printf("equation :%5.2f*x*x+%5.2f*x+%5.2f=0\n",a,b,c);
13     disc=b*b-4*a*c;
14     printf("root:\n");
15     if(disc>0)
16     {
17         greater_than_zero(a,b);
18         printf("x1=%f\t\tx2=%f\n",x1,x2);
19     }
20     else if(disc==0)
21     {equal_to_zero(a,b);
22     printf("x1=%f\t\tx2=%f\n",x1,x2);
23     }
24     else{smaller_than_zero(a,b);
25     printf("x1=%f+%fi\tx2=%f-%fi\n",p,q,p,q);
26     }
27     return 0;
28 }
29 void greater_than_zero(float a,float b)
30 {
31     x1=(-b+sqrt(disc))/(2*a);
32     x2=(-b-sqrt(disc))/(2*a);
33 }
34 void equal_to_zero(float a,float b)
35 {
36     x1=x2=(-b)/(2*a);
37 }
38 void smaller_than_zero(float a,float b)
39 {
40     p=-b/(2*a);
41     q=sqrt(-disc)/(2*a);
42 }

3、函数判断素数

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int prime(int);
 5     int n;
 6     printf("input");
 7     scanf("%d",&n);
 8     printf("%d",n);
 9     if(prime(n))
10         printf("  yes\n");
11     else
12         printf("   not\n");
13     return 0;
14 }
15 int prime(int n)
16 {
17     int flag=1,i;
18     for(i=2;i<n/2&&flag==1;i++)
19         if(n%i==0)
20             flag=0;
21         return flag;
22 }

4、将3*3数组转置

 1 #include<stdio.h>
 2 #define N 3
 3 int array[N][N];
 4 int main()
 5 {
 6     void convert(int array[][3]);
 7     int i,j;
 8     printf("input array:\n");
 9     for(i=0;i<N;i++)
10         for(j=0;j<N;j++)
11             scanf("%d",&array[i][j]);
12         printf("original array :\n");
13         for(i=0;i<N;i++)
14         {
15             for(j=0;j<N;j++)
16                 printf("%5d",array[i][j]);
17             printf("\n");
18         }
19         convert(array);
20         printf("convert array:\n");
21         for(i=0;i<N;i++)
22         {
23             for(j=0;j<N;j++)
24                 printf("%5d",array[i][j]);
25             printf("\n");
26         }
27         return 0;
28 }
29 void convert (int array[][3])
30 {
31     int i,j,t;
32     for(i=0;i<N;i++)
33         for(j=i+1;j<N;j++)
34         {
35             t=array[i][j];
36             array[i][j]=array[j][i];
37             array[j][i]=t;
38         }
39 }

5、反序存放一个字符串

 1 #include<stdio.h>
 2 #include<string.h>
 3 int main()
 4 {
 5     void inverse(char str[]);
 6     char str[100];
 7     printf("input sring:");
 8     scanf("%s",str);
 9     inverse(str);
10     printf("inverse string:%s\n",str);
11     return 0;
12 }
13 void inverse(char str[])
14 {
15     char t;
16     int i,j;
17     for(i=0,j=strlen(str);i<(strlen(str)/2);i++,j--)
18     {t=str[i];
19     str[i]=str[j-1];
20     str[j-1]=t;}
21 }

 6.将两个字符连接

 1 #include<stdio.h>
 2 int main()
 3 {
 4     void concatenate(char string1[],char string2[],char string[]);
 5     char s1[100],s2[100],s[100];
 6     printf("input string1:");
 7     scanf("%s",s1);
 8     printf("input string2:");
 9     scanf("%s",s2);
10     concatenate(s1,s2,s);
11     printf("\nthe new is\n");
12     printf("%s\n",s);
13     return 0;
14 }
15 void concatenate(char string1[],char string2[],char string[])
16 {
17     int i,j;
18     for(i=0;string1[i]!='\0';i++)
19         string[i]=string1[i];
20     for(j=0;string2[j]!='\0';j++)
21         string[i+j]=string2[j];
22     string[i+j]='\0';
23 }

7、复制元音字母

 1 #include<stdio.h>
 2 int main()
 3 {
 4     void cpy(char [],char []);
 5     char str[80],c[80];
 6     printf("input string\n");
 7     gets(str);
 8     cpy(str,c);
 9     printf("\nis   %s\n",c);
10     return 0;
11 }
12 void cpy(char s[],char c[])
13 {
14     int i,j;
15     for(i=0,j=0;s[i]!='\0';i++)
16     if(s[i]=='A'||s[i]=='a'||s[i]=='E'||s[i]=='e'||s[i]=='I'||s[i]=='i'||s[i]=='O'||s[i]=='o'||s[i]=='U'||s[i]=='u')
17     {
18         c[j]=s[i];
19         j++;}
20     c[j]='\0';
21 }

8、在字符串中打空格

 1 #include<stdio.h>
 2 #include<string.h>
 3 int main()
 4 {
 5     void insert(char str[]);
 6     char str[80];
 7     printf("input");
 8     scanf("%s",str);
 9     insert(str);
10     return 0;
11 }
12 void insert(char str[])
13 {
14     int i;
15     for(i=strlen(str);i>0;i--)
16     {
17         str[2*i]=str[i];
18         str[2*i-1]=' ';
19     }
20     printf("output:\n%s\n",str);
21 }

 9、统计字母数字空格以及其他字符个数

 1 #include<stdio.h>
 2 int letter,digit,space,other;
 3 int main()
 4 {
 5     void count(char []);
 6     char text[80];
 7     printf("input string:\n");
 8     gets(text);
 9     printf("string:");
10     puts(text);
11      letter=0;
12      space=0;
13      digit=0;
14      other=0;
15      count(text);
16      printf("字母数:%d\n空格数:%d\n数字数%d\n其他%d\n",letter,space,digit,other);
17      return 0;
18 }
19 void count(char str[])
20 {
21     int i;
22     for(i=0;str[i]!='\0';i++)
23           if(str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z')
24              letter++;
25          else if(str[i]==' ')
26              space++;
27          else if(str[i]>='0'&&str[i]<='9')
28              digit++;
29          else
30              other++;
31 }

10、输出一行字符中的最长单词

 1 #include<stdio.h>
 2 #include<string.h>
 3 int main()
 4 {
 5     int alphabetic(char);
 6     int longest(char []);
 7     int i;
 8     char line[100];
 9     printf("input one line:\n");
10     gets(line);
11     printf(" the longest word is:");
12     for(i=longest(line);alphabetic(line[i]);i++)
13         printf("%c",line[i]);
14     printf("\n");
15     return 0;
16 }
17 int alphabetic(char c)
18 {
19     if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
20         return(1);
21     else
22         return(0);
23 }
24 int longest(char string[])
25 {
26     int len=0,i,length=0,flag=1,place=0,point;
27     for(i=0;i<strlen(string);i++)
28         if(alphabetic(string[i]))
29             if(flag)
30             {point=i;
31             flag=0;
32             }
33             else
34                 len++;
35             else
36             {flag=1;
37             if(len>=length)
38             {length=len;
39             place=point;
40             len=0;
41             }
42             }
43             return(place);
44 }

11、起泡法对字符按照降序排列

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define N 100
 4 char str[N];
 5 int main()
 6 {
 7     void sort(char[]);
 8     int i,flag;
 9     for(flag=1;flag==1;)
10     {
11         printf("input string:\n");
12         scanf("%s",&str);
13         if(strlen(str)>N)
14             printf("roo long ,input again:");
15         else
16             flag=0;
17     }
18     sort(str);
19     printf("string sort:\n");
20     for(i=1;i<N;i++)
21         printf("%c",str[i]);
22     printf("\n");
23     return 0;
24 }
25 void sort(char str[])
26 {
27     int i,j;
28     char t;
29     for(j=1;j<N;j++)
30         for(i=0;(i<N-j)&&(str[i]!='\0');i++)
31             if(str[i]>str[i+1])
32             {
33                 t=str[i];
34                 str[i]=str[i+1];
35                 str[i+1]=t;
36             }
37 
38 }

 12、用牛顿迭代法求根

 1 #include<stdio.h>
 2 #include<math.h>
 3 int main()
 4 {
 5     float solut(float a,float b,float c,float d);
 6     float a,b,c,d;
 7     printf("input a,b,c,d:");
 8     scanf("%f,%f,%f.%f",&a,&b,&c,&d);
 9     printf("x=%10.7f\n",solut(a,b,c,d));
10     return 0;
11 }
12 float solut(float a,float b,float c,float d)
13 {
14     float x=1,x0,f,f1;
15     do
16     {
17         x0=x;
18         f=((a*x0+b)*x0+c)*x0+d;
19         f1=(3*a*x0+2*b)*x0+c;
20         x=x0-f/f1;
21     }while(fabs(x-x0)>=1e-3);
22     return(x);
23 }

13、勒让德多多项式

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int x,n;
 5     float p(int,int);
 6     printf("\n input n  x:");
 7     scanf("%d,%d",&n,&x);
 8     printf("n=%d,x=%d\n",n,x);
 9     printf("p%d(%d)=%6.2f\n",n,x,p(n,x));
10     return 0;
11 }
12 float p(int n,int x)
13 {
14     {if(n==0)
15         return(1);
16     else if(n==1)
17         return(x);
18     else
19         return((2*n-1)*x*p((n-1),x)-(n-1)*p((n-2),x))/n;
20     }
21 }

14、

#include<stdio.h>
  #define N 10
  #define M 5
  float score[N][M];              //10个学生5门课成绩
  float a_stu[N],a_cour[M];       
  int r,c;
  int main()
  {
      int i,j;
     float h;
     float s_var(void);            //计算方差
     float highest();
     void input_stu(void);          //输入数据
     void aver_stu(void);          //计算每个学生的平均分
     void aver_cour(void);         //计算每门课的平均分
     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("\n average:");
     for(j=0;j<M;j++)
         printf("%8.2f",a_cour[j]);
     printf("\n");
     h=highest();
     printf("highest: %7.2f  NO.%2d  cours %2d\n",h,r,c);
     //最高分  学生号 课程号
     printf("variance %8.2f\n",s_var());
         return 0;
  }
  void input_stu(void)
  {
      int i,j;
      for(i=0;i<N;i++)
      {
          printf("\n input scoreof 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=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));
  }

15、

#include<stdio.h>
#include<string.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 num[N],number,flag=1,c;
    char name[N][8];
    input(num,name);
    sort(num,name);
    while(flag==1)
    {
        printf("input number to look for:");
        scanf("%d",&number);
        search(number,num,name);
        printf("continue or not(Y/N)?");
        getchar();
        c=getchar();
        if(c=='N'||c=='n')
            flag=0;
    }
    return 0;
}
void input(int num[],char name[N][8])
{
    int i;
    for(i=0;i<N;i++)
    {
        printf("input NO.:");
        scanf("%d",&num[i]);
        printf("input name:");
        getchar();
        gets(name[i]);
}
}
void sort(int num[],char name[N][8])
{
    int i,j,min,temp1;
    char temp2[8];
    for(i=0;i<N-1;i++)
    {
        min=i;
        for(j=i;j<N;j++)
        if(num[min]>num[j]) min=j;
        temp1=num[i];
        strcpy(temp2,name[i]);
        num[i]=num[min];
        strcpy(name[i],name[min]);
        num[min]=temp1;
        strcpy(name[min],temp2);
    }
    printf("\nresult:\n");
    for(i=0;i<N;i++)
        printf("\n%5d%10s",num[i],name[i]);
}
void search(int n,int num[],char name[N][8])
{
    int top,bott,mid,loca,sign;
    top=0;
    bott=N-1;
    loca=0;
    sign=1;
    if((n<num[0])||(n>num[N-1]))
        loca=-1;
    while((sign==1)&&(top<=bott))
    {
        mid=(bott+top)/2;
        if(n==num[mid])
        {
            loca=mid;
            printf("No.%d,his name is%s.\n",n,name[loca]);
            sign=-1;
        }
        else if(n<num[mid])
            bott=mid-1;
        else
            top=mid+1;
    }
    if(sign==1||loca==-1)
        printf("%d not been found.\n",n);
}

 17、

#include<stdio.h>
int main()
{
    void convert(int n);
    int number;
    printf("input an interger:");
    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);
}

 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 nuumber is%d\n",htoi(t));
    printf("continue or not?");
    c=getchar();
    if(c=='N'||c=='n')
        flag1=0;
    else
    {flag=0;
    i=0;
    printf("\n input a HEX number:");
    }
    }
}
return 0;
}
int htoi(char s[])
{
    int i,n;
    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);
}

18、

#include<stdio.h>
int main()
{
    int sum_day(int month,int day);
    int leap(int year);
    int year,month,day,days;
    printf("input date(year,month,day)):");
    scanf("%d,%d,%d",&year,&month,&day);
    printf("%d/%d/%d",year,month,day);
    days=sum_day(month,day);
    if(leap(year)&&month>=3)
        days=days+1;
    printf("is the %d day in this year.\n",days);
    return 0;
}
int sum_day(int month,int day)
{
    int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int i;
    for(i=1;i<month;i++)
        day+=day_tab[i];
    return(day);
}
int leap(int year)
{int leap;
leap=year%4==0&&year%100!=0||year%400==0;
return(leap);
}

 

posted @ 2019-09-23 21:14  未央wdq  阅读(813)  评论(0编辑  收藏  举报