数组知识点总结

目录

1.数组引用 

2.一维数组的初始化

3.二维数组  a[行][列]

4.字符数组

       1.基本内容

      2.使用字符串处理函数

         5.一些相关的知识点

 

6.程序汇集

     1.找出输入的5个数据中的最大值及所在位置。

        2.输出Fibonacci数列的前20项,每行5个数据。

         3.将3×2矩阵转置,如下由A矩阵转置后得B矩阵。

          4.求4×4矩阵的主对角线元素之和。

           5.字符串排序

            6.将一个字符串复制到另一个字符串中

            7.选择法排序

            8.冒泡排序

              9.字符串到整数


1.数组引用 

   数组名[下标]  这里的下标可以为常量、变量、表达式

   ①例如 a[3+5]   或是   n=4;  a[0]=3*a[3]-a[n-2];实际上编译是允许的。但是考试不行,因为n是变量。

   但int n=10,a[n];(×)因为定义整型n=10,a[n]是同时发生的,计算机会认为a[n]没有定义长度。 要定义也是这样: int n=10; int a[n]; 
       int n; scanf("%d",&n); int a[n];(×)

   ②若有说明:int a[10];则对数组元素的正确引用是( d )

       选项:a、a[10] b、a[3,5] c、a(5) d、a[10-10]

       定义 int a[]={0,1,2,3}; 跟 int a[5]={0,1,2,3}; 是一样的。(×)  仔细看题目!!!

   ③运算符[]需要两个操作数,一个是数组名,一个是数组下标。(√)

   ④C语言为了增加执行的速度,并不会做数组的界限检查,所以范围检查的工作必须由程序设计师来做。(√)

   ⑤在程序中,使用下标表达式表示数组的元素。如果下标表达式中的下标值逾越了数组下标范围,不会引起编译错误,但会引起运行时\逻辑\计算错误。

   ⑥在输出数组时,如果超出了数组索引值或常量值可容许的范围,编译程序虽不至发生错误,仍然会有数据输出,是何原因?原先内存内的残值

   ⑦有以下申明:int a[3][3] ={{10,12,3},{40,5},{6,7}},i;则以下能够按数组元素在内存中存放顺序依次显示其值的循环语句是for(i=0;i<9;i++) printf("%d\n",a[i/3][i%3]);

   ⑧数组被经常运用在递推与_排序\sorting_的问题上,可以有效率解决。

2.一维数组的初始化

   在定义数组时给元素赋初值。一般语法为:类型符 数组名[元素个数]={常量表};可以只给一部分元素赋初值,但至少常量表里至少填入一个元素,并且元素个数能省略。未被赋初值的元素自动设为则为0(若是字符型数组,则初始化为'\0',指针型数组,则初始化为NULL,即空指针)。常量表只能在被定义的时候的时候用。

   例如 若需要对全是0的数组则int  a[10]={0};

   若数组在定义时未进行初始化,则各元素的值是随机的。如: int a[5];={?,?,?,?,?};

   除此之外,可以让系统根据花括号中的数据个数来确定a数组的元素。例如int a[ ]={1,2,3,4,5}可知a数组有五个元素。

3.二维数组  a[行][列]

  下标应是整型表达式。例如a[2-1][2*2-1](√)   a[2-1,2*2-1](×)亲试编译会出错

  1.若给所有元素赋初值,“行数”可以省略,但“列数”不能省,系统会根据数据总个数和第二维的长度算出第一维的长度。如:int a[   ][3]={1,2,3,4,5,6};在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。如:int  [ ][4]={{0,0,3},{ },{0,10}};
可以采用分行赋值,以增加程序的可读性。如:int a[ ][3]={{1,2,3},{4,5,6}};


  2.可以只给一部分元素赋初值,未被赋初值的元素则为0。

只对某行赋初值  int a[3][4]={{1},{5},{9}}  例右1                1  0  0  0        1  0  0  0

只对各行中某一元素赋值int a[3][4]={{1},{0.6},{0,0,11}}    5  0  0  0        0  6  0  0

例右二                                                                              9  0  0  0        0  0  11 0


  3.若数组在定义时未进行初始化,则各元素的值是随机的。

4.字符数组

       1.基本内容

   1.若有:char s[5]; 则称s为字符数组。初始化时,如果提供的初值个数与预定的数组的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。

   2. 在C语言中将字符串当成字符数组来处理,在存储字符串常量时会自动加上'\0'作为结束符,即把它前面的字符组成一个字符串。但字符数组并不要求它的最后一个字符为'\0',甚至可以不包含'\0'。如:char c[5]={'C','h','i','n','a'};完全合法。

   3.是否加'\0'完全根据需要决定。由于系统在处理字符串常量存储时会自动加一个'\0',因此,为了使处理方法一致,便于测定字符串的实际长度,以及在程序中作相应的处理,在字符数组中也常常人为地加上一个'\0'。空格算一个字符,但不是'\0',就是空格本身。

   4.输出的字符中不包含结束符'\0'。如果一个数组中包含多个'\0',则遇到第一个'\0'是输出就结束。

   5.‘%s’格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。如:printf("%s",c[0]); c[0]不是字符数组名,而是一个数组元素。应为printf("%s",c);

      也可以用scanf函数输入一个字符串。如:scanf("%s",c);

      如果利用一个scanf函数输入多个字符串,则应在输入时以空格分割。如:char strl[5],str[2],str3[5];scanf("%s%s%s",str1,str2,str3);看下图

   6.在C 语言中用于输入输出的字符串函数(puts、gets、putchar、getchar)使用前应包含头文件 "stdio.h",使用其他字符串函数则应包含头文件 "string.h"。

06c2149c834d485aa1b6feb8ae358035.jpg

      2.使用字符串处理函数

特性:    在C语言中这些操作都不能直接完成。
               处理字符串通过库函数来完成。
               在程序开头将字符串库文件包含到程序中:#include <string.h>

7607028cf6a341509ae8acbc2e4ba8fa.jpg

 485acfb758884d83b4847d1616279ef0.jpg

9a37f3c473e64653950c07e3b3105177.jpg

1bcad88f59724e45a95114d11d72b11a.jpg

①在C语言中,利用数组a存放字符串“Hello”,以下语句中正确的是(A)。

A、char h[]="Hello!"; B、char h[]={'H','e','l','l','o','!'}; C、char h[10]; D.char h[6]="Hello!";

 char s[ ]={'H','e','l','l','o'''!'} char s[ ]="Hello!" 长度一样吗?

不一样

char s[ ]={'H','e','l','l','o'''!'}是字符数组,长度为6

char s[ ]="Hello!" ,为字符串,相当于 char s[ ]={'H','e','l','l','o'','!',"\0"},长度为7

在C语言中char str[]={'h','e','l','l','o'}不能将字符串"hello"正确赋给数组

只是赋值了字符串的内容,但是却没有赋值字符串的结束标志,所以,它不能将字符串"hello"正确赋给数组。但是可以通过以下形式可以赋值成功:char str[]={'h','e','l','l','o','\0'};或char str[6]={'h','e','l','l','o'}; 或char str[][6]={{'h','e','l','l','o','\0'}; 或char str[]="hello"; 数字不太一样 如:int a[3][4]={{1},{},{9}}; 或int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};但字符数组本身并不要求最后一个元素必须是'\0'注意区别。

②有以下数组定义:int n[][3] ={{10,12,3},{40,5},{6,7}};则正确的值最小的下标表达式为n[1][2]

   以下定义字符串数组的写法,正确的是(C )。

   A.char ss[][3]={{'a','b','c'},{'x','y'},{'z'}};  C.char ss[][3]={{'a','b'},{'x','y'},{'z','c'}};

   以下定义字符串数组的写法,错误的是(C)。

     C.char ss[][3]={{'a','b','c'},{'x','y','z'}};   D.char ss[][4]={{'a','b','c','\0'},{'x','y','z','\0'}};
 

③设有以下字符数组s定义,则使表达式strlen(s)定义:遇到'\0'前的字符。所以char s[]={'\0','a','b','c','\0'};在定义中的长度为0.   

   字符数组 char a[]={'\0','a','b'}是长度为0的字符串(√)

   字符数组 char a[]={'\0','\0','\0'}不是一个字符串(×)

   char s[]={'\n','a','b','c','\0'};(容易看错)

    已知char s[]={"Happy"}; 则sizeof(s)和strlen(s)的值分别为_6_和_5_。(请用半角阿拉伯数字作答) 已知char s[32]={"Happy"}; 则sizeof(s)和strlen(s)的值分别为_32_和_5_。(请用半角阿拉伯数字作答)

    已知char str[10]={"Program"}; 系统会给数组str分配_10_个字节存储单元。(请用阿拉伯数字作答)

    已知char str[ ]={"Program"}; 系统会给数组str分配__8_个字节存储单元。(请用阿拉伯数字作答)

    如有以下二维字符数组申明: char ss[5][10];则用它存放多个字符串时,每个字符串长度不能超过 9个字符。

    char *s="abcde"; 则sizeof(s)、sizeof(*s)、strlen(s)的值依次为 4 1 5

sizeof是求字节数大小,strlen是求字符串长度。sizeof(s)是求s的字节数大小,此时s是一个指针变量(int型),而在C++中一个指针变量固定占4个字节。sizeof(*s)是求*s的字节数大小,而*s是char类型,在C++中一个char变量占1个字节。strlen(s)是求s指向的字符串的长度,即为5。

   字符串以'\0'字符为结束标志。元素中无该字符的字符数组不是字符串。(√)

   声明二维字符数组以存储字符串数组的语句char s[exp1][exp2];中,exp1即(限定)存储的字符串个数,exp2即(限定)每字符串最大长度。(×)

   若有如下整型数组a,则该数组的元素中,数值最大的元素的下标是_____。(请用半角阿拉伯数字作答)在百科园中只用写数字 如0
 


④如果数组里的元素想用键盘来输入,可以写成 int i, age[3]; for(i=0;i<=2;i++) scanf("%d", &age[i]);(√)  在C语言中,只有输入字符串时不用加&。

⑤(易错)

9cd54eb9a716c4ab987c37bbe47ab934.png

看清楚前面没有类型说明符,A、B、C三选项:只能在定义时,用常量表进行初始化。正确答案为D.

⑥一维字符数组就是字符串。(×)串是数组,但是字符数组不一定是字符串。这句话反着说是对的。

5.一些相关的知识点

   ①

      fputs

int fputs(const char *str, FILE *stream);
返回值:该函数返回一个非负值,如果发生错误则返回 EOF(-1)。
str 代表要输出的字符串的首地址,可以是字符数组名或字符指针变量名。
stream 表示向何种流中输出,可以是标准输出流 stdout,也可以是文件流。

      fgets

char *fgets(char *str, int n, FILE *stream);
例如:fgets(s,30,stdin);

    fprintf

int fprintf ( FILE* stream, const char*format, [argument])
例如 fprintf(stdout,"%s",s);其中s为字符数组
fprintf() 的读写对象不是键盘和显示器,而是磁盘文件。

     sprintf

int sprintf(char *string, char *format [,argument,...]);
将字符串b的内容转移到字符串a中  sprintf(a, "%s", b);

  

   ② 如果定义字符数组存放很长的字符串"aaa…aaabbb…bbb"(…表示省略了若干a或b),为了格式易读,需要在字符a和b之间分行排列,且不加入额外的空格,则应采用以下写法。

char s[] = "aaa…aaa\

bbb…bbb";  

 在结尾加\的方式,实现换行,编译时会忽略\及其后的换行符,当做一行处理。具体

   ③设已有申明char s[100],现要将中间带有空格的句子I love c programming.输入到s中保存,不能使用(C)语句。

      C.scanf("%[^\n]",s);      D.scanf("%s",s);

      ^表示"非",[^\n]表示读入换行字符就结束读入。正常用 scanf 函数输入的字符串不可以带空格,gets函数可以带。

    ④申明二维数组后,数组元素会自动初始化为缺省值。(×) 缺省值含义

6.程序汇集

     1.找出输入的5个数据中的最大值及所在位置。

         找最大值思路基本都是以第一个元素为最大值,然后将之与剩余的数据比较。

         二维可设row=0,col=0.

int main()
{ 	int a[5],max,p,i;
	for(i=0;i<5;i++)
	  scanf("%d",&a[i]);
	max=a[0];p=0;		/* 假定第一个数据最大 且注意p一定要先赋值,不然程序会出错*/
	for(i=1;i<5;i++)	/* 与剩余的数据进行比较 */
	  if(max<a[i])		/* 若发现它比数组中的某元素还小,即它不是最大的 */
	  {  max=a[i];		/* 让max取该元素的值 */
	     p=i;		/* 记录该元素的位置 */
	  }
	printf("Max=%d,Position=%d\n",max,p);
}

    

        2.输出Fibonacci数列的前20项,每行5个数据。

#include <stdio.h>
int main()
{	int fab[20]={1,1},n;
	for(n=2;n<20;n++)
		fab[n]=fab[n-1]+fab[n-2];
	for(n=0;n<20;n++)
	{	if(n%5==0)printf("\n");
		printf("%12d",fab[n]);
	}
}

         3.将3×2矩阵转置,如下由A矩阵转置后得B矩阵。

#include <stdio.h>
int main()
{	int a[3][2]={{1,4},{2,5},{3,6}};
	int b[2][3],i,j;
	for(i=0;i<3;i++)
		for(j=0;j<2;j++)
			b[j][i]=a[i][j];
	for(i=0;i<2;i++)
	{	for(j=0;j<3;j++)
			printf("%4d",b[i][j]);
		printf("\n");
	}
}

          4.求4×4矩阵的主对角线元素之和。

#include <stdio.h>
int main()
{
	int a[4][4],i,j,sum=0;
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			scanf("%d",&a[i][j]);
	for(i=0;i<4;i++)
		sum=sum+a[i][i];
	printf("Sum=%d\n",sum);
}

           5.字符串排序

下述程序是把键盘输入的两个整数按从大到小的顺序输出,请修改成对字符串的处理。
    main()
    {    int a,b,t;
        scanf(“%d%d”,&a,&b);
        if(a<b)
        { t=a; a=b; b=t; }
        printf(“从大到小的顺序为:%d,%d\n” ,a,b);
    }

#include <string.h>
main()
{	char s1[80],s2[80],t[80];
	printf("请输入两个字符串:\n");		/* 可写成:puts("请输入两个字符串:"); */
	gets(s1);
	gets(s2);
	if(strcmp(s1,s2)<0)
	{	strcpy(t,s1);
		strcpy(s1,s2);
		strcpy(s2,t);
	}
	printf("从大到小的顺序为:\n");
	puts(s1);
	puts(s2);
}

  

            6.将一个字符串复制到另一个字符串中

                先判断后赋值

main ()
{  char str1[]="China",str2[80];
   int i;
   for(i=0;str1[i]!='\0';i++)
	str2[i]=str1[i];
   str2[i]='\0';
   printf("%s",str2);
}

                先赋值后判断

main()
{  char str1[]="China",str2[80];
   int i;
   for(i=0;(str2[i]=str1[i])!='\0';i++);
   printf("%s",str2);
}

            7.选择法排序

#define  N  10
main()
{ 	int a[N],p,i,j,t;
	printf("请输入%d个整数:\n",N);
	for(i=0;i<N;i++)scanf("%d",&a[i]);	/* 读入数据 */
	for(i=0;i<N-1;i++)
	{   p=i;	/* 假定第i个数据最大,让p记录最大元素所在的位置 */
	for(j=i+1;j<N;j++)	/* 与剩余的数据进行比较 */
	  if(a[p]<a[j])/* 若发现它比数组中的某元素还小,它不是最大的 */
	p=j;	       /* 记录最大元素的位置 */
	if(p!=i)	/* 剩余数据中有比i处的数据大,交换i、p两处的数据 */
	{  t=a[i];  a[i]=a[p];  a[p]=t;  }
	}
	printf("排序之后:");
	for(i=0;i<N;i++)		/* 输出排序之后的数据 */
	printf("%d  ",a[i]);
	printf("\n");
}

            8.冒泡排序

#define  N  6
main()
{	int a[N],i,j,t;
	printf("请输入%d个整数:\n",N);
	for(i=0;i<N;i++)
           scanf("%d",&a[i]);
	for(i=1;i<N;i++)		/* 比较遍数:1~N-1 */
  		for(j=0;j<N-i;j++)    /* 下标变化:0~N-i-1 */
    			if(a[j]>a[j+1])
			{   t=a[j];  a[j]=a[j+1];  a[j+1]=t;  }
	printf("排序后:");
	for(i=0;i<N;i++)
		printf("%d  ",a[i]);
	printf("\n");
}

              9.字符串到整数

/*字符串到整数
    ------------------------------------------------
    【程序设计】   

    完成函数 int str2int_0(char x[]),
    参数x为纯数字字符构成的字符串,转为正整数并返回。
    如果x中有非数字字符,包括'+', '-', '.'等,则返回-1
     
    比如:
    字符串x        >>>     返回值
    ----------------------------
    "12345"     >>>     12345
    "987"         >>>     987
    "70"         >>>     70
    "07"         >>>     7
    "007"         >>>     7
     
    "+12"         >>>     -1
    "-12"         >>>     -1
    "12.23"     >>>     -1
    ".369"        >>>     -1
    "12.369"    >>>     -1
    ----------------------------
     
    --------------------------------------------------
    #include<stdio.h>
    void  bky(); 
     
    int str2int_0(char x[])
    {    
     
    /**********Begin**********/
        int xx, i, len;
        
        i=0; xx=0;
        for(i=0; x[i]!='\0'; i++)
        {
            if(x[i]<'0'||x[i]>'9')
            {
                xx = -1;
                break;
            }
            xx *= 10;
            xx += x[i]-'0';
        }
        return xx;
      /**********  End  **********/
    }
     
    main()
    {
      int n, i, num;
      char s[32];
        
      printf("请输入测试次数:");
      scanf("%d",&n);
     
      for(i=0;i<n;i++)
      { 
        printf("请输入第%d个字符串:",i+1);
        scanf("%s", s);
        num = str2int_0(s);
        printf("结果:%d\n",num);
      } 
      
      bky();
    }
     
    void bky()
    {
      FILE *IN,*OUT;
      int n, x, i;
      char s[32];
       
      int o;
      IN=fopen("in.dat","r");
      if(IN==NULL)
      {
        printf("Read FILE Error");
      }
      OUT=fopen("out.dat","w");
      if(OUT==NULL)
      {
        printf("Write FILE Error");
      }
      
      fscanf(IN,"%d",&n);
      for(i=0;i<n;i++)
      {    
        fscanf(IN,"%s", s);
        o = str2int_0(s);
        fprintf(OUT,"%d\n",o);
      }
      
      fclose(IN);
      fclose(OUT);
      return;
    }
 /*字符串到整数
    ------------------------------------------------
    【程序设计】    guo s. 
                    2021-01-25
    --------------------------------------------------
     
    完成函数 int str2int_2(char x[], int *res);
    参数x为首位可能是'-','+',后续为纯数字字符构成的字符串,
    转为整数值到*res,并返回0。
     
    如果x中有除首位有'+'和'-'外,其他有非数字字符时,则返回-1
     
    比如:
    字符串x        >>> *res    返回值(整数) 
    --------------------------------------
    "12345"     >>> 12345    0
    "-987"         >>> -987    0
    "+70"         >>> 70        0
    "07"         >>> 7        0
    "007"         >>> 7        0
     
    "12.23"     >>> 可无视    -1
    "12+"         >>> 可无视    -1
    ".369"        >>> 可无视    -1
    "12.369"    >>> 可无视    -1
    "-1-2"         >>> 可无视    -1
    "+1+2"         >>> 可无视    -1
    --------------------------------------
     
    --------------------------------------------------
    注意:部分源程序给出如下。请勿改动主函数
          main和其它函数中的任何内容,仅在函
          数的花括号中填入所编写的若干语句。
          
    *********Begin**********和**********  End  **********不可删除
    ------------------------------------------------*/
     
    #include<stdio.h>
    void  bky(); 
     
    int str2int_2(char x[] , int *res)
    {    
     
    /**********Begin**********/
        int xx=0, i, len, flg=1;
        
        i=0; *res=0;
        
        if(x[0]=='+') {
            flg=1;     i=1;
        }
        if(x[0]=='-') 
        {
            flg=-1;    i=1;
        }
        
        for(; x[i]!='\0'; i++)
        {
            if(x[i]<'0'||x[i]>'9')
            {
                xx = -1;
                break;
            }
            *res *= 10;
            *res += x[i]-'0';
        }
        if(xx!=-1) 
            *res *= flg;
            
        return xx;    
      /**********  End  **********/
    }
     
    main()
    {
      int n, i, num, res;
      char s[32];
        
      printf("请输入测试次数:");
      scanf("%d",&n);
     
      for(i=0;i<n;i++)
      { 
        printf("请输入第%d个字符串:",i+1);
        scanf("%s", s);
        num = str2int_2(s, &res);
        
        printf("返回:%d\n",num);
        if(num==0)
            printf("*res:%d\n", res);
      } 
      
      bky();
    }
     
    void bky()
    {
      FILE *IN,*OUT;
      int n, x, i;
      char s[32];
       
      int o, res;
      IN=fopen("in.dat","r");
      if(IN==NULL)
      {
        printf("Read FILE Error");
      }
      OUT=fopen("out.dat","w");
      if(OUT==NULL)
      {
        printf("Write FILE Error");
      }
      
      fscanf(IN,"%d",&n);
      for(i=0;i<n;i++)
      {    
        fscanf(IN,"%s", s);
        o = str2int_2(s, &res);
        fprintf(OUT,"%d\n",o);
        if(o==0)
            fprintf(OUT,"%d\n", res);
      }
      
      fclose(IN);
      fclose(OUT);
      return;
    }

         10.字符串到浮点数

 ------------------------------------------------
    【程序设计】    
     
    完完成函数int str2double_1(char [], double *re),
    参数x是可能含'.'的数字字符串,转为双精度浮点数,赋值*re,并返回0。
    如果含多个小数点'.',或其他非数字字符的字符,返回-1。
     
    比如:
    字符串x        >>> 对应*re值   返回值 
    -------------------------------------
    "12.345"     >>> 12.345000    0
    "12.369872" >>> 12.369872    0
    "12"         >>> 12.000000    0
    ".369"        >>> 0.369000    0
    "2.369"        >>> 2.369000    0
    "12.23.45"     >>> 可以无视    -1 
    "12.23+45"     >>> 可以无视    -1
    "+.369"        >>> 可以无视    -1
    "-1.369"    >>> 可以无视    -1
     
    -------------------------------------
     
    注意:部分源程序给出如下。请勿改动主函数
          main和其它函数中的任何内容,仅在函
          数的花括号中填入所编写的若干语句。
          
    *********Begin**********和**********  End  **********不可删除
    ------------------------------------------------*/
     
    #include <stdio.h>
    #include <math.h>
    void  bky(); 
     
    int str2double_1(char x[] , double *res)
    {    
     
    /**********Begin**********/
     
                double xx, y;
        int i, len;
        
        i=0; xx=0;
        while(x[i] !='.' && x[i]!='\0')
        {
            if(x[i]<'0'||x[i]>'9') return -1.000000;
            xx *= 10;
            xx += x[i]-'0';
            i++;        
        }
        
        if(x[i] =='.')
        {
            len = 0;
            y = 0;
            i++;
            while(x[i]!='\0')
            {
                if(x[i]<'0'||x[i]>'9') return -1.000000;
                y *= 10;
                y += (x[i]-'0');
                i++;
                len++;    
            }
        }
        
        xx += y/pow(10, len);
        *res = xx;
        
        return 0;
     
      /**********  End  **********/
    }
     
    main()
    {
      int n, i, num;
      double res;
      char s[32];
        
      printf("请输入测试次数:");
      scanf("%d",&n);
     
      for(i=0;i<n;i++)
      { 
        printf("请输入第%d个字符串:",i+1);
        scanf("%s", s);
        num = str2double_1(s, &res);
        printf("返回:%d\n", num);
        if(num!=-1)
            printf("res=%lf\n", res);
      } 
      
      bky();
    }
     
    void bky()
    {
      FILE *IN,*OUT;
      int n, x, i;
      char s[32];
       
      int o;
      double res;
      IN=fopen("in.dat","r");
      if(IN==NULL)
      {
        printf("Read FILE Error");
      }
      OUT=fopen("out.dat","w");
      if(OUT==NULL)
      {
        printf("Write FILE Error");
      }
      
      fscanf(IN,"%d",&n);
      for(i=0;i<n;i++)
      {    
        fscanf(IN,"%s", s);
        o = str2double_1(s, &res);
        fprintf(OUT,"%d\n", o);
        if(o!=-1)
            fprintf(OUT,"%lf\n", res);
      }
      
      fclose(IN);
      fclose(OUT);
      return;
    }
    /*字符串到浮点数
    ------------------------------------------------
    【程序设计】   
     
    完成函数 int str2double_2(char [], double *re),
    参数x是可能含'.'和第一个为'+'或'-'的数字字符串,
    转为双精度浮点数,赋值*re,并返回0。
    如果含多个小数点'.',或其他非数字字符的字符,
    包括非首位的'+', '-'等,返回-1。
     
    比如:
    字符串x        >>> 对应*re值   返回值 
    ----------------------------
    "+12.345"     >>> 12.345000    0
    "12.369872" >>> 12.369872    0
    "12"         >>> 12.000000    0
    ".369"        >>> 0.369000    0
    "-12.369"    >>> -12.369000    0
    "-.369"        >>> -0.369000    0
    "-0.369"    >>> -0.369000    0
     
    "12.23+45"     >>> 可以无视    -1 
    "12.23.45"     >>> 可以无视    -1 
    "12-23.45"     >>> 可以无视    -1
    -------------------------------------
     
    注意:部分源程序给出如下。请勿改动主函数
          main和其它函数中的任何内容,仅在函
          数的花括号中填入所编写的若干语句。
          
    *********Begin**********和**********  End  **********不可删除
    ------------------------------------------------*/
     
    #include <stdio.h>
    #include <math.h>
    void  bky(); 
     
    int str2double_2(char x[] , double *res)
    {    
     
    /**********Begin**********/
        double xx, y;
        int i, len, flg=1;
        
        i=0; xx=0;
     
        if(x[0]=='-'){
            flg=-1;
            i++;
        }
        if(x[0]=='+') i++;
        
        while(x[i] !='.' && x[i]!='\0')
        {
            if(x[i]<'0'||x[i]>'9') return -1.000000;
            xx *= 10;
            xx += x[i]-'0';
            i++;        
        }
        
        if(x[i] =='.')
        {
            len = 0;
            y = 0;
            i++;
            while(x[i]!='\0')
            {
                if(x[i]<'0'||x[i]>'9') return -1.000000;
                y *= 10;
                y += (x[i]-'0');
                i++;
                len++;    
            }
        }
        *res = xx + y/pow(10, len);    
        
        return 0;
            
      /**********  End  **********/
    }
     
    main()
    {
      int n, i, num;
      double res;
      char s[32];
        
      printf("请输入测试次数:");
      scanf("%d",&n);
     
      for(i=0;i<n;i++)
      { 
        printf("请输入第%d个字符串:",i+1);
        scanf("%s", s);
        num = str2double_2(s, &res);
        printf("返回:%d\n", num);
        if(num!=-1)
            printf("res=%lf\n", res);
      } 
      
      bky();
    }
     
    void bky()
    {
      FILE *IN,*OUT;
      int n, x, i;
      char s[32];
       
      int o;
      double res;
      IN=fopen("in.dat","r");
      if(IN==NULL)
      {
        printf("Read FILE Error");
      }
      OUT=fopen("out.dat","w");
      if(OUT==NULL)
      {
        printf("Write FILE Error");
      }
      
      fscanf(IN,"%d",&n);
      for(i=0;i<n;i++)
      {    
        fscanf(IN,"%s", s);
        o = str2double_2(s, &res);
        fprintf(OUT,"%d\n", o);
        if(o!=-1)
            fprintf(OUT,"%lf\n", res);
      }
      
      fclose(IN);
      fclose(OUT);
      return;
    }

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值