}
函数调用
练习4.编写一个程序,其中包含一个子函数,功能为取出数x从右边起的第m位数字,如digit(1234,3)=2,digit(1234,6)=0。
子函数要求:
形式为:int digit(int n,int k);
运行结果示例:
#include
#include
int digit(intn,int k)
{
int i;
n=abs(n);
for (i=1;i
return n%10;
}
void main()
{
int x,m;
printf(“输入x和m值:”);
scanf(“%d %d”,&x,&m);
printf(“digit(%d,%d)=%d”, x,m,digit(x,m));
}
递归算法
练习2.用递归方法解决猴子吃桃子的问题(P129习题6.10)。
运行结果:1534
#include"iostream.h"
int tz(int x)
{
if (x==10)
return 1;
else
return ((tz(x+1)+1)*2);
}
void main()
{
cout<<"原数量:"<
}
字符串操作
练习4.编写一个程序,其中包含一个子函数,功能为在字符串中查找某个字符首次出现的位置,若字符串中没有该字符,则给出0。
子函数要求:
形式为:int at(char s[ ],charc);
运行结果示例:
#include
#include
#include
void main( )
{
int at(char s[],char c);
char s[80],c;
printf("输入字符串:");
gets(s);
printf("输入查询字符:");
c=getchar();
cout<<"返回值:"<
}
int at(chars[],char c)
{
int i;
for (i=0;i
if (s[i]==c) break;
if (i==strlen(s))
return 0;
else
return i+1;
}
练习1.编写一个程序,其中包含一个子函数,功能为将读入的密码(字符串)按指定规律翻译回原文后输出。
l 子函数要求:
形式为:void decrypt (charstr[]);
l 解码规律如下:
字母:变成其后的第3个,且循环转换(例:a→d、W→Z、y→b);
其它:保持不变。
运行结果示例:
#include
#include
void main()
{
void decrypt(char str[]);
char str[80];
printf("原文: ");
gets(str);
decrypt(str);
printf("译文:%s\n",str);
}
voiddecrypt(char str[])
{
int i;
for (i=0;str[i]!='\0';i++)
if (isalpha(str[i]))
if(str[i]>='A'&&str[i]<='W'||str[i]>='a'&&str[i]<='w')
str[i]=str[i]+3;
else
str[i]=str[i]-23;
}
指针操作
练习3.用指针变量的处理方法编写一个子函数,功能为把读入的数组(10个数据)中的所有奇数放在另一个数组中,并输出新数组的内容。
子函数要求:
实参为指针变量;形参为指针变量,且形式为:int select(int *p, int*q);
其中:指针p用来接收原数组(的地址),指针q用来接收新数组(的地址);函数返回新数组元素的个数。
提示:两个数组全部在主函数中定义。
运行结果示例:
#include
intselect(int *p, int *q)
{
int i,j=0;
for (i=0;i<10;i++,p++)
if (*p%2!=0)
{ *q++=*p;j++; }
return j;
}
void main( )
{
int a[10],b[10],i,j;
int *x=a,*y=b;
cout<<"输入10个数组元素:\n";
for (i=0;i<10;i++) cin>>*(x+i);
j=select(x,y);
cout<<"挑选后的新数组元素:"<
for (i=0;i
cout<
}
练习3.编写一个程序,其中包含一个子函数,功能为统计一个字符串在另一个字符串中出现的次数。要求:
l 子函数形式为:int strat(char *a,char*sub);
运行结果示例:
#include
#include
#include
intstrat(char *a,char *sub)
{
int x,y,i=0,k,t=0;
x=strlen(a);
y=strlen(sub);
for(i=0;i<=x-y;i++)
{
if (sub[0]==a[i])
{
k=1;
while(k
if (k==y) t++;
}
}
return t;
}
void main( )
{
char a[80],sub[80];
printf("输入字符串1:");
gets(a);
printf("输入字符串2:");
gets(sub);
cout<<"n="<
}
结构体数组
练习2.编写一个程序,功能如下:
⑴ 输入若干人员的姓名及电话号码(8位),以字符“#”结束输入;
⑵ 当输入姓名时,能查找出该人的电话号码(如果没有此人,则显示未找到该记录)。
运行结果示例:
#include"iostream.h"
#include"string.h"
void main()
{
struct
{
char name[20];
char tel[9];
}s[50];
int i=0,j=0;
char ns[20];
cout<<"输入姓名及电话号码(以 # 结束):\n";
cin>>ns;
while (strcmp(ns,"#")!=0)
{
strcpy(s[i].name,ns);
cin>>s[i].tel;
i++;
cin>>ns;
}
cout<<"输入要查找电话人的姓名:";
cin>>ns;
while(strcmp(s[j].name,ns)!=0&&j
if (j
cout<<"电话号码:"<
else
cout<<"未找到该记录。"<
}
链表操作
练习2.编写一个程序,功能为输入10个整数,将它们存储在一个动态链表中。再读入一个数n,将链表从第n个结点开始重组(即以第n个结点作为头结点,而将前n-1个结点平移至链表的末尾),并输出重组后的链表结果。要求:程序包含3个子函数,各函数要求如下:
l 子函数1:功能为创建包括10个结点的链表并读入数据;
形式为:struct LNode *creat(void);
l 子函数2:功能为平移(重组)链表;
形式为:struct LNode *move(struct LNode *head,int n);
其中:函数返回值为调整后的新“头指针”的地址;
l 子函数3:功能为输出链表中的所有结点;
形式为:void print(struct LNode *head);
运行结果示例:
#include"iostream.h"
#include"stdlib.h"
#define NULL0
#define LENsizeof(struct LNode)
typedefstruct LNode
{
int x;
struct LNode *next;
}Link;
Link*creat(void)
{
Link *head=NULL,*p1,*p2;
int i;
cout<<"输入10个整数:";
for(i=0;i<10;i++)
{
p2=(Link *)malloc(LEN);
cin>>p2->x;
if(i==0)
head=p2;
else
p1->next=p2;
p1=p2;
}
p1->next=NULL;
return head;
}
Link*move(Link *head,int n)
{
Link *p1=head,*head1=head;
int i;
if(n>1)
{
for(i=1;inext;
head1=p1->next;
p1->next=NULL;
p1=head1;
while(p1->next!=NULL)p1=p1->next;
p1->next=head;
}
return head1;
}
voidprint(Link *head)
{
Link *p;
p=head;
if(p==NULL) cout<<"It's a emptylink-list."<
else cout<<"输出链表结果:"<
while(p!=NULL)
{
cout<x<<" ";
p=p->next;
}
cout<
}
void main()
{
Link *head;
int n;
head=creat();
cout<<"输入n值(1-10):";
cin>>n;
head=move(head,n);
print(head);
}
文件操作
练习2.编写一个程序,功能为从键盘读入一组数值(10个整数),将其中的奇数和偶数分别在磁盘文件“odd.c”和“even.c”中存放(以二进制方式)并输出。
要求:使用fread和fwrite函数。
运行结果示例:
#include"stdlib.h"
#include"iostream.h"
#include"stdio.h"
void main()
{
int x,i,odd=0,even=0;
FILE *fp1,*fp2;
if((fp1=fopen("odd.c","wb+"))==NULL)
{
printf("Cannot openfile.");
exit(0);
}
if((fp2=fopen("even.c","wb+"))==NULL)
{
printf("Cannot openfile.");
exit(0);
}
printf("输入数据内容: \n");
for(i=0;i<10;i++)
{
cin>>x;
if(x%2==1)
{
fwrite(&x,sizeof(int),1,fp1);
odd++;
}
else
{
fwrite(&x,sizeof(int),1,fp2);
even++;
}
}
rewind(fp1);
printf("\n输出奇数:");
for(i=0;i
{
fread(&x,sizeof(int),1,fp1);
printf(" %d",x);
}
rewind(fp2);
printf("\n输出偶数:");
for(i=0;i
{
fread(&x,sizeof(int),1,fp2);
printf(" %d",x);
}
printf("\n");
fclose(fp1);
fclose(fp2);
}
1、现有21根火柴,两人轮流取,每人每次可取走1- 4根,不可多取,也不能不取,谁取最后一根火柴则谁输。请编写一个程序进行人机对弈,要求人先取,计算机后取;计算机一方为“常胜将军”。要求程序运行效果如下图。
#include
void main()
{
inta=21,i;
printf("Gamebegin:\n");
while(a>0)
{
do{
printf("Howmany stick do you wish to take(1~%d)?",a>4?4:a);
scanf("%d",&i);
}while(i>4||i<1||i>a);/*接收正在确的输入*/
if(a-i>0)printf(" %d stick left in the pile.\n",a-i);
if((a-i)<=0)
{
printf("You have taken the last stick.\n");
printf("* * * You lose! \nGame Over.\n"); /*输出取胜标记*/
break;
}
else
printf("Compute take %d stick.\n",5-i); /*输出计算机取的子数*/
a-=5;
printf("%d stick left in the pile.\n",a);
}
}
2、编程完成商人过河游戏:有三个商人带着三个随从和货物过河,船每次最多只能载两个人,由他们自己划行,并且如何乘船渡河的大权由商人掌握。要求保证在过河期间的任一岸上商人的人数要大于或等于随从的人数,否则随从会杀死商人抢走货物。设计一个符合上述要求的商人过河的游戏。要求程序运行效果如下图。
有制约关系物品过河问题
有一人要将自己的兔子、蔬菜和狐狸等三件物品运过河。但过河所用的船每次只能装其中的两件,而这三件物品之间又存在一定的制约关系:兔子不能单独和狐狸以及不能和蔬菜在一起,因为狐狸要吃兔子,兔子也能吃蔬菜。
逻辑关系可以把蔬菜和狐狸抽象成“真” 也就是1把兔子抽象成“假” 也就是0船和岸就是求他们 与的关系 如果兔子单独存在 就 让船或岸+1变成真判断每次 船和岸是否出现 0出现0就跳转到结束 没出现就继续
规律与原则:
掌握常用算法,如排序、递归、穷举法、回溯法等
掌握常用趣味题,如八皇后、马踏棋盘、最佳路径、报数游戏、背包问题等