一、选择题
1~4 B C A D?
5~8 C B A B
二、填空题?
1、a? 10? &maxskub? &minsub? ? ? ? ? ? ?*maxsub=i? ? ? ? ? ? *minsub=i
2、i<*n-1? ? ?j<=i? ? ?a[j+1]? ? ? x
3、s? ? ?p++? ? ?&s[n-1]? ? ?p<q? ? ?q--? ?
4、q=p? ? ?p>&str[0]? ? ?*p=*(p-1)
5、cnt%3==0? ? ?k++? ? ?cnt=0
三、程序设计题
第1题
#include<stdio.h>//习题8.1 拆分实数的整数与小数部分
void splitfloat(float x,int *intpart,float *fracpart)
{
*intpart=(int)x;//强制转换为整型
*fracpart=x-*intpart;//直接减去整数部分可得小数部分
}
main(void)
{
float x,fracpart;//x=123.456,小数部分会输出为0.456001
int intpart;//x=345.89,小数部分为0.890015
printf("Enter x:");
scanf("%f",&x);
splitfloat(x,&intpart,&fracpart);
printf("整数部分:%d\n小数部分:%lf",intpart,fracpart);
return 0;
}
?第2题
#include<stdio.h>//习题8.2 数组中查找指定元素
int search(int list[],int n,int x)
{
int i,flag=0,k;
for(i=0;i<n;i++)
{
if(x==list[i]){
k=i;
flag=1;
}
}
if(flag==1)
{
return k;//只返回最大下标
}
else return -1;
}/*
int search(int list[],int n,int x,int *pk)
{
int i,flag=0;
for(i=0;i<n;i++)
{
if(x==list[i]){
*pk=i;
flag=1;
}
}
if(flag==0) return -1;
}*/
main()
{
int n,i,a[10],x,result;
printf("Enter n(n<=10):");
scanf("%d",&n);
printf("Enter %d numbers:",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
printf("Enter x:");
scanf("%d",&x);
result=search(a,n,x);
if(result==-1)
{
printf("Not Found!");
}
else printf("下标:%d",result);
}
第3题
#include<stdio.h>//习题8.3 循环后移
main()
{
int n,m,i,a[10],j,b[10];
printf("Enter n:");
scanf("%d",&n);
printf("Enter m:");
scanf("%d",&m);
printf("Enter %d numbers:",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
j=i;
if(i+m<n){
b[j+m]=a[i];
}
else {
b[j-(n-m)]=a[i];
}
}
for(j=0;j<n;j++)
{
printf("%d",b[j]); //4会改变为-1
}
}
第4题
#include<stdio.h>//习题60.4
#define N 20
main()
{
int n,i,m,k=1,j,p=0;
int a[N];
printf("Enter n:");
scanf("%d",&n);
printf("Enter m:");
scanf("%d",&m);
for(i=0;i<n;i++)
{
a[i]=i+1;//编号
}
for(i=1;i<n;i++)//与编号相同,a[1]=2
{
a[i]=i+1;//建立链表 ,a[i]作为“指针”变量使用,存放下一节点的位置
}//设指针j指向当前节点,j=a[i]表示移动节点
a[n]=1;//第n个人指向第一个人
j=n;
while(p<n)//n个数均出列为止
{
while(k<m)//从出局的下一个报数
{
j=a[j];//移动节点,到下一个
k++;//报数计数器加一
}
printf("%d ",a[j]);//数到m的出列
p++;//出列人数计数
a[j]=a[a[j]];// 以出局的那个数的编号作为下标,移动到下一个数
k=1;//计数器初始化为1,因为是出局的下一个报1
}
}
第5题
#include<stdio.h>//习题8.5 使用函数实现字符串复制
#include<string.h>
#define N 80
void strmcpy(char *s,char *t,int m)//题目要求从字符串中第m个字符开始复制,即m=下标+1
{
// t=t+m;//指针指向下标为m的字符,从下标为m的字符开始复制
t=t+m-1;//t指向第m个字符
strcpy(s,t);
*s=*s;
}
int main(void)
{
int m,i;
char t[N],s[N];
gets(t);
printf("Enter m(m>=1):");
scanf("%d",&m);
strmcpy(s,t,m);
printf("复制后的字符串为:");//原字符复制,m=1
puts(s);
return 0;
}
第6题
#include<stdio.h>//习题8.6 删除字符
#include<string.h>
void delchar(char s[],char c)
{
int i,j=0;
for(i=0;s[i]!='\0';i++)//遍历字符串
{
if(s[i]!=c){//比较
s[j]=s[i];//不同则放在以j为下标的s数组中 ,直接改变了字符数组s。也可以放在字符数组t中,直接在自定义函数中输出
j++;//每放一个,下标加一
}
}
s[j]='\0';//加上字符串结束标志
}
main()
{
char ch,s[80],t[80];
int i;
gets(s);
ch=getchar();
delchar(s,ch);
printf("删除后:\n");
puts(s);
}
第7题
#include<stdio.h>//习题8.7
#include<string.h>
int main(void)
{
char s[5][80],t[10];//定义二维数组,中间变量
int i,j,k;
printf("输入5个字符串:");
for(i=0;i<5;i++)
{
scanf("%s",s[i]);//输入二维字符数组 ,或者用gets(s[i]);,需每行输入一个
}
/*冒泡排序*/
for(i=0;i<4;i++)
{
for(j=0;j<5-i;j++)
{
if(strcmp(s[j],s[j+1])>0)//比较,后面小于前面(>0),后面换到前面
{
strcpy(t,s[j+1]);
strcpy(s[j+1],s[j]);//交换
strcpy(s[j],t);
}
}
}
/*选择排序*/
for(i=0;i<4;i++)
{
k=i;
for(j=i+1;j<5;j++)
{
if(strcmp(s[j],s[k])<0)//比较,后面小于前面(>0),后面换到前面
{
k=j;//s[j]小,则赋值
}
}
if(k!=i)
{
strcpy(t,s[k]);
strcpy(s[k],s[i]);//交换
strcpy(s[i],t);
}
}
printf("从小到大排序后:\n");
for(i=0;i<5;i++)
{
puts(s[i]);//输出交换好的数组
}
return 0;
}
第8题
#include<stdio.h>//习题8.8 判断回文
#include<string.h>
#define N 80
main()
{
/*数组版*/
int i,k,lenth;
char s[N];
printf("输入一个字符串:");
scanf("%s",s);
lenth=strlen(s);
i=0;
k=lenth-1;
while(i<k){
if(s[i]!=s[k]){
break;
}
i++;
k--;
}
if(i>=k)
{
printf("%s是回文。",s);
}
else {
printf("%s不是回文。",s);
}
//两个不能同时用
/*指针版 */{
char ch,s[80],*p,*q;
int i,j,n;
printf("输入一个字符串:");
gets(s);
p=s;//指向s ,空格也算字符,也归在字符串里
while(*p==' ')
{
p++;//计算S前的空格
}
n=strlen(s);//有效长度,不包括'\0'
q=&s[n-1];//指向数组最后一个字符
while(*q==' ')
{
q--;//计算回车键前有多少个空格需消除
}
while(p<q&&*p==*q)//从两头开始,判断是否相等
{
p++;//向中间缩进
q--;
}
if(p<q) printf("No.\n");//相对中间对称,如果大于,就已经出现重复比较了
else printf("Yes.\n");}
}
第9题
#include<stdio.h>//习题8.9
int main(void)
{
int A_count,a_count,blank,digit,other;
char ch;
A_count=a_count=blank=digit=other=0;
while((ch=getchar())!='\n'){
if(ch>='A'&&ch<='Z'){
A_count++;
}
else if(ch>='a'&&ch<='z'){
a_count++;
}
else if(ch==' '){
blank++;
}
else if(ch>='0'&&ch<='9'){
digit++;
}
else other++;
}
printf("A_count=%d,a_count=%d,blank=%d,digit=%d,other=%d",A_count,a_count,blank,digit,other);
return 0;
}
|