C语言问题汇总

C语言问题汇总

  • 排序方法
    • 冒泡排序
    • 降序排序
  • 作业
    • 从文件中读取内容
    • 字符写入文件
    • 结构体数组 以二进制形式写入文件并读取
    • 将字符串写入文件,并从文件中读取
    • 查找字符在字符串中的位置
    • 字符串链接 不使用strcpy函数
    • 使用strcpy函数将字符串复制到另一个地址
    • 找出与目标值最接近的元素
    • 输出不能被3整除但能被5整除的整数及总和
    • 输入学生学号及周数,判断学生是否需要交作业
    • 将字符串加密
    • 输入学生成绩输出其成绩等级
    • 统计字符串中大小写字母个数及数字个数
    • 登记学生成绩并统计最高分最低分及平均分
    • 将文本按字典顺序排列
    • c语言 青蛙跳台阶
    • 判断字符串是否对称
    • 奶牛生子
    • 打印平行四边形图案
    • 查找数组元素,并输出其下标
    • 交换x和y的数值
    • 计算长方形面积和长方体体积
    • 判断一个整数的奇偶性
    • 输出成绩最高者的姓名及成绩
    • 输入一个成绩,输出成绩及其等级
    • 结构体输出两人基础信息,并比较年龄谁大
    • 枚举实现工作日查找
    • 最小消费问题
    • 不同路径问题
    • 内部收益率问题 二分法求零点

排序方法

冒泡排序

#include 
#include 

int main ()
{
    int a[100],n,i,j,k;
    printf("请输入整数个数n: ");
    scanf("%d",&n);
    printf("请输入%d个整数(用空格隔开): ",n);
    for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
    }
    for(j=0;j<n;j++)
          for(k=0;k<n-1-i;k++){
                if(a[k+1]<a[k]){
                int temp=a[k];
                    a[k]=a[k+1];
                    a[k+1]=temp;
                }

    }
    printf("升序排序后整数系列: ");
    for(i=0;i<n;i++){
        printf("%d ",a[i]);
    }
    return 0;


}

在这里插入图片描述

降序排序

写一个函数,对任意一维数组进行降序排序
在主函数中随机生成一有n个元素的一维数组(元素的取值范围载10-90之间),调用排序函数对该数组进行排序,并输出排序结果

#include 
#include 

void f(int a[],int n){
    for(int i=0;i<n;i++)
        for(int j=0;j<n-i-1;j++)
            if(a[j]<a[j+1]){
                    int temp=a[j];
                     a[j]=a[j+1];
                     a[j+1]=temp;
           }
}

int main()
{
    printf("请输入产生多个随机数: ");
    int a[100],num=0;
    scanf("%d",&num);
    printf("随机数组: ");
    for(int i=0;i<num;i++){
        a[i]=rand()%80+10;
        printf("%d ",a[i]);
    }
    f(a,num);
    printf("\n");
    printf("降序排序后整数系列: ");
    for(int j=0;j<num;j++)
        printf("%d ",a[j]);
    return 0;
}

在这里插入图片描述

作业

从文件中读取内容

#include 
#include 

int main()
{
    char ch;
    FILE *fp=fopen("D:\\test.txt","r");
     if(fp==NULL){
        printf("error!\n");
        return 0;
    }

        printf("从文件中读取的内容: ");
        ch=fgetc(fp);
        while(ch!=EOF)
        {
            putchar(ch);
            ch=fgetc(fp);
        }
        fclose(fp);
        return 0;
    }


​​​​​​​​​​​​​​在这里插入图片描述

字符写入文件

#include 
#include 

int main()
{
    char ch;
    FILE *fp=fopen("D:\\test.txt","w");
    if(fp!=NULL)
      {
        printf("请输入一串字符: ");
        ch=getchar();
        while(ch!='#')
        {
            fputc(ch,fp);
            ch=getchar();

        }
      fclose(fp);
      }
      else
        printf("error!\n");
      return 0;

}

在这里插入图片描述

结构体数组 以二进制形式写入文件并读取

#include 
#include 

struct Student{
    char name[20];
    int  id;
    int  age;
  };

int main()
{
    struct Student stus[3]={{"zhuangsan",123,18},{"lisi",124,19},{"wangwu",125,20}};
    struct Student temp[3];
    int size=sizeof(struct Student);
    FILE *fp=fopen("student.dat","rb+");
    fopen("student.dat","wb");
    if(fp!=NULL)
    {
       int count= fwrite(stus,size,3,fp);
       if(count==3)
       {
           printf("数组temp中的内容为: \n");
       }
    }
    fclose(fp);
    fopen("student.dat","rb");
    if(fp!=NULL)
    {
        int i;
        for(i=0;i<3;i++)
        {
            int count=fread(&temp,size,1,fp);
            if(count==1)
            {
                printf("姓名: %s\t学号: %d\t年龄: %d\n",temp->name,temp->id,temp->age);
            }
        }
        fclose(fp);
    }
    return 0;
}


C语言问题汇总_第1张图片

将字符串写入文件,并从文件中读取

#include 
#include 

int main()
{
    char arr[100];
    FILE *fp=fopen("a.tex","r+");
    printf("请输入一串字符给arr: ");
    gets(arr);
    fopen("a.tex","w");
    if(fp!=NULL){
        int i;
        for(i=0;i<strlen(arr);i++){
                fputc(arr[i],fp);
        }
    }
    fclose(fp);
    arr[0]='\0';
    printf("数组arr中的内容: ");
    fopen("a.tex","r");
    char ch;
    if(fp!=NULL)
    {

       ch=fgetc(fp);
       while(ch!=EOF)
       {
           printf("%c",ch);
           ch=fgetc(fp);
       }

在这里插入图片描述

查找字符在字符串中的位置

#include 
#include 

int main()
{
    char arr[80];
    char ch,*p;
    printf("请输入一串字符给arr: ");
    gets(arr);
    printf("请输入要查找的字符: ");
    scanf("%c",&ch);
    p=strchr(arr,ch);
    if(p!=NULL){
        printf("%c在字符串%s中的索引位置为: %d\n",ch,arr,p-arr);
        return 0;
    }
    printf("%s中没有字符%c",arr,ch);
    return 0;
}

在这里插入图片描述

字符串链接 不使用strcpy函数

#include 
#include 

void myStrCat(char *dest,char *src)
{
   char *trm;
   int i,j;
   for(i=0;dest[i]!='\0';i++)
   {
       trm[i]=dest[i];
   }
   for(j=0;src[j]!='\0';j++)
   {
       trm[i+j]=src[j];
   }
   puts(trm);
}
int main()
{
    char src[80];
    char dest[80];
    void myStrCat(char *dest,char *src);
    printf("请输入一串字符给stc: ");
    gets(src);
    printf("请输入一串字符给dest: ");
    gets(dest);
    printf("执行mysterCat前dest的内容: %s\n",dest);
    printf("执行mysterCat后dest的内容 :");
    myStrCat(dest,src);
    return 0;
}

C语言问题汇总_第2张图片

使用strcpy函数将字符串复制到另一个地址

#include 
#include 

int main()
{
    char stc [80]={'\0'};
    char dest[80]={'\0'};
    printf("请输入一串字符: ");
    gets(stc);
    printf("执行strcpy前dest的内容:%s\n",dest);
    strcpy(dest,stc);
    printf("执行stecpy后dest的内容:%s\n",dest);
    return 0;
}

找出与目标值最接近的元素

目标值与数组所有元素去比对,找出最接近的元素,输出下标
举例如下:一个数组[915,941,960,976,992,1015,1034,1050,1073,1089,1115,1131,1150,1166,1182,1208,1227]

目标值假设是1000,最接近元素为992,下标为4

#include 

int main()
{
   int min=(1<<31)-1;
   int idx=0;
   int arr[]={915,941,960,976,992,1015,1034,1050,1073,1089,1115,1131,1150,1166,1182,1208,1227};
   int n=1000;
   for(int i=0;i<sizeof(arr)/sizeof(int);i++)
   {
       int diff=arr[i]-n;
       if(diff<0)
          diff=-diff;
       if(diff<min)
       {
           min=diff;
           idx=i;
       }
   }
   printf("最接近的是%d,下标是%d",arr[idx],idx);
   return 0;


输入任意个数数组,查找出与目标值最接近的元素,并输出其下标

#include 

int main()
{
   int min=(1<<31)-1;
   int idx=0,arr[100],m,n;
   printf("请输入数组元素个数: ");
   scanf("%d",&m);
   printf("请输入数组元素: ");
   for(int j=0;j<m;j++)
   {
       scanf("%d",&arr[j]);
   }
  printf("请输入目标值: ");
  scanf("%d",&n);
   for(int i=0;i<m;i++)
   {
       int diff=arr[i]-n;
       if(diff<0)
          diff=-diff;
       if(diff<min)
       {
           min=diff;
           idx=i;
       }
   }
   printf("最接近的是%d,下标是%d",arr[idx],idx);
   return 0;
}

C语言问题汇总_第3张图片

输出不能被3整除但能被5整除的整数及总和

#include 
#include 
int main()
{   int i, sum=0;
    int num = 0;
    printf("1~100之间不能被3整除但能被5整除的整数分别为:\n");
    for(i=1;i<= 100;i++)
    {
        if(i%3!= 0 && i%5 == 0)
        {
           printf("%d\t",i);
           num++;
           if(num%5 ==0)
              printf("\n");
           sum=sum+i;
       }
    }
    printf("\n");
    printf("不能被3整除但能被5整除的整数之和为:%d\n", sum);
    return 0;
}

C语言问题汇总_第4张图片

输入学生学号及周数,判断学生是否需要交作业

#include 
#include 
int main(){
    int stuNum=0;
    int remainder=-1;
    int weekNum=0;
    printf("请输入学号(1420110001,142015000):\n");
    scanf("%d",&stuNum);
    if((stuNum>=142011001)&&(stuNum<=142015000)){
        printf("请输入周数:\n");
        scanf ("%d",&weekNum);
    if((weekNum>=1)&&(weekNum<=20))
        remainder=stuNum %10;
    if(remainder%3==weekNum%3)
        printf("学生%d在第%d周应该交作业吗?是\n");
    }
    else
        printf("学生%d在第%d周应该交作业吗?否\n");
    return 0;
    }

将字符串加密

#include 
#include 
int main()
{
    char a[20]={'H','e','l','l','o',' ','W','o','r','l','d'};
    int i;

    printf("加密前:\n");

    for(i=0;i<20;i++){
        printf("%c",a[i]);
    }
    printf("\n");

    for(i=0;i<20;i++){
        if(a[i]>='a'&&a[i]<='z'){
            if(a[i]<'v'){
                a[i]+=5;
            }
          else

               a[i]-=21;
        }
        if(a[i]>='A'&&a[i]<='Z'){
            if(a[i]<'V'){
                a[i]+=5;
            }
            else

                a[i]-=21;
        }
    }
    printf("加密后:\n");
    for(i=0;i<20;i++){
            printf("%c",a[i]);
    }
    return 0;
}


C语言问题汇总_第5张图片

输入学生成绩输出其成绩等级

#include 
#include 
char f(int n);
int main()
{
    char grade_level;
    int grade;
    printf("请输入学生的成绩:");
    scanf("%d",&grade);
    grade_level=f(grade);
    printf("该学生的成绩等级为:%c",grade_level);
    return 0;
}
char f(int n)
{
    char level;
    switch(n/10)
    {
        case 10:
        case 9:
              level='A';
              break;
        case 8:
             level='B';
             break;
        case 7:
             level='C';
             break;
        case 6:
             level='D';
             break;
        case 5:
        case 4:
        case 3:
        case 2:
        case 1:
        case 0:
             level='E';
             break;
    }
    return level;
}

在这里插入图片描述

统计字符串中大小写字母个数及数字个数

#include 
#include 
int main()
{
    char ch=0;
    int upperNum=0;
    int lowerNum=0;
    int digitNum=0;
    printf("请输入一串字符,按回车结束:");
    while((ch=getchar())!='\n')
    {

        if(ch>='A'&&ch<='Z'){
            upperNum++;
        }
        else if(ch>='a'&&ch<='z'){
            lowerNum++;
        }
        else if(ch>='0'&&ch<='9'){
            digitNum++;
        }
    }
    printf("大写字母个数:%d,\n",upperNum);
    printf("小写字母个数: %d\n",lowerNum);
    printf("数字字符个数: %d\n",digitNum);
    printf("So Easy!!!\n");
    return 0;
}

C语言问题汇总_第6张图片

登记学生成绩并统计最高分最低分及平均分

#include 
#include 
int main()
{
    double results[10];
    int i=0;
    double max=0,min=100,sum=0,average;
    printf("成绩登记:\n");
    for(i=0;i<10;i++){
        printf("请输入第%d个学生的成绩: ",i+1);
        scanf("%lf",&results[i]);
        if(max<results[i]){
            max=results[i];
        }
        if(min>results[i]){
            min=results[i];
        }
        sum+=results[i];
    }
    average=sum/10;
    printf("统计如下: \n");
    printf("所以学生中最高分为:%f \n",max);
    printf("所以学生中最低分为:%f \n",min);
    printf("所以学生中平均分为:%f \n",average);
    return 0;
}


C语言问题汇总_第7张图片

将文本按字典顺序排列

#include 
#include 

int main()
{
    char str[3][80];
    char temp[80];
    int i,j,k;
    printf("请输入三行文本(每行小于80个字符):\n");
    for(i=0;i<3;i++){
        gets(str[i]);
    }
    for(i=0;i<3;i++){
        k=i;
        for(j=k+1;j<3;j++){
            if(strcmp(str[k],str[j])>0){
                k=j;
            }

        }
         if(k!=i){
                strcpy(temp,str[i]);
                strcpy(str[i],str[k]);
                strcpy(str[k],temp);
            }

        }
        printf("按字典排序后的结果: \n");
        for(i=0;i<3;i++){
            puts(str[i]);
    }
    return 0;
}

C语言问题汇总_第8张图片

c语言 青蛙跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级。

求该青蛙跳上一个n级的台阶总共有多少种跳法。
解法一:递归法
C语言问题汇总_第9张图片

#include 
#include 

int f(int n){
    int tem;
    if(n<=2)
        tem=n;
    else
        tem=f(n-1)+f(n-2);
    return tem;
}

int main()
{
    int n,tem;
    int f(int n);

    printf("请输入台阶数n: ");
    scanf("%d",&n);
    if(n>=0){
        tem=f(n);
        printf("该青蛙跳上一个%d级的台阶总共有%d种跳法。",n,tem);
    }
    else
        printf("输入错误!");
    return 0;
}

在这里插入图片描述

判断字符串是否对称

#include 
#include 
int main()
{
    char str[20];
    int i;
    int len;
    printf("请输入小于20个字符:");
    gets(str);
    len=strlen(str);
    for(i=0;i<len/2;i++){
         if(str[i]!=str[len-i-1]){
            printf("%s不是对称的\n",str);
            return 0;
         }
    }
    printf("%s是对称的\n",str);
   return 0;
}

在这里插入图片描述

奶牛生子

一只刚出生的奶牛,4年生1只奶牛,以后每一年生1只。现在给你一只刚出生的奶牛,求20年后有多少奶牛?

#include 
#include 

int icows (int year){
    int i,cows=1;
    for(i=0;i<=year;++i){
        if(i>3){
                if((year-i)>3)
                   cows+=icows(year-i);
                else
                   cows++;
       }
    }
    return cows;
}
int main()
{
    int year;
    int cows;
    int icows (int year);
    printf("请输入年数: ");
    scanf("%d",&year);
    cows=icows(year);
    printf("%d年后奶牛总数为%d",year,cows);
    return 0;
}

打印平行四边形图案

#include 
#include 

int main()
{
    int i,j,k;
    char space=' ';
    char a[5]={'*','*','*','*','*'};
    for(i=0;i<5;i++){
        for(j=0;j<i+2;j++){

            printf("%c",space);
        }
        for(k=0;k<5;k++){
            printf("%c",a[k]);
        }
        printf("\n");
    }
    return 0;
}

C语言问题汇总_第10张图片

查找数组元素,并输出其下标

#include 
#include 

int findElement(int *ptr,int arrLen,int n){
    int i;
    for(i=0;i<arrLen;i++){
        if(ptr[i]==n){
            return i;
        }}
    return -1;
}
int main()
{
    int arr[10];
    int n,i;

    int findElement(int *ptr,int arrLen,int n);
    for(i=0;i<10;i++){
        printf("请输入第%d个元素:  ",i+1);
        scanf("%d",&arr[i]);
    }
    printf("请输入要查找的n的值:");
    scanf("%d",&n);
    i=findElement(arr,10,n);
    printf("数组中存在与待查找的n(%d)相等的数组元素,其下标为:%d\n",n,i);
    return 0;

}

C语言问题汇总_第11张图片

交换x和y的数值

#include 
#include 

void swap(int *a,int *b){
    int p;
    p=*a;
    *a=*b;
    *b=p;

}

int main()
{
    void swap(int *a,int *b);
    int x,y;
    printf("请输入两个整数,如12,34:");
    scanf("%d,%d",&x,&y);
    printf("交换前: x和y的值分别为:%d,%d\n",x,y);
    swap(&x,&y);
    printf("交换后: x和y的值分别为:%d,%d\n",x,y);
    printf("So Easy!");
    return 0;
}

C语言问题汇总_第12张图片

计算长方形面积和长方体体积

#include 
#include 
float getRectArea(float length,float width){
    float area=0;
    area=length*width;
    return area;
}
float getCuboidVolume(float length,float width,float height){
    float volume=0;
    volume=length*width*height;
    return volume;
}
int main()
{
    float length=0,width=0,height=0,area=0,volume=0;
    float getRectArea(float length,float width);
    float getCuboidVolune(float length,float width,float height);
    while(1){
    printf("请依次输入长度、宽度和高度(如1.0,2.0,3.0):");
    scanf("%f,%f,%f",&length,&width,&height);
    area=getRectArea(length,width);
    printf("矩形(长:%f,宽:%f)的面积为:%f\n",length,width,area);
    volume=getCuboidVolume( length,width,height);
    printf("矩形(长:%f,宽:%f,高:%f)的体积为:%f\n",length,width,height,volume);
    if(area<0){
        break;
    }
    else{
        continue;
    }
    }
}

在这里插入图片描述

判断一个整数的奇偶性

#include 
#include 

int main()
{
    unsigned int number;
    int result;
    printf("请输入一个无符号整数: \n");
    scanf("%d",&number);
    result=number%2;
    if(result==0)
        printf("整数%d是偶数!\n",number);
    else
        printf("整数%d是奇数!\n",number);
    return 0;
}

在这里插入图片描述

输出成绩最高者的姓名及成绩

#include 
#include 

struct Student{
    char name[20];
    int math;
};

int main()
{
    struct Student arr[5];
    int index=0,i,j;
    for(i=0;i<5;i++)
    {
        printf("请输入第%d个学生的姓名和数学成绩(用空格分开): ",i+1);
        scanf("%s %d",&arr[i].name,&arr[i].math);
        getchar();
    }
    for(j=0;j<5;j++)
    {
        if(arr[j].math>arr[index].math)
            index=j;
    }
    printf("数学成绩最高的学生姓名是: %s ,其数学成绩为: %d\n",
           arr[index].name,arr[index].math);
    return 0;

}

C语言问题汇总_第13张图片

输入一个成绩,输出成绩及其等级

#include 
#include 
char getGradeLevel(int grade){
    if(grade>=0&&grade<=100){
    char gradeLevel;
    int grade_d10=-1;
    grade_d10=grade/10;
    switch(grade_d10){
        case 0:
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
              return'E';
        case 6:
              return'D';
        case 7:
             return 'C';
        case 8:
             return 'B';
        case 9:
        case 10:
             return 'A';
    }
    }
    else
        return '0';
}
int main()
{
    int grade=-1;
    char gradeLevel='A';
    char getGradeLevel(int grade);
    while(1){
    printf("请输入成绩(0~100):\n");
    scanf("%d",&grade);
    gradeLevel= getGradeLevel(grade);
    printf("成绩%d的等级是%c: \n",grade,gradeLevel);
    if(gradeLevel='0'){
        break;
    }
    else
        continue;

    }
    printf("So Easy!!!!!\n");
    return 0;
}

C语言问题汇总_第14张图片

结构体输出两人基础信息,并比较年龄谁大

#include 
#include 

struct Person{
    char arr[20];
    char ch;
    unsigned int age;
};
int main()
{
    struct Person per1={"Person 1",'F',30};
    struct Person per2={"Person 2",'M',20};

    if(per1.age>per2.age)
        printf("Person 1比Person 2年龄大\n");
    else
        printf("Person 2比Person 1年龄大\n");

    printf("Person: Person 1的个人信息为:\n");
    printf("\tName: %s\n",per1.arr);
    printf("\tSex : %c\n",per1.ch);
    printf("\tAge : %d\n",per1.age);

    printf("Person: Person 2的个人信息为:\n");
    printf("\tName: %s\n",per2.arr);
    printf("\tSex : %c\n",per2.ch);
    printf("\tAge : %d\n",per2.age);
    printf("So Easy!");
return 0;
}

C语言问题汇总_第15张图片

枚举实现工作日查找

#include 
#include 

enum weekday
{
    Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday,
};
int main()
{
    int i;
    while(1){
            printf("请输入当前工作日(1~7):");
            scanf("%d",&i);
            if(i<=7&&i>=1){
                switch(i)
                {
                    case 1:
                        printf("Monday\n");
                        break;
                    case 2:
                        printf("Tuesday\n");
                        break;
                    case 3:
                        printf("Wednesday\n");
                        break;
                    case 4:
                        printf("Thursday\n");
                        break;
                    case 5:
                        printf("Friday\n");
                        break;
                    case 6:
                        printf("Saturday\n");
                        break;
                    case 7:
                        printf("Sunday\n");
                        break;
               }
            }
            else{
                printf("输入的工作日%d不在正确范围内(1~7)\n",i);
                return 0;
            }
   }
}

C语言问题汇总_第16张图片

最小消费问题

#include 
#include 

int main()
{
   int n,x,y,z,i,min=10000,n1,n2,n3,temp=0,t=0;

   //n为咨询的商家数,xyz分别为要购买商品一、商品二、商品三的数量
   //n1、n2、n3分别为商品一、二、三的价格

   printf("咨询的商家数为: ");
   scanf("%d",&n);
   printf("需购买商品一、二、三的数量为: ");

   //输入数据用空格分隔,以下皆是

   scanf("%d %d %d",&x,&y,&z);
   for(i=0;i<n;i++){
       printf("编号为%d的商家商品一、二、三的报价: \n",i+1);
       scanf("%d %d %d",&n1,&n2,&n3);
       temp=n1*x+n2*y+n3*z;
       if(temp<min){
        min=temp;
        t=i+1;
       }
   }
   printf("在编号为%d的商家购买总费用最低,为 %d元!!!",t,min);
   return 0;

}

C语言问题汇总_第17张图片

不同路径问题

问题:

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?
C语言问题汇总_第18张图片

#include 
#include 

//定义一个求组合的函数!

    int combination(int m, int n) {
        if(m > n)
            return combination(n, m);
        int i,j;
        long long result = 1;
        for (i = n,j = 1; j <= m - 1; i++, j++) {
               result=result*i/j;
        }
        return result;
    }
    
int main()
{
    int n,m;
    long long sum;
    printf("请输入网格规格m X n: ");
    //m n 输入用空格隔开!
    scanf("%d %d",&m, &n);
    sum=combination(m,n) ;
    printf("总共有%lld条路径!",sum);
    return 0;
}

内部收益率问题 二分法求零点

在金融中,我们有时会用内部收益率IRR来评价项目的投资财务效益,它等于使得投资净现值NPV等于0的贴现率。换句话说,给定项目的期数T、初始现金流CF0和项目各期的现金流CF1, CF2, …,CFT,IRR是下面方程的解:
在这里插入图片描述
为了简单起见,本题假定:除了项目启动时有一笔投入(即初始现金流CF0 < 0)之外,其余各期均能赚钱(即对于所有i=1,2,…,T,CFi > 0)。根据定义,IRR可以是负数,但不能小于-1。

输入文件最多包含25组测试数据,每个数据占两行,第一行包含一个正整数T(1<=T<=10),表示项目的期数。第二行包含T+1个整数:CF0, CF1, CF2, …, CFT,其中CF0 < 0, 0 < CFi < 10000 (i=1,2,…,T)。T=0表示输入结束.

#include 
#include 

double f(double IRR,int CF[],int T ){
    double NPV=0;
    for(int i=0;i<=T;i++){
            NPV+=CF[i]/pow((1+IRR),i);
    }
    return NPV;
}

int main()
{
    int CF[25],T;
    double IRR;
    while(scanf("%d",&T)&&T){
        double x=-1,y=1e8;
        printf("项目周期T为: %d\n",T);
        printf("请输入%d个整数CF(用空格空开): \n",T+1);
        for(int i=0;i<=T;i++){
            scanf("%d",&CF[i]);
            printf("输入的CF[%d]为: %d\n",i,CF[i]);
        }

        while(fabs(f(x,CF,T)-f(y,CF,T))>1e-6){
            IRR=(x+y)/2;
            if(f(x,CF,T)*f(IRR,CF,T)<0)
                y=IRR;
            if(f(IRR,CF,T)*f(y,CF,T)<0)
                x=IRR;
            if(f(IRR,CF,T)==0)
                break;

        }
        printf("IRR为:%.2f\n",IRR);
        printf("\n");
    }
    return 0;
}

C语言问题汇总_第19张图片

你可能感兴趣的:(c语言,c++,算法)