题目一(选择中的switch-case语句):
编程,输入某一年的任一个月,输出这个月的天数,要求使用switch语句。
输入输出示例:
input month of 2011:10
2011年10月有31天
提示:
(1)该程序应该运行13次,分别输入1~12月,以及除此之外的数。
(2)运行时调试跟踪月份的变化。
(3)编程时注意不同月份可以有相同的天数。
思考:
输入年和月,如何求该月的天数。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int year, month; //将year与month定义为整型变量
printf("输入年和月(用空格分隔):\n"); //输入的提示语
scanf("%d %d", &year, &month); //输入年份与月份
switch (month) //用switch case语句来储存其月份对应的天数
{
case 2:if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) //判断所输入的年份是否为闰年
printf("29天\n"); //闰年则为29天
else
printf("28天\n"); //非闰年则为28天
break;
case 4:
case 6:
case 9:
case 11:printf("30天\n"); break; //小月30天
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:printf("31天\n"); break; //大月31天
default:printf("输出错误,这不是一个月份!\n")//输入其他数字均判错
}
system("pause");
return 0;
}
题目二(c语言生成随机数的方法):
设计一个加减算术运算练习程序,用户输入想要进行的加减算术运算符,程序随机产生(0—100)之间两个数的算术表达式(用产生随机数函数完成),用户输出运算结果;程序给出正确或错误的提示信息。
如:用户输入“+”,随机产生了56+8= ,用户输出64<Enter>,提示:“运算正确,好棒!”
【提示:如何编程控制计算机产生指定范围的随机数呢?可采用下面方法:
(1)利用求余运算rand()%b将函数rand()所产生的数变化到0~(b-1)之间。
(2)利用rand()%b+a运算将随机数取值范围平移到[a,a+b-1]之间。】
#include <stdio.h>
#include <time.h>
int main()
{
int a,b,result; //将a,b,result定义为整型变量
char c; //将c定义为字符型变量,由于储存"+"和"-"
srand((unsigned)time(NULL)); //时钟清零
a = rand()%101; //a在0~100间随机产生随机数
b = rand()%101; //b在0~100间随机产生随机数
scanf("%c",&c); //用c来储存"+"/"-"
printf("%d%c%d=", a,c,b); //输出算式
scanf("%d",&result); //输入结果
if(result==a+b) //判断结果是否正确
{
printf("运算正确,好棒!\n");
}
else if (result==a-b)
{
printf("运算正确,好棒!\n");
}
if (result!=a+b && result!=a-b)
{
printf("运算错误,再思考一下哦~\n");
}
return 0; //无返回值
}
题目三(利用"getchar"读取字符):
输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
提示:灵活使用getchar() 函数来按顺序读入所输入字符串里面的各个字符。
#include <stdio.h>
int main()
{
char c; //插入字符型变量
int letters=0,space=0,digit=0,other=0; //利用四个变量来统计各个类型字符的数量
printf("请输入一行字符:\n"); //输入字符串
while((c=getchar())!='\n'){ //不是换行符则开始进行操作
if(c>='a'&&c<='z'||c>='A'&&c<='Z') //判断是否为字母
letters++;
else if(c==' ') //判断是否为空格
space++;
else if(c>='0'&&c<='9') //判断是否为数字
digit++;
else //判断其他字符
other++;
}
printf("字母数:%d\n空格数:%d\n数字数:%d\n其他字符数:%d\n",letters,space,digit,other); //输出各个类型字符的数量
return 0;
}
补充:获取字符串的方法
1. scanf("%s",src);
这个方法很常见,遇到空格和回车结束。
#include <stdio.h>
int main()
{
char src[100];
scanf("%s",src);
printf("%s",src);
return 0;
}
scanf也可以遇到空格不结束。
%[ ]可以用来进行多个字符的输入,并对结束符进行自定义。对于%[ ]还可以用^+任意字符(包括 eof)来结束字符串的输入。比如%[^EOF]就是直到有EOF 输入,字符串才中止。
#include <stdio.h>
int main()
{
char src[100];
scanf("%[^\n]",src);//直到输入回车键,读取才结束,当然不能超过a定义的大小,否则会出错。
printf("%s",src);
return 0;
}
2. gets(src);
gets()遇到空格不停止,遇到回车停止。
#include <stdio.h>
int main()
{
char src[100];
gets(src);
printf("%s",src);
return 0;
}
3.while((ch = getchar()) != ‘\n’)
#include <stdio.h>
int main()
{
char ch;
char src[9];
int i = 0;
while ((ch = getchar()) != '\n')
{
src[i] = ch;
i++;
if (i == 9)
{
printf("Thank for your love!\n");
break;
}
}
return 0;
}
结果:
题目四(利用变量或者“break和continue”控制循环结束):
爱因斯坦数学题。爱因斯坦曾出过这样一道数学题:有一条长阶梯,若每步跨2阶,最后剩下1阶;若每步跨3阶,最后剩下2阶;若每步跨5阶,最后剩下4阶;若每步跨6阶,最后剩下5阶;只有每步跨7阶,最后才正好1阶不剩。请问,这条阶梯至少有多少阶?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x = 1, find = 0; //插入两个变量,x用来记录结果,find用来跳出循环
while (find==0) //find等于0时进入循环
{
if (x % 2 == 1 && x % 3 == 2 && x % 5 == 4 && x % 6 == 5 && x % 7 == 0) //对x进行判断
{
printf("x = %d\n", x); //搜索到合适的x后,输出x
find = 1; //令find=1,跳出循环
}
x++; //使x不断搜索,直至出现最小的符合条件的值
}
system("pause");
return 0;
}
P.S. 上述代码利用的是定义一个变量Find,通过改变变量的值使循环结束,也可以使用“break”语句,再找到符合题目的值之后跳出循环。
题目五(c语言求解多解问题):
编程求解马克思手稿中的数学题。
马克思手稿中有一道趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人?
#include <stdio.h>
#include <stdlib.h>
#define MIN 0 //男人、女人和小孩至少有几人
int main()
{
int x = 0, y = 0, z = 0; //用x,y,z分别记录男人,女人,小孩的数量
for(x = MIN; x < 30; x++)
for(y = MIN; y < 30; y++)
for(z = MIN; z < 30; z++)
if(x + y + z == 30 && 3 * x + 2 * y + z == 50) //利用for循环逐个检验满足条件的数量
printf("男人数量:%2d, 女人数量:%2d, 小孩数量%2d\n", x, y, z); //将三者对应的数量输出
system("pause");
return 0;
}
题目六(for循环跳出的限制条件改变):
考试时建议使用草稿纸去演算循环的中止条件以及循环次数!!!
输入n值,运用循环结构输出下图所示高和上底均为n的直角梯形。
*****
******
*******
********
********* n=5时的直角梯形
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i,j; //用n来记录输入值,用i来表示高,用j来表示宽
scanf("%d",&n);
for(i=1;i<=n;i++) //控制高为n
{
for (j=1;j<n+i;j++) //保证上底为n且输出为直角梯形
printf("*");
printf("\n");
}
system("pause");
return 0;
}
题目七(数组的排序方法):
选择法排序:
for(i = 0;i < n-1;i++)
{
temp = a[i];
iPot = i;
for(j = i+1;j < 10;j++) //从每一个数字依次向后查找
{
if(a[j] < temp)
{
temp = a[j]; //记录当前查找到的最小值与最小值对应的位号
iPot = j;
}
}
a[iPot] = a[i];
a[i] = temp;
}
冒泡法排序:
int a[10];
int temp;
for(int i = 0;i < 10;i++)
{
for(int j = 9;j > i;j--)
{
if(a[j] < a[j-1])
{
temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
}
}
}
交换法排序:
int a[10];
for(i = 0;i <9;i++)
{
for(j = i+1;j < 10;j++)
{
if(a[j] < a[i])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
二分法排序:
CelerityRun(int left,int right,int array[])
{
int i,j;
int middle;
int temp;
i = left;
j = right;
middle = array[((right - left) >> 1) + left]; //实际这里的middle可以取左右边界内任意的一个值
do
{
while((array[i] < middle) && (i < right))
{
i++;
}
while((array[j] > middle) && (j > left))
{
j--;
}
if(i<=j)
{
temp = array[i];
array[i] = array[j];
array[j] = array[i];
i++;
j--;
}
}while(i<=j)
if(left < j)
CelerityRun(left,j,array);
if(right > i)
CelerityRun(i,right,array);
}
题目八(矩阵的排序方法):
//矩阵的每一行进行排序//
#include "stdafx.h"
int main(int argc, char* argv[])
{
int a[5][6]={{0,5,9,7,4,6},{7,98,4,5,18,5},{10,20,4,6,9,13},{1,5,4,17,6,8},{10,5,47,3,16,1}};
int i,j,k,temp;
for(i=0;i<=4;i++)
{
for(j=0;j<=5;j++)
{
printf("%-3d ",a[i][j]);
}
printf("\n");
}
for(i=0;i<=4;i++)
{
for(j=0;j<=5;j++)
{
for(k=1+j;k<=5;k++)
{
if(a[i][j]<a[i][k])
{
temp=a[i][j];
a[i][j]=a[i][k];
a[i][k]=temp;
}
}
}
//printf("%d ",a[i][k]);
}
for(i=0;i<=4;i++)
{
for(j=0;j<=5;j++)
{
printf("%-3d ",a[i][j]);
}
printf("\n");
}
return 0;
}
题目九(数组的行列互换):
写一个函数,使给定的一个3×3的二维整形数组转置。思路提示:行列互换。
函数法:
#include <stdio.h>
#include <stdlib.h>
int i,j,temp,a[3][3];
int zhihuan(int i,int j) //用于置换数组的排序
{
temp = a[i][j];
a[i][j] = a[j][i];
a[j][i] = temp;
}
void main()
{
printf("请输入需要置换的数组:\n"); //输入数组
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
printf("\n");
for(i=0;i<2;i++) //置换数组
{
for(j=0;j<3;j++)
{
if(i==0 || (i==1&&j==2))
{
zhihuan(i,j);
}
}
}
printf("置换后的数组如下:\n");
for (i=0;i<3;i++) //输出数组
{
for(j=0;j<3;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
system("pause");
}
将一个3×3的整数矩阵转置,要求用指针方法编程实现。(所谓矩阵转置,就是矩阵行列互换)。
指针法:
#include <stdio.h>
#include <stdlib.h>
void change(int *a) //数组转置函数
{
int temp; //数组中第2个元素与第4个交换
temp=*(a+1);
*(a+1)=*(a+3);
*(a+3)=temp;
temp=*(a+2); //数组中第3个元素与第7个交换
*(a+2)=*(a+6);
*(a+6)=temp;
temp=*(a+5); //数组中第6个元素与第8个交换
*(a+5)=*(a+7);
*(a+7)=temp;
}
void main()
{
int a[9],i; //定义数组
printf("原数组为:\n");
for ( i = 0; i < 9; i++) //输入数组
{
scanf("%d",&a[i]);
}
int *p=a; //是p指向a[0],同时使*p的值为a[0]
change(p); //利用函数转置数组
printf("转置后的数组为:\n");
for ( i = 0; i < 9; i++) //输出转置后的数组
{
printf("%d ",a[i]);
if(i==2||i==5||i==8)
{
printf("\n");
}
}
system("pause");
}
题目十(函数递归的使用):
已知ackermann函数,对于和有如下定义:
ack(0,n)=n+1
ack(m,0)=ack(m-1,1)
ack(m,n)=ack(m-1,ack(m,n-1))
请编程输入m和n,求ack(m,n)之值。
#include <stdio.h>
#include <stdio.h>
int ack(int m,int n) //利用递归写出ackermann函数
{
if(n == 0)
{
return ack(m-1,1);
}
else if(m==0)
{
return n+1;
}
else
{
return ack(m-1,ack(m,n-1));
}
};
void main()
{
int m=0,n=0; //用m和n记录函数的变量
scanf("%d %d",&m,&n); //输入m和n
printf("ack is %d\n",ack(m,n)); //输出结果
system("pause");
}
题目十一(插入字符串):
输入一个长度为N的字符串A,从其第K个字符起,插入长度为M的字符串B,输出新的长度为N+M的字符串,其中N、M均小于100,且K<=N。
#include <stdio.h>
#include <stdlib.h>
int main() {
char A[100], B[100], *pA, *pB;
int K, N, M;
printf("请输入字符串A:");
gets(A);
printf("请输入字符串B:");
gets(B);
printf("请输入插入位置K:");
scanf("%d", &K);
pA = A;
pB = B;
for (N = 0; *(pA + N) != '\0'; N++); // 计算字符串A的长度
for (M = 0; *(pB + M) != '\0'; M++); // 计算字符串B的长度
for (int i = N; i >= K; i--) // 将字符串B插入到字符串A的第K个字符位置中
*(pA + i + M) = *(pA + i);
for (int i = 0; i < M; i++)
*(pA + K + i) = *(pB + i);
printf("新的字符串为:%s\n", A);
system("pause");
return 0;
}