程序来自配套的习题解答一书
8.5写一函数,使输入的字符串反序存放,在主函数中输入和输出字符串
#include <stdio.h>
#include <string.h>
void main()
{
void inverse(char str[]);
char str[100];
printf("Input String:");
scanf("%s",str);
inverse(str);
printf("Inverse string:%s/n",str);
}
void inverse(char str[])
{
char t;
int i,j;
for(i=0,j=strlen(str);i<strlen(str)/2;i++,j--)
{
t=str[i];
str[i]=str[j-1];
str[j-1]=t;
}
}
8.8写一函数,输入一个4位数,要求输出这4个数字字符,但每两个数字间有一个空格。例:输入1990输出1 9 9 0
#include <stdio.h>
#include <string.h>
void main()
{
char str[80];
void insert(char str[]);
printf("/nInput four digit:");
scanf("%s",str);
insert(str);
}
void insert(char str[])
{
int i;
for(i=strlen(str);i>0;i--)
{
str[2*i]=str[i];
str[2*i-1]=' ';
}
printf("/nOutput:%s/n",str);
}
8.10写一函数,输入一行字符,将此字符串中最长的单词输出
#include <stdio.h>
#include <string.h>
int alphabetic(char c)//判断当前字符是否是字母
{
if((c>='a' && c<='z')||(c>='A' && c<='Z'))
return 1;
else
return 0;
}
int longest(char string[])//寻找最长单词的起始位置
{
int len=0,i,length=0,flag=1,place=0,point;
for(i=0;i<=strlen(string);i++)
{
if(alphabetic(string[i]))
{
if(flag)//flag表示新单词是否已开始,flag=0表示未开始,flag=1表示开始
{
point=i;//point代表当前单词的起始位置(用下标表示)
flag=0;
len++;//len表示当前单词已累计的字母个数
}
else
len++;
}
else
{
flag=1;
if(len>=length)//length代表先前单词中最长单词的长度
{
length=len;
place=point;//place代表最长单词的起始位置
len=0;
}
else
len=0;
}
}
return place;//返回最长单词的起始位置
}
void main()
{
int i;
char line[100];
printf("Input one line:/n");
gets(line);
printf("/nThe longest word is:");
for(i=longest(line);alphabetic(line[i]);i++)//输出最长单词直到遇到空格
printf("%c",line[i]);
printf("/n");
}
8.14输入10个学生5门课成绩,分别用函数求:(1)每个学生的平均分(2)每门课的平均分(3)找出最高分数所对应的学生和课程
#include <stdio.h>
#define N 10
#define M 5
float score[N][M];
float a_stu[N],a_cour[M];
int r,c;
void main()
{
float highest();
void input_stu();
void aver_stu();
void aver_cour();
int i,j;
float h;
input_stu();//输入10个学生成绩
aver_stu();//计算10个学生平均成绩
aver_cour();//计算5门课平均成绩
printf("/nNO. cour1 cour2 cour3 cour4 cour5 aver");
for(i=0;i<N;i++)
{
printf("/nNo.%2d",i+1);
for(j=0;j<M;j++)
{
printf("%8.2f",score[i][j]);//输出1个学生各门课成绩
}
printf("%8.2f",a_stu[i]);//输出1个学生平均成绩
}
printf("/nAverrage:");
for(j=0;j<M;j++)
printf("%8.2f",a_cour[j]);//输出5门课平均成绩
h=highest();//求最高分和它属于哪个学生哪门课
printf("/nhighest:%7.2f NO.%2d course%2d/n",h,r,c);//输出最高分和学生号,课程号
}
void input_stu()
{
int i,j;
for(i=0;i<N;i++)
{
printf("/nInput score of student%2d:/n",i+1);
for(j=0;j<M;j++)
scanf("%f",&score[i][j]);
}
}
void aver_stu()
{
int i,j;
float s;
for(i=0;i<N;i++)
{
for(j=0,s=0;j<M;j++)
{
s+=score[i][j];
}
a_stu[i]=s/5.0;
}
}
void aver_cour()
{
int i,j;
float s;
for(j=0;j<M;j++)
{
s=0;
for(i=0;i<N;i++)
{
s+=score[i][j];
}
a_cour[j]=s/(float)N;
}
}
float highest()
{
float high;
int i,j;
high=score[0][0];
for(i=0;i<N;i++)
for(j=0;j<M;j++)
{
if(score[i][j]>high)
{
high=score[i][j];
r=i+1;//数组行号i从0开始,学生号r从1开始,故r=i+1
c=j+1;//数组行号j从0开始,学生号c从1开始,故c=j+1
}
}
return high;
}
8.15写几个函数:(1)输入10个职工的姓名和工号(2)按职工号由小到大排序,姓名顺序也随之调整(3)输入1职工号,用折半查找法找出该职工姓名。从主函数输入要查找的职工号,输出该职工姓名
#include <stdio.h>
#include <string.h>
#define N 10
void input_e(int num[],char name[N][8])//录入职工数据
{
int i;
for(i=0;i<N;i++)
{
printf("/nInput NO.:");
scanf("%d",&num[i]);
printf("Input name:");
getchar();
gets(name[i]);//输入的名字不能超过8个字节
}
}
void sort(int num[],char name[N][8])//选择法排序
{
int i,j,min,temp1;
char temp2[8];
for(i=0;i<N-1;i++)
{
min=i;
for(j=i+1;j<N;j++)
if(num[min]>num[j])
min=j;
if(min!=j)
{
temp1=num[i];
strcpy(temp2,name[i]);
num[i]=num[min];
strcpy(name[i],name[min]);
num[min]=temp1;
strcpy(name[min],temp2);
}
}
printf("/nResult:/n");
for(i=0;i<N;i++)
printf("/n%5d%10s",num[i],name[i]);
}
void search(int n,int num[],char name[N][8])//折半查找法
{
int top,bott,mid,loca,sign=1;
loca=0;
top=0;
bott=N-1;
if((n<num[0]) || (n>num[N-1]))
loca=-1;
while((sign==1) && (top<=bott))
{
mid=(bott+top)/2;
if(n==num[mid])
{
loca=mid;
printf("NO.%d,his name is %s./n",n,name[loca]);
sign=-1;
}
else if(n<num[mid])
bott=mid-1;
else
top=mid+1;
}
if(sign==1 || loca==-1)
printf("%d not been found./n",n);
}
void main()
{
int num[N],number,flag=1,c;
char name[N][8];
input_e(num,name);
sort(num,name);
while(flag==1)
{
printf("/nInput number to look for:");
scanf("%d",&number);
search(number,num,name);
printf("continue or not(Y/N)?");
getchar();
c=getchar();
if(c=='N' || c=='n')
flag=0;
}
}
8.16写一函数,输入一个16进制数,输出相应的10进制数
#include <stdio.h>
#define MAX 100
int htoi(char s[])//16进制到10进制转换
{
int i,n=0;
for(i=0;s[i]!='/0';i++)
{
if(s[i]>='0' && s[i]<='9')
n=n*16+s[i]-'0';
if(s[i]>='a' && s[i]<='f')
n=n*16+s[i]-'a'+10;
if(s[i]>='A' && s[i]<='F')
n=n*16+s[i]-'A'+10;
}
return n;
}
void main()
{
char t[MAX];
int flag=0,flag1=1,i=0;
char c;
printf("/nInput a hex number:");
while((c=getchar())!='/0' && i<MAX && flag1)//输入字符不为EOF和不超过定义长度而且flag1==1
{
if(c>='0' && c<='9' || c>='a' && c<='f' || c>='A' && c<='F')
{
flag=1;//标志是否为合法16进制字符,1表示合法,0表示非法
t[i++]=c;
}
else if(flag)
{
t[i]='/0';
printf("decimal number :%d/n",htoi(t));
printf("continue or not(Y/N)?");
c=getchar();
if(c=='N' || c=='n')
flag1=0;//循环终止条件
else
{
flag=0;
i=0;
printf("/nInput a hex number:");
}
}
}
}
8.17用递归法将一个整数n转换成字符串。例:输入483应输出"483"。n的位数不确定,可以是任意位数的整数
#include <stdio.h>
void convert(int n)
{
int i;
if((i=n/10)!=0)
convert(i);
putchar(n%10+'0');
}
void main()
{
int number;
printf("/nInput an integer:");
scanf("%d",&number);
printf("Output:");
if(number<0)
{
putchar('-');
number=-number;
}
convert(number);
}
8.18给出年、月、日,计算改日是该年的第几天
#include <stdio.h>
int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int sum_day(int month,int day)//计算日期
{
int i;
for(i=1;i<month;i++)//累加所在月之前的天数
day+=day_tab[i];
return day;
}
int leap(int year)//判断是否为闰年
{
int leap;
leap=(year%4==0 && year%100!=0 || year%400==0);
return leap;
}
void main()
{
int year,month,day,days;
printf("/nInput date(year,month,day):");
scanf("%d,%d,%d",&year,&month,&day);
printf("/n%d/%d/%d ",year,month,day);
days=sum_day(month,day);
if(leap(year) && month>3)
days=days+1;
printf("is the %dth day in this year./n",days);
}