能不能再if语句中给数组赋初值

x编程狂魔 2014-06-09 08:36:32
if(leap(y,m,d))
int a[12]={31,28,31,30,31,30,31,30,31,30,31,30};
else
int a[12]={31,29,31,30,31,30,31,30,31,30,31,30};

这个是代码,leap(y,m,d)是一个函数,其返回值为bool型,这样写编译器会报错
error C2065: 'a' : undeclared identifier
我在想是不是在if语句中是不可以定义一个变量并给其赋初值的
...全文
416 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-06-10
  • 打赏
  • 举报
回复
“变量赋值”和“变量初始化”不是一回事! “变量赋值”发生在运行期,其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期,其写法遵循初始化列表语法规定。
lanlvy 2014-06-10
  • 打赏
  • 举报
回复
引用 9 楼 u012421456 的回复:
不可以吗?
可以参考
百曉生 2014-06-10
  • 打赏
  • 举报
回复
引用 13 楼 lin5161678 的回复:
引用 9 楼 u012421456 的回复:
不可以吗?
C语言不可以的 不要和C++ 混淆了
我刚才仔细看了看,的确是C++可以,C不可以,新手又犯错误了,唉,谢谢指点啊
lin5161678 2014-06-10
  • 打赏
  • 举报
回复
不可以 原因是 if()这里只能写语句 而声明不是语句 不符合语法 所以不行
lin5161678 2014-06-10
  • 打赏
  • 举报
回复
引用 9 楼 u012421456 的回复:
不可以吗?
C语言不可以的 不要和C++ 混淆了
全校最菜 2014-06-10
  • 打赏
  • 举报
回复
引用 8 楼 lpcads 的回复:
[quote=引用 1 楼 u013163564 的回复:] c语言所有的变量定义都要放在函数开头,谢谢
目测老谭和 (或) TC 的受害者。[/quote] 好吧,是我的错,但在VC6.0中c后缀确实只可以在函数前面使用,刚在linux中使用gcc的时候是可以的,我不知道其他版本会不会有这样的问题
全校最菜 2014-06-10
  • 打赏
  • 举报
回复
引用 8 楼 lpcads 的回复:
[quote=引用 1 楼 u013163564 的回复:] c语言所有的变量定义都要放在函数开头,谢谢
目测老谭和 (或) TC 的受害者。[/quote] 目测你写C文件的时候后缀是.cpp的,谢谢
nzgsm 2014-06-09
  • 打赏
  • 举报
回复
作用域的问题。如果在if/else都加上{}就很容易明白了。
百曉生 2014-06-09
  • 打赏
  • 举报
回复
不可以吗?
lpcads 2014-06-09
  • 打赏
  • 举报
回复
引用 1 楼 u013163564 的回复:
c语言所有的变量定义都要放在函数开头,谢谢
目测老谭和 (或) TC 的受害者。
ForestDB 2014-06-09
  • 打赏
  • 举报
回复
不可以。 LZ的问题可以这样解决: int days[][12]= {{31,28,31,30,31,30,31,30,31,30,31,30}, {31,29,31,30,31,30,31,30,31,30,31,30}}; number_of_days_in_month = days[is_leap(year)][month];
anshiny 2014-06-09
  • 打赏
  • 举报
回复
int a[12]={31,28,31,30,31,30,31,30,31,30,31,30};
if(leap(y,m,d))  a[1] = 29;
zhuyf87 2014-06-09
  • 打赏
  • 举报
回复
引用 4 楼 a515360208 的回复:
标准C的变量声明必须放在最前面、、、、、、、
从c99标准开始,变量声明就已经可以不在语句之前了。楼主换了个新版本的编译器吧。
漂浮一生 2014-06-09
  • 打赏
  • 举报
回复
标准C的变量声明必须放在最前面、、、、、、、
_skytrails 2014-06-09
  • 打赏
  • 举报
回复
引用 1 楼 u013163564 的回复:
c语言所有的变量定义都要放在函数开头,谢谢
不用好吗,在while语句里也可以定义变量啊!只是它的变量的俢域范围不一样而已!
_skytrails 2014-06-09
  • 打赏
  • 举报
回复
a的作用域只在if的内部。像下面这样的代码:
if (1)
{
    int a = 1;
    printf("\n %d",a);
}
else
{
    int a = 2;
    printf("\n %d", a);
}
这样是可以的。但如果在这个语句的下面加上

printf("\n %d", a);
这样都会报上面的错误!
全校最菜 2014-06-09
  • 打赏
  • 举报
回复
c语言所有的变量定义都要放在函数开头,谢谢
比较详实 第四章: 数组 数 组   数组在程序设计,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。   本章介绍数值数组和字符数组,其余的在以后各章陆续介绍。数组类型说明 在C语言使用数组必须先进行类型说明。 数组说明的一般形 式为: 类型说明符 数组名 [常量表达式],……; 其,类型说明符是任一种基本数据类型或构造数据类型。 数组名是用户定义的数组标识符。 方括号的常量表达式表示数据元素的个数,也称为数组的长度。 例如: int a[10]; 说明整型数组a,有10个元素。 float b[10],c[20]; 说明实型数组b,有10个元素,实型数组c,有20个元素。 char ch[20]; 说明字符数组ch,有20个元素。 对于数组类型说明应注意以下几点: 1.数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。 2.数组名的书写规则应符合标识符的书写规定。 3.数组不能与其它变量名相同,例如: void main() { int a; float a[10]; …… } 是错误的。 4.方括号常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为a[0],a[1],a[2],a[3],a[4]。 5.不能在方括号用变量来表示元素的个数, 但是可以是符号常数或常量表达式。例如: #define FD 5 void main() { int a[3+2],b[7+FD]; …… } 是合法的。但是下述说明方式是错误的。 void main() { int n=5; int a[n]; …… } 6.允许在同一个类型说明,说明多个数组和多个变量。 例如: int a,b,c,d,k1[10],k2[20]; 数组元素的表示方法   数组元素是组成数组的基本单元。数组元素也是一种变量, 其标识方法为数组名后跟一个下标。 下标表示了元素在数组的顺序号。数组元素的一般形式为: 数组名[下标] 其的下标只能为整型常量或整型表达式。如为小数时,C编译将自动取整。例如,a[5],a[i+j],a[i++]都是合法的数组元素。 数组元素通常也称为下标变量。必须先定义数组, 才能使用下标变量。在C语言只能逐个地使用下标变量, 而不能一次引用整个数组。 例如,输出有10 个元素的数组必须使用循环语句逐个输出各下标变量: for(i=0; i<10; i++)  printf("%d",a[i]); 而不能用一个语句输出整个数组,下面的写法是错误的: printf("%d",a); void main() { int i,a[10]; for(i=0;i<10;i++) a[i++]=2*i+1; for(i=9;i>=0;i--) printf("%d",a[i]); printf("\n%d %d\n",a[5.2],a[5.8]); }   本例用一个循环语句给a数组各元素送入奇数值,然后用第二个循环语句从大到小输出各个奇数。在第一个 for语句,表达式3省略了。在下标变量使用了表达式i++,用以修改循环变量。当然第二个for语句也可以这样作, C语言允许用表达式表示下标。 程序最后一个printf语句输出了两次a[5]的值, 可以看出当下标不为整数时将自动取整。数组值给数组值的方法除了用值语句对数组元素逐个值外, 还可采用初始化值和动态值的方法。数组初始化数组初始化值是指在数组说明时给数组元素初值数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。   初始化值的一般形式为: static 类型说明符 数组名[常量表达式]={值,值……值}; 其static表示是静态存储类型, C语言规定只有静态存储数组和外部存储数组才可作初始化值(有关静态存储,外部存储的概念在第五章介绍)。在{ }的各数据值即为各元素的初值, 各值之间用逗号间隔。例如: static int a[10]={ 0,1,2,3,4,5,6,7,8,9 }; 相当于a[0]=0;a[1]=1...a[9]=9;   C语言对数组的初始值还有以下几点规定: 1.可以只给部分元素初值。当{ }值的个数少于元素个数时,只给前面部分元素值。例如: static int a[10]={0,1,2,3,4};表示只给a[0]~a[4]5个元素值,而后5个元素自动0值。 2.只能给元素逐个值,不能数组整体值。 例如给十个元素全部1值,只能写为: static int a[10]={1,1,1,1,1,1,1,1,1,1};而不能写为: static int a[10]=1; 3.如不给可初始化的数组初值,则全部元素均为0值。 4.如给全部元素值,则在数组说明, 可以不给出数组元素的个数。例如: static int a[5]={1,2,3,4,5};可写为: static int a[]={1,2,3,4,5};动态值可以在程序执行过程,对数组作动态值。 这时可用循环语句配合scanf函数逐个对数组元素值。 void main() { int i,max,a[10]; printf("input 10 numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); max=a[0]; for(i=1;i<10;i++) if(a[i]>max) max=a[i]; printf("maxmum=%d\n",max); }   本例程序第一个for语句逐个输入10个数到数组a。 然后把a[0]送入max。在第二个for语句,从a[1]到a[9]逐个与max的内容比较,若比max的值大,则把该下标变量送入max,因此max总是在已比较过的下标变量为最大者。比较结束,输出max的值。 void main() { int i,j,p,q,s,a[10]; printf("\n input 10 numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++){ p=i;q=a[i]; for(j=i+1;j<10;j++) if(q中用了两个并列的for循环语句,在第二个for 语句又嵌套了一个循环语句。第一个for语句用于输入10个元素的初值。第二个for语句用于排序。本程序的排序采用逐个比较的方法进行。在i次循环时,把第一个元素的下标i于p,而把该下标变量值a[i]于q。然后进入小循环,从a[i+1]起到最后一个元素止逐个与a[i]作比较,有比a[i]大者则将其下标送p,元素值送q。 一次循环结束后,p即为最大元素的下标,q则为该元素值。若此时i≠p,说明p,q值均已不是进入小循环之前所之值,则交换a[i]和a[p]之值。 此时a[i]为已排序完毕的元素。输出该值之后转入下一次循环。对i+1以后各个元素排序。 二维数组   前面介绍的数组只有一个下标,称为一维数组, 其数组元素也称为单下标变量。在实际问题有很多量是二维的或多维的, 因此C语言允许构造多维数组。多维数组元素有多个下标, 以标识它在数组的位置,所以也称为多下标变量。 本小节只介绍二维数组,多维数组可由二维数组类推而得到。二维数组类型说明二维数组类型说明的一般形式是: 类型说明符 数组名[常量表达式1][常量表达式2]…; 其常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。例如: int a[3][4]; 说明了一个三行四列的数组数组名为a,其下标变量的类型为整型。该数组的下标变量共有3×4个,即: a[0][0],a[0][1],a[0][2],a[0][3] a[1][0],a[1][1],a[1][2],a[1][3] a[2][0],a[2][1],a[2][2],a[2][3]   二维数组在概念上是二维的,即是说其下标在两个方向上变化, 下标变量在数组的位置也处于一个平面之, 而不是象一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的, 也就是说存储器单元是按一维线性排列的。 如何在一维存储器存放二维数组,可有两种方式:一种是按行排列, 即放完一行之后顺次放入第二行。另一种是按列排列, 即放完一列之后再顺次放入第二列。在C语言,二维数组是按行排列的。 在图4.1,按行顺次存放,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行有四个元素也是依次存放。由于数组a说明为 int类型,该类型占两个字节的内存空间,所以每个元素均占有两个 字节(图每一格为一字节)。 二维数组元素的表示方法   二维数组的元素也称为双下标变量,其表示的形式为: 数组名[下标][下标] 其下标应为整型常量或整型表达式。例如: a[3][4] 表示a数组三行四列的元素。下标变量和数组说明在形式有些相似,但这两者具有完全不同的含义。 数组说明的方括号给出的是某一维的长度,即可取下标的最大值; 而数组元素的下标是该元素在数组的位置标识。前者只能是常量, 后者可以是常量,变量或表达式。 一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。 课程 成绩姓名 Math C DBASE 张      80  75 92 王      61  65 71 李      59  63 70 赵      85  87 90 周      76  77 85   可设一个二维数组a[5][3]存放五个人三门课的成绩。再设一个一维数组v[3]存放所求得各分科平均成绩,设变量l为全组各科总平均成绩。编程如下: void main() { int i,j,s=0,l,v[3],a[5][3]; printf("input score\n"); for(i=0;i<3;i++){ for(j=0;j<5;j++) { scanf("%d",&a[j][i]); s=s+a[j][i];} v[i]=s/5; s=0; } l=(v[0]+v[1]+v[2])/3; printf("math:%d\nc languag:%d\ndbase:%d\n",v[0],v[1],v[2]); printf("total:%d\n",l); }   程序首先用了一个双重循环。 在内循环依次读入某一门课程的各个学生的成绩,并把这些成绩累加起来, 退出内循环后再把该累加成绩除以5送入v[i]之,这就是该门课程的平均成绩。外循环共循环三次,分别求出三门课各自的平均成绩并存放在v数组。退出外循环之后,把v[0],v[1],v[2]相加除以3即得到各科总平均成绩。最后按题意输出各个成绩。 二维数组的初始化   二维数组初始化也是在类型说明时给各下标变量初值。 二维数组可按行分段值,也可按行连续值。 例如对数组a[5][3]: 1.按行分段值可写为static int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85} }; 2.按行连续值可写为static int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85 };   这两种初值的结果是完全相同的。 void main() { int i,j,s=0,l,v[3]; static int a[5][3]={ {80,75,92},{61,65,71},{59,63,70}, {85,87,90},{76,77,85} }; for(i=0;i<3;i++) { for(j=0;j<5;j++) s=s+a[j][i]; v[i]=s/5; s=0; } l=(v[0]+v[1]+v[2])/3; printf("math:%d\nc languag:%d\ndbase:%d\n",v[0],v[1],v[2]); printf("total:%d\n",l); }   对于二维数组初始化值还有以下说明: 1.可以只对部分元素初值,未初值的元素自动取0值。 例如: static int a[3][3]={{1},{2},{3}}; 是对每一行的第一列元素值,未值的元素取0值。 值后各元素的值为: 1 0 02 0 03 0 0 static int a [3][3]={{0,1},{0,0,2},{3}}; 值后的元素值为 0 1 00 0 23 0 0 2.如对全部元素初值,则第一维的长度可以不给出。 例如: static int a[3][3]={1,2,3,4,5,6,7,8,9}; 可以写为:static int a[][3]={1,2,3,4,5,6,7,8,9};   数组是一种构造类型的数据。 二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组, 就组成了二维数组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。 C语言允许这种分解有二维数组a[3][4],可分解为三个一维数组,其数组名分别为a[0],a[1],a[2]。对这三个一维数组不需另作说明即可使用。这三个一维数组都有4个元素,例如:一维数组a[0]的元素为a[0][0],a[0][1],a[0][2],a[0][3]。必须强调的是,a[0],a[1],a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。 字符数组   用来存放字符量的数组称为字符数组。 字符数组类型说明的形式与前面介绍的数值数组相同。例如: char c[10]; 由于字符型和整型通用,也可以定义为int c[10]但这时每个数组元素占2个字节的内存单元。字符数组也可以是二维或多维数组,例如: char c[5][10];即为二维字符数组。 字符数组也允许在类型说明时作初始化值。例如: static char c[10]={`c`,` `,`p`,`r`,o`,g`,r`,`a`,`m`};值后各元素的值为: 数组C c[0]c[1]c[2]c[3]c[4]c [5]c[6]c[7]c[8]c[9]其c[9]未值,由系统自动予0值。 当对全体元素初值时也可以省去长度说明。例如: static char c[]={`c`,` `,`p`,`r`,`o`,`g`,`r`,`a`,`m`};这时C数组的长度自动定为9。 main() { int i,j; char a[][5]={{'B','A','S','I','C',},{'d','B','A','S','E'}}; for(i=0;i<=1;i++) { for(j=0;j<=4;j++) printf("%c",a[i][j]); printf("\n"); } }   本例的二维字符数组由于在初始化时全部元素都初值, 因此一维下标的长度可以不加以说明。字符串在C语言没有专门的字符串变量, 通常用一个字符数组来存放一个字符串。在2.1.4节介绍字符串常量时,已说明字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时, 也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。 有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。   C语言允许用字符串的方式对数组作初始化值。例如: static char c[]={'c', ' ','p','r','o','g','r','a','m'}; 可写为: static char c[]={"C program"}; 或去掉{}写为: sratic char c[]="C program";   用字符串方式值比用字符逐个值要多占一个字节, 用于存放字符串结束标志'\0'。上面的数组c在内存的实际存放情况为: C program\0`\0'是由C编译系统自动加上的。由于采用了`\0'标志,所以在用字符串初值时一般无须指定数组的长度, 而由系统自行处理。在采用字符串方式后,字符数组的输入输出将变得简单方便。 除了上述用字符串初值的办法外,还可用printf函数和scanf函数一次性输出输入一个字符数组的字符串, 而不必使用循环语句逐个地输入输出每个字符。 void main() { static char c[]="BASIC\ndBASE"; printf("%s\n",c); } 注意在本例的printf函数,使用的格式字符串为“%s”, 表示输出的是一个字符串。而在输出表列给出数组名则可。 不能写为: printf("%s",c[]); void main() { char st[15]; printf("input string:\n"); scanf("%s",st); printf("%s\n",st); }   本例由于定义数组长度为15, 因此输入的字符串长度必须小于15,以留出一个字节用于存放字符串结束标志`\0`。 应该说明的是,对一个字符数组,如果不作初始化值,则必须说明数组长度。还应该特别注意的是,当用scanf函数输入字符串时,字符串不能含有空格,否则将以空格作为串的结束符。例如运行例4.8,当输入的字符串含有空格时,运行情况为: input string:this is a book this 从输出结果可以看出空格以后的字符都未能输出。 为了避免这种情况, 可多设几个字符数组分段存放含空格的串。程序可改写如下: Lesson void main() { char st1[6],st2[6],st3[6],st4[6]; printf("input string:\n"); scanf("%s%s%s%s",st1,st2,st3,st4); printf("%s %s %s %s\n",st1,st2,st3,st4); }   本程序分别设了四个数组, 输入的一行字符的空格分段分别装入四个数组。然后分别输出这四个数组的字符串。在前面介绍过,scanf的各输入项必须以地址方式出现,如 &a,&b等。但在例4.8却是以数组名方式出现的,这是为什么呢?这是由于在C语言规定,数组名就代表了该数组的首地址。 整个数组是以首地址开头的一块连续的内存单元。如有字符数组char c[10],在内存可表示如图4.2。设数组c的首地址为2000,也就是说c[0]单元地址为2000。则数组名c就代表这个首地址。因此在c前面不能再加地址运算符&。如写作scanf("%s",&c);则是错误的。 在执行函数printf("%s",c) 时,按数组名c找到首地址,然后逐个输出数组各个字符直到遇到字符串终止标志'\0'为止。 字符串常用函数   C语言提供了丰富的字符串处理函数, 大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。 使用这些函数可大大减轻编程的负担。用于输入输出的字符串函数, 在使用前应包含头文件"stdio.h" ; 使用其它字符串函数则应包含头文件"string.h"。 下面介绍几个最常用的字符串函数。 1.字符串输出函数 puts 格式: puts (字符数组名) 功能:把字符数组的字符串输出到显示器。 即在屏幕上显示该字符串 #include"stdio.h" main() { static char c[]="BASIC\ndBASE"; puts(c); }   从程序可以看出puts函数可以使用转义字符, 因此输出结果成为两行。puts函数完全可以由printf函数取代。 当需要按一定格式输出时,通常使用printf函数。 2.字符串输入函数gets 格式: gets (字符数组名) 功能:从标准输入设备键盘上输入一个字符串。 本函数得到一个函数值,即为该字符数组的首地址。 #include"stdio.h" main() { char st[15]; printf("input string:\n"); gets(st); puts(st); }   可以看出当输入的字符串含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志, 而只以回车作为输入结束。这是与scanf函数不同的。 3.字符串连接函数strcat 格式: strcat (字符数组名1,字符数组名2) 功能:把字符数组2的字符串连接到字符数组1 字符串的后面,并删去字符串1后的串标志“\0”。本函数返回值是字符数组1的首地址。 #include"string.h" main() { static char st1[30]="My name is "; int st2[10]; printf("input your name:\n"); gets(st2); strcat(st1,st2); puts(st1); } 本程序把初始化值的字符数组与动态值的字符串连接起来。 要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串 4.字符串拷贝函数strcpy 格式: strcpy (字符数组名1,字符数组名2) 功能:把字符数组2的字符串拷贝到字符数组1。串结束标志“\0”也一同拷贝。字符数名2, 也可以是一个字符串常量。这时相当于把一个字符串予一个字符数组。 #include"string.h" main() { static char st1[15],st2[]="C Language"; strcpy(st1,st2); puts(st1);printf("\n"); } 本函数要求字符数组1应有足够的长度,否则不能全部装入所拷贝的字符串。 5.字符串比较函数strcmp 格式: strcmp(字符数组名1,字符数组名2) 功能:按照ASCII码顺序比较两个数组的字符串,并由函数返回值返回比较结果。 字符串1=字符串2,返回值=0; 字符串2〉字符串2,返回值〉0; 字符串1〈字符串2,返回值〈0。 本函数也可用于比较两个字符串常量,或比较数组和字符串常量。 #include"string.h" main() { int k; static char st1[15],st2[]="C Language"; printf("input a string:\n"); gets(st1); k=strcmp(st1,st2); if(k==0) printf("st1=st2\n"); if(k>0) printf("st1>st2\n"); if(k<0) printf("st1中把输入的字符串和数组st2的串比较,比较结果返回到k,根据k值再输出结果提示串。当输入为dbase时,由ASCII 码可知“dBASE”大于“C Language”故k〉0,输出结果“st1>st2”。 6.测字符串长度函数strlen 格式: strlen(字符数组名) 功能:测字符串的实际长度(不含字符串结束标志‘\0’) 并作为函数返回值。 #include"string.h" main() { int k; static char st[]="C language"; k=strlen(st); printf("The lenth of the string is %d\n",k); } 程序举例   把一个整数按大小顺序插入已排好序的数组。 为了把一个数按大小插入已排好序的数组, 应首先确定排序是从大到小还是从小到大进行的。设排序是从大到小进序的, 则可把欲插入的数与数组各数逐个比较, 当找到第一个比插入数小的元素i时,该元素之前即为插入位置。然后从数组最后一个元素开始到该元素为止,逐个后移一个单元。最后把插入数予元素i即可。如果被插入数比所有的元素值都小则插入最后位置。 main() { int i,j,p,q,s,n,a[11]={127,3,6,28,54,68,87,105,162,18}; for(i=0;i<10;i++) { p=i;q=a[i]; for(j=i+1;j<10;j++) if(qa[i]) {for(s=9;s>=i;s--) a[s+1]=a[s]; break;} a[i]=n; for(i=0;i<=10;i++) printf("%d ",a[i]); printf("\n"); } 本程序首先对数组a的10个数从大到小排序并输出排序结果。然后输入要插入的整数n。再用一个for语句把n和数组元素逐个比较,如果发现有n>a[i]时,则由一个内循环把i以下各元素值顺次后移一个单元。后移应从后向前进行(从a[9]开始到a[i]为止)。 后移结束跳出外循环。插入点为i,把n予a[i]即可。 如所有的元素均大于被插入数,则并未进行过后移工作。此时i=10,结果是把n于a[10]。最后一个循环输出插入数后的数组各元素值。程序运行时,输入数47。从结果可以看出47已插入到54和 28之间。   在二维数组a选出各行最大的元素组成一个一维数组b。 a=3 16 87 65 4 32 11 108 10 25 12 37b=(87 108 37) 本题的编程思路是,在数组A的每一行寻找最大的元素,找到之后把该值数组B相应的元素即可。程序如下: main() { static int a[][4]={3,16,87,65,4,32,11,108,10,25,12,27}; int b[3],i,j,l; for(i=0;i<=2;i++) { l=a[i][0]; for(j=1;j<=3;j++) if(a[i][j]>l) l=a[i][j]; b[i]=l;} printf("\narray a:\n"); for(i=0;i<=2;i++) { for(j=0;j<=3;j++) printf("%5d",a[i][j]); printf("\n");} printf("\narray b:\n"); for(i=0;i<=2;i++) printf("%5d",b[i]); printf("\n"); }   程序第一个for语句又嵌套了一个for语句组成了双重循环。外循环控制逐行处理,并把每行的第0列元素予l。进入内循环后,把l与后面各列元素比较,并把比l大者予l。内循环结束时l 即为该行最大的元素,然后把l值予b[i]。等外循环全部完成时,数组b已装入了a各行的最大值。后面的两个 for语句分别输出数组a和数组b。   输入五个国家的名称按字母顺序排列输出。   本题编程思路如下:五个国家名应由一个二维字符数组来处理。然而C语言规定可以把一个二维数组当成多个一维数组处理。 因此本题又可以按五个一维数组处理, 而每一个一维数组就是一个国家名字符串。用字符串比较函数比较各一维数组的大小,并排序, 输出结果即可。 编程如下: void main() { char st[20],cs[5][20]; int i,j,p; printf("input country's name:\n"); for(i=0;i<5;i++) gets(cs[i]); printf("\n"); for(i=0;i<5;i++) { p=i;strcpy(st,cs[i]); for(j=i+1;j<5;j++) if(strcmp(cs[j],st)<0) {p=j;strcpy(st,cs[j]);} if(p!=i) { strcpy(st,cs[i]); strcpy(cs[i],cs[p]); strcpy(cs[p],st); } puts(cs[i]);}printf("\n"); }   本程序的第一个for语句,用gets函数输入五个国家名字符串。上面说过C语言允许把一个二维数组按多个一维数组处理, 本程序说明cs[5][20]为二维字符数组,可分为五个一维数组cs[0],cs[1],cs[2],cs[3],cs[4]。因此在gets函数使用cs[i]是合法的。 在第二个for语句又嵌套了一个for语句组成双重循环。 这个双重循环完成按字母顺序排序的工作。在外层循环把字符数组cs[i]的国名字符串拷贝到数组st,并把下标i予P。 进入内层循环后,把st与cs[i]以后的各字符串作比较,若有比st小者则把该字符串拷贝到st,并把其下标予p。内循环完成后如p不等于 i 说明有比cs[i]更小的字符串出现,因此交换cs[i]和st的内容。 至此已确定了数组cs的第i号元素的排序值。然后输出该字符串。在外循环全部完成之后即完成全部排序和输出。 本章小结 1.数组是程序设计最常用的数据结构。数组可分为数值数组(整数组,实数组),字符数组以及后面将要介绍的指针数组,结构数组等。 2.数组可以是一维的,二维的或多维的。 3.数组类型说明由类型说明符、数组名、数组长度 (数组元素个数)三部分组成。数组元素又称为下标变量。 数组的类型是指下标变量取值的类型。 4.对数组值可以用数组初始化值, 输入函数动态值和值语句值三种方法实现。 对数值数组不能值语句整体值、输入或输出,而必须用循环语句逐个对数组元素进行操作。 资料收集:beck Copyright 2002 www.vcok.com, All Rights Reserved
二级C上机习题1(1)【参考答案】 (1) 1  (2) 2*i  (3) (-1) 【考点分析】 本题考查:变量初值操作;for循环语句;累加运算。 【解题思路】 填空1:由fun函数整体结构可以看出k的作用是值,并累加各项前边的正负号,由于第一项是正的,因此给k的值为1。 填空2:此空下一行的表达式k*(2*i-1)*(2*i+1)/(t*t)累加的通向,k为正负号,由题目公式可知t=2*i。 填空3:由于通向前边的正负号每次都要发生变化,因此k=k*(-1)。 (2) 【参考答案】 (1)k++; (2)if(m==k) 【考点分析】 本题考查:C语言的语法格式,每个语句后面要以";"结尾;if语句条件表达式,区别条件表达式==和=的区别。 【解题思路】 函数fun的功能是判断m是否为素数:m从2开始作为除数,并对m取余,若不存在一个数使得余数为0,则m为素数,程序的错误在于if(m=k)语句的逻辑表达式写成了值语句。 (3) 【参考答案】 void fun(int a[],int n, int *max, int *d) { int i; *max=a[0]; *d=0; for(i=0;i数组的最大值及其下标,使用循环判断结构实现。指针变量的应用。 【解题思路】 要查找最大值及其下标需要定义两个变量,该程序直接使用形参max和d,由于它们都是指针变量,所以在引用它所指向的变量时要对它进行指针运算。循环语句用来遍历数组元素,条件语句用来判断该数组元素是否最大。 【解题宝典】 该程序考查求最大值,需要掌握以下语句: for(i=0;i
“新概念C语言”突破了以往任何一种语言教材的旧的模式,将教学内容分为入门篇和提高篇两个篇章。在入门篇只引进程序设计必要的语法现象,达到快速入门。激发兴趣的目的。在入门篇和提高篇之间插一个强化上机实验周,巩固学习内容。在提高篇完成完整的语法、算法、程序设计思想等教学目的的学习任务。由于学生对语言已具有了初步的了解并掌握了最基本的语法和程序设计思想,能设计较简单的程序,所以在提高篇的学习,不论对灵活语法的学习和掌握,还是对程序设计思想的掌握都更加容易,从而可以较容易达到教学目标。 第一部分 入门篇 1 第1章 C语言的产生及其工作流程 3 1.1 C语言的产生 3 1.2 程序和程序设计 3 1.2.1 C程序 3 1.2.2 程序设计 4 习题 4 第2章 C程序设计的初步知识 5 2.1 简单C程序的构成和格式 5 2.2 常量、变量和标识符 6 2.2.1 标识符 6 2.2.2 常量 7 2.2.3 用定义一个符号名的方法来代表一个常量 7 2.2.4 变量 8 2.3 整型数据 8 2.3.1 整型常量 8 2.3.2 整型变量 8 2.4 实型数据 9 2.4.1 实型常量 9 2.4.2 实型变量 9 2.5 字符型数据 10 2.5.1 字符常量 10 2.5.2 字符串常量 11 2.5.3 字符变量 11 2.6 算术表达式 11 2.6.1 基本的算术运算符 11 2.6.2 运算符的优先级、结合性和算术表达式 12 2.6.3 强制类型转换表达式 13 2.7 值表达式 13 2.7.1 值运算符和值表达式 13 2.7.2 值运算的类型转换 14 习题 15 第3章 顺序结构程序 16 3.1 复合语句和空语句 16 3.1.1 复合语句 16 3.1.2 空语句 16 3.2 程序举例 16 习题 17 第4章 选择结构 19 4.1 关系运算和逻辑运算 19 4.1.1 C语言的逻辑值 19 4.1.2 关系运算符和关系表达式 19 4.1.3 逻辑运算符和逻辑表达式 20 4.2 if语句和用if语句构成的选择结构 21 习题 22 第5章 循环结构 25 5.1 for语句和用for语句构成的循环结构 25 5.1.1 for语句构成的循环结构 25 5.1.2 for循环的执行过程 25 5.1.3 有关for语句的说明 25 5.2 循环结构的嵌套 27 习题 28 第6章 函数 30 6.1 函数的定义和返回值 30 6.1.1 函数定义的语法 30 6.1.2 函数的返回值 30 6.2 函数的调用 32 6.2.1 函数的调用方式 32 6.2.2 函数调用时的语法要求 32 6.3 函数的说明 33 6.3.1 函数说明的形式 33 6.3.2 函数说明的位置 34 6.4 调用函数和被调用函数之间的数据传递 34 6.5 库函数 36 6.6 数据输入输出及常用库函数 37 6.6.1 printf函数(格式输出函数) 37 6.6.2 scanf函数(格式输入函数) 39 6.6.3 调用putchar和getchar函数输出和输入字符 40 6.7 程序举例 41 习题 43 第7章 数组 45 7.1 一维数组的定义和一维数组元素的引用 45 7.1.1 一维数组的定义 45 7.1.2 一维数组元素的引用 46 7.1.3 一维数组的初始化 46 7.1.4 一维数组的定义和数组元素引用举例 47 7.2 函数之间对一维数组数组元素的引用 47 7.2.1 数组元素做实参 47 7.2.2 数组名做实参 49 7.3 一维数组应用举例 50 7.4 字符数组 53 7.4.1 字符数组的定义 53 7.4.2 字符数组的初始化 54 7.4.3 字符数组的引用 54 7.4.4 字符串与字符串结束标志 55 7.4.5 字符数组的输入输出 56 7.4.6 字符串处理函数 58 7.4.7 字符数组应用举例 60 习题 61 第8章 文件 63 8.1 C语言文件的概念 63 8.2 打开文件 64 8.3 关闭文件 65 8.4 调用getc(fgetc)和putc(fputc)等常用函数进行输入和输出 65 8.5 判断文件结束函数feof 68 习题 69 第二部分 提高篇 71 第9章 算法 73 9.1 算法 73 9.2 结构化程序设计和模块化结构 74 9.2.1 结
系统地讲述c语言的基础知识、基本语法以及编程方法,并且结合c阐述面向对象的程序设计思想,使读者在掌握c语言语法知识的同时,能够解决现实生活较简单的问题,并用计算机语言进行描述。本书每一章都用大量实用性较强的例题阐述基本知识点,同时在每章的最后都提供一个有一定难度且趣味性较强的综合实例,将本章多个知识点有机地结合起来,力求读者能把理论与实践紧密结合,体会解决实际问题的过程。全书内容精练,重点突出,从实例出发提出概念,突出应用,趣味性强。 语言表达严谨、文字通俗易懂,同时配有题型多样的典型习题,适用于c高级语言程序设计的初学者,可以作为普通高等院校电子信息类专业程序设计基础的教材,也适宜有兴趣学习c的非计算机专业学生作为辅助教材,同时也适合自学。 目录编辑 第1章c简单程序设计1 1.1概述1 1.1.1c语言的发展历史1 1.1.2c程序设计的初步知识2 1.1.3字符集5 1.1.4词法记号5 1.2基本数据类型6 1.2.1基本数据类型7 1.2.2变量8 1.2.3常量10 1.3运算符和表达式13 1.3.1运算符的优先级14 1.3.2算术运算符及其表达式15 1.3.3关系运算符与逻辑运算符15 1.3.4增1、减1运算符及其表达式17 1.3.5值运算符、复合的值运算符及其表达式17 1.3.6条件运算符18 1.3.7位操作运算符18 1.3.8其他运算符20 1.3.9数据类型转换21 1.3.10类型别名22 1.4面向对象设计思想及其实例23 1.4.1程序设计语言的发展23 1.4.2面向过程的程序设计(pop)思想23 1.4.3面向对象的程序设计(oop)思想24 1.4.4面向对象思想分析实例——卖报亭24 1.5c上机实践26 1.5.1c程序的实现过程26 1.5.2cbuilder可视化编程环境27 本章小结30 习题31 第2章数据的输入/输出与控制结构34 2.1键盘输入34 2.2屏幕显示输出35 2.3字符数据的输入输出36 2.3.1字符数据的输入与输出36 2.3.2字符串的输入与输出37 2.4程序基本控制结构38 2.4.1语句的概念38 2.4.2算法的基本控制结构41 2.5选择结构42 2.5.1if-else语句42 2.5.2switch语句46 2.6循环结构48 2.6.1while语句与do-while语句48 2.6.2for循环语句50 2.6.3ifgoto实现循环功能51 2.6.4循环的嵌套52 2.7跳转语句53 2.7.1break语句54 2.7.2continue语句54 2.7.3break语句与continue语句的比较54 2.7.4goto语句55 2.8编程实例——水果收银机55 本章小结56 习题57 第3章数组61 3.1数组的基本概念61 3.2数组的定义与数组元素的表示法62 3.2.1数组的定义格式62 3.2.2数组元素的表示方法62 3.3数组值63 3.3.1数组初值63 3.3.2数组值65 3.4字符数组66 3.4.1字符数组的定义格式66 3.4.2字符数组值66 3.4.3字符数组的输入输出操作67 3.4.4字符串处理函数68 3.5编程实例——选择法排序和josephus问题70 3.5.1选择法排序70 3.5.2josephus问题71 本章小结72 习题72 第4章函数76 4.1函数的定义与调用76 4.1.1函数的定义76 4.1.2函数的声明和调用77 4.2函数的调用方式和参数传递79 4.2.1函数的调用过程79 4.2.2函数的传值调用80 4.2.3函数的引用调用81 4.2.4数组作为函数参数83 4.3函数的嵌套调用和递归调用85 4.3.1函数的嵌套调用85 4.3.2函数的递归调用86 4.4带默认形参值的函数90 4.5内联函数和重载函数92 4.5.1内联函数92 4.5.2重载函数93 4.6编程实例——二进制与十进制的转换94 本章小结95 习题95 第5章程序结构100 5.1全局变量与局部变量100 5.1.1全局变量100 5.1.2局部变量101 5.2静态变量102 5.3存储类型103 5.4作用域与生存期104 5.4.1作用域104 5.4.2可见性105 5.4.3生存期105 5.5编译预处理105 5.5.1文件包含106 5.5.2宏定义106 5.5.3条件编译108 5.6多文件结构109 本章小结110 习题110 第6章指针114 6.1指针的概念114 6.1.1指针变量的声明115 6.1.2指针变量的初始化与引用115 6.2指针运算116 6.2.1运算符“ [1]
1 C语言概述 2 1.1 C语言的发展过程 2 1.2 当代最优秀的程序设计语言 2 1.3 C语言版本 2 1.4 C语言的特点 3 1.5 面向对象的程序设计语言 3 1.6 C和C++ 3 1.7 简单的C程序介绍 4 1.8 输入和输出函数 5 1.9 C源程序的结构特点 6 1.10 书写程序时应遵循的规则 6 1.11 C语言的字符集 6 1.12 C语言词汇 7 1.13 Turbo C 2.0集成开发环境的使用 8 1.13.1 Turbo C 2.0简介和启动 8 1.13.2 Turbo C 2.0集成开发环境 8 1.13.3 File菜单 9 1.13.4 Edit菜单 10 1.13.5 Run菜单 11 1.13.6 Compile菜单 12 1.13.7 Project菜单 13 1.13.8 Options菜单 14 1.13.9 Debug菜单 18 1.13.10 Break/watch菜单 19 1.13.11 Turbo C 2.0的配置文件 20 2 程序的灵魂—算法 1 2.1 算法的概念 1 2.2 简单算法举例 1 2.3 算法的特性 4 2.4 怎样表示一个算法 4 2.4.1 用自然语言表示算法 4 2.4.2 用流程图表示算法 4 2.4.3 三种基本结构和改进的流程图 8 2.4.4 用N-S流程图表示算法 9 2.4.5 用伪代码表示算法 10 2.4.6 用计算机语言表示算法 11 2.5 结构化程序设计方法 11 3 数据类型、运算符与表达式 1 3.1 C语言的数据类型 1 3.2 常量与变量 3 3.2.1 常量和符号常量 3 3.2.2 变量 3 3.3 整型数据 4 3.3.1 整型常量的表示方法 4 3.3.2 整型变量 5 3.4 实型数据 7 3.4.1 实型常量的表示方法 7 3.4.2 实型变量 8 3.4.3 实型常数的类型 9 3.5 字符型数据 9 3.5.1 字符常量 9 3.5.2 转义字符 9 3.5.3 字符变量 10 3.5.4 字符数据在内存的存储形式及使用方法 10 3.5.5 字符串常量 11 3.5.6 符号常量 12 3.6 变量初值 12 3.7 各类数值型数据之间的混合运算 13 3.8 算术运算符和算术表达式 14 3.8.1 C运算符简介 14 3.8.2 算术运算符和算术表达式 15 3.9 值运算符和值表达式 17 3.10 逗号运算符和逗号表达式 18 3.11 小结 19 3.11.1 C的数据类型 19 3.11.2 基本类型的分类及特点 19 3.11.3 常量后缀 19 3.11.4 常量类型 19 3.11.5 数据类型转换 19 3.11.6 运算符优先级和结合性 20 3.11.7 表达式 20 4 最简单的C程序设计—顺序程序设计 1 4.1 C语句概述 1 4.2 值语句 3 4.3 数据输入输出的概念及在C语言的实现 4 4.4 字符数据的输入输出 4 4.4.1 putchar 函数(字符输出函数) 4 4.4.2 getchar函数(键盘输入函数) 5 4.5 格式输入与输出 5 4.5.1 printf函数(格式输出函数) 5 4.5.2 scanf函数(格式输入函数) 8 4.6 顺序结构程序设计举例 12 5 分支结构程序 1 5.1 关系运算符和表达式 1 5.1.1 关系运算符及其优先次序 1 5.1.2 关系表达式 1 5.2 逻辑运算符和表达式 2 5.2.1 逻辑运算符极其优先次序 2 5.2.2 逻辑运算的值 3 5.2.3 逻辑表达式 3 5.3 if语句 4 5.3.1 if语句的三种形式 4 5.3.2 if语句的嵌套 7 5.3.3 条件运算符和条件表达式 9 5.4 switch语句 10 5.5 程序举例 11 6 循环控制 1 6.1 概述 1 6.2 goto语句以及用goto语句构成循环 1 6.3 while语句 2 6.4 do-while语句 4 6.5 for语句 6 6.6 循环的嵌套 9 6.7 几种循环的比较 9 6.8 break和continue语句 9 6.8.1 break语句 9 6.8.2 continue 语句 10 6.9 程序举例 11 7 数组 1 7.1 一维数组的定义和引用 1 7.1.1 一维数组的定义方式 1 7.1.2 一维数组元素的引用 2 7.1.3 一维数组的初始化 4 7.1.4 一维数组程序举例 4 7.2 二维数组的定义和引用 6 7.2.1 二维数组的定义 6 7.2.2 二维数组元素的引用 6 7.2.3 二维数组的初始化 7 7.2.4 二维数组程序举例 9 7.3 字符数组 9 7.3.1 字符数组的定义 9 7.3.2 字符数组的初始化 9 7.3.3 字符数组的引用 10 7.3.4 字符串和字符串结束标志 10 7.3.5 字符数组的输入输出 10 7.3.6 字符串处理函数 12 7.4 程序举例 14 7.5 本章小结 17 8 函 数 1 8.1 概述 1 8.2 函数定义的一般形式 3 8.3 函数的参数和函数的值 4 8.3.1 形式参数和实际参数 4 8.3.2 函数的返回值 5 8.4 函数的调用 6 8.4.1 函数调用的一般形式 6 8.4.2 函数调用的方式 6 8.4.3 被调用函数的声明和函数原型 7 8.5 函数的嵌套调用 8 8.6 函数的递归调用 10 8.7 数组作为函数参数 12 8.8 局部变量和全局变量 17 8.8.1 局部变量 17 8.8.2 全局变量 19 8.9 变量的存储类别 20 8.9.1 动态存储方式与静态动态存储方式 20 8.9.2 auto变量 21 8.9.3 用static声明局部变量 21 8.9.4 register变量 22 8.9.5 用extern声明外部变量 23

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧