C语言错题与不熟悉的题

题目一(选择中的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;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值