C语言程序设计(第四版)谭浩强版 课后答案 第七章 函数

1、辗转相除法
复制代码
#include<stdio.h>
int commond(int a,int b){
    int i;
    while(b!=0){
        i = a%b;
         a=b;
         b=i;
    }
    printf("%d\n",a);
}
int commonm(int a,int b){
    int i;
    int y=b,x=a;
    while(b!=0){
        i = a%b;
        a=b;
        b=i;
    }
    printf("%d\n",x*y/a);
}
int main(){
    int a,b;
    printf("please input two menbers:");
    scanf("%d%d",&a,&b);
    commond(a,b);
    commonm(a,b);
    return 0;
}
复制代码

2、求方程根

复制代码
#include<stdio.h>
#include<math.h>
double positive(double a,double b,double c){
    double x1,x2;
    x1 = (-b+sqrt(b*b-4*a*c))/2;
    x2 = (-b-sqrt(b*b-4*a*c))/2;
    printf("the equation's roots are:%f %f\n",x1,x2);
}
double negative(double a,double b,double c){
    double x1,y1,n;
    n = fabs(b*b-4*a*c);
    y1 = sqrt(n)/(2*a);
    x1 = -b/(a*2);
    printf("the equation's roots are:%fi+%f,",y1,x1);
    printf("%lfi-%lf\n",y1,x1);
}
double zero(double a,double b,double c)
{
    printf(" the equation's roots are:%f %f\n",(-b)/2*a,b/(a*2));
}
int main(){
    double a,b,c,d;
    scanf("%lf%lf%lf",&a,&b,&c);
    d = b*b-4*a*c;
    if(d>0){
        positive(a,b,c);
    }
    else if (d<0)
    {
        negative(a,b,c);
    }
    else 
        zero(a,b,c);
    

    return 0;
}
复制代码

3、如何定义函数的返回,一开始并不想用int型,而是用void,但是不知道if执行怎么结束返回,所有用了int型,直接return 0。如果用void可以用exit(0)让程序结束退出

复制代码
#include<stdio.h>
int isprime(int a){
    int i;
    for(i=2;i<a;i++){
        if(a%i==0){
            printf("it's not a prime number!\n");
            return 0;
        }
    }
    printf("this number is a prime number\n");
    return 0;
}
int main(){
    int i;
    printf("please input a number:");
    scanf("%d",&i);
    isprime(i);
    return 0;
}
复制代码

4、3*3数组转置

复制代码
#include<stdio.h>
void T(int array[][3]){
    int i,j,t;
    for(i=0;i<3;i++){
        for(j=i;j<3;j++){
            t=array[i][j];
            array[i][j]=array[j][i];
            array[j][i]=t;
        }
    }
    for(i=0;i<3;i++){
          for(j=0;j<3;j++){
            printf("%d ",array[i][j]);
          }
          printf("\n");
          
    }
}
int main(){
    void T(int array[][3]);
    int a[3][3];
    int i,j;
    printf("please input numbers:");
    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++){
            printf("%d ",a[i][j]);
          }
          printf("\n");
          
    }
    T(a);
    return 0;
}
复制代码

5、无返回类型

复制代码
#include<stdio.h>
#include<string.h>
void anti(char b[20]){
    int l,i,j,t;
    l = strlen(b);
    for(i=0,j=l-1;i<l/2;i++){
       t=b[i];
       b[i]=b[j];
       b[j]=t;
       j--; 
    }
    puts(b);
}
int main(){
    void anti(char b[20]);
    char a[20];
    printf("please input string:");
    scanf("%s",a);
    anti(a);
    return 0;
}
复制代码

返回指针类型

复制代码
#include<stdio.h>
#include<string.h>
char* anti(char b[20]){
    int l,i,j,t;
    l = strlen(b);
    for(i=0,j=l-1;i<l/2;i++){
       t=b[i];
       b[i]=b[j];
       b[j]=t;
       j--; 
    }
    return b;
}
int main(){
    char* anti(char b[20]);
    char *b;
    char a[20];
    printf("please input string:");
    scanf("%s",a);
    b=anti(a);
    puts(b);
    return 0;
}
复制代码

6、连接字符串

复制代码
#include<stdio.h>
#include<string.h>
int main(){
    char *linkstring(char array1[20],char array2[20] );
    char a[40],b[20];
    char *c;
    printf("please input first string:");
    gets(a);
    printf("please input second string:");
    gets(b);
    c=linkstring(a,b);
    puts(c);
    return 0;
}
char *linkstring(char array1[20],char array2[20]){
    int i = 0,n=0;
    while(array1[n]!='\0'){
        n++;
    }
    while(array2[i]!='\0'){
        array1[n+i]=array2[i];
        i++;
    }
    array1[n+i]='\0';
    return array1;

}
复制代码

7、

复制代码
#include<stdio.h>
int main(){
    char *funda(char a[30]);
    char a[30];
    char *c;
    printf("please input a string:");
    gets(a);
    //funda(a);
    c= funda(a);
    puts(c);
    return 0;
}
char *funda(char a[30]){
     static char b[30];
    int i=0,j=0;
    while(a[i]!='\0'){
        if(a[i]=='a'||a[i]=='e'||a[i]=='i'||a[i]=='o'||a[i]=='u'){
            b[j]=a[i];
            j++;
        }
        i++;
    }
    b[j]='\0';
   // puts(b);
    return b;
}
复制代码

8、输入四个数,每两个数之间有空格

复制代码
#include<stdio.h>
int main(){
    char *addblank(char a[10]);
    char a[10];
    char *p;
    printf("please input four numbers:");
    gets(a);
    p = addblank(a);
    puts(p);
    return 0;
}
char *addblank(char a[20]){
    int i =0,j,count=3;
    for(i=3;i>0;i--){
        a[2*i]=a[i];
        a[2*i-1]=' ';
    }
    a[7]='\0';
    return a;
}
复制代码

9、输出字符串中,各种符号的个数。

复制代码
  int c = 0;
        int o = 0;
        while(array[i]!='\0'){
                if(array[i]>='A'&&array[i]<='z')
                        a++;
                else if((int)array[i]==32)
                        b++;
                else if (array[i]>='0'&&array[i]<='9')
                        c++;
                else o++;
             i++;
        }    
        printf("The number of letter is:%d\n",a);
        printf("The number of blank is:%d\n",b);
        printf("The number of figure is:%d\n",c);
        printf("The number of other is:%d\n",o);
}
int main(){
    char a[20];
    gets(a);
    every(a);
    return 0;
}
复制代码

10、一串字符串,找最大的单词

复制代码
<stdio.h>
#include<string.h>
int main(){
    void longstr(char a[30]);
    char a[30];
    printf("please input some words:");
    fgets(a,30,stdin);
    longstr(a);
    return 0;
}
void longstr(char a[30]){
    int len = strlen(a);
    int i,start=0,end=0,maxlen=0;
    int x=0,y;
    for(i=0;i<len+1;i++){
        if(a[i]==' '||a[i]=='\0'){
            y=i-1;
            if((y-x)>maxlen){
                maxlen=y-x +1;
                start =x;
                end=y;
            }
            x=i+1;
        }
    }
    for(int i=start;i<=end;i++){
        printf("%c",a[i]);
    }

}
复制代码

11、冒泡算法

复制代码
#include<stdio.h>
int main(){
    void bubble(char a[11]);
    char a[11];
    for(int i=0;i<10;i++){
        scanf("%c",&a[i]);
    }
    bubble(a);
    return 0;
}
void bubble(char a[11]){
    int i=0,j=0;
    char max,t;
    for(i=0;i<9;i++){
        for(j=0;j<9-i;j++){
            if(a[j]>a[j+1]){
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
    fputs(a,stdout);
    printf("\n");
}
复制代码

12、牛顿二分法

复制代码
#include<stdio.h>
#include<math.h>
int main(){
    void equtionroot(int,int,int,int);
    int a,b,c,d;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    equtionroot(a,b,c,d);
    return 0;
}
void equtionroot(int a,int b,int c,int d){
    float x,x1=1;
    while(fabs(x1-x)>=pow(10,-5)){
        x=x1;
        x1= x-(a*x*x*x+b*x*x+c*x+d)/(a*3*x*x+2*b*x+c);
        printf("x1=%f\n",x1);
    }
}
复制代码

13、求勒让德多项式

复制代码
#include<stdio.h>
int main(){
    float legend(int,int);
    int n,x;
    float p;
    scanf("%d%d",&n,&x);
    p = legend(n,x);
    printf("%f\n",p);
}
float legend(int a,int b){
    float p;
    if(a==0) p=1;
    else if(a==1) p=b;
    else{
        p = ((2*a-1)*b -legend(a-1,b)-(a-1)*legend(a-2,b))/a;
    }
    return p;
}
复制代码

14、求各种学生成绩平均值

复制代码
#include<stdio.h>
void Savarage(int a[][5]){
    int i;
    float ave;
    for(i=0;i<10;i++){
        ave = (float)(a[i][0]+a[i][1]+a[i][2]+a[i][3]+a[i][4])/5;
        printf("第%d位的平均成绩为:%f\n",i+1,ave);
    }
}
void Caverage(int a[][5]){
    int i,j,sum=0;
    float ave;
    for(i=0;i<5;i++){
        for(j=0;j<10;j++){
            sum+=a[j][i];
        }
        ave = (float)sum/10;
        printf("第%d门课的平均成绩为:%f\n",i+1,ave);
    }
}
void high(int a[][5]){
    int i,j,max,x,y;
    max=a[0][0];
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            if(max<a[i][j]){
                max=a[i][j];
                x=i+1;
                y=j+1;
            }
        }
    }
    printf("the most high score is%d,student is %d , class is %d\n",max,x,y);
}
float sum1(float b[10]){
    float a=0;
    for(int i=0;i<10;i++){
        a+=b[i]*b[i];
    }
    return a;
}
float sum2(float b[10]){
    float a=0;
    for(int i=0;i<10;i++){
        a+=b[i];
    }
    return a;
}
void variance(int a[][5]){
    int i;
    float b[10];
    float ave,var;
    for(i=0;i<10;i++){
        ave = (float)(a[i][0]+a[i][1]+a[i][2]+a[i][3]+a[i][4])/5;
        b[i]=ave;
    }
   var=sum1(b)/10-pow(sum2(b)/10,2);
   printf("the variance is %f",var);
}
int main(){
    int a[10][5];
    int i,j;
    for(i=0;i<10;i++){
        for(j=0;j<5;j++){
            scanf("%d",&a[i][j]);
        }
    }
    Saverage(a);
    Caverage(a);
    high(a);
    variance(a);
    return 0;
}
复制代码

15、

16、16进制转10进制,先把所有的字母换成数字大小,依次16*+。

复制代码
#include<stdio.h>
#include<string.h>
void conversion(char str[]) 
{
    int i = 0, j=0,num = 0, sum = 0,len=0;
    //int len = strlen(str);//这种方法会将非16进制数记录在内
    while ((str[i] >= 'a' && str[i] <= 'f') || (str[i] >= 'A' && str[i] <= 'F') || (str[i] >= '0' && str[i] <= '9'))
    {
        len++;
        i++;
    } 
    i = 0;
    while (str[i] != '\0')
    {
        //字符转数字
        if (str[i] >= '0' && str[i] <= '9')
            num = str[i] - '0';
        else if (str[i] >= 'a' && str[i] <= 'f')
            num = str[i] - 'a' + 10;
        else if (str[i] >= 'A' && str[i] <= 'F')
            num = str[i] - 'A' + 10;
        else
            break;//遇到'\0'之前的第一个非十六进制数就停止循环
        for (j = 0; j < len - 1; j++)
        {
            num = num * 16;
        }
        sum += num;
        i++;
        len--;//每读取一位就使长度-1
    }
    printf("%d\n", sum);
}
int main(){
    char a[10];
    fgets(a,10,stdin);
    conversion(a);
    return 0;
}
复制代码

17、将一个整数n转换成字符串,数字怎么换成字符? 

复制代码
#include<stdio.h>
#include<math.h>
void trans(int a){
    char b[10];
    char t;
    int i=0,j,n;
    if(a<10) {
        b[i]=(48+a);
        b[i+1]='\0';
    }
    else{
        while(a%10!=0){
          b[i]=(48+(a%10));
          a = a/10;
          i++;
         }
        if((a/pow(10,i))!=0)
            b[i]=(48+a/pow(10,i));
        b[i+1]='\0';

    }
    n=i;
    for(j=0;j<(i+1)/2;j++){
        t=b[j];
        b[j]=b[n];
        b[n]=t;
        n--;
    }
    puts(b);
}
int main(){
    int a;
    scanf("%d",&a);
    trans(a);
    return 0;
}
复制代码

18、给出年月日判断该日是该年的第几天

复制代码
#include<stdio.h>
int main()
{
    int count(int y, int m, int d);
    int year, month, day, i;
    printf("请输入年,月,日:");
    scanf_s("%d,%d,%d", &year, &month, &day);
    i = count(year, month, day);
    printf("是这一年的第%d天", i);
    return 0;
}
 
int count(int y, int m, int d)
{
    int i = 0,j=0,n;
    int a[12] = { 0,31,28,31,30,31,30,31,31,30,31,30 };
    for (n = 0; j < m; j++)
    {
        n = n + a[j];
    }
    i = n + d;
    if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
    {
        if (m > 2)
            i = i + 1;
    }
    return (i);
}
复制代码

 

posted @   风中凌乱的猪头  阅读(150)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示