#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[5] = { 1,2,3,4,5 };
int p1 = (int)(&a + 1);//数组a的首地址
int p2= (int)((int)a + 1);//将地址转化为int型得到乱码
int p3= (int)(a + 1);//数组中第二个元素
printf("%d,%d,%d\n", p1[-1], p2[0], p3[1]);//p1:后退一个,p2:数组首地址,p3:元素加1
getchar();
return 0;
}
//11.5
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[5] = { 1,2,3,4,5 };
int *ptr = (int )(&a + 1); 行代码中 &a 代表 整个数组的地址,(&a + 1) 就代表数组a下一个int类型数字的地址,把这个地址强转成 int 赋给ptr。这里(ptr - 1),指针减一就是减去它所指向的类型的大小,int类型正好为四个字节;
printf("%d,%d", *(a + 1), *(ptr - 1));
return 0;
}
char 类型的字节为1,char类型的指针字节为4
//11.3
#include <stdio.h>
int g = 0;
int f()
{
return g++;//先引用后++
//g++第一次不改变,g第二次改变;
//++g两者都改变;
}
int main()
{
if (f()&&f())//&&和的意思,两者都为真方可
{
printf("%d\n", g);
}
printf("%d\n", g);
return 0;
}
//11.4
#include<stdio.h>
int main()
{
int i = -2;
unsigned int j = 1;//无符号型
unsigned char b = 0;
if ((i + j) >= 0)//有符号型转化为无符号型(原码,饭吗,补码)
{
printf(“i+j>=0\n”);
}
else
{
printf("i+j<0\n");
}
printf("i+j=%d\n",i+j);
printf("j-2=%d\n",j-2 );
printf("b-1=%d\n",b-1);//字符型转化为整数型,(原码,反吗,补码)
b = b - 1;
printf("b-1=%d\n", b);
return 0;
}
//逆序输出汉字(汉字在计算机中占两个字符)
#include<stdio.h>
#include<stdlib.h>
int main()
{
char str[80] = “临沂大学信息学院信息工程”;
char t1, t2;
int L, i;
L = strlen(str);
for (i = 0; i < L / 2; i = i + 2)
{
t1 = str[i];
t2 = str[i+1];
str[i] = str[L-2-i];
str[i+1] = str[L-1-i];
str[L-2 -i] = t1;
str[L - 1- i] = t2;
}
printf("%s", str);
return 0;
}
//11.8
//把“LIN临YI沂University大学信息208”倒序打印出来
#include <stdio.h> //定理:如果第一个字符串当做char处理,那么标准的ASCLL字符一定是个整数
#include <string.h>
#define MAX 100 //定义字符串的最大长度
int main()
{
int len;
char str[80] = “LIN临YI沂University大学信息208”;
len = strlen(str);
int min = 0;
int max = len - 1;
int temp;
while (min < max) //字符串逆序(按字节长度)
{
temp = str[min];
str[min++] = str[max];
str[max–] = temp;
}
int i = len;
while (i != 0) //从后开始扫描,遇到小于0的字符,则逆序自其往前二字符(中文字符占2个字节长度)
{
i--;
if (str[i] < 0)
{
temp = str[i];
str[i] = str[i - 1];
str[i - 1] = temp;
i = i - 1;
}
}
printf("%s\n", str); //输出逆序后的字符
return 0;
}//十进制变二进制;根据其在电脑中数据的存在形式;
#include<stdio.h>
void func(unsigned int x, int cnt)
{
if (cnt > 31)
return;
if (cnt != 0 && cnt % 4 == 0)
{
printf(" “);
}
printf(”%u", (x >> (31 - cnt)) & 0x01);
func(x, ++cnt);
}
int main()
{
int x = 0;
scanf_s("%d", &x);
func(x, 0);
return 0;
}
//递归问题
//第一天做了一道题,每天做题数是前一天的两倍,总数不超过100道,一共做了多少道?做了几天?
#inclue <stdlib.h>
int main()
{
int day, ans, sum;
for (day = 1, ans = 1, sum = 1; day++; sum <= 100)//sum<=63,结果将正常输出
// 条件限制有问题
{
ans = ans * 2;
sum + = ans;
}
printf("第%d天做了%d道题,一共做了多少道");
return 0;
}//循环问题
5个强盗一起抢了1家银行。
因为太累了,他们商量决定,先回家睡一觉再分钱。
过了不知多久,1个强盗醒过来了。
他将这1堆钱平均分成5份,结果多了1元,就将多的一元自己拿了,又拿走其中的1堆。
又过了不知多久,第2个强盗来了。
他不知道有1个同伴已经来过,还以为自己是第1个到的呢。
于是将地上的钱堆起来,平均分成5份,发现也多了一元,同样独吞了这一元,拿走其中的1堆。
第3个、第4个、第5个强盗都是这样……问这5个强盗至少抢了多少元钱?第5个强盗走后还剩下多少元?
输出至少抢了多少元钱?第5个强盗走后还剩下多少元,中间用空格隔开
#include<stdio.h>
int main()
{
int first, i, t;
for (i = 1; i < 5000; i++)
{
first = i;
for (t = 1; t <= 5; t++)//五个强盗,控制五次循环
if (first % 5 == 1)//必须每次分的时候对5求余为1
{
first = (first - 1) / 5 * 4;//第一个人拿走以后剩的钱
if (t == 5)
printf("%d %d\n", i, first);
}
else
break;
}
return 0;
}
///实现一个字符串查找的简单函数,在字符串s中查找字符串t,返回字符串t在s中的首地址。若未找到,则返回NULL
#include<stdio.h>
#include<stdlib.h>
char search(chars, char*t);
#define MAXS 30
int main()
{
char s[MAXS], t[MAXS], pos;
get(s);
get(t);
pos = search(s, t);
if (pos != NULL)
{
printf("%d\n", pos - s);
}
else
{
printf("-1,\n");
}
system(“pause”);
return 0;
}
char search(chars, chart);
{
int i = 0, j;
while (s[i] != ‘\0’)
{
j = 0;
while (t[j] != ‘\0’)
{
if (s[i + j] != t[j])
break;
j++;
}
if (t[j] == ‘\0’)
return s + i;
j++;
}
return NULL;
}
//C语言特定函数
#include<string.h>
#include<stdio.h>
char str(const charstrs, const charstrt);
void ReadString(char s[]);
int main()
{
char * p;
char strs[30], strt[30];
ReadString(strs);
ReadString(strt);
p = strstr(strs, strt);
if (p != NULL)
{
printf("%d\n", p - strs);
}
else
{
printf("-1\n");
}
return 0;
}
char str(const charstrs, const charstrt)
{
charm;
m = str(strs, strt);
return m;
}
11.17
// 请输入一个ea15de#@$^sdf中存在的字符,并输出它所在的位置,要求当输入ea15de*^#@$sdf不存在的sc字符时可以不断的输入。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//请输入一个ea15de*^#@KaTeX parse error: Expected group after '^' at position 71: … str = "ea15de*^̲#@^sdf";
int i = 0;
int IsFind = 0;
printf(“请输入一个ea15de*#@$sdf中存在的字符:\r\n”);
scanf_s("%c", &data);
getchar(); //除去空格
for (i = 0; i < strlen(str); i++)
{
if (str[i] == data)
{
IsFind = 1;
break;
}
}
if (IsFind)
{
printf(“你所查找的字符位于:%d位置!\r\n”, i);
}
else
{
while (1)
{
scanf_s("%c", &data);
}
}
}
/// 买包子。.cpp : 定义控制台应用程序的入口点。
//今日小题:wya去买包子,第一天买了x个包子(x<10),第二天买了xx个包子,第三天买了xxx个包子,
//以此类推(如2+22+222+2222+…),买了y次。x,y由用户输入,求第y次买的包子数及买的包子的总数。
#include “stdafx.h”
#include “math.h”
#include “stdio.h”
int _tmain(int argc, _TCHAR* argv[])
{
int a[99] = { 0 }; //将每天买包子的数量放在一个数组中
int sum = 0, n, x, y; //sum买包子的总数
scanf_s("%d", &x); //第一天买了x个包子(x<10)
scanf_s("%d", &y); //买了y次包子
for (n = 0; n<y; n++) //第一个for循环 当求出第y天买包子数时跳出
{
a[0] = 1 * x; //n=0时 为第一天
a[n + 1] = x*pow(10.0, n + 1) + a[n]; // 10.0 pow 要求输入浮点型数据
if (n + 1 == y)
{
printf("第%d次买了%d个包子\n", y, a[n]);
}
}
for (n = 0; n<y; n++) //第二个for循环 累加求出买包子总数
{
sum += a[n];
}
printf("一共买了%d个包子\n", sum);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
考核题
//请输入一个ea15de*^#@KaTeX parse error: Expected group after '^' at position 78: …ring = "ea15de*^̲#@^sdf";
int i = 0;
int IsFind = 0;
printf(“请输入一个ea15de*#@$sdf中存在的字符:\r\n”);
scanf("%c", &data);
getchar(); //除去空格
for (i = 0; i < strlen(string); i++)
{
if (string[i] == data)
{
IsFind = 1;
break;
}
}
if (IsFind)
{
printf(“你所查找的字符位于:%d位置!\r\n”, i);
}
else
{
while (1)
{
scanf("%c", &data);
}
}
system("pause");
}
//wya买车,50万一辆,第一天买一辆,第三天买一辆,第五天买3辆;并且每天的最后一辆可以根据天数打折,依次为九折,八折,七折,要求用户输入天数,并且天数只能是基数,求其当天买车数量以及一共花费多长金钱
#include <stdio.h>
#define Q 50
double car(int x);
int main(void) {
int x;
int i;
double m, n = 0;
scanf_s("%d", &x);
m = car(x);
printf(“当天所花费金额为%.2lf\n”, m);
for (i = 1; i <= x; i += 2) {
n += car(i);
}
printf(“之前买车所花费的所有金额为%.2lf”, n);
return 0;
}
double car(int x) {
double m;
if (x == 1) {
m = Q;
}
else {
double a, b; // a为当天购买车数,b为折扣数目
a = 0.5*(x + 1); //天数和车数的关系
b = 1.1 - 0.1*a; //车数和折扣的关系
m = (a + b - 1)*Q; //(a-1)Q+Qb
}
return 0;
}//本题要求实现求Fabonacci数列项的函数。Fabonacci数列的定义如下:
f(n) = f(n−2) + f(n−1) (n≥2),其中f(0) = 0,f(1) = 1。
#include <stdio.h>
int f(int n);
int main()
{
int n;
scanf_s("%d", &n);
printf("%d\n", f(n));
return 0;
}
int f(int n)
{
if (n = 0)
{
return 0;
}
else if (n = 1)
{
return 1;
}
else
{
return f(n - 2) + f(n - 1);//f(3)=f(1)+f(2)//f(2)=f(0)+f(1)从入口进,会返回入口
}
return 0;
}//输入一个上底和下底为n的等腰梯形
#include <stdio.h>
int main()
{
int a, b, c, n;//a为行数,b为空格数,c为星号
printf(“input n:”);//输入一个高和上底都为n的等腰梯形
scanf_s("%d", &n);
for (a = 1; a <= n; a++)
{
for (b = 1; b <= n - a; b++) { //打印行前的空格
printf(" “);
}
for (c = 1; c <= 2 * a + n - 2; c++) { //每一行的星号与行数与n的关系
printf(”* *");
}
printf("\n");
}
while (1);
return 0;
}
11.27//程序解读
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char * argv[])
{
int a[3][2] = { (0, 1), (2, 3), (4, 5) }; //花括号里面是圆括号,所以这里就组成了逗号表达式。一行用逗号隔开的表达式的运算是从左到右的,但结果只取最右边的那个逗号的右边的表达式的值。这是逗号表达式最基本也是最重要的用法。
int *p; //定义一个指针
p = a[0]; //指到a[0]地址
printf("%d\n", p[0]); //输出地址里的值
system("pause"); //暂停
return 0;
//最后数组里面的值是 a[3][2] = {1, 3, 5, 0, 0, 0}; 所以a[0] = 1
}
//考核题
//请编写程序,实现以下功能:在字符串中的所有数字字符前加一个$字符。例如,输入 A1B23CD45,输出 A$1B$2$3CD$4$5。
#include <stdio.h>
#include <stdlib.h>
int fun(char *s)
{
char t[80];
int i, j;
for (i = 0; s[i]; i++)
t[i] = s[i];
t[i] = ‘\0’;
for (i = 0, j = 0; t[i]; i++)
{
if (t[i] >= '0' && t[i] <= '9')
{
s[j++] = '$';
s[j++] = t[i];
}
else
{
s[j++] = t[i];
s[j] = '\0';
}
}
return 0;
}
int main()
{
char s[80];
printf(“Enter a string:”);
scanf("%s", s);
fun(s);
printf(“The result: %s\n”, s);
return 0;
}
#include<stdio.h>
#include<stdio.h>
int main(void)
{
char a[100];
int i;
int len;
scanf_s("%s")
}
//求S=2+22+222+2222+22222的值
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int result = 0.0f;
int i, j;
int sum = 0;
int n, a;
scanf_s("%d %d", &n, &a);
for (i = 0; i < n; i++)
{
sum = a *pow(10.0, i) + sum;
result += sum;
}
printf("%d", result);
return 0;
}
}//数组指针的理解
#include “stdafx.h”
int _tmain(int argc, _TCHAR* argv[])
{
char a[] = “imj”;//字符串变量
*a = 'L';
printf("%s", a);
return 0;
}//
#include “stdafx.h”
#include “stdlib.h”
int main()
{
char *a = “imj”;//字符串常量,不可更改
*a = ‘L’;
printf("%s", a);
system("pause");
}
//12.3
#include “stdafx.h”
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
int main()
{
char *c[] = { “ENTER”, “NEW”, “POINT”, “FIRST” };
char **cp[] = { c + 3, c + 2, c + 1, c };
char ***cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", –++cpp + 3);
printf("%s\n", *cpp[-2] + 3);
printf("%s\n", cpp[-1][-1] + 1);
system(“pause”);
return 0;
}
//12.4冒泡排序
#include “stdafx.h”
#include <stdio.h>
void Bubblesort(int s[], int n);
int main()
{
int a[5];
int i;
for (i = 0; i < 5; ++i)
{
scanf_s("%d", &a[i]);
}
Bubblesort(a, 5);
for (i = 0; i < 5; ++i)
{
printf("%d", a[i]);
}
printf("\n");
return 0;
}
void Bubblesort(int s[], int n)
{
int i, j, t;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (s[j] > s[j + 1])
{
t = s[j];
s[j] = s[j + 1];
s[j + 1] = t;
}
}
}
}
//大小端问题
#include <stdio.h>
int main()
{
int a[4] = { 1,2,3,4 };
int ptr1 = (int)(&a + 1); //4
int ptr2 = (int)((int)a + 1);//2000000
printf("%x, %x\n", ptr1[-1], *ptr2);
}
小端输出:12345在电脑中存入为54321,输出时从左向右输出
#include “stdafx.h”
#include “stdio.h”
#include “string.h”
int main()
{
char str[20] = { '\0' };
char p[20] = { '\0' };
gets_s(str);
int s = 0;
int mark;
int i = 0;
for (int j = 0; j < sizeof(str) + 1; j++)
{
if (str[j] == '-')
{
s++;
}
if (s == 2)
{
mark = j;
break;
}
}
for (int k = mark + 1; k < strlen(str); k++)
{
p[i++] = str[k];
}
p[i++] = '-';
for (int k = 0; k < mark; k++)
{
p[i++] = str[k];
}
p[i] = '\0';
printf("%s", p);
getchar();
return 0;
}
日期反转,虽然麻烦但是很有意思
02-29-1999
1999-02-29
另外在月份输出时要考虑%02d,两个字节
//pta
7-7 龟兔赛跑
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?
输入格式:
输入在一行中给出比赛时间T(分钟)。
输出格式:
在一行中输出比赛的结果:乌龟赢输出@@,兔子赢输出_,平局则输出--;后跟1空格,再输出胜利者跑完的距离。
输入样例:
242
输出样例:
@_@ 726
#include"stdafx.h"
#include<stdio.h>
int main()
{
int t = 0, t1 = 0, t2 = 0, W = 0, T = 0;
scanf_s("%d", &t);
while (t1<t&&t>0) {
if (t1 % 10 == 0 && T>W) {
t2 = t1 + 30;
while (t1<t2&&t1<t) {
W += 3;
t1++;
}
}
else {
t2 = t1 + 10;
while (t1<t2&&t1<t) {
W += 3;
T += 9;
t1++;
}
}
}
if (W>T) {
printf("@_@ %d", W);
}
else if (W == T) {
printf("-_- %d", W);
}
else {
printf("^_^ %d", T);
}
return 0;
}
虽然很变态,但是思路为判断兔子的时间,如果十分钟后的,st大于sw,则让sw变大,并使t1增大,若st<sw,则两者都跑。
给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。
//结构体:
输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2 成绩3”,中间以空格分隔。
输出格式:
在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。
输入样例:
5
00001 huanglan 78 83 75
00002 wanghai 76 80 77
00003 shenqiang 87 83 76
10001 zhangfeng 92 88 78
21987 zhangmeng 80 82 75
输出样例:
zhangfeng 10001 258
#include <stdio.h>
#include <string.h>
int main()
{
struct stdent
{
char num[10];
char name[100];
int s[3];
int max;
}str[10];
int n = 0;
scanf_s("%d", &n);
for (int i = 0; i < n; i++)
{
char num[10];
char name[100];
scanf_s("%s %s %d %d %d", num, name, &str[i].s[0], &str[i].s[1], &str[i].s[2]);
strcpy_s(str[i].num, num);
strcpy_s(str[i].name, name);
}
for (int i = 0; i < n; i++)
{
str[i].max = str[i].s[0] + str[i].s[1] + str[i].s[2];
}
int index = 0;
int max = 0;
for (int i = 0; i < n; i++)
{ if (str[i].max >max)
{
index = i;
max = str[i].max;
}
}
printf("%s %s %d", str[index].name, str[index].num, max);
return 0;
}
快速排序`在这里插入代码片#include <stdio.h>
void sort (int *a,int left,int right);
int main (void){
//freopen ("2.txt","r",stdin);
int b[10];
int n;
for(n=0;n<10;n++){
scanf ("%d",&b[n]);
}
sort(b,0,9);
for(n=0;n<10;n++){
printf ("%d ",b[n]);
}
return 0;
}
void sort (int *a,int left,int right){
if(left >= right){
return ;
}
int i = left;
int j = right;
int key = a[left];
while(i < j)
{
while(i < j && key <= a[j]){
j--;
}
a[i] = a[j];
while(i < j && key >= a[i]){
i++;
}
a[j] = a[i];
}
a[i] = key;
sort(a, left, i - 1);
sort(a, i + 1, right);
}
`