C语言第二次实验作业
题目:计算天数,编写程序计算某年某月某日是该年的第几天(11-3)
思路:相方法将从一月一日开始加到输入的年月日,计算天数;
方法:使用数组,把每一个月份的对应天数存储到矩阵中,再通过循环计算出总天数;
源程序:#include <stdio.h>
int main(){
int a[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int y,m,d,k,flag=0;
scanf("%d/%d/%d",&y,&m,&d);
if(y%400==0||(y%4==0&&y%100!=0))flag=1;
for(k=1;k<m;k++)d+=a[flag][k];
printf("%d",d);
return 0;
}
遇到的问题:写时没想到能用两列分别代表闰年和非闰年,导致未想到用矩阵的方法,异常麻烦
心得:这种比叫确定的数需要相加的类型题用矩阵或数组好做;
题目:字符串转换成十进制整数(输入一个以#结束的字符串,先滤去所有的非十六进制字符,组成一个新的十六进制字符串,编写程序将该字符串转换成十进制整数输出;若在第一个十六进制字符前存在字符‘-’,则表示其为负数。(12-5)
思路:先输入一个字符串,再判断什么时候出现第一个十六进制字符,记住下标,再判断在这个下标之前的位置是否含‘-’,若有,则跳出循环且说明该数是负数,若没有,则是正数。
方法:定义一个字符数组输入字符串,记录第一个十六进制字符的下标,再利用for循环检查从k=0到k=i-1的字符是否出现‘-’;最后将新字符串转换成数字即好。
源程序:
#include <stdio.h>
int main(){
char a[80],b[80];
int i=0,d=0,k=0,c;
long m;
while((a[i]=getchar())!='#'){ //输入字符串
i++;
}
for(k=0;k<i;k++){
if((a[k]<='9'&&a[k]>='0')||(a[k]<='F'&&a[k]>='A')||(a[k]<='f'&&a[k]>='a')){
c=k;
k=i;
}} //判断第一个十六进制字符出现的位置
for(k=0;k<c;k++){
if(a[k]=='-'){
printf("-");
k=c;
}
} //判断是否为负数
for(k=0;k<i;k++){
if((a[k]<='9'&&a[k]>='0')||(a[k]<='F'&&a[k]>='A')||(a[k]<='f'&&a[k]>='a')){
b[d]=a[k];
d++;
}} //建立一个新字符串
for(k=0;k<d;k++){
if(b[k]<='9'&&b[k]>='0')m=m*16+b[k]-'0';
else if(b[k]<='F'&&b[k]>='A')m=m*16+b[k]-'A'+10;
else if(b[k]<='f'&&b[k]>='a')m=m*16+b[k]-'a'+10;
} //将字符串转化为对应的整数
printf("%ld",m);
return 0;
}
遇到的问题:写程序时未想到直接将负号输出,一直想着保存在数组里,导致出错;
心得:很多题目也许看着复杂,但静下心来想一下并不会很复杂;
题目:使用函数选择法排序,要求实现一个用选择法对整数数组进行简单排序的函数(13-4)
思路:使用两个循环,一个循环用以计算循环次数,一个循环用以数组遍历比较;
方法:使用循环嵌套,外循环计数,内循环用以比较出最小的数;
源程序:
#void sort( int a[], int n ){
int i,min,index,k;
for(i=0;i<n;i++){
min=i;
for(k=i+1;k<n;k++){
if(a[k]<a[min])min=k;
}
index=a[i];
a[i]=a[min];
a[min]=index;
}
}
遇到的问题:外循环和内循环的下标联系未搞清楚;
心得:C语言题目很锻炼思维,能使思路更清晰;
题目:给字符串排序,给输入的五个字符串按从小到大排序(14-8)
思路:数类似数组元素的选择排序
方法: 调用strcmp函数和strcpy函数;
源程序:
#include<stdio.h>
#include<string.h>
int main(void)
{
int i,j;
char a[5][80], t[80];//改大了点,不然字符串太长会超出数组范围
for (i = 0; i < 5; i++)
{
scanf("%s",a[i]);
}
for (i = 1; i < 5; i++)
{
for (j =0; j < 5-i ;j++)
if (strcmp(a[j], a[j+1]) > 0)
{
strcpy(t,a[j]);
strcpy(a[j], a[j + 1]);
strcpy(a[j + 1], t);
}
}
printf("After sorted:\n");
for (i = 0; i < 5; i++)
puts(a[i]);
return 0;
}遇到的问题:对字符串函数的调用不是很理解;
心得:C语言中有很多函数用了后很方便,我们要学习的有很多;
题目:求链式表表长(15-4)
思路:从表头开始,计算链表中有效节点的个数;
方法: 利用指针
源程序:
int Length( List L ){
int len=1;
if(L==NULL)return 0;
else {
while(L->Next!=NULL){
len++;
L=L->Next;
}
return len;
}
}
遇到的问题:对define不是很理解,对函数名看不大懂;
心得:学习一门课程要理解性学习;