目录
1、喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水
要求:给20元,可以多少汽水 (编程实现)
int main()
{
int money = 0;
scanf("%d",&money);
int total = money;
int empty = money;
while(empty >= 2)
{
total += empty/2;
empty = empty/2 + empty%2;
}
printf("%d\n",total);
return 0;
}
2、实现一个函数来调整该数组中数字的顺怀
要求:使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
void move(int arr[],int sz)
{
int left = 0;
int right = sz-1;
while(left<right)
{
//从前找一个偶数
while((left<right)&&(arr[left]%2 == 1))
{
left++;
}
//从后找一个奇数
while((left<right)&&(arr[right]%2 == 0))
{
right--;
}
if(left<right)
{
int tmp = 0;
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
}
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int sz = sizeof(arr) / sizeof(arr[0]);
move(arr,sz);
int i = 0;
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
3、在屏幕上打印杨辉三角
代码:
int main()
{
int arr[10][10] = {0};
int i = 0;
int j = 0;
for(i=0;i<10;i++)
{
for(j=0;j<=i;j++)
{
if(j == 0)
{
arr[i][j]=1;
}
if(i == j)
{
arr[i][j]=1;
}
if(i>=2&&j>=1)
{
arr[i][j] = arr[i-1][j-1]+arr[i-1][j];
}
}
}
for(int i =0;i<=10;i++)
{
for(int j =0;j<i;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
4、根据供词猜凶手
题目内容:
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个
以下为4个嫌疑犯的供词:
- A说:不是我。
- B说:是C。
- C说:是D
- D说:C在胡说
已知3个人说了真话,1个人说的是假活
int main()
{
char killer = 0;
for(killer = 'A';killer <= 'D';killer++)
{
if((killer != 'A')+(killer == 'C')+(killer == 'D')+(killer != 'D') == 3)
{
printf("killer=%c\n",killer);
}
}
return 0;
}
5、5位运动员参加了10米台跳水比赛预测比赛结果
- A选手说: B第二,我第三;
- B选手说: 我第二,E第四;
- C选手说: 我第一,D第二;
- D选手说: C最后,我第三;
- E选手说: 我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次
int main()
{
int a,b,c,d,e = 0;
for(a=1;a<=5;a++)
{
for(b=1;b<=5;b++)
{
for(c=1;c<=5;c++)
{
for(d=1;d<=5;d++)
{
for(e=1;e<=5;e++)
{
if((((b==2)+(a==3))==1)
&&((b==2)+(e==4)==1)
&&((c==1)+(d==2)==1)
&&((c==5)+(d==3)==1)
&&((e==4)+(a==1)==1)
)
{
if(a*b*c*d*e == 120)
{
printf("a=%d b=%d c=%d d=%d e=%d\n",a,b,c,d,e);
}
}
}
}
}
}
}
return 0;
}
6、实现一个计算器,加减乘除
要求:用两种方法,不用函数指针数组和用函数指针数组
不用函数指针数组:
int Add(int x,int y)
{
return x + y;
}
int Sub(int x,int y)
{
return x - y;
}
int Mul(int x,int y)
{
return x * y;
}
int Div(int x,int y)
{
return x / y;
}
void menu()
{
printf("****************************\n");
printf("** 1.Add *** 2.Sub ****\n");
printf("** 3.Mul *** 4.Div ****\n");
printf("******** 0.exit *********\n");
printf("****************************\n");
}
int main()
{
int input = 0;
do
{
int a = 0;
int b = 0;
menu();
printf("请输入:>");
scanf("%d",&input);
switch(input)
{
case 1:
printf("请输入两个数:>\n");
scanf("%d %d",&a,&b);
printf("%d\n",Add(a,b));
break;
case 2:
printf("请输入两个数:>\n");
scanf("%d %d",&a,&b);
printf("%d\n",Sub(a,b));
break;
case 3:
printf("请输入两个数:>\n");
scanf("%d %d",&a,&b);
printf("%d\n",Mul(a,b));
break;
case 4:
printf("请输入两个数:>\n");
scanf("%d %d",&a,&b);
printf("%d\n",Div(a,b));
break;
case 0:
printf("退出程序\n");
break;
default:
printf("输入错误,请重新输入:>\n");
break;
}
}while(input);
return 0;
}
用函数指针数组
int Add(int x,int y)
{
return x + y;
}
int Sub(int x,int y)
{
return x - y;
}
int Mul(int x,int y)
{
return x * y;
}
int Div(int x,int y)
{
return x / y;
}
void menu()
{
printf("****************************\n");
printf("** 1.Add *** 2.Sub ****\n");
printf("** 3.Mul *** 4.Div ****\n");
printf("******** 0.exit *********\n");
printf("****************************\n");
}
int main()
{
int input = 0;
do
{
int (*pfarr[5])(int,int) = {NULL,Add,Sub,Mul,Div};
int a = 0;
int b = 0;
menu();
printf("请输入:>");\
scanf("%d",&input);
if(input >=1 && input <= 4)
{
printf("请输入两个数:>\n");
scanf("%d %d",&a,&b);
printf("%d\n",(pfarr[input])(a,b));
}
else if(input ==0)
{
printf("退出程序\n");
break;
}
else
{
printf("输入错误,请重新输入:>\n");
}
}while(input);
return 0;
}
7、写一个冒泡排序
void bubble_sort(int arr[],int sz)
{
int i = 0;
for(i=0; i<sz-1; i++)
{
int j = 0;
for(j=0; j<sz-1-i;j++)
{
if(arr[j]>arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
void print(int arr[],int sz)
{
int i = 0;
for(i=0;i<sz-1;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {0,1,2,3,4,5,6,7,8,9};
int sz =sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz);
print(arr,sz);
return 0;
}
8、写一个通用方式的冒泡排序
void print(int arr[],int sz)
{
int i = 0;
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void Swap(char* buf1,char* buf2,int wideth)
{
int i = 0;
for(i=0; i<wideth; i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
void bubble_sort(void* base,
int sz,
int wideth,
int (*cmp)(const void* e1,const void* e2)
)
{
int i = 0;
for(i=0; i<sz-1;i++) //趟数
{
int j = 0;
for(j=0; j<sz-1-i; j++) //一趟的排序
{
if(cmp((char*)base+j*wideth,(char*)base+(j+1)*wideth)>0) //比较两个元素的
{
Swap((char*)base+j*wideth,(char*)base+(j+1)*wideth,wideth);
}
}
}
}
int cmp_int(const void* e1,const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int main()
{
int arr[] = {0,1,9,3,4,5,6,2,8,7};
int sz =sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz,sizeof(arr[0]),cmp_int);
print(arr,sz);
return 0;
}
9、给一个结构体排序
要求:用到qsort函数:
void qsort(void* base,size_t num,size_t size,int(*cmp)(const void* e1,const void* e2))
#include<stdlib.h>
#include<string.h>
struct Stu
{
char name[20];
int age;
};
int sort_by_name(const void* e1,const void* e2)
{
return strcmp(((struct Stu*)e1)->age,((struct Stu*)e2)->age);
}
void test()
{
struct Stu s[3] = {
{"zhangsan",30},{"lise",23},{"wangwu",33}};
int sz = sizeof(s) / sizeof(s[0]);
qsort(s,sz,sizeof(s[0]),sort_by_name);
}
int main()
{
test();
return 0;
}
10、杨氏矩阵查找一个数
要求:有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
int find_num(int arr[3][3],int r,int c,int k)
{
int x = 0;
int y = c-1;
while(x<r && y>=0)
{
if(arr[x][y]<k)
{
x++;
}
else if(arr[x][y]>k)
{
y--;
}
else
{
printf("在第%d行,第%d列\n",x+1,y+1);
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3] = {1,2,3,4,5,6,7,8,9};
int k = 7;
int ret = find_num(arr,3,3,k);
if(ret == 1)
{
printf("找到了\n");
}
else
{
printf("找不到\n");
}
return 0;
}
在函数里不打印,怎么返回来行和列的值
int find_num(int arr[3][3],int* r,int* c,int k)
{
int x = 0;
int y = *c-1;
while(x<*r && y>=0)
{
if(arr[x][y]<k)
{
x++;
}
else if(arr[x][y]>k)
{
y--;
}
else
{
*r = x;
*c = y;
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3] = {1,2,3,4,5,6,7,8,9};
int k = 7;
int x = 3;
int y = 3;
int ret = find_num(arr,&x,&y,k);
if(ret == 1)
{
printf("找到了,下标为:%d %d\n",x,y);
}
else
{
printf("找不到\n");
}
return 0;
}
11、实现一个函数,可以左旋字符串中的k个字符。
例如:ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
#include<string.h>
void left_move(char* str,int k)
{
int len = strlen(str);
int i = 0;
for(i=0; i<k; i++)
{
char tmp = *str;
int j = 0;
for(j=0; j<len-1; j++)
{
*(str+j) = *(str+j+1);
}
*(str+len-1) = tmp;
}
}
int main()
{
char arr[10] = "abcdef";
int k = 2;
left_move(arr,k);
printf("%s\n",arr);
return 0;
}
利用散布翻转法
#include<string.h>
void reverse(char *start,char* end)
{
while(start<end)
{
char tmp = *start;
*start = *end;
*end = tmp;
start++;
end--;
}
}
void left_move(char* str,int k)
{
int len = strlen(str);
reverse(str,str+k-1);
reverse(str+k,str+len-1);
reverse(str,str+len-1);
}
int main()
{
char arr[10] = "abcdef";
int k = 2;
left_move(arr,k);
printf("%s\n",arr);
return 0;
}
12、字符串旋转结果
题目内容:
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串
例如:
给定s1 = PABCD和s2 = BCDAA,返回1
给定s1 = abcd和s2 = ACBD,返回0.
#include<string.h>
int is_left_move(char arr1[],char arr2[])
{
int n = strlen(arr1);
int i = 0;
for(i=0; i<n-1; i++)
{
int tmp = *arr1; //每次左旋转一个字符
int j = 0;
for(j=0; j<n-1; j++) //后面的n-1一个字符往前挪
{
*(arr1+j) = *(arr1+j+1);
}
*(arr1+n-1) = tmp; //tmp放在最后面
if(strcmp(arr1,arr2) == 0)
{
return 1;
}
}
return 0;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "cdefab";
int ret = is_left_move(arr1,arr2);
if(ret == 1)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
方法二(用strncat和strstr库函数)
#include<string.h>
int is_left_move(char* str1,char* str2)
{
if(strlen(str1) != strlen(str2)) //长度不相等,肯定不是旋转得来的
{
return 0;
}
int len = strlen(str1);
strncat(str1,str2,len); //str1字符串的后面追加一个str1
char* ret = strstr(str1,str2); //判断str2是否为str1的字符串
return ret != NULL;
}
int main()
{
char arr1[20] = "abcdef";
char arr2[] = "cdefab";
int ret = is_left_move(arr1,arr2);
if(ret == 1)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
13、模拟实现strlen库函数
#include<assert.h>
int my_strlen(const char* str)
{
assert(str != NULL);
int count = 0;
while(*str != '\0')
{
str++;
count++;
}
return count;
}
int main()
{
char arr[] = "abc";
printf("%d\n",my_strlen(arr));
return 0;
}
14、模拟实现strcat库函数
#include<assert.h>
char* my_strcat(char* dest,const char* src)
{
char* ret = dest;
assert(dest && src);
while(*dest) //找到目标字符串的\0
{
dest++;
}
while(*dest++ = *src++) //追加字符串,包括\0
{
;
}
return ret; //返回目标空间的起始位置
}
int main()
{
char arr[20] = "bit ";
char arr1[] = "hello";
printf("%s\n",my_strcat(arr,arr1));
return 0;
}
15、模拟实现strcmp库函数
int my_strcmp(char* s1,char* s2)
{
while(*s1 == *s2)
{
if(*s1 == '\0')
{
return 0;
}
s1++;
s2++;
}
if(*s1>*s2)
{
return 1;
}
else
{
return -1;
}
}
int main()
{
char* p = "abcd";
char* q = "abca";
int ret = my_strcmp(p,q);
if(ret > 0)
{
printf("p>q\n");
}
else if(ret < 0)
{
printf("p<q\n");
}
else
{
printf("p=q\n");
}
return 0;
}
16、模拟实现strstr函数(*)
#include<assert.h>
char* my_strstr(const char* str1,const char* str2)
{
assert(str1 && str2);
const char* s1 = NULL;
const char* s2 = NULL;
const char* cp = str1;
if(*str2 == '\0')
{
return (char*)str1;
}
while(*cp)
{
s1 = cp;
s2 = str2;
while(*s1 && *s2 && (*s1 == *s2))
{
s1++;
s2++;
}
if(*s2 == '\0')
{
return (char*)cp;
}
cp++;
}
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "bcd";
char* ret = my_strstr(arr1,arr2);
if(ret == NULL)
{
printf("找不到\n");
}
else
{
printf("找到了:%s\n",ret);
}
return 0;
}
17、写代码实现输入任意的字符
要求:输入任意的字符,输出的都是小写
#include<ctype.h>
int main()
{
char arr[10] = {0};
scanf("%s",&arr);
int i = 0;
while(arr[i] != '\0')
{
if(isupper(arr[i]))
{
arr[i] = tolower(arr[i]);
}
printf("%c ",arr[i]);
i++;
}
return 0;
}
18、模拟实现memcpy函数
#include<assert.h>
void* my_memcpy(void* dest,const void* src,size_t num)
{
assert(dest && src);
void* ret = dest;
while(num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[] = {1,2,3,4,5,6,7,8,9};
int arr2[20] = {0};
my_memcpy(arr2,arr1,20);
return 0;
}
19、模拟实现memmove函数
#include<assert.h>
void* my_memmove(void* dest,const void* src,size_t num)
{
assert(dest && src);
void* ret = dest;
if(dest<src) //从前先后拷贝
{
while(num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else //从后向前拷贝
{
while(num--)
{
*((char*)dest+num) = *((char*)src+num);
}
}
return ret;
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9};
my_memmove(arr+3,arr,20);
return 0;
}